[
  {
    "path": ".claude/settings.json",
    "content": "{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(cmake -B build :*)\",\n      \"Bash(build/copyq-tests :*)\",\n      \"Bash(build/copyq :*)\"\n    ]\n  },\n  \"env\": {\n    \"COPYQ_SESSION_NAME\": \"test\",\n    \"COPYQ_SETTINGS_PATH\": \"build/copyq-test-conf\",\n    \"COPYQ_ITEM_DATA_PATH\": \"build/copyq-test-data\",\n    \"COPYQ_PLUGINS\": \"\",\n    \"COPYQ_DEFAULT_ICON\": \"1\",\n    \"COPYQ_SESSION_COLOR\": \"#f90\",\n    \"COPYQ_THEME_PREFIX\": \"$PWD/shared/themes\",\n    \"COPYQ_PASSWORD\": \"TEST123\",\n    \"COPYQ_LOG_LEVEL\": \"DEBUG\",\n    \"QT_LOGGING_RULES\": \"*.debug=true;qt.*.debug=false\",\n    \"QT_QPA_PLATFORM\": \"minimal\"\n  }\n}\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "* @hluk\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us fix problems.\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n<!--\nBefore continuing, make sure a similar request or a known issue does not exists already:\n- See the list of known issues: https://copyq.readthedocs.io/en/latest/known-issues.html\n- Try to look up a similar problem: https://github.com/hluk/CopyQ/issues\n-->\n\n**Describe the bug**\n<!-- A clear and concise description of what the bug is. -->\n\n**To Reproduce**\n<!-- List of steps to reproduce the behavior. -->\n\n**Expected behavior**\n<!-- A clear and concise description of what you expected to happen. -->\n\n**Screenshots**\n<!-- If applicable, add screenshots to help explain your problem. -->\n\n**Version, OS and Environment**\n<!--\nGet details from `copyq version` command, or copy from the CopyQ main window:\n1. Open Action dialog (F5 shortcut).\n2. Enter command: `copyq: copy(version())`\n3. Click OK - the details should be copied to the system clipboard.\n4. Paste the details in the report.\n-->\n\n- Application Version (for example 10.0.0)\n- OS (for example Windows 11, Ubuntu 24.04, Fedora 42, macOS Sonoma 14.4)\n- Desktop environment, window manager (if applicable)\n- Installation method (for example Windows installer, portable zip, Flatpak, Homebrew, manual build)\n\n**Additional context**\n<!--\nProvide any additional context about the problem if possible.\nFor example, the latest logs from `copyq logs` or from GUI (in menu bar Help - Show Log).\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project.\ntitle: ''\nlabels: feature\nassignees: ''\n\n---\n\n<!--\nBefore continuing, make sure a similar request does not exists already:\nhttps://github.com/hluk/CopyQ/issues\n-->\n\n**Is your feature request related to a problem? Please describe.**\n<!-- A clear and concise description of what the problem is. -->\n\n**Describe the solution you'd like**\n<!-- A clear and concise description of what you want to happen. -->\n\n**Describe alternatives you've considered**\n<!-- A clear and concise description of any alternative solutions or features you've considered. -->\n\n**Additional context**\n<!-- Add any other context or screenshots about the feature request here. -->\n"
  },
  {
    "path": ".github/actions/download-miniaudio/action.yml",
    "content": "name: Download miniaudio\ndescription: Downloads and verifies miniaudio.h from a pinned commit (cached)\n\nruns:\n  using: composite\n  steps:\n    - name: Set miniaudio version\n      shell: bash\n      run: |\n        # 0.11.25\n        echo 'MINIAUDIO_COMMIT=9634bedb5b5a2ca38c1ee7108a9358a4e233f14d' >> \"$GITHUB_ENV\"\n        echo 'MINIAUDIO_SHA256=ac7af4de748b7e26b777f37e01cee313a308a7296a3eb080e2906b320cc55c89' >> \"$GITHUB_ENV\"\n\n    - name: Cache miniaudio header\n      id: cache\n      uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4\n      with:\n        path: src/miniaudio.h\n        key: miniaudio-${{ env.MINIAUDIO_COMMIT }}\n\n    - name: Download and verify miniaudio\n      if: steps.cache.outputs.cache-hit != 'true'\n      shell: bash\n      run: |\n        curl -sSLo src/miniaudio.h --fail-with-body --retry 3 \\\n          \"https://raw.githubusercontent.com/mackron/miniaudio/$MINIAUDIO_COMMIT/miniaudio.h\"\n\n        if command -v sha256sum >/dev/null 2>&1; then\n          sha256cmd='sha256sum -c'\n        elif command -v shasum >/dev/null 2>&1; then\n          sha256cmd='shasum -a 256 -c'\n        else\n          echo '::error::No SHA-256 utility found'; exit 1\n        fi\n\n        echo \"$MINIAUDIO_SHA256  src/miniaudio.h\" | $sha256cmd\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"monthly\"\n"
  },
  {
    "path": ".github/workflows/build-linux.yml",
    "content": "---\nname: Linux\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\n\nenv:\n  common_packages: >-\n    ninja-build\n\n    libxfixes-dev\n    libxtst-dev\n\n    extra-cmake-modules\n    libwayland-dev\n\n    gnupg2\n\n    xvfb\n    openbox\n    xdotool\n  qt6_packages: >-\n    libegl-dev\n\n    qt6-base-private-dev\n    qt6-base-dev\n    qt6-base-dev-tools\n    qt6-tools-dev\n    qt6-tools-dev-tools\n    qt6-l10n-tools\n    qt6-declarative-dev\n\n    libqt6svg6-dev\n    libqt6svg6\n\n    libkf6guiaddons-dev\n    libkf6guiaddons\n\n    libqt6waylandclient6\n    qt6-wayland\n    qt6-wayland-dev\n    qt6-wayland-dev-tools\n\n    libqca-qt6-dev\n    libqca-qt6-2\n    libqca-qt6-plugins\n\n    qtkeychain-qt6-dev\n  qt5_packages: >-\n    qtbase5-dev\n    qtbase5-dev-tools\n    qtbase5-private-dev\n    qtdeclarative5-dev\n    qttools5-dev\n    qttools5-dev-tools\n\n    libqt5x11extras5-dev\n\n    libqt5svg5-dev\n    libqt5svg5\n\n    libqt5waylandclient5-dev\n    qtwayland5\n    qtwayland5-dev-tools\n\n    libkf5notifications-dev\n\n    libqca-qt5-2-dev\n    libqca-qt5-2\n    libqca-qt5-2-plugins\n\n    qtkeychain-qt5-dev\n  # FIXME: Sending signal to client process does not cause the process\n  # to exit with non-zero code with GitHub Actions. Why?\n  COPYQ_TESTS_SKIP_SIGNAL: '1'\n\njobs:\n  build:\n    name: ${{matrix.buildname}}\n    runs-on: ${{matrix.os}}\n    strategy:\n      # Avoid canceling all jobs on transient failures.\n      fail-fast: false\n      matrix:\n        include:\n          - os: ubuntu-22.04\n            buildname: Qt 5\n            compiler: g++\n            compiler_package: g++\n            with_qt6: false\n            with_native_notifications: true\n            cmake_preset: Debug\n\n          - os: ubuntu-latest\n            buildname: Qt 6\n            compiler: g++\n            compiler_package: g++\n            with_qt6: true\n            with_native_notifications: false\n            test_wayland: true\n            test_gnome: true\n            coverage: true\n            cmake_preset: Debug\n            compiler_flags: >-\n              --coverage\n              -fprofile-arcs\n              -ftest-coverage\n              -fprofile-abs-path\n              -fprofile-update=atomic\n\n          - os: ubuntu-latest\n            buildname: Qt 6 Clang\n            compiler: clang++\n            compiler_package: clang\n            with_qt6: true\n            with_native_notifications: false\n            cmake_preset: Debug\n\n    steps:\n      - name: Checkout source code\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5\n        with:\n          submodules: false\n          fetch-depth: 1\n\n      - name: Enable ccache\n        uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 # v1.2\n        with:\n          key: ${{ github.job }}-${{ matrix.os }}\n\n      - name: Set up ccache\n        run: |\n          export PATH=\"/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH\"\n\n      - name: Install dependencies\n        uses: awalsh128/cache-apt-pkgs-action@acb598e5ddbc6f68a970c5da0688d2f3a9f04d05 # v1\n        with:\n          version: 1.0\n          packages: >-\n            ${{ matrix.compiler_package }}\n            ${{ env.common_packages }}\n            ${{ matrix.with_qt6 && env.qt6_packages || env.qt5_packages }}\n            ${{ matrix.coverage && 'lcov' || '' }}\n            ${{ matrix.coverage && 'kwin-wayland kwin-wayland-backend-virtual libwayland-server0 procps' || '' }}\n            ${{ matrix.test_gnome && 'gnome-shell gnome-shell-common glib2.0-bin' || '' }}\n\n      - name: Download miniaudio\n        uses: ./.github/actions/download-miniaudio\n\n      - name: Build with CMake\n        uses: lukka/run-cmake@af1be47fd7c933593f687731bc6fdbee024d3ff4 # v10\n        with:\n          configurePreset: '${{ matrix.cmake_preset }}'\n          buildPreset: '${{ matrix.cmake_preset }}'\n          configurePresetAdditionalArgs: >-\n            [\n            '-DCMAKE_CXX_COMPILER=${{matrix.compiler}}',\n            '-DCMAKE_CXX_FLAGS=${{matrix.compiler_flags}}',\n            '-DCMAKE_C_FLAGS=${{matrix.compiler_flags}}',\n            '-DWITH_QT6=${{matrix.with_qt6}}',\n            '-DWITH_NATIVE_NOTIFICATIONS=${{matrix.with_native_notifications}}'\n            ]\n\n      - name: Create gnupg directory for tests\n        run: mkdir -p ~/.gnupg && chmod go-rwx ~/.gnupg\n\n      - name: Test on GNOME\n        working-directory: >-\n          ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}\n        if: matrix.test_gnome\n        run: '${{github.workspace}}/utils/github/test-linux-gnome-extension.sh'\n        env:\n          COPYQ_TESTS_EXECUTABLE: >-\n            ${{runner.workspace}}/install/copyq/${{ matrix.cmake_preset }}/bin/copyq\n\n      - name: Test on Wayland\n        working-directory: >-\n          ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}\n        if: matrix.test_wayland\n        run: '${{github.workspace}}/utils/github/test-linux-wayland.sh'\n        env:\n          COPYQ_TESTS_EXECUTABLE: >-\n            ${{runner.workspace}}/install/copyq/${{ matrix.cmake_preset }}/bin/copyq\n\n      - name: Test on X11\n        working-directory: >-\n          ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}\n        run: '${{github.workspace}}/utils/github/test-linux.sh'\n        env:\n          COPYQ_TESTS_EXECUTABLE: >-\n            ${{runner.workspace}}/install/copyq/${{ matrix.cmake_preset }}/bin/copyq\n          COPYQ_TESTS_SKIP_DRAG_AND_DROP: >-\n            ${{ matrix.with_qt6 && '0' || '1' }}\n\n      - name: Update coverage\n        if: matrix.coverage\n        working-directory: >-\n          ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}\n        run: |\n          lcov --capture --directory . \\\n            --base-directory '${{github.workspace}}' \\\n            --no-external \\\n            --rc branch_coverage=1 \\\n            --rc geninfo_no_exception_branch=1 \\\n            --output-file coverage-full.info\n          # Remove 3rd party files in source tree\n          lcov --remove coverage-full.info \\\n              '*/plugins/itemfakevim/fakevim/*' \\\n              '*/src/gui/fix_icon_id.h' \\\n              --output-file coverage.info\n\n      - name: Upload coverage to Codecov\n        if: matrix.coverage\n        uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5\n        with:\n          files: ${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}/coverage.info\n          fail_ci_if_error: true\n          verbose: true\n          token: ${{ secrets.CODECOV_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/build-macos.yml",
    "content": "---\nname: macOS\n\non:\n  push:\n    branches: [master]\n    tags: ['v*']\n  pull_request:\n    branches: [master]\n\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\n\nenv:\n  QT_VERSION: '6.10.2'\n  KF_VERSION: '6.23'\n  KF_PATCH: '0'\n  KF_BRANCH: stable\n  QCA_VERSION: '2.3.10'\n  QTKEYCHAIN_VERSION: '0.15.0'\n\njobs:\n  build:\n    name: ${{matrix.buildname}}\n    runs-on: ${{matrix.os}}\n    strategy:\n      # Avoid canceling all jobs on transient failures.\n      fail-fast: false\n      matrix:\n        include:\n          - os: macos-15-intel\n            buildname: macOS 13\n            bundle_suffix: '-macos-13'\n            cmake_preset: macOS-13\n\n          - os: macos-14\n            buildname: macOS 12 M1\n            bundle_suffix: '-macos-12-m1'\n            cmake_preset: macOS-12-m1\n\n    steps:\n      - name: Checkout source code\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5\n        with:\n          submodules: false\n          fetch-depth: 0\n\n      - name: Enable ccache\n        uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 # v1.2\n        with:\n          key: ${{ github.job }}-${{ matrix.os }}\n          max-size: 1G\n\n      - name: Set up ccache\n        run: |\n          export PATH=\"/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH\"\n\n      - name: Install Qt\n        uses: jurplel/install-qt-action@d325aaf2a8baeeda41ad0b5d39f84a6af9bcf005 # v4\n        with:\n          version: ${{ env.QT_VERSION }}\n          modules: qtimageformats qt5compat\n          cache: true\n          set-env: true\n\n      - name: Set up dependency paths\n        run: |\n          DEPS_PREFIX=$GITHUB_WORKSPACE/deps/install\n          # install-qt-action sets QT_ROOT_DIR but may not set CMAKE_PREFIX_PATH.\n          echo \"DEPS_PREFIX=$DEPS_PREFIX\" >> \"$GITHUB_ENV\"\n          echo \"CMAKE_PREFIX_PATH=${DEPS_PREFIX};${QT_ROOT_DIR}\" >> \"$GITHUB_ENV\"\n\n      - name: Cache dependencies\n        id: cache-deps\n        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4\n        with:\n          path: ${{ github.workspace }}/deps/install\n          key: >-\n            macos-deps-kf${{ env.KF_VERSION }}.${{ env.KF_PATCH\n            }}-qca${{ env.QCA_VERSION\n            }}-qtkeychain${{ env.QTKEYCHAIN_VERSION\n            }}-${{ runner.arch\n            }}-${{ hashFiles('utils/patches/**') }}\n\n      - name: Build dependencies\n        if: steps.cache-deps.outputs.cache-hit != 'true'\n        run: '${{ github.workspace }}/utils/github/build-macos-deps.sh'\n\n      - name: Download miniaudio\n        uses: ./.github/actions/download-miniaudio\n\n      - name: Build with CMake\n        uses: lukka/run-cmake@af1be47fd7c933593f687731bc6fdbee024d3ff4 # v10\n        with:\n          configurePreset: '${{ matrix.cmake_preset }}'\n          buildPreset: '${{ matrix.cmake_preset }}'\n\n      - name: Create gnupg directory for tests\n        run: mkdir -p ~/.gnupg && chmod go-rwx ~/.gnupg\n\n      - name: Get version string\n        id: version\n        run: |\n          version=$(git describe --tags --always HEAD | sed -E \\\n            -e 's/^v([0-9]+\\.[0-9]+\\.[0-9]+)/\\1/' \\\n            -e 's/-([0-9]+).*/\\.\\1/')\n          echo \"version=$version\" >> \"$GITHUB_OUTPUT\"\n          echo \"Version: $version\"\n\n      - name: Create macOS bundle\n        working-directory: '${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}'\n        # Retry cpack due to frequent errors: \"hdiutil: create failed - Resource busy\"\n        run: (cpack || cpack || cpack) && mv -v copyq-*.dmg 'CopyQ-${{ steps.version.outputs.version }}${{ matrix.bundle_suffix }}.dmg'\n\n      - name: Upload macOS bundle\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v4\n        with:\n          name: 'CopyQ-${{ steps.version.outputs.version }}${{ matrix.bundle_suffix }}.dmg'\n          path: '${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}/CopyQ-${{ steps.version.outputs.version }}${{ matrix.bundle_suffix }}.dmg'\n\n      - name: Test\n        working-directory: '${{runner.workspace}}/build/copyq/${{ matrix.cmake_preset }}'\n        run: '${{github.workspace}}/utils/github/test-macos.sh'\n\n      - name: Upload crash reports\n        if: failure()\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v4\n        with:\n          name: 'crash-reports${{ matrix.bundle_suffix }}'\n          path: '~/Library/Logs/DiagnosticReports/*'\n          if-no-files-found: ignore\n\n\n  release:\n    if: startsWith(github.ref, 'refs/tags/v')\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    steps:\n      - name: Download artifacts\n        uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4\n\n      - name: Upload to release\n        uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2\n        with:\n          draft: true\n          files: 'CopyQ-*/*.dmg'\n"
  },
  {
    "path": ".github/workflows/build-windows.yml",
    "content": "---\nname: Windows\n\non:\n  push:\n    branches: [master]\n    tags: ['v*']\n  pull_request:\n    branches: [master]\n\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\n\nenv:\n  QT_VERSION: '6.10.2'\n  KF_VERSION: '6.23'\n  KF_PATCH: '0'\n  KF_BRANCH: stable\n  SNORETOAST_VERSION: '0.9.1'\n  QCA_VERSION: '2.3.10'\n  QTKEYCHAIN_VERSION: '0.15.0'\n  COPYQ_TESTS_SKIP_DRAG_AND_DROP: '1'\n  COPYQ_TESTS_SKIP_BASH: '1'\n  COPYQ_TESTS_NO_SYMLINKS: '1'\n  # There is no audio device on the CI system\n  COPYQ_TESTS_SKIP_AUDIO: '1'\n\njobs:\n  build:\n    name: Windows\n    runs-on: windows-2025\n    defaults:\n      run:\n        shell: bash\n    steps:\n      - name: Checkout source code\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5\n        with:\n          submodules: false\n          # Full history needed for git describe (version string).\n          fetch-depth: 0\n\n      - name: Set up MSVC\n        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1\n        with:\n          arch: x64\n\n      - name: Install Qt\n        uses: jurplel/install-qt-action@d325aaf2a8baeeda41ad0b5d39f84a6af9bcf005 # v4\n        with:\n          version: ${{ env.QT_VERSION }}\n          arch: win64_msvc2022_64\n          modules: qtimageformats qt5compat\n          cache: true\n          set-env: true\n\n      - name: Set OpenSSL path\n        run: echo \"OPENSSL_ROOT_DIR=C:/Program Files/OpenSSL\" >> \"$GITHUB_ENV\"\n\n      - name: Enable sccache\n        uses: hendrikmuhs/ccache-action@5ebbd400eff9e74630f759d94ddd7b6c26299639 # v1.2\n        with:\n          variant: sccache\n          key: windows-msvc\n\n      - name: Set up dependency paths\n        run: |\n          DEPS_PREFIX=\"${GITHUB_WORKSPACE}/deps/install\"\n          echo \"DEPS_PREFIX=$DEPS_PREFIX\" >> \"$GITHUB_ENV\"\n          echo \"$DEPS_PREFIX/bin\" >> \"$GITHUB_PATH\"\n          # Extend CMAKE_PREFIX_PATH with Qt and KDE deps.\n          # install-qt-action sets QT_ROOT_DIR but may not set CMAKE_PREFIX_PATH.\n          echo \"CMAKE_PREFIX_PATH=${DEPS_PREFIX}/lib/cmake;${DEPS_PREFIX}/share/ECM/cmake;${QT_ROOT_DIR}/lib/cmake\" >> \"$GITHUB_ENV\"\n\n      - name: Cache KDE dependencies\n        id: cache-deps\n        uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4\n        with:\n          path: ${{ github.workspace }}/deps/install\n          key: >-\n            windows-deps\n            -kf${{ env.KF_VERSION }}.${{ env.KF_PATCH }}\n            -qca${{ env.QCA_VERSION }}\n            -qtkeychain${{ env.QTKEYCHAIN_VERSION }}\n            -snoretoast${{ env.SNORETOAST_VERSION }}\n            -${{ hashFiles('utils/patches/**') }}\n\n      - name: Build KDE dependencies\n        if: steps.cache-deps.outputs.cache-hit != 'true'\n        run: utils/github/build-windows-deps.sh\n\n      - name: Download miniaudio\n        uses: ./.github/actions/download-miniaudio\n\n      - name: Build with CMake\n        uses: lukka/run-cmake@af1be47fd7c933593f687731bc6fdbee024d3ff4 # v10\n        env:\n          VCPKG_ROOT: ''\n        with:\n          configurePreset: Windows\n          buildPreset: Windows\n          configurePresetAdditionalArgs: >-\n            [\n            '-DWITH_NATIVE_NOTIFICATIONS=TRUE',\n            '-DWITH_QCA_ENCRYPTION=TRUE',\n            '-DWITH_KEYCHAIN=TRUE'\n            ]\n\n\n      - name: Get version string\n        id: version\n        run: |\n          version=$(git describe --tags --always HEAD | sed -E \\\n            -e 's/^v([0-9]+\\.[0-9]+\\.[0-9]+)/\\1/' \\\n            -e 's/-([0-9]+).*/\\.\\1/')\n          echo \"version=$version\" >> \"$GITHUB_OUTPUT\"\n          echo \"Version: $version\"\n\n      - name: Deploy application\n        run: utils/github/deploy-windows.sh\n        env:\n          APP_VERSION: ${{ steps.version.outputs.version }}\n          BUILD_DIR: ${{ runner.workspace }}/build/copyq/Windows\n\n      - name: Set up GPG for tests\n        shell: pwsh\n        run: |\n          $env:PATH = \"C:\\Program Files\\Git\\usr\\bin;$env:PATH\"\n          New-Item -ItemType Directory -Force \"$HOME\\.gnupg\" | Out-Null\n          gpg --version\n\n      - name: Test\n        working-directory: ${{ github.workspace }}/copyq-${{ steps.version.outputs.version }}\n        shell: cmd\n        run: |\n          set \"PATH=%CD%;C:\\Program Files\\Git\\usr\\bin\"\n          .\\copyq-tests.exe\n        env:\n          QT_FORCE_STDERR_LOGGING: 1\n          COPYQ_LOG_LEVEL: DEBUG\n          COPYQ_TESTS_RERUN_FAILED: 1\n          COPYQ_PLUGINS: ${{ github.workspace }}\\copyq-${{ steps.version.outputs.version }}\\itemtests.dll\n\n      - name: Create portable zip\n        run: 7z a \"copyq-${{ steps.version.outputs.version }}.zip\" \"copyq-${{ steps.version.outputs.version }}\"\n\n      - name: Build installer\n        shell: cmd\n        run: |\n          \"%ProgramFiles(x86)%\\Inno Setup 6\\ISCC.exe\" /O\"%GITHUB_WORKSPACE%\" ^\n            /DAppVersion=\"${{ steps.version.outputs.version }}\" ^\n            /DRoot=\"%GITHUB_WORKSPACE%\\copyq-${{ steps.version.outputs.version }}\" ^\n            /DSource=\"%GITHUB_WORKSPACE%\" ^\n            \"%GITHUB_WORKSPACE%\\shared\\copyq.iss\"\n\n      - name: Upload portable zip\n        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4\n        with:\n          name: copyq-${{ steps.version.outputs.version }}.zip\n          path: copyq-${{ steps.version.outputs.version }}.zip\n\n      - name: Upload installer\n        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4\n        with:\n          name: copyq-${{ steps.version.outputs.version }}-setup.exe\n          path: copyq-${{ steps.version.outputs.version }}-setup.exe\n\n\n  release:\n    if: startsWith(github.ref, 'refs/tags/v')\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    steps:\n      - name: Download artifacts\n        uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4\n\n      - name: Upload to release\n        uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2\n        with:\n          draft: true\n          files: |\n            copyq-*/*.zip\n            copyq-*/*.exe\n"
  },
  {
    "path": ".github/workflows/codespell.yml",
    "content": "# Codespell configuration is within .codespellrc\n---\nname: Codespell\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n\npermissions:\n  contents: read\n\njobs:\n  codespell:\n    name: Check for spelling errors\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v5\n      - name: Codespell\n        uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2\n"
  },
  {
    "path": ".gitignore",
    "content": "# Generated CMake files\nCMakeFiles/\nCMakeCache.txt\ncmake_install.cmake\n\n# Generated Visual Studio files\n/plugins/Debug/\n/plugins/Release/\n/plugins/Win*/\n/Debug/\n/Release/\n/Win*/\n*.sln\n*.suo\n*.*sdf\n*.vc?proj*\n\n# Generated Makefiles\n/plugins/Makefile\n/plugins/*/Makefile\n/src/Makefile\n/Makefile\n\n# Generated Qt files\n/plugins/**/*.dir/\n/src/copyqcon.dir/\n/src/copyq.dir/\n/src/copyq_*.qm\n/src/copyq_*.qm.rule\n/src/qrc_copyq.cxx\n/src/translations.qrc\n/src/qrc_translations.cxx\n\nmoc_*\nui_*\n*.depends\n*.o\n*.dylib\n*.moc\n**/qrc_*.cpp\n/.qmake.cache\n/copyq.app\ncopyq.pro.user*\nCMakeLists.txt.user*\n.DS_Store\n.qmake.stash\n*.pyc\n*.dmg\n/build*\n*.qm\n\n# Generated Sphinx files\n/docs/_build\n\n# Generated Flatpak files\n/shared/flatpak/.flatpak-builder\n/shared/flatpak/copyq\n\n# Visual Studio Code\n/.vscode\n\n# Files for utils/launchpad/build.sh\n.gitconfig\nlaunchpad.key\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "---\nimage: ubuntu:24.04\n\nvariables:\n  BUILD_DIR: \"build\"\n  INSTALL_PREFIX: \"copyq\"\n  SCREENSHOT_DIR: \"screenshots\"\n  TESTS_LOG_DIR: \"logs\"\n  DEBIAN_FRONTEND: \"noninteractive\"\n\nbuild:\n  stage: build\n\n  before_script:\n    - utils/gitlab/build-before_script.sh\n\n  script:\n    - utils/gitlab/build-script.sh\n\n  # Upload installed application.\n  artifacts:\n    paths:\n      - \"$INSTALL_PREFIX\"\n\n  cache:\n    paths:\n      - build\n\n# Run simple tests (doesn't require GUI)\ntest:\n  stage: test\n\n  before_script:\n    - utils/gitlab/test-before_script.sh\n\n  script:\n    - utils/gitlab/test-script.sh\n\n  dependencies:\n    - build\n\n# GUI tests (requires X11)\ntest_gui:\n  stage: test\n\n  before_script:\n    - utils/gitlab/test_gui-before_script.sh\n\n  script:\n    - utils/gitlab/test_gui-script.sh\n\n  # Upload screenshots on failure.\n  artifacts:\n    when: on_failure\n    paths:\n      - \"$SCREENSHOT_DIR\"\n      - \"$TESTS_LOG_DIR\"\n\n  dependencies:\n    - build\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "---\nrepos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v6.0.0\n    hooks:\n      - id: check-executables-have-shebangs\n      - id: check-merge-conflict\n      - id: check-xml\n      - id: check-yaml\n      - id: end-of-file-fixer\n      - id: trailing-whitespace\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# Read the Docs configuration file for Sphinx projects\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n---\nversion: 2\n\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.11\"\n\nsphinx:\n  configuration: docs/conf.py\n\npython:\n  install:\n    - requirements: docs/requirements.txt\n"
  },
  {
    "path": ".weblate",
    "content": "[weblate]\nurl = https://hosted.weblate.org/api/\ntranslation = copyq/master\n"
  },
  {
    "path": "AGENTS.md",
    "content": "## Commands\n\nAlways use the following environment variables for all `build/copyq` and\n`build/copyq-tests` commands:\n\n    export COPYQ_SESSION_NAME=\"test\"\n    export COPYQ_SETTINGS_PATH=\"build/copyq-test-conf\"\n    export COPYQ_ITEM_DATA_PATH=\"build/copyq-test-data\"\n    export COPYQ_PLUGINS=\"\"\n    export COPYQ_DEFAULT_ICON=\"1\"\n    export COPYQ_SESSION_COLOR=\"#f90\"\n    export COPYQ_THEME_PREFIX=\"$PWD/shared/themes\"\n    export COPYQ_PASSWORD=\"TEST123\"\n    export COPYQ_LOG_LEVEL=\"DEBUG\"\n    export QT_LOGGING_RULES=\"*.debug=true;qt.*.debug=false\"\n    export QT_QPA_PLATFORM=\"xcb\"\n\nRun CMake to configure build:\n\n    cmake -B build -G Ninja \\\n      -DCMAKE_BUILD_TYPE=Debug \\\n      -DCMAKE_EXPORT_COMPILE_COMMANDS=1 \\\n      -DCMAKE_INSTALL_PREFIX=$PWD/build/install \\\n      -DCMAKE_CXX_FLAGS=\"-ggdb -fdiagnostics-color\" \\\n      -DWITH_TESTS=ON \\\n      -DPEDANTIC=ON .\n\nBuild: `cmake -B build --build`\n\nInstall: `cmake -B build --target install`\n\nTests require X11 session (or Wayland) and a window manager. Use `Xvfb` and\n`openbox` to initialize the testing environment.\n\nAvoid running all tests, always specify a list tests functions to run.\n\nRun tests after build: `build/copyq-tests $TEST_FUNCTIONS`\n\nRun tests for specific plugin: `build/copyq-tests PLUGINS:sync $TEST_FUNCTIONS`\n\nList tests function names: `build/copyq-tests -functions`\n\nList tests function names for a plugin: `build/copyq-tests PLUGINS:image -functions`\n\nStart the server process: `build/copyq`\n\nIn case any process exits with exit code 11 (SIGSEGV) use `coredumpctl` utility\nto find the root cause.\n\nStop the server process: `build/copyq exit`\n\nList server and client logs (server process does not need to run): `build/copyq logs`\n\nRun a script - requires server to be running:\n\n    build/copyq source script.js\n\n    # the above command is equivalent to\n    build/copyq 'source(\"script.js\")'\n\nScripting API documentation is in @docs/scripting-api.rst. After changing it,\nrun @utils/script_docs_to_cpp.py to update the completion popup in the GUI.\n\nUseful scripts (omit the `tab(...)` call to use the default tab):\n\n- `tab('TAB1'); add('ITEM')` - prepend ITEM text item to the TAB1 tab\n- `tab('TAB1'); size()` - item count in the TAB1 tab\n- `tab('TAB1'); read(0,1,2)` - read items at indexes 0, 1 and 2 in the TAB1 tab\n- `config()` - list configuration options with current value and description\n- `config('check_clipboard', 'false')` - set an option\n\n## Project structure\n\n- @plugins - code for various plugins build as dynamic modules loaded optionally by the app\n- @src - main app code\n- @src/app - wrappers for QCoreApplication object\n- @src/common - common functionality, client/server local socket handling, logging\n- @src/gui - GUI widgets and some helper modules\n- @src/item - tab and item data handling, serialization code\n- @src/platform - platform-specific code\n- @src/scriptable - scripting capabilities\n- @src/tests - tests for the main app\n- @src/ui - Qt widget definition files (XML)\n- @qxt - code to handle global system-wide shortcuts\n"
  },
  {
    "path": "AUTHORS",
    "content": "Adam Batkin <adam@batkin.net>\nGiacomo Margarito <giacomomargarito@gmail.com>\nGreg Carp <grcarpbe@gmail.com>\nIlya Plenne <libbkmz.dev@gmail.com>\nJörg Thalheim <joerg@higgsboson.tk>\nKim Jzhone <jzhone@gmail.com>\nKos Ivantsov <kos.ivantsov@gmail.com>\nlightonflux <lightonflux@znn.info>\nLukas Holecek <hluk@email.cz>\nMarjolein Hoekstra <http://twitter.com/cleverclogs>\nMartin Lepadusch <mlepadusch@googlemail.com>\nMatt d'Entremont <mattdentremont@gmail.com>\nMichal Čihař <michal@cihar.com>\nPatricio M. Ros <patricioros.dev@gmail.com>\nRobert Orzanna <robert@orzanna.de>\nRyan Wooden <rygwdn@gmail.com>\nScott Kostyshak <skostysh@princeton.edu>\nSebastian Schuberth <sschuberth@gmail.com>\nTomas Nilzon <tomas.nilzon@telia.com>\nWilfried Caruel <wilfried.caruel@gmail.com>\nx2357 <x2357handle@gmail.com>\n"
  },
  {
    "path": "CHANGES.md",
    "content": "# 13.0.0\n\n## Added\n\n- Windows: Preferences now include auto-start option, previously available only\n  in the installer.\n\n## Changed\n\n- Tabs synchronized with a directory on the disk will now include files from\n  sub-directories (#2638).\n\n- Filtering/searching items in large tabs no longer blocks UI (#3111, #3261).\n\n## Fixed\n\n- Fixes saving edited HTML and setting style in internal editor (#3227).\n\n- Fixes updating selected item colors (#3219).\n\n- Wayland: Fixes clipboard access in KDE Plasma 6.5 (#3228). This requires\n  KGuiAddons library installed on the system.\n\n# 12.0.1\n\n## Fixed\n\n- X11: Fixes registering global shortcuts with modifiers (#3212).\n\n- macOS: Fixes providing builds for Intel architecture.\n\n- Fixes maximum length for session name (it is 16 characters as the error\n  message says, not 15).\n\n# 12.0.0\n\n## Added\n\n- Wayland: Global shortcuts are now registered using Portal if available.\n\n- Black theme (#3142). Thanks to @FadeMind.\n\n- Adds attributes for controlling the dialog window created via `dialog()`\n  (#2947): `.onTop` makes the dialog stay on top of other windows, `.modal`\n  makes the dialog modal (blocks interaction with other windows in the\n  application until closed).\n\n- Adds support showing icon font symbol in notes using\n  `application/x-copyq-item-icon` format.\n\n- Adds support for setting colors in theme files by name. For example:\n  `edit_bg=white`.\n\n## Changed\n\n- Temporary tabs that are not stored on disk will now not expire if\n  configuration changes (#3172).\n\n- Pinned and locked items will not be dropped if tab size (maximum item count)\n  changes (#3008).\n\n- The app now propagates exit code properly if it is aborted or receives a\n  Unix signal (SIGINT, SIGTERM).\n\n- Support for Qt older than 5.15 has been dropped.\n\n- The build now uses Qt 6 by default. Use `cmake -DWITH_QT6=OFF ...` to build\n  the app for Qt 5.\n\n- Windows: The application will be now hidden from screenshots and screen\n  recordings by default (#3165). This can be disabled using option \"Hide from\n  screenshots and recordings\".\n\n- Logs are now stored in multiple files based on the process and the log\n  records have a slightly different format (start with timestamp).\n\n## Fixes\n\n- Drops unsafe sanitizing QTextDocument fonts (#3156). Qt 6 should handle any\n  rich texts safely now.\n\n- Logging now does not use lock files and avoids crashes if the application\n  loop was not yet started.\n\n- Avoids resetting properties of a tab if it is renamed.\n\n- Fixes setting color for item counter (#2717).\n\n- Fixes editing and providing UTF-8 text by default (#3093).\n\n- Fixes updating item preview if when window is shown.\n\n- Fixes changing synchronization directory for a tab.\n\n- Fixes possible crash if calling a function with unexpected function argument.\n\n- Fixes background of the command line in some themes in FakeVim plugin.\n\n- Fixes renaming tabs with item storing disabled.\n\n- Avoids collapsing tab in the tab tree after it is moved.\n\n- Fixes item counter value after moving the tab in the tab tree.\n\n- Fixes moving tab group with items in the tab tree.\n\n- Linux: Fixes storing the first clipboard change after starting the app and\n  modifying configuration.\n\n- Linux: Avoids exiting on commit data request from the session manager (#3145).\n\n# 11.0.0\n\n## Added\n\n- Adds support for dark/light window title scheme.\n\n- New `frameless_window` option (#2570) toggles the main window frame and title\n  bar (if supported by the window manager):\n\n      copyq toggleConfig frameless_window\n\n- Adds support for localizing command names in the command INI files (#3032):\n\n      [Command]\n      Name = ...\n      Name_cs = ...\n      Name_fr = ...\n      Name_pt_BR = ...\n      Name_pt = ...\n\n- Adds support for showing preview for more image formats\n  (namely ico and webp).\n\n- Adds support for more complex network requests in scripts. New\n  `NetworkRequest` class can be used to set custom headers, HTTP method, number\n  of allowed redirects and timeout.\n\n## Changed\n\n- Avoids hiding the main window on backspace (#3107).\n\n- Enables Vi/Emacs navigation (#3012) in menus, and `Ctrl+[` in Vi and `Ctrl+G`\n  in Emacs to work in many other places as `Esc` key (for example, to hide menus,\n  dialogs). Users can override shortcuts, but not some reserved ones in\n  specific cases (mainly, if the item list or a menu has focus).\n\n- Selections and current items/rows/data in scripts now only relate to the\n  tab selected with `tab(...)` in scripts (this is still by default the\n  selected tab when the command started). Affected script functions:\n  - `move()`\n  - `setData()`\n  - `removeData()`\n  - `selectedItems()`\n  - `selectedItemData()`\n  - `setSelectedItemData()`\n  - `setSelectedItemsData()`\n  - `currentItem()`\n  - `ItemSelection().current()`\n\n- Drops unnecessary timeouts when executing commands and actions from scripts.\n\n- Avoids fetching and passing clipboard to `action()`/`execute()` if the\n  commands do not contains `%1` placeholder. This can improve performance.\n\n## Fixed\n\n- Fixes `dialog()`: custom size, layout and resizing (#3003).\n\n- Fixes overriding filter/search string with `filter()` (previously the new\n  value was appended to the current filter).\n\n- Fixes refocusing the item after editing its notes.\n\n- Synchronize plugin: Fixes missing data in the last item when tab is full.\n\n- Windows: Fixes the icon for uninstaller (#2864).\n\n- Fixes build for Qt 6.9 and above.\n\n- Fixes potentially misconfigured log file path at app start (#3087).\n\n- Linux: Avoids auto-hiding the main window when moved on some window managers\n  (#3119).\n\n# 10.0.0\n\n## Added\n\n- Emacs navigation key-bindings support.\n\n- Adds support for setting urgency and persistency to notifications. Script\n  function `notification()` takes new arguments: '.urgency' (low, normal, high,\n  critical), '.persistent' (toggle persistent notification)\n\n## Changed\n\n- Updates icon font from Font-Awesome 6.7.2.\n\n- On Windows, the main window is shown when starting the application using\n  the program icon (#2965).\n\n- Calling `exit()` script function prints \"Terminating server\" on stderr\n  instead of stdout.\n\n## Fixed\n\n- Fixes item selection with Ctrl+Space (#2850).\n\n- Fixes confirming exit if any commands are running.\n\n- Fixes selecting specific row on search (#2770).\n\n- Clipboard data cloning will be now aborted if the data changes during the\n  process. This avoids using incomplete data in rare cases.\n\n- Fixes contrast of the selected row number color (#2887). The row number text\n  color of selected item is set to the same color as item text by default. This\n  can be overridden via \"Edit Theme\" button using option `num_sel_fg`.\n\n- Fixes internal editor syntax highlighting for numbers containing separators\n  (for example `100_000`, `0x1234_abcd`) and avoids incorrectly highlighting\n  multiple lines as regular expression in some cases.\n\n- On GNOME (Wayland session), the clipboard monitor and provider processes run\n  in XWayland mode because GNOME does not support Wayland data control\n  protocol. This behavior can be skipped by settings `QT_QPA_PLATFORM`\n  environment variable to \"wayland\" (or other value).\n\n- On Wayland compositors, fixes unnecessary application start delay if\n  clipboard access (the data control protocol) is not supported.\n\n- On Linux, the \"Ignore items with no or single character\" predefined command\n  properly avoids synchronizing empty text or single character.\n\n- On Linux, fixes waiting on keyboard modifiers release when synchronizing\n  selection.\n\n- Avoids recursive item preview updates when using display commands.\n\n- Avoids removing items if drag'n'drop action fails.\n\n- Wayland: Fixes crash if getting owned clipboard data.\n\n- Wayland: Fixes setting UTF-8 text on broken GNOME's XWayland.\n\n# 9.1.0\n\n## Added\n\n- Allows processing all clipboard changes (#2787, #2746).\n  If clipboard contains secret (for example is copied from a password manager),\n  `onSecretClipboardChanged()` script function is called with data containing\n  `mimeSecret` format set to `1`. Also ensures that callbacks are called\n  consistently for all clipboard changes with properly set formats\n  `mimeClipboardMode`, `mimeOutputTab` and `mimeCurrentTab`.\n\n## Fixed\n\n- Fixes editing multiple items (#2810).\n\n- Fixes synchronization plugin causing redundant UI updates and menu\n  misbehavior (#2649).\n\n- Fixes showing sub-menus for custom commands in tray menu (#2730).\n\n- Fixes switching tab if `onItemsLoaded()` is overridden (#2788).\n\n- Fixes theme option `hover_item_css` (#2687).\n\n- Avoids modifying data from display commands and causing redundant UI updates\n  (#2837).\n\n- Avoids sharing execute() state in case it is launched recursively.\n\n# 9.0.0\n\n## Added\n\n- Adds `editItem()` script function for editing any item format (#2672).\n\n- Item color is now shown in tray menu as the default icon (#2700).\n\n## Changed\n\n- Removes large margins in the tab tree.\n\n- Single action \"Toggle Tag …\" replaces the two separate actions \"Tag as …\" and\n  \"Remove tag …\" for each custom tag (this can make the item context menu a lot\n  more compact).\n\n- Selected items can now be accessed even from commands started from outside\n  the app using global commands or from command line.\n\n- The `dialog()` script function can now be used for asking Yes/No questions\n  without providing any fields. In such case, the function will return `true`\n  instead of `undefined` after accepting the dialog. For example:\n\n      const remove = dialog(\n        '.title', 'Remove Items',\n        '.label', 'Do you really want to remove all items?'\n      );\n\n      if (!remove)\n          abort();\n\n      // remove items ...\n\n- The `execute()` script function now throws an exception when command cannot\n  be executed instead of returning `undefine`.\n\n## Fixed\n\n- Includes many performance improvements for working with large amount of items.\n\n- Fixes triggering menu items by number (#2569).\n\n- Fixes text color in the internal item editor (#2643).\n\n- Fixes showing global shortcuts in tray menu (#2382).\n\n- Fixes passing captured texts to automated commands (#2707).\n\n- Fixes duplicate synchronized items after tagging or modifying data.\n\n- Fixes situation when display commands stop updating items.\n\n- The pre-defined \"Move to tab\" action will be shown only if the current tab is\n  not the same as target tab (#2669). Previously, in such case the item was\n  removed unexpectedly.\n\n- Windows: Detect and ignore secrets from more apps (#2679).\n\n- Linux: Fixes storing previously synchronized clipboard (#2630).\n\n- Linux: Fixes storing selection when \"Store text selected using mouse\" option\n  is enabled but \"Run automatic commands on selection\" is disabled (#2651).\n\n- Linux: Fixes clipboard synchronization with Qt 6 GUI framework.\n\n- Linux: Fixes showing tab tree labels with Qt 6 GUI framework.\n\n# 8.0.0\n\n## Added\n\n- Tab item limit has been increased to 100,000 (#1144).\n\n- New macOS builds for M1/arm64 architectures are available (#1884).\n\n- New Debian/Raspbian builds for arm/arm64 architectures are available.\n\n- Allows overriding item activation using `paste()`.\n\n- Allows overriding script functions to handle some events: items\n  added/removed/changed (`onItemsAdded()`, `onItemsRemoved()`,\n  `onItemsChanged()`), tab items loaded (`onItemsLoaded()`), tab selected\n  (`onTabSelected()`) (#59).\n\n- Allows to cancel removing items by overriding `onItemsRemoved()` script\n  function. If the exit code is non-zero (for example `fail()` is called),\n  items will not be removed. But this can also cause a new items not to be\n  added if the tab is full.\n\n- Allows overriding current clipboard owner (`currentClipboardOwner()`) used by\n  the clipboard monitor process. By default it uses `currentWindowTitle()`.\n\n- Allows using Ctrl+C to copy items even if search entry box is focused unless\n  it has a selection (#2440).\n\n- Linux: Adds build option to disable X11 support (`cmake -DWITH_X11=OFF ...`)\n  (#2532).\n\n- Linux: Adds build option to disable autostart which is useful mainly for\n  Flatpak builds (#2517, #2518).\n\n## Changed\n\n- Windows binaries (which are 64 bit) are now by default installed to \"Program\n  Files\" instead of incorrect \"Program Files (X86)\". After installing the new\n  version, the **old path must be manually removed**.\n\n- Windows and macOS builds are now based on newer Qt 6.\n\n- Avoids accessing clipboard from password managers (#2282, #2495, #2500). This\n  disallows storing and processing such data. Specifically, the clipboard is\n  ignored if it contains following data: `Clipboard Viewer Ignore` on Windows,\n  `application/x-nspasteboard-concealed-type` on macOS,\n  `x-kde-passwordManagerHint` with `secret` value on Linux.\n\n- Large data items in tabs are now stored in separate location unless\n  Synchronize or Encryption plugins are active for the tab. This allows storing\n  more items in tabs while using less memory. The data path can be printed via\n  `copyq info data` command and overridden using `COPYQ_ITEM_DATA_PATH`\n  environment variable. To disable this functionality use `copyq config\n  item_data_threshold -1` - the default value is 1024 and items larger than\n  this amount of bytes are stored in the separate location.\n\n- Command dialog now shows advanced properties for built-in commands allowing\n  to copy the command line to set global shortcut in system.\n\n- Global shortcuts are now also visible in menus (#2382).\n\n- Avoids pasting all image formats as new item.\n\n- Display commands are now applied to tray menu items too.\n\n- Linux: Last stored text item is updated from any new mouse selection only if\n  the item content matches the start or the end of the selection (but not the\n  middle like previously). This may avoid some unexpected item updates.\n\n- Updates icon font from Font-Awesome 6.5.1.\n\n## Fixed\n\n- Fixes drag'n'drop ordering for plugins and commands. This could have caused a\n  missing icon, app crash or various inconsistencies.\n\n- Fixes managing keys with gpg 2.1 and above (#2463, #1208).\n\n- Fixes creating duplicate item with Synchronize plugin when adding a tag for\n  example (#2355).\n\n- Fixes conflicting notes and text with Synchronize plugin (#2355)\n\n- Fixes deleted global object after running scripts (#2542).\n\n- Wayland: Fixes copying images to another app instance.\n\n# 7.1.0\n\n## Changed\n\n- Image editor (if set) will now open instead of built-in text editor when\n  selecting Edit action on image items containing no text.\n\n- Encryption now uses larger/safer keys (#2385).\n\n## Fixed\n\n- Fixes saving and opening empty encrypted tabs.\n\n- Fixes minimal size of dialogs (#2299).\n\n- Fixes importing commands with regular expressions containing slash characters\n  in scripts.\n\n- Fixes font weight with Qt 6.\n\n- Fixes closing the app with Qt 6.\n\n- Fixes the build and calling some script functions with Qt 6.5.\n\n- X11: Fixes crash when entering search with some keyboard layouts (#2171).\n\n# 7.0.0\n\n## Added\n\n- Windows installer has an option to install for current user or all users\n  (#1912).\n\n## Changed\n\n- The preferred format to edit is now \"text/plain;charset=utf-8\" with\n  \"text/plain\" as fallback. Additionally, if no such format is available,\n  \"text/uri-list\" is used.\n\n- Toggle Clipboard Storing menu item uses static text and icon instead of\n  changing these dynamically after each use (#2255).\n\n- Settings integrity is now handled solely by Qt. Previously, additional\n  `*.bak` files where created for configuration files.\n\n- Commands are no longer migrated to the new format on start. The old command\n  configuration file has been last used in version 3.9.0 (released on\n  2019-06-27).\n\n- Native notification text length is limited now to avoid slow downs when\n  showing notifications in some desktop environments. The limit is about\n  100,000 characters and 100 lines.\n\n## Fixed\n\n- Fixes Sort/Reverse Selected Items menu actions (#2267).\n\n- Fixes moving items to a tab in tab bar using drag'n'drop (#1246).\n\n- Fixes possibly buggy window manager frame geometry (#2247).\n\n# 6.4.0\n\n## Added\n\n- Items in menu can be additionally filtered using the item notes (#2170).\n\n- Items can be sorted with a custom order via scripting. For example:\n\n      var sel = ItemSelection().selectAll();\n      const texts = sel.itemsFormat(mimeText);\n      sel.sort(function(i,j){\n          return texts[i] < texts[j];\n      });\n\n## Changed\n\n- More shortcuts and even sequences of shortcuts can be now captured and\n  assigned. This uses new QKeySequenceEdit UI widget from Qt framework.\n\n- UI uses the preferred sans-serif system font in the dark theme.\n\n## Fixed\n\n- Fixes copying items in order they were selected (#2124).\n\n- Fixes re-selecting the edited item after external editor closes.\n\n- Fixes menu theme (#2139).\n\n- Avoids duplicating items from clipboard in synchronized tabs (#2236).\n\n- macOS: Fixes compatibility with macOS 10.15 (#2103).\n\n- Linux: Fixes synchronizing UTF-encoded text to/from primary selection (#2195)\n\n- Wayland: Avoids showing window after a screen is turned on.\n\n- Wayland: Avoids a rare crash while accessing clipboard data.\n\n- Wayland: Fixes pasting to some XWayland apps (#2234)\n\n- X11: Avoids app freeze when entering search mode (#2171).\n\n- X11: Fixes capturing quickly changing clipboard text (ignores unchanged\n  TIMESTAMP).\n\n# 6.3.2\n\n## Fixed\n\n- Fixes potential crash when rendering an empty item list.\n\n# 6.3.1\n\n## Fixed\n\n- Fixes rendering issues (#1728, #2093).\n\n- Fixes the space between row number and the item content. This is customizable\n  with `num_margin` theme option.\n\n- Fixes Qt 6 build.\n\n- Wayland: Fixes synchronizing selection with clipboard with UTF-8 text.\n\n- X11: Fixes tray window popup position on multi-monitor (#2038).\n\n# 6.3.0\n\n## Changed\n\n- UI margins are decreased leaving more space space for item content.\n\n- Script function `config()` now lists current values for each option (#412).\n  Example of new `copyq config` output:\n\n      ...\n      clipboard_notification_lines=3\n        Number of lines to show for new clipboard content.\n\n        Set to 0 to disable.\n      clipboard_tab=&clipboard\n        Name of tab that will automatically store new clipboard content.\n\n        Leave empty to disable automatic storing.\n      close_on_unfocus=false\n        Close main window when other application has focus\n      ...\n\n- FakeVim plugin improvements from upstream:\n\n    * Ignores only full-line comments in configuration file\n    * Support backslashes in substitute command patterns\n    * Partial support for multi-repeat command (:g, :v)\n\n- Improves rendering item list speed.\n\n- Updates icon font from Font-Awesome 6.2.0\n\n## Fixed\n\n- Fixes showing window under mouse cursor (#2088).\n\n- In single-click-activate mode, multiple items can be selected while holding\n  Shift or Ctrl (#2056).\n\n- The pre-defined command \"Ignore items with no or single character\" now also\n  avoids synchronizing selection and showing popup if less than two characters\n  where copied.\n\n- Wayland: Fixes synchronizing selection with clipboard in various cases.\n\n- Wayland: Fixes possible crash when managed clipboard data changes while it is\n  accessed.\n\n# 6.2.0\n\n## Added\n\n- Tabs can now load at least some items from a partially corrupted data file\n  dropping the rest of the items.\n\n- Simpler and safer data saving uses Qt framework (`QSaveFile`).\n\n- New `Settings` class in scripts can be used to manage INI configuration\n  files (#1964).\n\n## Changed\n\n- Obscure untested Save button has been removed from Action dialog.\n\n## Fixed\n\n- Fixes restoring window geometry in a loop (#1946).\n\n- Fixes converting internal byte array representation in scripts in some rare\n  cases.\n\n- Fixes tray menu appearance to follow the configuration (#1896).\n\n- The search history popup menu for will be closed if mouse wheel scrolls and\n  mouse pointer is outside the menu (#1980).\n\n- macOS: Fixes pasting (#2012).\n\n- Windows: Fixes exiting the app on logout (#1249).\n\n- Windows: Workaround to treat native path separators properly and not as\n  special escape characters.\n\n# 6.1.0\n\n## Added\n\n- Users can now customize shortcuts for the built-in editor (#708).\n\n- Users can now set default style sheet for HTML items to override for example\n  color for hyperlinks with `a { color: lightblue }` (#1859). The new settings\n  can be found under Item configuration tab under Text sub-tab.\n\n## Changed\n\n- Window geometry (size and position) restoring is now simpler: The app sets\n  geometry only initially and when the current screen/monitor changes.\n\n  The mouse cursor position indicates the current screen. In case the app\n  cannot inspect the mouse pointer position (for example on some Wayland\n  compositors), it is left up to the window manager to decide to move the\n  window to another screen.\n\n  Users can still disable the automatic geometry by running the following\n  command (in Action dialog or terminal) and restarting the app:\n\n      copyq config restore_geometry false\n\n## Fixed\n\n- Fixes moving items in synchronized tabs after activating them from the\n  context menu (#1897).\n\n- Windows: Fixes tray icon tooltip (#1864).\n\n- Windows: External editor command now treats native path separators properly\n  (#1894, #1868).\n\n- macOS: Fixes crash when pasting from the main window or menu (#1847).\n\n- macOS: Older versions of macOS (down to 10.15) are now supported again\n  (#1866).\n\n- Wayland: Fixes using correct window title icon (#1910).\n\n- Wayland: Fixes retrieving UTF-8 encoded text from selection in environments\n  which supports it.\n\n- Wayland: Fixes restoring window size without breaking window position (window\n  position cannot be set in most or all Wayland compositors).\n\n# 6.0.1\n\n## Fixed\n\n- X11: Fixes global/system-wide shortcuts (#1860).\n\n# 6.0.0\n\n## Added\n\n- Native notifications now have lower urgency if the display interval is less\n  than 10 seconds. This makes clipboard change notification less intrusive.\n\n- Preview dock can be focused with Tab key (#1826). Escape, Tab or Shift+Tab\n  returns focus back to the item list.\n\n- All options are now documented/described when using command `copyq config`.\n\n- Command editor now supports highlighting multi-line strings enclosed by\n  backticks (#1845).\n\n- New option to disable restoring window/dialog geometry (app needs to be\n  restarted after changing the option):\n\n      copyq config restore_geometry false\n\n- macOS: New option to enable native tray menu (#1652):\n\n      copyq config native_tray_menu true\n\n- Support for building the source code with Qt 6 framework.\n\n## Changed\n\n- While search bar is focused, pressing Down or PageDown key now selects next\n  item without focusing the item list (#1834).\n\n- Internal commands (like \"\"Show/hide main window\", Pin/Unpin, Encrypt/Decrypt)\n  will now be automatically updated in following application releases or\n  whenever the language changes. The side-effect is that only icon, shortcuts,\n  enabled state and list order can be changed for these commands. Old internal\n  commands added in previous versions (5.0.0 and lower) of the app need to be\n  removed manually.\n\n- Increases the default delay for storing changed clipboard owner. This can\n  help save correct window title for new clipboard content when the window is\n  closed right after the copy operation. The delay can be changed using:\n\n      copyq config change_clipboard_owner_delay_ms 500\n\n- The application version now excludes the \"v\" prefix in UI and CLI.\n\n- Log Qt warnings by default (at Warning log level messages).\n\n- Linux: Other data formats are now stored for primary selection so as to\n  support some automatic commands properly (for example, ignore selection when\n  it contains a special format). Images and non-plain text formats are still\n  ignored for performance reasons.\n\n## Fixed\n\n- Drag'n'drop operations are now properly ended (#1809).\n\n- Main window will now open only inside the visible screen area (#1768).\n\n- \"Clear Current Tab\" command will no longer show a message dialog if there are\n  pinned items (#1823).\n\n- Improves initial size for native tray menu.\n\n- Fixes removing backup file for old commands configuration.\n\n- Fixes broken item selection state (#1828).\n\n- Fixes hiding main window immediately when shown. This can be caused by long\n  animations in window manager.\n\n- Further performance improvements for logging, application startup and file\n  synchronization.\n\n- Linux: Native status icon (using D-Bus) is used by default instead of the\n  legacy tray icon. Application start delay/sleep hacks should no longer be\n  needed (#1526).\n\n- Wayland: Improved clipboard access.\n\n- Wayland: Fixes selection/clipboard synchronization.\n\n- Windows: Any application instance is now closed automatically before\n  installation.\n\n# v5.0.0\n\n## Added\n\n- Search matches similar accented characters (#1318). For example, searching\n  for \"vacsina\" would also show items containing \"väčšina\".\n\n- If the clipboard tab is renamed, clipboard will be still stored in the\n  renamed tab. Similarly if a specific tab is set for tray menu. This basically\n  modifies `clipboard_tab`, `tray_tab` options when renaming tabs.\n\n- New predefined command to clear the current tab.\n\n- Tabs can be reordered in Preferences (in addition to tab bar/tree).\n\n- Tabs can be reordered from command line or a script. For example:\n\n      copyq 'config(\"tabs\", [\"&clipboard\", \"work\", \"study\"])'\n\n- New buttons can move commands, tabs and plugins in configuration to top and\n  bottom with a single click. This previously required dragging item to the\n  top/bottom or multiple clicks on the move up/down buttons.\n\n- Script function `dialog()` supports non-editable combo box. For example:\n\n      var choice = dialog('.combo:Select', ['a', 'b', 'c'])\n\n- Script function `dialog()` restores last position and size of dialog\n  windows with matching title (set with `.title`).\n\n- Syntax highlighting for more script keywords.\n\n- New script class `ItemSelection` allows more powerful, consistent, safe and\n  fast handling of multiple items. Examples:\n\n      // move matching items to the top of the tab\n      ItemSelection().select(/^prefix/).move(0)\n\n      // remove all items from given tab but keep pinned items\n      ItemSelection(tabName).selectRemovable().removeAll();\n\n## Changed\n\n- Simpler lock file mechanism is used instead of a system semaphore and shared\n  memory lock (#1737). This allows to support more platforms.\n\n- Editor font from Appearance settings is used for the edit widget in Command\n  and Action dialogs (#1757).\n\n- Theme does not modify the scrollbar in item list by default (#1751).\n\n## Removed\n\n- Windows: Migrating old configuration from registry to file format is no\n  longer supported.\n\n## Fixed\n\n- Icons are rendered properly in About dialog. This uses correct icon font\n  from the app instead the one installed on the system.\n\n- Correct UI layout direction is used depending on the selected language\n  (#1696).\n\n- Automatic commands that use regular expressions for matching\n  window title or clipboard content are imported properly\n  (hluk/copyq-commands#45).\n\n- Native notifications are updated correctly when using existing notification\n  ID.\n\n- Bash completion script is installed to a correct path.\n\n- macOS: Fixes pasting/copying when using different keyboard layouts (#1733).\n\n- macOS: Avoids focusing own window before paste operation (#1601).\n\n- macOS: Tries to paste directly to the process ID if the window ID is not\n  available (#1395) (#1686).\n\n# v4.1.0\n\n- Old notification system can now be used instead of native/system\n  notifications (#1620). This can be disabled in Notifications tab in\n  Preferences.\n\n- Additional configuration file for notifications will not be created\n  automatically (#1638).\n\n- In scripting, `console` object can be used for logging, measuring elapsed\n  time and asserting conditions.\n\n- `plugins.itempinned.mimePinned` contains item data format for pinned items\n  (item is pinned if it contains the format).\n\n- Command completion menu contains more complete list of script\n  objects/function and better description.\n\n- Action dialog command, `action()` and commands (if \"Content\"/filter regular\n  expression is unset) now do not replace `%2` through `%9`. This allows\n  passing URLs without requiring to escape encoded characters like `%20` or\n  `%3A`.\n\n- Syntax highlighting for hexadecimal and boolean values in the command editor.\n\n- Fix moving the main window to different display/screen (#1624).\n\n- Windows: Native notifications are disabled on Windows 7 (#1623). This fixes\n  crash because of unsupported features.\n\n- Windows: Fixed crash when loading some themes (#1621).\n\n- Wayland: Restores last stored geometry for a window (since getting current\n  screen does not work).\n\n- MinGW Windows builds are available again (without native notification\n  support).\n\n# v4.0.0\n\n## Features\n\n- Synchronization plugin newly keeps order of new items consistent between\n  multiple application instances (#1558). Newly added items in one instance\n  will appear at the top of other instances.\n\n- Search now finds separate words if regular expressions are disabled (#1569).\n  Searching for \"foo bar\" will find items containing both \"foo\" and \"bar\" and\n  the relative position of words no longer matter.\n\n- System notification popups are now used instead of own implementation.\n\n- Item rows in main window and tray menu are now indexed from one instead of\n  zero by default (#1085). This can be reverted to the old behavior using\n  command `copyq config row_index_from_one false`.\n\n- A tag can be marked as \"locked\" in configuration. Items with such tags cannot\n  be removed until the tag is removed or \"unlocked\".\n\n- Command line completion for bash (#1460). Thanks, Jordan!\n\n- History combo box is focused when Action dialog opens to easily recall recent\n  commands. Note: Focusing combo boxes is not supported on macOS.\n\n- Web plugin has been completely dropped (unmaintained with performance and\n  possible security problems). Simple HTTP rendering is still supported by Text\n  plugin.\n\n- Advanced option `window_paste_with_ctrl_v_regex` to change default paste\n  shortcut Shift+Insert to Ctrl+V for specific windows (only on Windows and\n  Linux/X11). This is regular expression matching window titles.\n\n- New advanced options allow to set intervals and wait times for copying,\n  pasting and window focus:\n\n  * `script_paste_delay_ms` - delay after `paste()`, default is 250ms (#1577)\n  * `window_wait_before_raise_ms`\n  * `window_wait_raised_ms`\n  * `window_wait_after_raised_ms`\n  * `window_key_press_time_ms`\n  * `window_wait_for_modifiers_released_ms`\n\n- Format \"text/plain;charset=utf-8\" is now preferred to \"text/plain\".\n\n- FakeVim: Auto-indents when adding new lines.\n\n## Scripting\n\n- New scripting engine. This adds some new functionality, better ECMAScript\n  support, improved performance and would allow Qt 6 support in the future.\n\n- Argument `--start-server` to both starts the app if not yet running and runs\n  a command (#1590). For example, `copyq --start-server show` would show main\n  window even if the app was not started yet.\n\n- Accessing a missing plugin from script throws an human-readable error and\n  show an popup if uncaught (for example, \"plugins.itemtags\" could throw\n  \"Plugin itemtags is not installed\").\n\n- Script function `setPointerPosition()` throws an error if it fails to set the\n  mouse pointer position.\n\n- Fixes for `NetworkReply` objects to properly fetch data when needed (#1603).\n  Script functions `networkGet()` and `networkPost()` now wait for data to be\n  fetched. New script functions `networkGetAsync()` and `networkPostAsync()`\n  can be used to make asynchronous network request. Property\n  `NetworkReply.finished` can be used to retrieved completion status of a\n  request.\n\n- New script function `styles()` to list possible application styles and option\n  `style` to override the default or current style.\n\n## Platforms\n\n- Wayland support, notably clipboard access and window size restoring.\n\n- Windows: Builds are now 64bit (built by Visual Studio tools).\n\n- Linux: Selecting the app icon in the desktop environment using the installed\n  entry in the application menu or launcher, shows main window immediately.\n  Previously, the app started silently in tray or minimized state.\n\n- Linux/X11: Fixes copying from VirtualBox (#1565).\n\n- macOS: Fix version information (#1552).\n\n## User Interface\n\n- The default theme is kept consistent with system theme (#1613). This also\n  allows to use new special placeholders like `default_bg` and `default_text`\n  in custom style sheet files.\n\n- Command dialog always shows the command type at top.\n\n- Updated icons (Font Awesome 5.15.3).\n\n- FakeVim: Command line not supports better text interaction (select, copy,\n  cut, paste).\n\n## Fixes\n\n- Fix crashed with some custom system themes (#1521).\n\n- Fix importing old saved tabs/configuration (#1501).\n\n- Fix trailing spaces in copied commands.\n\n- Fix filtering shortcuts in preferences.\n\n- Fixes for window geometry restoring.\n\n- Tray menu items are updated only just before the menu is shown.\n\n- Avoid storing \"text/richtext\" by default since displaying of this format is\n  not supported.\n\n- Better performance when updating synchronized items.\n\n- Various appearance and theme fixes (#1559).\n\n## Various\n\n- Code base now follows C++17 standard.\n\n- GitHub Actions now continuously build and test for Linux and macOS, and\n  provide development builds for macOS.\n\n# v3.13.0\n\n- Newly, if a global shortcut is triggered when the main window is active, the\n  command will be executed with item selection and item data available (#1435).\n\n- New `focusPrevious()` script function to activate window that was focused\n  before the main window.\n\n- Export now write data to a temporary file before saving.\n\n- Display command are now also applied on item preview (e.g. to enable syntax\n  highlighting in the preview).\n\n- New command line option \"tray_menu_open_on_left_click\" to check default mouse\n  button behavior for tray icon (`copyq config tray_menu_open_on_left_click\n  true`).\n\n- New command line option \"activate_item_with_single_click\" to activate items\n  with single click (`copyq config activate_item_with_single_click true`).\n\n- New command line options \"filter_regular_expression\" and\n  \"filter_case_insensitive\" to change the item search behavior.\n\n- New command line option \"native_menu_bar\" to disable native/global menu bar\n  (`copyq config native_menu_bar false`).\n\n- Updated icons (Font Awesome 5.15.1)\n\n- Improved performance of loading the icon font.\n\n- Fix crash when exporting large amount of data (#1462).\n\n- Fix entering vi search mode (#1458).\n\n- Fix size of scrollable text area in item preview (#1472).\n\n- OSX: Broken native/global menu bar was replaced by default with application\n  menu bar (#1444). This can be changed with `copyq config native_menu_bar true`.\n\n- OSX: Mouse click on tray icon is now handled similarly to other platforms.\n  This can be changed with `copyq config tray_menu_open_on_left_click true`.\n\n# v3.12.0\n\n- Unsaved data are now saved whenever application is unfocused, otherwise\n  immediately after an item is edited and saved or after ~5 minute intervals if\n  items change. These intervals can be configured - use `copyq config` to list\n  options with `save_delay_` prefix. For example, disable storing after an item\n  is added (only when app is unfocused, exits or tab is unloaded):\n\n      copyq config save_delay_ms_on_item_added -1\n\n- Filter field in commands can now modify menu items. This is done by setting\n  properties to \"menuItem\" object. Example:\n\n      copyq:\n      menuItem['checkable'] = true\n      if (plugins.itempinned.isPinned.apply(this, selectedItems())) {\n          menuItem['checked'] = true\n          menuItem['text'] = 'Unpin'\n          menuItem['color'] = '#f00'\n          menuItem['tag'] = 'X'\n      } else {\n          menuItem['checked'] = false\n          menuItem['text'] = 'Pin'\n          menuItem['icon'] = ''\n      }\n\n- Application icon will no longer automatically change when there is an ongoing\n  operation (i.e. the icon snip animation). This caused performance issues in\n  some environments and it was not tested automatically so it often broke. When\n  clipboard storing is disabled the icon only changes opacity slightly.\n\n- New `preview()` script function shows/hides item preview.\n\n- Avoid terminating application on SIGHUP (#1383)\n\n- Use brighter bar for pinned items with a dark theme (#1398)\n\n- Improved notification text line wrapping (#1409)\n\n- Improved layout when showing many shortcut buttons (#1425)\n\n- Fix indentation when importing commands with CRLF (#1426)\n\n- Fix using the configured notification font (#1393)\n\n- Fix initial item size (avoid scroll bars)\n\n- Fix decrypting item with note\n\n- Fix hiding windows after changing \"Always on Top\" option\n\n- Fix tool bar flickering when browsing items\n\n- Fix crash when destroying main window\n\n- Fix rare crash when menu items change\n\n- FakeVim: Improved completion menu control with Vim emulation\n\n- FakeVim: Always start in normal mode\n\n- FakeVim: Fix searching backwards\n\n- Windows: Paste operation is now postponed until user releases shortcut\n  (#1412). This works better than releasing the shortcut keys automatically and\n  is consistent with behavior on Linux.\n\n- Windows: Fix SSL/TLS errors; `networkGet()` should now work with `https`\n  protocol\n\n- Windows: Fix native GUI style (#1427)\n\n# v3.11.1\n\n- Fix scrolling in selected text items (#1371)\n\n- Fix using application icon font instead of a system-installed on (#1369)\n\n- X11: Fix checking correct text before selection synchronization\n\n# v3.11.0\n\n- Tab character size can now be set (number of spaces) and maps more accurately\n  to space character width (#1341). The default value is 8 spaces which is\n  smaller than before. This can be changed on command line:\n\n      copyq config text_tab_width 4\n\n- New `move()` script function moves selected items within tab.\n\n- New `menuItems()` script function creates custom menus.\n\n- CSS stylesheet files to fully customize appearance\n\n- Allow keyboard navigation in item preview dock\n\n- \"Show Preview\" is now available in File menu instead of Item menu\n\n- Shortcuts Ctrl+P and Ctrl+N selects previous/next action in Action dialog.\n\n- New synchronized item/files are now added to item list ordered alphabetically\n  by filename which is faster and more consistent on multiple platforms than\n  ordering by modification-time (#833).\n\n- Improved performance when synchronizing items/files\n\n- Non-owned synchronized files at the end of item list are now dropped (but not\n  deleted) if the list is full.\n\n- Updated icons (Font Awesome 5.13.0)\n\n- Simpler item scrollbar style\n\n- Omit showing new notification under mouse pointer (#1310)\n\n- Duplicate \"CopyQ Error\" notification are not shown\n\n- Bind x to Delete in Vi style navigation mode\n\n- Left/Right arrow keys now work in FakeVim editor mode by default\n\n- FakeVim editor mode now supports cutting text to given register\n\n- If FakeVim editor mode is active in a dialog, Esc key allows to close the\n\n- Consistent window and dialog titles in application (\" - CopyQ\" suffix)\n  dialog.\n\n- Fix opening tray menu with empty search\n\n- Fix search in main window and tray with different keyboard layouts (#1316)\n\n- Fix restoring search when closing internal editor\n\n- Fix crash when synchronizing pinned items/files (#1311)\n\n- Fix pasting synchronized file instead of its content (#1309)\n\n- Fix enabling menu items with filters in commands (#1284)\n\n- Fix commands for removing tags from items (#1332)\n\n- Fix copying from item preview dock (#1326)\n\n- Fix position of main window on current screen (#1216)\n\n- Fix copying \"text/plain;charset=utf-8\" format as a text (#1324)\n\n- Fix preview search highlight in Appearance configuration (#1354)\n\n- Fix hover/mouse-over style for items (#1347)\n\n- Fix wrapping long notification text\n\n- Fix jitter when scrolling in item list\n\n- Fix item width\n\n- X11: Fix re-getting clipboard content after aborted (#1356)\n\n- Windows: Use builds with Qt 5.13\n\n# v3.10.0\n\n- Use environment variable `COPYQ_DEFAULT_ICON=1` to show the original\n  application icon instead of the one from current icon theme.\n\n- Avoid updating menu too unnecessarily\n\n- Drop using deprecated Qt API and require at least Qt 5.5 (meaning Ubuntu\n  14.04 and Debian 8 are no longer supported)\n\n- Use non-native color and font dialogs which fixes showing these in Gnome/Gtk\n\n- Fix GUI with fractional scaling\n\n- Fix updating tray menu (remove empty sections)\n\n- Fix editing synchronized file content instead of its path\n\n- OSX: Omit preventing system from entering the sleep mode\n\n- X11: Improve clipboard/selection synchronization\n\n- X11: Avoid reading clipboard in parallel in the monitor process\n\n# v3.9.3\n\n- New `loadTheme()` script function loads theme from INI file.\n\n- Currently selected item stays on top on PageUp/Down (less jittery list view\n  scrolling)\n\n- Performance improvements: Updates GUI only when necessary; dedicated\n  processes to run menu filters and display commands; reloads configuration\n  once when setting multiple options with `config()`\n\n- Skips using a command from a disabled plugin\n\n- Logs information on slow menu filters and display commands\n\n- Fix hiding item preview when disabled (caused an empty window to be shown)\n  and when no items are selected\n\n- Fix taking screenshots on multiple monitors\n\n- Fix duplicate show/hide tray menu items\n\n- Fix moving synchronized items to top when activated\n\n- Fix calling `onExit()` second time when on shutdown\n\n- Fix removing empty actions from history in Action dialog\n\n- Fix updating version from Git when rebuilding\n\n- OSX: Fix refocusing correct main window widget\n\n- Windows: Use Qt 5.12.5 builds (MinGW 7.3.0 32-bit, msvc2017 64-bit)\n\n# v3.9.2\n\n- Fix unnecessary tab reloading after expired.\n\n- Fix repeated menu updates.\n\n- Fix loading tabs with an empty item\n\n- Fix initializing expire timeout (it was always 0 or 1 minute)\n\n# v3.9.1\n\n- Commands are moved to a separate configuration file \"copyq-commands.ini\".\n\n- Horizontal tabs in the configuration dialog were replaced with a list of\n  sections so it's possible to view all of the sections even in a smaller\n  window.\n\n- New option `hide_main_window_in_task_bar` to hide window in task bar can be\n  set using `copyq config hide_main_window_in_task_bar true`.\n\n- New `logs()` script function prints application logs.\n\n- New `clipboardFormatsToSave()` script function allows to override clipboard\n  formats to save.\n\n- Some hidden options can be modified using `config()` script function.\n\n- Font sizes in items and editor are limited to prevent application freeze.\n\n- Application icons are cached so as to avoid creating icons for the snip\n  animation again.\n\n- Fix restoring tabs with some non-ASCII characters\n\n- Fix opening window on different screen with different DPI\n\n- Fix 100% CPU utilization on wide screens (5120x1440)\n\n- Fix icon size and GUI margins in Tabs configuration tab\n\n- X11: Fix stuck clipboard access\n\n- X11: Faster selection synchronization\n\n- OSX: Prevent showing font download dialog\n\n- OSX: Fix clipboard owner window title\n\n# v3.9.0\n\n- Large images in clipboard are no longer automatically converted to other\n  formats - it caused slowdowns and was mostly unnecessary since some usable\n  image format was provided.\n\n- The server/GUI process now provides the clipboard and no other process is\n  started (i.e. \"copyq provideClipboard\"). The other process helped to unblock\n  GUI in rare cases when an application requested large amount of clipboard\n  data, but it could cause some slowdowns to start the process.\n\n- Closing external editor focuses the edited item again (if the editor was open\n  from main window).\n\n- Only Global Shortcut commands are shown in tray menu.\n\n- Separate Global and Application shortcuts into tabs in configuration dialog.\n\n- New per-tab configuration allows disabling storing items on disk and limiting\n  number of items.\n\n- New script function unload() and forceUnload() allow unloading tabs from main\n  memory.\n\n- Tabs synchronized with a directory on disk are updated only when needed. An\n  update happens regularly when synced tab has focus or item data and are too\n  old. Update interval is 10s and can be changed by setting env variable\n  COPYQ_SYNC_UPDATE_INTERVAL_MS (in ms).\n\n- X11: New option allows to disable running automatic commands on X11 selection\n  change.\n\n- Fix rare crash on exit.\n\n- Fix value returned by filter() after it's hidden\n\n- Fix memory leak (tool bar and menu items were not properly cleaned up)\n\n- Fix crash when opening content dialog with many formats\n\n- OSX: Fix pixelated UI rendering on retina displays.\n\n- Windows: Fix blocking Ctrl, Shift and other modifier keys after invoking\n  paste action. The downside is that it's no longer possible to invoke command\n  assigned to a global shortcut repeatedly without releasing these keys.\n\n- X11: Fix high CPU usage when mouse selection cannot be accessed.\n\n- X11: Fix assigning global shortcuts with keypad keys\n\n# v3.8.0\n\n- Custom settings from scripts (using settings() function) are now saved in\n  \"copyq-scripts.ini\" file in configuration directory. Existing configuration\n  needs to be moved manually from \"[script]\" section in the main configuration\n  file (\"copyq info config\" command prints the path) to \"[General]\" section to\n  the new file (in the same directory).\n\n- Correct clipboard owner (window title) is now used when the window is hidden\n  after copy operation (e.g. password manager copies password and hides its\n  window immediately).\n\n- New script functions onStart and onExit allow to defined commands run when\n  the application starts and exits.\n\n- New script functions pointerPosition and setPointerPosition to get/set mouse\n  cursor position on screen.\n\n- New script callback onClipboardUnchanged called when clipboard changes but\n  monitored content remains the same.\n\n- Block default shortcut overridden by a command while its filter command needs\n  to run.\n\n- Item selection is not cleared when main window hides in response to\n  activating an item or automatically when unfocused.\n\n- Clipboard dialog opens much faster and retrieves clipboard data only when\n  needed.\n\n- Clipboard dialog contains special clipboard formats and the whole list is\n  sorted - plain text first, HTML, other text, application, application\n  specific (`application/x-`), special (uppercase).\n\n- Detect encoding for other text formats.\n\n- Method text for ByteArray returns correctly formatted text from unicode\n  encoded data (e.g. UTF-8).\n\n- Show pin and tag menu items even if shortcut is not assigned (can be disabled\n  completely in Command dialog).\n\n- Hide encrypt/decrypt commands when keys for Encrypt plugin don't exist.\n\n- Command list is focused when Command dialog opens; the less important \"Find\"\n  field is smaller and moved below the list.\n\n- Process manager is completely redone and the dialog is no longer created at\n  application start (faster application start, smaller memory footprint).\n\n- Process manager has filter field for searching for commands.\n\n- Process manager has new column showing error message.\n\n- Process manager has color status icons for running, starting and failed\n  processes.\n\n- Next/Previous formats are no longer available (were rarely used and\n  untested).\n\n- Updated donation link: https://liberapay.com/CopyQ/\n\n- FakeVim, if enabled, is used for other multi-line text fields in the\n  application (e.g. item notes, command editor).\n- FakeVim, if in a dialog, binds save and quit command to the dialog buttons -\n  `:w` for Apply, `:wq` for OK, `:q` for Cancel.\n- FakeVim status bar shows an icon for errors and warnings.\n- FakeVim now handles set commands correctly.\n- FakeVim text cursor is gray if the editor is not focused.\n\n- Fix opening image editor for encrypted items.\n- Fix opening SVG image editor if the bitmap one is unset.\n- Fix stopping client processes properly.\n- Fix showing main window under mouse pointer (with showAt function).\n- Fix client crash when calling a method without instance (e.g. command \"copyq\n  ByteArray().size\").\n\n- OSX: Fix opening main window above full screen window.\n- OSX: Fix selecting item with Up/Down keys when searching.\n\n- X11: Fix setting wrong window title for own clipboard.\n- X11: Fix synchronizing selection if the change is quick.\n- X11: Fix tray icon on KDE.\n\n# v3.7.3\n- Search and item selection reset when main window is closed\n- Updated icons (Font Awesome 5.6.3)\n- Tray icon animation is not triggered if no automatic commands are run.\n- Improved color themes on some systems\n- Omit auto-hiding main window when it has a dialog open\n- Fix transparency of some icons\n- Fix size of menu when open on different screen\n- Fix window geometry restore and rendering issues\n- Fix auto-hide main window (e.g. on Gnome when using Activities)\n- X11: Fix small tray icon on Gnome\n- X11: Fix icon mask file name according to standard (\"copyq_mask\")\n\n# v3.7.2\n- Backspace deletes last character in tray menu search instead of clearing it\n  completely\n- Window title shows \"<ITEMS>\" label when non-text items are copied\n- Command dialog uses simpler layout for easier command editing\n- Command dialog shows simple command description\n- Remove empty lines at the end of copied and exported commands\n- New script functions to calculate hash: md5sum, sha1sum, sha256sum, sha512sum\n- Retrieving clipboard data is interrupted if it's slow\n- Editing commands no longer causes high CPU usage\n- Completion menu for command editor is resized once\n- Items are rendered faster and are shown with incorrect size initially while\n  scrolling instead of showing empty items\n- When Action dialog opens, the command editor is focused instead of the combo\n  box containing command history (this consistent with default focus behavior\n  on OS X)\n- Clipboard monitor process loads configuration only at start\n- Autostart option now works in the Flatpak package\n- OSX: Application no longer crashes when using the main window close button\n- X11: TIMESTAMP clipboard format is used to avoid retrieving unchanged content\n  unnecessarily\n- X11: Data installation path can be overridden with CMake options\n  (CMAKE_INSTALL_DATAROOTDIR and DATA_INSTALL_PREFIX)\n- X11: Store current window title with new clipboard data right after\n  clipboard-change signal is received\n\n# v3.7.1\n- Store formats specified in Format field in automatic commands\n- Fix restoring geometry on screens with different scaling factors\n- X11: Fix restoring geometry on i3 window manager\n- X11: Fix the first clipboard/selection signal when unchanged\n\n# v3.7.0\n- New option to show notes beside item content\n- Removed option to show icon instead of notes\n- Only plain text is Copied/Pasted from menu if Shift key is pressed\n- Customizable shortcut for Item context menu\n- Remove unmaintained Data plugin (can be replaced with a script)\n- Allow to set icon to tab groups in tree view\n- Allow export even if a tab group or an unloaded tab is selected\n- Automatic commands are no longer run in clipboard monitor context\n- Omit aborting monitor by calling abort() from automatic commands\n- Omit aborting automatic commands by changing configuration\n- Updated icons (Font Awesome 5.4.2)\n- Fix sizes of items with notes and when using Web plugin\n- Fix icons alignment\n- Fix setting different font weights in Appearance configuration\n- Fix button sizes in Appearance configuration\n- Fix position of the context menu for large items\n- Fix server crash when a client disconnected while processing its request\n- Fix crash when changing icon or renaming unloaded tab\n- Fix handling of incorrect editor command\n- X11: Faster and safer clipboard checking and synchronization\n- X11: Prioritize checking clipboard before selection\n\n# v3.6.1\n- Omit displaying notes twice when \"Show simple items\" is enabled\n- Fix broken tab decryption\n\n# v3.6.0\n- Invoking search with a shortcut reuses last search expression\n- Exiting from search (ESC) doesn't unselect found item\n- `COPYQ_SETTINGS_PATH` environment variable overrides default config path\n- Merge top item with same new clipboard text\n- Check clipboard after start\n- Animate app icon when a clipboard changes or a client calls some functions\n- Use gpg for encryption if gpg2 is unavailable\n- Faster tray and context menu updates\n- Close dialog() after client process exits\n- Display system, arch and compiler info when using version()\n- Tests are about 2x faster\n- Updated icons (Font Awesome 5.3.1)\n- Fix search field icon position\n- Fix overriding `onClipboardChanged()` and similar script functions\n- Fix closing client processes\n- Fix deleting temporary timer object\n- Fix handling return values and abort() in afterMilliseconds()\n- Fix icon font sizes and omit using system-installed font\n- Fix showing <EMPTY> label\n- X11: Fix showing window after using close button on Qt 5.11\n- X11: Fix crash when UI scaling is too large\n- Windows: Fix removing old DLLs with installer\n\n# v3.5.0\n- Icon for global shortcuts in Shortcut configuration tab\n- Simpler icons (smaller installation footprint)\n- Faster copying and pasting from the application\n- Faster and simpler invocation for commands run automatically\n- More compact Process Manager dialog\n- Scriptable function select() waits for clipboard to be set\n- Image masks for colorizing icons (\"icon-mask\" and \"icon-busy-mask\")\n- Improved logging\n- Updated icons (Font Awesome 5.0.13)\n- Fix showing icons when \"System icons\" is enabled (Windows and OS X)\n- Fix initial setup for encryption\n- Fix storing SVG images and other XML formats with text\n- Fix stopping clipboard monitor and other processes at exit\n- Fix restarting monitor whenever script commands change\n- Fix updating status in Process Manager\n- Fix using tab() multiple times from script\n- Fix building for Qt 5.11\n- Windows: Use Qt 5.6 LTS version for released binaries\n- OSX: Fix URI list and UTF-16 text clipboard formats\n- X11: Faster clipboard/selection synchronization\n\n# v3.4.0\n- Fix icon sizes in menu\n- Fix showing dialog() above main window\n- Fix closing clipboard monitor and provider on exit\n- Safer data serialization and communication protocol\n- Smoother colorized application icon\n- Faster pasting to target window\n- Run script commands in own context\n- Omit showing same notification multiple times\n- Omit handling text/uri-list by default\n- OSX: Fix opening main window from tray menu\n- OSX: Fix exporting configuration\n- OSX: Fix focusing own windows for pasting\n- Linux: Fix crashing on Wayland\n- X11: Fix showing incorrect clipboard content\n\n# v3.3.1\n- Mark tray menu item in clipboard\n- Scroll view when dragging items to top or bottom\n- Always use current tab name in new tab dialog\n- Update clipboard label in tray menu immediately\n- Raise last window after menu is closed\n- Paste commands correctly even if pasted into text edit widget\n- Unload unneeded tabs after exported/imported\n- Omit slow data compression on export\n- Fix queryKeyboardModifiers() script function\n- Fix settings autostart option from script\n- Fix warnings when trying to load bitmap icons as SVG\n- OSX: Fix settings global shortcuts with some keyboard layouts\n- OSX: Fix tray menu icon size\n- X11: Fix Autostart option\n- X11: Fix crash when icon is too big\n- X11: Omit resetting empty clipboard and selection\n- X11: Omit overriding new clipboard with older selection content\n\n# v3.3.0\n- Add option for searching numbers in item list and tray menu\n- Use exception instead of return code for exportData()/importData()\n- Draw icon shadow (for internal icon font)\n- Remove support for Qt 4, require Qt >= 5.1.0\n- Fix storing only non-empty clipboard items\n- Fix opening web browser from script with open()\n- Fix exiting clipboard provider process when not needed\n- Fix exportData()/importData() with relative file paths\n- Fix SVG app icon resolution in some panels\n- Fix closing window after a menu is closed and window is unfocused\n- Fix icons for command error notifications\n- Fix warnings when using system icons\n- Linux: Fixes for AppData, desktop and flatpak files\n- OSX: Fix pasting items\n- OSX: Log errors when global shortcut registration fails\n\n# v3.2.0\n- Add option to close main window when unfocused\n- Add script command type for enhancing scripting API and CLI\n- Add display command type for overriding item display data\n- Add documentation for plugins scripting API\n- Add script function afterMilliseconds()\n- Add isGlobalShortcut property to commands\n- Allow to set global and menu command shortcuts in preferences\n- New icon appearance (Font Awesome 5)\n- Search in icon dialog (just start typing text)\n- Improve scripting API for plugins\n- Show command type with icon in command dialog\n- Allow to set tray and window icon tag\n- Allow to store MIME types with spaces\n- Allow to set negative offsets for notifications\n- Allow to override clipboard handling with script commands\n- Script functions add() and insert() can add multiple items\n- Hide vertical scroll bar in text items if not needed\n- Hide main tool bar when internal editor is visible\n- Run scripts safely in client process\n- Omit closing internal editor if item changes\n- Smoother scrolling and item browsing\n- Fix accepting dialog() on Ctrl+Enter and Enter\n- Fix sleep() timing out before interval\n- Fix Dir().separator() return value type\n- Fix item rendering\n- Fix window title and tool tip for multi-line clipboard\n- Fix tool bar rendering while editing an item\n- Fix scaling pixel font sizes in HTML items\n- Fix rendering item number in top left corner\n- Fix rendering drag'n'drop preview on high-DPI screens\n- Fix rendering notification icon on high-DPI screens\n- Fix disabling antialiasing\n- Fix opening menu/window on left screen (negative coordinates)\n- Linux: Fix merging X11 selection if the first item is pinned\n- Linux: Fix displaying tray menu on KDE/Plasma\n- Windows: Fix negative item size warnings\n\n# v3.1.2\n- Don't show mouse cursor for selecting text after clicking on item\n- Fix rendering background for item preview dock\n- Fix showing main window under mouse pointer\n- Fix loading tray icon\n- Fix scrollbar interaction in items\n- Fix performance for eliding huge text\n- Fix correct mouse pointer in text items\n- itemtext: Render plain text instead of empty HTML\n- itemtext: Always limit text size in items\n- itemweb: Use some sane settings for items\n- itemencrypted: Copy to selection with copyEncryptedItems()\n\n# v3.1.1\n- Improve performance for items with long lines\n- Linux: Fix tray icon\n\n# v3.1.0\n- Add \"Paste current date and time\" predefined command\n- Add \"Take screenshot\" predefined command\n- Add scriptable function queryKeyboardModifiers()\n- Add scriptable function screenNames()\n- Add scriptable function isClipboard()\n- Add scriptable function toggleConfig()\n- Add scriptable function iconColor()\n- Allow to change icon color using COPYQ_SESSION_COLOR\n- Expand text ellipsis if selected\n- Avoid copying ellipsis if selected and copy rich text only if needed\n- Improved command widget layout\n- Copy encrypted items as hidden in UI\n- Open external editor if internal fails\n- Fix item rendering on high DPI screens\n- Fix tray icon on high DPI screens\n- Fix taking screenshots on multiple monitors and on high DPI screens\n- Fix flicker when rendering items for the first time\n- Fix icon layout for notes\n- Fix showing icon if notes are empty\n- Fix copying/drag'n'dropping files into a synchronized tab\n- Fix long message alignment in notifications\n- Fix activating simple items with double-click\n- Fix styling of current and selected items\n- Fix setting clipboard immediately after start\n- Fix size of items with tags\n- Fix moving multiple items to clipboard and to the top of the list\n- Fix updating global shortcuts with setCommands()\n- Fix clearing search after opening internal editor\n- Fix aborting script execution\n- Fix black scroll bar in items\n- Fix completion popup resizing\n- OSX: Fix some memory leaks\n- Linux: Add manual pages\n- Linux: Fix getting icon for non-default session from theme\n- Linux: Fix settings tab name in KDE/Plasma\n- Linux: Fix restoring with session manager\n- Windows: Add pinned items to installer\n- Windows: Fix saving tab with another plugin\n- Windows: Fix pasting to a window\n- Windows: Fix setting foreground window even if app is in background\n\n# v3.0.3\n- Added new documentation\n- Added option to disable auto-completion for commands\n- Improved image thumbnail rendering\n- Fixed opening window on current screen\n- Fixed item rendering when searching\n- Fixed tab reloading and closing external editor\n- Fixed image sizes\n- Fixed loading plugins on OS X\n- Fixed selecting area in screenshot\n- Fixed rendering and showing tooltip for notes\n- Fixed hang on exit when using QtCurve theme\n\n# v3.0.2\n- Added script functions for listing synchronized tabs and their paths\n- Fixed showing window on current screen\n- Fixed notification position with multiple screens\n- Fixed rendering items when scrolling\n- Fixed pasting from main window after switching tabs\n- Fixed copy/paste to some apps on OS X\n- Fixed focusing editor when closing completion popup on OS X\n- Fixed setting temporary file template from script\n\n# v3.0.1\n- Install themes on OS X\n- Improve pasting to current window\n- Fix crash when the first tab is not loaded\n- Fix crash when reloading tab after closing editor\n- Fix item rendering and UI elements for high DPI displays\n- Fix window focus after closing menu or main window on OS X\n- Fix opening main window on current space on OS X\n- Fix pasting to some windows on OS X\n- Fix navigating item list\n- Fix getting boolean from checkbox in dialog()\n- Fix default move action for drag'n'drop\n- Fix exiting on logout when tray is disabled\n\n# v3.0.0\n- Pinned and protected items\n- Export/import tabs, configuration and commands in one file\n- Create and modify commands from script\n- Create temporary files from script\n- Create notifications with buttons from script\n- Take screenshots using script\n- Allow to process lines on stdout from execute() scriptable using a function\n- Safer and faster encrypt/decrypt commands (need to be re-added)\n- Improved menu scriptable function\n- Improved icon sharpness\n- Improved plugin architecture\n- Improved logging and displaying log\n- Performance and memory consumption improvements\n- Implemented copy() on OS X\n- Fixed focusing menu and windows on OS X\n- Fixed configuration folder path for portable version on Windows\n- Fixed opening menu for a tab\n- Fixed using correct GPG version for encryption\n- Fixed tray menu position in KDE/Plasma\n\n# v2.9.0\n- Set text style in editor\n- Search in editor\n- Quick help in completion popup menu for commands\n- Easier text selection in item preview\n- Show whole text and unscaled image in item preview\n- Improved pasting to windows on Linux/X11\n- Fixed global shortcuts at application start on Linux/X11\n- Fixed closing application from installer on Windows\n- Fixed showing item preview at start\n- Fixed saving position of new tabs and tab lists\n\n# v2.8.3\n- Search items from tray menu\n- Added support for animated gifs (played when selected)\n- Added special formats for automatic commands to sync and store clipboard\n- Added auto-completion for command editor\n- Added scriptable variables for MIME types\n- Fix encryption with new OpenPGP\n- Fix passing big data to commands on Windows\n\n# v2.8.2\n- Simplify appearance of items with notes and tags\n- Support for drag'n'dropping images to more applications\n- Added list widget for custom dialog\n- Fixed opening windows on current screen\n- Fixed tray icon appearance on Linux\n- Fixed focusing tray menu from command\n- Fixed dialog button translation on Windows\n- Fixed passing big data to commands\n\n# v2.8.1\n- All Qt messages are logged\n- Fixed and improved commands for Tags plugin\n- Fixed removing last items when changing item limit\n- Fixed library paths for OS X\n- Fixed pasting items on Windows\n- Fixed copying from script on Windows\n\n# v2.8.0\n- Insert images in editor\n- Show simple items options\n- Item preview window\n- Move to Qt 5 on Windows and newer Linux distros\n- Faster item content listing\n- Simple filter for Log dialog\n- Smooth icons on OS X\n- Fixed system icons\n- Fixed pasting animated images\n- Fixed occasional crashes when finalizing commands with Qt 5\n- Fixed opening log speed on Windows\n- Lithuanian translation\n\n# v2.7.1\n- Colorize items with command\n- Drag'n'drop items in selection order\n- Fixed item selection with \"next\" and \"previous\" commands\n- Fixed encrypting/decrypting items on Windows\n- Fixed occasional client crashes at exit\n- Fixed editor command on OS X\n\n# v2.7.0\n- Log accessible from GUI\n- Performance and memory usage improvements\n- Added scriptable function to set current tab (setCurrentTab())\n- Added scriptable function to modify new items (setData())\n- Appearance fixes\n- Simplified window management\n- Improved pasting to current window on Windows\n- Window geometry fixes\n- Command with Enter shortcut overrides item activate action\n\n# v2.6.1\n- Moved configuration from registry on Windows\n- Fixed shortcuts on Windows\n- Fixed window geometry restoring\n\n# v2.6.0\n- Show item notes in tray and window title\n- Removed broken console executable on Windows\n- Dutch translation\n- Added env() and setEnv() to access and modify environment variables\n- Access shortcut which activated command\n- Fixed closing the application at shutdown on Windows\n- Fixed some global shortcuts on Windows\n- Fixed capturing some shortcuts\n\n# v2.5.0\n- Smarter tab name matching (ignore key hints '&')\n- Fixed omit passing global shortcuts to widgets\n- Fixed autostart option on Ubuntu\n- Fixed window geometry saving and restoring\n- Fixed reading binary input on Windows\n- Fixed clearing configuration\n\n# v2.4.9\n- Added new light theme\n- Added scriptable function focused() to test main window focus\n- Customizable shortcuts for tab navigation\n- Extended item selection\n- Fixed tab expiration and updating context menu\n- Fixed passing text to command from action dialog\n\n# v2.4.8\n- New command to show main window under mouse cursor or at a position with custom size\n- Hide clipboard content when \"application/x-copyq-hidden\" is \"1\"\n- \"Copy next/previous item\" command waits for clipboard to be set\n- Fixed updating window title and tray tool tip on X11\n- Fixed modifying multiple commands in Command dialog\n- Fixed implicit date to string conversions\n\n# v2.4.7\n- Separate dialog for command help\n- Added scriptable function visible() to check main window visibility\n- Linux: Install bitmap icons for menus\n- Linux: Install AppData file\n- Allow to search for specific MIME types stored in items\n- Menu items and customizable shortcut for cycling item format\n- Fixed icon alignment\n- Fixed moving tabs with Qt 5\n- Fixed overriding socket file path (Linux and OS X)\n- Fixed \"Paste as Plain Text\" command (Windows and OS X)\n- Fixed tab tree layout and changing icons for tab groups\n- Fixed URL encoding\n\n# v2.4.6\n- Fixed crash when removing command\n- Fixed encryption/decryption selected items\n- Fixed reading from standard input\n- GUI fixes for high-DPI displays\n\n# v2.4.5\n- Option to save/restore history for filtering items\n- Clipboard changes with unchanged content is ignored\n- Notify about unsaved changes in command dialog\n- Use application icons from current icon theme on Linux\n- Simple error checking for user scripts\n- Fix blocked system shutdown on Linux/X11\n\n# v2.4.4\n- Option to choose tab for storing clipboard\n- Fixed overriding mouse selection (Linux/X11)\n- Fixed window title updates from user commands\n- Fixed toggling window visibility with Qt 5\n- Minor GUI improvements and user command fixes\n\n# v2.4.3\n- Plugin for tagging items\n- Plugins can provide script functions and commands\n- Improved automatic commands execution\n- Fixed gradients, transparency and other style improvements\n- Fixed decryption with newer version of GnuPG\n- Fixes for Qt 5 version\n\n# v2.4.2\n- Send input data to execute()\n- Better clipboard encoding guessing\n- Set tab icon from commands using tabicon()\n- Fixed window title encoding on Windows\n- Fixed restoring window geometry\n- Performance fixes\n- Various bug and usability fixes\n- New logo\n\n# v2.4.1\n- Added scriptable classes File and Dir\n- Added scriptable function settings() for saving custom user data\n- Improved dialog() command\n- Windows: Qt translated strings bundled with application\n- Fixed %1 in command\n- Fixed building with tests and Qt5\n\n# v2.4.0\n- Separate dialog for user commands and global shortcuts\n- Search for item by row number\n- Command highlighting\n- More shortcuts can be mapped on Windows and X11\n- New \"copy\" command to copy from current window to clipboard\n- New \"dialog\" command to show dialog with custom input fields\n- Fixed crash on log out on Windows\n- Fixed clipboard monitoring on Windows\n- Fixed argument encoding from client on Windows\n- Fixed log output when printing messages from multiple processes\n- GUI fixes\n\n# v2.3.0\n- Support for OS X\n- Japanese translation\n- Custom icons for tabs\n- Show item count next to each tab name (optional)\n- Added Process Manager for running and finished commands\n- Scripting improvements\n- Nicer format for copied user commands\n- GUI fixes\n\n# v2.2.0\n- Custom system shortcuts for any user command\n- Drag'n'drop items to tabs\n- Options to set position and maximum size for notifications\n- Option to open windows on same desktop\n- Weblate service for translations (https://hosted.weblate.org/projects/copyq/master/)\n- Commands input and output is UTF-8 only (this fixes encoding issues on Windows)\n- Scripting engine improvements\n- Various GUI improvements and fixes\n- Fix main window position in various X11 window managers\n- Fix crashing with Oxygen GUI style\n- Fix storing images from clipboard on Windows\n- Various GUI improvements and fixes\n\n# v2.1.0\n- French translation\n- Save/load and copy/paste user commands\n- Easier way to write longer commands and scripts\n- Remove formats in clipboard and item content dialogs\n- Command \"toggle\" focuses main window if unfocused (instead of closing)\n- Choose log file and amount of information to log\n- Lot of bugfixes and GUI improvements\n\n# v2.0.1\n- Initial OS X support\n- Configuration moved into installed directory in Windows\n- Change language in configuration\n- New tool bar with item actions\n- Option to apply color theme in tabs, tool bar and menus\n- Allow to match items using a command\n- Focus output item of the last executed command\n- Allow to cancel exit if there are active commands\n- Removed option to hide menu bar (inconsistent behavior)\n- Fix showing lock icon in encrypted items\n\n# v2.0.0\n- Synchronize items with files on disk\n- Faster tab loading and saving (data format was changed; only backward compatible)\n- User can limit size of text items\n- Opening external image editor fixed on Windows\n- New logo and website\n- Lot of other fixes\n\n# v1.9.3\n- Item and tab encryption (using GnuPG)\n- FakeVim plugin for editing items (Vim editor emulation)\n- Drag'n'drop items from and to list\n- Improved appearance for notes\n- Improved search bar\n- New GUI for application and system-wide shortcuts\n- Option to unload tabs after an interval\n- Fixed item sizes and disabling font anti-aliasing\n- Major bug fixes (mainly for Windows) and performance improvements\n\n# v1.9.2\n- Better performance\n- GUI improvements and bugfixes\n\n# v1.9.1\n- Notifications -- customizable theme, timeout and position on screen\n- Optional notification for new clipboard content\n- Autostart option on Linux\n- Reset empty clipboard to previous content\n- More user-friendly item editor\n- Optional font antialiasing\n- Changed layout of configuration dialog\n- Other fixes\n\n# v1.9.0\n- User notes\n- Improved appearance settings with some example themes\n- Tree view for tabs with groups\n- Sessions, i.e. run multiple independent instances\n- Lot of GUI improvements\n- Compatibility with Qt5\n- Bugfixes (crashing on Unity, icon colors etc.)\n\n# v1.8.3\n- Options to hide tab bar and main menu\n- Automatic paste works with more applications under Linux/X11\n- Multi-monitor support\n- Lot of GUI fixes and improvements\n\n# v1.8.2\n- Added shortcut to paste current and copy next/previous item\n- Bugfixes (paste to correct window, show tray menu on Unity, GUI and usability fixes)\n\n# v1.8.1\n- Spanish translation\n- Option and system-wide shortcuts to temporarily disable clipboard storing\n- Option for main window transparency\n- Custom action on item activation\n- Various GUI improvements and bugfixes\n\n# v1.8.0\n- New shortcuts: \"Next/previous item to clipboard\", \"Paste as plain text\"\n- Show clipboard content in main window title and tray tooltip\n- New options for commands (transform current item, close main window)\n- GUI enhancements, faster application start with many tabs and items, lot of bugfixes\n\n# v1.7.5\n- User-settable editor for images\n- Command-line fixes for Windows\n- Commands for items of specified format (MIME type)\n- Tray menu fixes\n\n# v1.7.4\n- Improved automatic paste from tray\n\n# v1.7.3\n- Paste immediately after choosing tray item\n- German translation\n- Support for system-wide shortcuts on Qt 5\n\n# v1.7.2\n- Clipboard content visible in tray tooltip\n\n# v1.7.1\n- Bugfixes for text encoding\n\n# v1.7.0\n- Plugins for saving and displaying clipboard content\n- Bugfixes (lot of refactoring and tests happened)\n\n# v1.6.3\n- Some important bugfixes\n\n# v1.6.2\n- Dialog for viewing item content\n- Improved tray menu\n- Minor GUI updates\n\n# v1.6.1\n- Configurable tray menu\n- Lot of fixes in GUI and bugfixes\n\n# v1.6.0\n- Highlight text and copy text in items\n- Interactive web view\n- Commands for any MIME type\n- e.g. it's possible to create QR Code image from an URL and save it in list\n- Pipe commands using '|' character\n\n# v1.5.0\n- Option to use WebKit to render HTML\n- Wrap text with long lines\n- Faster list rendering\n- Icons from FontAwesome\n- Desktop icon on Linux\n\n# v1.4.1\n- Support for other languages -- right now supports only English and Czech (any help is welcome)\n- New \"insert\" command\n- More safe item saving\n\n# v1.4.0\n- lot of GUI Improvements, faster interaction\n- Automatic commands for matched windows (only on Linux and Windows)\n\n# v1.3.3\n- GUI Improvements\n- New system-wide shortcuts\n- Item editing improved\n\n# v1.3.2\n- Drag'n'Drop to clipboard\n- \"Always on Top\" option\n- Change tab bar position\n- Fix parsing arguments\n\n# v1.3.1\n- GUI improvements\n- Mode for Vi navigation (h, j, k, l keys for movement)\n- Better performance\n\n# v1.3.0\n- Import/export items to/from a file (not compatible with older saved format)\n- Use scripts to handle item history\n- Improved performance\n\n# v1.2.5\n- Save/load items to/from a file\n- Sort selected items\n- Easier tab browsing (left/right arrow keys)\n- GUI improvements\n- More shortcut combinations work on Linux\n\n# v1.2.4\n- Improved commands\n- Fixed and faster scrolling\n- Better tab manipulation\n\n# v1.2.3\n- Bugfixes and major clean-up\n\n# v1.2.2\n- Performance improved\n\n# v1.2.1\n- Save items from commands in other tabs\n- Missing icons in Windows version\n\n# v1.2.0\n- Appearance settings\n- Tab manipulation from command line\n- Copy/paste items from/to tabs\n- Faster searching\n\n# v1.1.0\n- Better performance\n- New configuration options\n- Improved command line\n\n# v1.0.2\n- Improved Windows compatibility\n- Global shortcuts\n- Automatic commands\n\n# v1.0.1\n- Compatibility with different platforms\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.16)\nproject(copyq)\n\nif (APPLE)\n    set(COPYQ_EXECUTABLE_NAME \"CopyQ\")\nelse()\n    set(COPYQ_EXECUTABLE_NAME copyq)\nendif()\n\n# C++17\nset(CMAKE_CXX_STANDARD 17)\n\nset(CMAKE_CXX_VISIBILITY_PRESET hidden)\nset(CMAKE_C_VISIBILITY_PRESET hidden)\nset(CMAKE_VISIBILITY_INLINES_HIDDEN ON)\n\nif(CMAKE_BUILD_TYPE MATCHES Debug)\n    set(COPYQ_DEBUG ON)\n    add_definitions( -DCOPYQ_DEBUG  )\nendif()\n\nOPTION(PEDANTIC \"Enable all compiler warnings\" OFF)\n\n# Options (cmake -LH)\nOPTION(WITH_PLUGINS \"Compile plugins\" ON)\nOPTION(WITH_QCA_ENCRYPTION \"Enable QCA-based tab encryption\" ON)\nOPTION(WITH_KEYCHAIN \"Enable system keyring integration using QtKeychain\" ON)\nOPTION(WITH_GNOME_CLIPBOARD_EXTENSION \"Install GNOME extension, required for clipboard monitoring\" ON)\nOPTION(WITH_AUDIO \"Build with audio playback support (miniaudio)\" ON)\n\nadd_definitions( -DQT_USE_STRINGBUILDER  )\n\nif (WIN32)\n    # Prevent windows.h from defining min/max macros that conflict with std::min/std::max.\n    add_definitions( -DNOMINMAX )\nendif()\n\n# Unix-specific options\nif (UNIX AND NOT APPLE)\n    include(GNUInstallDirs)\n    set(DATA_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}\" CACHE PATH \"Install path for data\")\n    set(PLUGIN_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}/${CMAKE_SHARED_MODULE_PREFIX}/copyq/plugins\" CACHE PATH \"Install path for plugins\")\n    set(ICON_INSTALL_PREFIX \"${DATA_INSTALL_PREFIX}/icons/hicolor/scalable/apps\" CACHE PATH \"Install path for icons\")\n    set(ICON_INSTALL_PREFIX_TEMPLATE \"${DATA_INSTALL_PREFIX}/icons/hicolor/%SIZE%/apps\" CACHE PATH \"Install path for icons (%SIZE% is icon size)\")\n    set(THEME_INSTALL_PREFIX \"${DATA_INSTALL_PREFIX}/copyq/themes\" CACHE PATH \"Install path for themes\")\n    set(DESKTOP_INSTALL_PREFIX \"${DATA_INSTALL_PREFIX}/applications\" CACHE PATH \"Install path for desktop file\")\n    set(APPDATA_INSTALL_PREFIX \"${DATA_INSTALL_PREFIX}/metainfo\" CACHE PATH \"Install path for AppData file\")\n    set(MANPAGE_INSTALL_PREFIX \"${CMAKE_INSTALL_MANDIR}/man1\" CACHE PATH \"Install path for manual pages\")\n    set(TRANSLATION_INSTALL_PREFIX \"${DATA_INSTALL_PREFIX}/copyq/translations\" CACHE PATH \"Install path for translations\")\n    set(BASH_COMPLETION_INSTALL_PREFIX \"${DATA_INSTALL_PREFIX}/bash-completion/completions/\" CACHE PATH \"Install path for bash completions\")\n    set(ICON_NAME \"copyq\" CACHE STRING \"Name for icon files\")\n    set(COPYQ_AUTOSTART_COMMAND \"\" CACHE STRING \"Autostart command\")\n    OPTION(COPYQ_AUTOSTART \"Enable autostart option\" ON)\nendif()\n\nset(CMAKE_AUTOMOC ON)\n\nOPTION(WITH_QT6 \"Enable Qt 6\" ON)\nif (WITH_QT6)\n    set(QT_DEFAULT_MAJOR_VERSION 6)\n    find_package(Qt6Widgets 6.1.0 REQUIRED)\n    set(copyq_qt Qt6)\n    add_definitions( -DQT_DEPRECATED_WARNINGS_SINCE=0x051500 )\nelse()\n    set(QT_DEFAULT_MAJOR_VERSION 5)\n    find_package(Qt5Widgets 5.15.0 REQUIRED)\n    set(copyq_qt Qt5)\nendif()\n\nlist(APPEND copyq_LIBRARIES ${copyq_qt}::Widgets)\n\n# QCA encryption support\nif (WITH_QCA_ENCRYPTION)\n    find_package(Qca-qt${QT_DEFAULT_MAJOR_VERSION} REQUIRED)\n    list(APPEND copyq_LIBRARIES qca-qt${QT_DEFAULT_MAJOR_VERSION})\n    add_definitions(-DWITH_QCA_ENCRYPTION)\n    message(STATUS \"QCA encryption support enabled\")\nelse()\n    message(STATUS \"QCA encryption support DISABLED\")\n    set(WITH_KEYCHAIN OFF)\nendif()\n\n# QtKeychain support for system keyring integration\nif (WITH_KEYCHAIN)\n    find_package(Qt${QT_DEFAULT_MAJOR_VERSION}Keychain REQUIRED)\n    list(APPEND copyq_LIBRARIES qt${QT_DEFAULT_MAJOR_VERSION}keychain)\n    add_definitions(-DWITH_KEYCHAIN)\n    message(STATUS \"Keychain support enabled\")\nelse()\n    message(STATUS \"Keychain support disabled\")\nendif()\n\nset(copyq_APP_ID          com.github.hluk.copyq)\nset(copyq_ICON_PREFIX     src/images/icon)\nset(copyq_ICON_NORMAL     src/images/icon.svg)\nset(copyq_ICON_MASK       src/images/icon_mask.svg)\nset(copyq_DESKTOP         shared/${copyq_APP_ID}.desktop)\nset(copyq_APPDATA         shared/${copyq_APP_ID}.metainfo.xml)\nset(copyq_BASH_COMPLETION shared/copyq-completion)\nset(copyq_MANPAGE         shared/copyq.1)\n\n# Be more strict while compiling debugging version\nif(CMAKE_COMPILER_IS_GNUCXX OR \"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"Clang\")\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wno-long-long\")\n    set(CMAKE_CXX_FLAGS_DEBUG\n        \"${CMAKE_CXX_FLAGS_DEBUG} -Wextra -Wall -pedantic -Wfloat-equal -Woverloaded-virtual -Wundef -Wno-inconsistent-missing-destructor-override -Wno-variadic-macro-arguments-omitted\")\nendif()\n\nif (PEDANTIC)\n    if (CMAKE_COMPILER_IS_GNUCXX)\n        list(APPEND copyq_pedantic_flags\n            -Wextra -Wall\n            -Wsuggest-override\n            -Wlogical-op\n            -Wnoexcept\n            -Wstrict-null-sentinel\n            )\n    else()\n        list(APPEND copyq_pedantic_flags\n            -Weverything\n            -Winconsistent-missing-override\n            -Wno-c++98-compat\n            -Wno-c++98-compat-pedantic\n            -Wno-disabled-macro-expansion\n            -Wno-double-promotion\n            -Wno-exit-time-destructors\n            -Wno-extra-semi-stmt\n            -Wno-inconsistent-missing-destructor-override\n            -Wno-redundant-parens\n            -Wno-shadow-field\n            -Wno-shadow-field-in-constructor\n            -Wno-shorten-64-to-32\n            -Wno-sign-conversion\n            -Wno-suggest-destructor-override\n            -Wno-unknown-warning-option\n            -Wno-used-but-marked-unused\n            -Wno-weak-vtables\n            -Wno-switch-default\n            -fcomment-block-commands=retval\n            )\n    endif()\n\n    list(APPEND copyq_pedantic_flags\n        -pedantic\n        -Wcast-align\n        -Wctor-dtor-privacy\n        -Wdisabled-optimization\n        -Wformat=2\n        -Winit-self\n        -Wmissing-declarations\n        -Wmissing-include-dirs\n        -Wold-style-cast\n        -Woverloaded-virtual\n        -Wredundant-decls\n        -Wstrict-overflow=4\n        -Wundef\n        )\n\n    list(APPEND copyq_pedantic_flags\n        -Wno-padded\n        -Wno-switch-enum\n        )\nendif()\n\ninclude(src/version.cmake)\nmessage(STATUS \"Building CopyQ version ${copyq_version}.\")\n\nif (UNIX AND NOT APPLE)\n    install(FILES ${copyq_ICON_NORMAL}     DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}.svg)\n    install(FILES ${copyq_ICON_MASK}       DESTINATION ${ICON_INSTALL_PREFIX} RENAME ${ICON_NAME}_mask.svg)\n    install(FILES ${copyq_APPDATA}         DESTINATION ${APPDATA_INSTALL_PREFIX})\n    install(FILES ${copyq_MANPAGE}         DESTINATION ${MANPAGE_INSTALL_PREFIX})\n    install(FILES ${copyq_BASH_COMPLETION} DESTINATION ${BASH_COMPLETION_INSTALL_PREFIX} RENAME copyq)\n\n    if (WITH_GNOME_CLIPBOARD_EXTENSION)\n        set(copyq_GNOME_EXTENSION_DESTINATION \"${DATA_INSTALL_PREFIX}/gnome-shell/extensions/copyq-clipboard@hluk.github.com\")\n        install(FILES\n            shared/gnome-extension/extension.js\n            shared/gnome-extension/metadata.json\n            DESTINATION \"${copyq_GNOME_EXTENSION_DESTINATION}\")\n    endif()\n\n    configure_file(${copyq_DESKTOP}.in ${copyq_DESKTOP})\n    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${copyq_DESKTOP} DESTINATION ${DESKTOP_INSTALL_PREFIX})\n\n    foreach (copyq_ICON_EXTENT 16 22 24 32 48 64 128)\n        set(copyq_ICON_SIZE \"${copyq_ICON_EXTENT}x${copyq_ICON_EXTENT}\")\n        string(REPLACE \"%SIZE%\" \"${copyq_ICON_SIZE}\" copyq_ICON_TARGET_PREFIX \"${ICON_INSTALL_PREFIX_TEMPLATE}\")\n        foreach (copyq_ICON_TYPE \"\")\n            install(FILES \"${copyq_ICON_PREFIX}${copyq_ICON_TYPE}_${copyq_ICON_SIZE}.png\" DESTINATION \"${copyq_ICON_TARGET_PREFIX}\" RENAME \"${ICON_NAME}${copyq_ICON_TYPE}.png\")\n        endforeach()\n    endforeach()\n\n    set(copyq_THEME_INSTALL_PREFIX ${THEME_INSTALL_PREFIX})\n    file(GLOB copyq_THEMES shared/themes/*.css shared/themes/*.ini)\n    install(FILES ${copyq_THEMES} DESTINATION ${THEME_INSTALL_PREFIX})\n\n    add_definitions( -DCOPYQ_ICON_PREFIX=\"${ICON_INSTALL_PREFIX}/${ICON_NAME}\" )\n    add_definitions( -DCOPYQ_THEME_PREFIX=\"${THEME_INSTALL_PREFIX}\" )\n    add_definitions( -DCOPYQ_PLUGIN_PREFIX=\"${PLUGIN_INSTALL_PREFIX}\" )\n    add_definitions( -DCOPYQ_DESKTOP_FILE=\"${DESKTOP_INSTALL_PREFIX}/${copyq_APP_ID}.desktop\" )\n    add_definitions( -DCOPYQ_TRANSLATION_PREFIX=\"${TRANSLATION_INSTALL_PREFIX}\" )\n    add_definitions( -DCOPYQ_BASH_COMPLETION_PREFIX=\"${BASH_COMPLETION_INSTALL_PREFIX}\" )\n    add_definitions( -DCOPYQ_ICON_NAME=\"${ICON_NAME}\" )\n\n    if (COPYQ_AUTOSTART)\n        add_definitions( -DCOPYQ_AUTOSTART )\n    endif()\n\n    if (COPYQ_AUTOSTART_COMMAND)\n        add_definitions( -DCOPYQ_AUTOSTART_COMMAND=\"${COPYQ_AUTOSTART_COMMAND}\" )\n    endif()\nelseif (APPLE)\n    set(copyq_themes_dest_dir \"${COPYQ_EXECUTABLE_NAME}.app/Contents/Resources/themes\")\n    file(GLOB copyq_THEMES shared/themes/*.css shared/themes/*.ini)\n    install(FILES ${copyq_THEMES} DESTINATION \"${copyq_themes_dest_dir}\" COMPONENT Runtime)\nendif()\n\nif (MSVC)\n    include(InstallRequiredSystemLibraries)\nendif()\n\nadd_definitions( -DQT_NO_CAST_TO_ASCII )\n\nset_property(GLOBAL PROPERTY COPYQ_INSTALLED_PLUGINS)\n\nif (WITH_PLUGINS)\n    add_subdirectory(plugins)\nendif()\n\nadd_subdirectory(src)\n"
  },
  {
    "path": "CMakePresets.json",
    "content": "{\n    \"version\": 6,\n    \"configurePresets\": [\n        {\n            \"name\": \"Debug\",\n            \"generator\": \"Ninja\",\n            \"binaryDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"installDir\": \"${sourceParentDir}/install/copyq/${presetName}\",\n            \"cacheVariables\": {\n                \"WITH_TESTS\": \"TRUE\",\n                \"WITH_QCA_ENCRYPTION\": \"TRUE\",\n                \"PEDANTIC\": \"TRUE\",\n                \"CMAKE_BUILD_TYPE\": \"Debug\",\n                \"CMAKE_C_COMPILER_LAUNCHER\": \"ccache\",\n                \"CMAKE_CXX_COMPILER_LAUNCHER\": \"ccache\"\n            }\n        },\n        {\n            \"name\": \"macOS-10\",\n            \"generator\": \"Ninja\",\n            \"binaryDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"installDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"cacheVariables\": {\n                \"WITH_QT6\": \"TRUE\",\n                \"WITH_TESTS\": \"TRUE\",\n                \"CMAKE_PREFIX_PATH\": \"$penv{CMAKE_PREFIX_PATH}\",\n                \"CMAKE_OSX_DEPLOYMENT_TARGET\": \"10.15\",\n                \"CMAKE_C_COMPILER_LAUNCHER\": \"ccache\",\n                \"CMAKE_CXX_COMPILER_LAUNCHER\": \"ccache\",\n                \"CMAKE_CXX_FLAGS\": \"-Wno-deprecated-declarations\"\n            }\n        },\n        {\n            \"name\": \"macOS-13\",\n            \"generator\": \"Ninja\",\n            \"binaryDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"installDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"cacheVariables\": {\n                \"WITH_QT6\": \"TRUE\",\n                \"WITH_TESTS\": \"TRUE\",\n                \"CMAKE_PREFIX_PATH\": \"$penv{CMAKE_PREFIX_PATH}\",\n                \"CMAKE_OSX_DEPLOYMENT_TARGET\": \"13.0\",\n                \"CMAKE_C_COMPILER_LAUNCHER\": \"ccache\",\n                \"CMAKE_CXX_COMPILER_LAUNCHER\": \"ccache\",\n                \"CMAKE_CXX_FLAGS\": \"-Wno-deprecated-declarations\"\n            }\n        },\n        {\n            \"name\": \"macOS-12-m1\",\n            \"generator\": \"Ninja\",\n            \"binaryDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"installDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"cacheVariables\": {\n                \"WITH_QT6\": \"TRUE\",\n                \"WITH_TESTS\": \"TRUE\",\n                \"CMAKE_PREFIX_PATH\": \"$penv{CMAKE_PREFIX_PATH}\",\n                \"CMAKE_OSX_DEPLOYMENT_TARGET\": \"12\",\n                \"CMAKE_OSX_ARCHITECTURES\": \"arm64\",\n                \"CMAKE_C_COMPILER_LAUNCHER\": \"ccache\",\n                \"CMAKE_CXX_COMPILER_LAUNCHER\": \"ccache\",\n                \"CMAKE_CXX_FLAGS\": \"-Wno-deprecated-declarations\"\n            }\n        },\n        {\n            \"name\": \"Windows\",\n            \"generator\": \"Ninja\",\n            \"binaryDir\": \"${sourceParentDir}/build/copyq/${presetName}\",\n            \"installDir\": \"${sourceParentDir}/install/copyq/${presetName}\",\n            \"cacheVariables\": {\n                \"WITH_QT6\": \"TRUE\",\n                \"WITH_TESTS\": \"TRUE\",\n                \"CMAKE_PREFIX_PATH\": \"$penv{CMAKE_PREFIX_PATH}\",\n                \"CMAKE_BUILD_TYPE\": \"Release\",\n                \"CMAKE_C_COMPILER_LAUNCHER\": \"sccache\",\n                \"CMAKE_CXX_COMPILER_LAUNCHER\": \"sccache\",\n                \"CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION\": \".\"\n            }\n        }\n    ],\n    \"buildPresets\": [\n        {\n            \"name\": \"Debug\",\n            \"configurePreset\": \"Debug\",\n            \"configuration\": \"Debug\",\n            \"targets\": \"install\"\n        },\n        {\n            \"name\": \"macOS-10\",\n            \"configurePreset\": \"macOS-10\",\n            \"configuration\": \"Release\",\n            \"targets\": \"install\"\n        },\n        {\n            \"name\": \"macOS-13\",\n            \"configurePreset\": \"macOS-13\",\n            \"configuration\": \"Release\",\n            \"targets\": \"install\"\n        },\n        {\n            \"name\": \"macOS-12-m1\",\n            \"configurePreset\": \"macOS-12-m1\",\n            \"configuration\": \"Release\",\n            \"targets\": \"install\"\n        },\n        {\n            \"name\": \"Windows\",\n            \"configurePreset\": \"Windows\",\n            \"configuration\": \"Release\",\n            \"targets\": \"install\"\n        }\n    ],\n    \"packagePresets\": [\n        {\n            \"name\": \"macOS-10\",\n            \"configurePreset\": \"macOS-10\"\n        },\n        {\n            \"name\": \"macOS-13\",\n            \"configurePreset\": \"macOS-13\"\n        },\n        {\n            \"name\": \"macOS-12-m1\",\n            \"configurePreset\": \"macOS-12-m1\"\n        }\n    ]\n}\n"
  },
  {
    "path": "Doxyfile",
    "content": "# Doxyfile 1.7.4\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a hash (#) is considered a comment and will be ignored.\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded\n# by quotes) that should identify the project.\n\nPROJECT_NAME           =\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\nPROJECT_NUMBER         =\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          =\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       =\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       =\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = YES\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given extension.\n# Doxygen has a built-in mapping, but you can override or extend it using this\n# tag. The format is ext=language, where ext is a file extension, and language\n# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,\n# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make\n# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions\n# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate getter\n# and setter methods for a property. Setting this option to YES (the default)\n# will make doxygen replace the get and set methods by a property in the\n# documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n# determine which symbols to keep in memory and which to flush to disk.\n# When the cache is full, less often used symbols will be written to disk.\n# For small to medium size projects (<1000 input files) the default value is\n# probably good enough. For larger projects a too small cache size can cause\n# doxygen to be busy swapping symbols to and from disk most of the time\n# causing a significant performance penalty.\n# If the system has enough physical memory increasing the cache will improve the\n# performance by keeping more symbols in memory. Note that the value works on\n# a logarithmic scale so increasing the size by one will roughly double the\n# memory usage. The cache size is given by this formula:\n# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n# corresponding to a cache size of 2^16 = 65536 symbols\n\nSYMBOL_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = YES\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# If the sources in your project are distributed over multiple directories\n# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy\n# in the documentation. The default is NO.\n\nSHOW_DIRECTORIES       = NO\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.\n# This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. The create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = src/include src\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *.cpp *.h\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = NO\n\n# The EXCLUDE tag can be used to specify files and/or directories that should\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n\nEXCLUDE                =\n\n# The EXCLUDE_SYMLINKS tag can be used select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       =\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        =\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       =\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.\n# If FILTER_PATTERNS is specified, this tag will be\n# ignored.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.\n# Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.\n# The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C and C++ comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.\n# Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see http://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = YES\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n# for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            =\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If the tag is left blank doxygen\n# will generate a default style sheet. Note that doxygen will try to copy\n# the style sheet file to the HTML output directory, so don't put your own\n# stylesheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the stylesheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see http://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = YES\n\n# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,\n# files or namespaces will be aligned in HTML using tables. If set to\n# NO a bullet list will be used.\n\nHTML_ALIGN_MEMBERS     = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded. For this to work a browser that supports\n# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox\n# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n#  will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index at\n# top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it.\n\nDISABLE_INDEX          = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 4\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n\nGENERATE_TREEVIEW      = NO\n\n# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,\n# and Class Hierarchy pages using a tree view instead of an ordered list.\n\nUSE_INLINE_TREES       = NO\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see http://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to the\n# mathjax.org site, so you can quickly see the result without installing\n# MathJax, but it is strongly recommended to install a local copy of MathJax\n# before deployment.\n\nMATHJAX_RELPATH        = http://www.mathjax.org/mathjax\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a PHP enabled web server instead of at the web client\n# using Javascript. Doxygen will generate the search PHP script and index\n# file to put on the web server. The advantage of the server\n# based approach is that it scales better to large projects and allows\n# full text search. The disadvantages are that it is more difficult to setup\n# and does not have live searching capabilities.\n\nSERVER_BASED_SEARCH    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = a4\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_SCHEMA             =\n\n# The XML_DTD tag can be used to specify an XML DTD,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\nXML_DTD                =\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.\n# This is useful\n# if you want to understand what is going on.\n# On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             =\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles.\n# Optionally an initial location of the external documentation\n# can be added for each tagfile. The format of a tag file without\n# this location is as follows:\n#\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths or\n# URLs. If a location is present for each tag, the installdox tool\n# does not have to be run to correct the links.\n# Note that each tag file must have a unique name\n# (where the name does NOT include the path)\n# If a tag file is not located in the directory in which doxygen\n# is run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = YES\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 0\n\n# By default doxygen will write a font called Helvetica to the output\n# directory and reference it in all dot files that doxygen generates.\n# When you want a differently looking font you can specify the font name\n# using DOT_FONTNAME. You need to make sure dot is able to find the font,\n# which can be done by putting it in a standard location or by setting the\n# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory\n# containing the font.\n\nDOT_FONTNAME           = Ubuntu\n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the output directory to look for the\n# FreeSans.ttf font (which doxygen will put there itself). If you specify a\n# different font using DOT_FONTNAME you can set the path where dot\n# can find it using this tag.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# the CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = YES\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = YES\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = YES\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used.\n\nDOT_IMAGE_FORMAT       = svg\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "HACKING",
    "content": "https://copyq.readthedocs.io/en/latest/build-source-code.html\n"
  },
  {
    "path": "INSTALL",
    "content": "https://copyq.readthedocs.io/en/latest/build-source-code.html\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# CopyQ\n\n[![Documentation Status](https://readthedocs.org/projects/copyq/badge/?version=latest)](https://copyq.readthedocs.io/en/latest/?badge=latest)\n[![Translation Status](https://hosted.weblate.org/widgets/copyq/-/svg-badge.svg)](https://hosted.weblate.org/engage/copyq/?utm_source=widget)\n[![Linux Build Status](https://github.com/hluk/CopyQ/actions/workflows/build-linux.yml/badge.svg?branch=master&event=push)](https://github.com/hluk/CopyQ/actions?query=branch%3Amaster+event%3Apush+workflow%3ALinux)\n[![macOS Build Status](https://github.com/hluk/CopyQ/actions/workflows/build-macos.yml/badge.svg?branch=master&event=push)](https://github.com/hluk/CopyQ/actions?query=branch%3Amaster+event%3Apush+workflow%3AmacOS)\n[![Windows Build Status](https://github.com/hluk/CopyQ/actions/workflows/build-windows.yml/badge.svg?branch=master&event=push)](https://github.com/hluk/CopyQ/actions?query=branch%3Amaster+event%3Apush+workflow%3AWindows)\n[![Coverage Status](https://codecov.io/gh/hluk/CopyQ/branch/master/graph/badge.svg)](https://codecov.io/gh/hluk/CopyQ)\n\nCopyQ is an advanced clipboard manager with powerful editing and scripting features.\n\n- [Downloads](https://github.com/hluk/CopyQ/releases)\n- [Web Site](https://hluk.github.io/CopyQ/)\n- [Documentation](https://copyq.readthedocs.io)\n- [Mailing List](https://groups.google.com/group/copyq)\n- [Bug Reports](https://github.com/hluk/CopyQ/issues)\n- [Donate](https://liberapay.com/CopyQ/)\n- [Scripting API](https://copyq.readthedocs.io/en/latest/scripting-api.html)\n\n## Overview\n\n* CopyQ monitors the system clipboard and saves its content in customized tabs.\n* Saved clipboard entries can later be copied and pasted directly into any application.\n\n## Features\n\n* Support for Linux, Windows, and [macOS 13+](https://doc.qt.io/qt-6/macos.html)\n* Store text, HTML, images, and any other custom formats\n* Quickly browse and filter items in clipboard history\n* Sort, create, edit, remove, copy/paste, drag'n'drop items in tabs\n* Add notes and tags to items\n* System-wide keyboard shortcuts with customizable commands\n* Paste items with keyboard shortcuts, from tray, or from main window\n* Fully customizable appearance\n* Advanced command-line interface and scripting\n* Ignore clipboard copied from specified windows or containing specified text\n* Support for simple Vim-like editor with keyboard shortcuts\n* Many more features\n\n## Install\n\n<a href=\"https://repology.org/metapackage/copyq\">\n    <img src=\"https://repology.org/badge/vertical-allrepos/copyq.svg\" alt=\"Packaging status\" align=\"right\">\n</a>\n\nTo install CopyQ, use the binary package or the installer provided for your operating system.\n\nFor unlisted operating systems, please follow the instructions in\n[Build from Source Code](https://copyq.readthedocs.io/en/latest/build-source-code.html).\n\n### Windows\n\n[![Chocolatey package](https://repology.org/badge/version-for-repo/chocolatey/copyq.svg)](https://repology.org/metapackage/copyq)\n\nOn Windows you can use any of the following options to install CopyQ:\n\n* [Installer (setup.exe)](https://github.com/hluk/CopyQ/releases)\n* [Portable zip package](https://github.com/hluk/CopyQ/releases)\n* [Scoop package](https://scoop.sh/) from the [extras bucket](https://github.com/lukesampson/scoop-extras).\n* [Chocolatey package](https://chocolatey.org/packages/copyq)\n\nUsing Scoop:\n\n```\nscoop install copyq\n```\n\nUsing Chocolatey:\n\n```\nchoco install copyq\n```\n\n### macOS\n\nmacOS 13 and above are supported (this mainly depends on the [Qt version](https://doc.qt.io/qt-6/macos.html)).\n\n[![Homebrew package](https://repology.org/badge/version-for-repo/homebrew_casks/copyq.svg)](https://repology.org/metapackage/copyq)\n\nOn macOS you can use [Homebrew](https://brew.sh/) to install CopyQ:\n\n```bash\nbrew install --cask copyq\n```\n\nIf you encounter an issue where the app crashes with a dialog saying \"CopyQ is\ndamaged\" or \"CopyQ cannot be opened\", you may need to run the following\ncommands (for details, see #2652):\n\n```bash\nxattr -d com.apple.quarantine /Applications/CopyQ.app\ncodesign --force --deep --sign - /Applications/CopyQ.app\n```\n\n### Debian 11+, Ubuntu 22.04+, and their derivatives\n\nInstall `copyq` and `copyq-plugins` packages.\n\n#### Ubuntu PPA\n\nInstall and keep CopyQ always up to date by running the following commands from\nthe terminal (the package from PPA contains all plugins and documentation):\n\n```bash\nsudo apt install software-properties-common python-software-properties\nsudo add-apt-repository ppa:hluk/copyq\nsudo apt update\nsudo apt install copyq\n# this package contains all plugins and documentation\n```\n\n### Fedora\n\nInstall `copyq` package.\n\n### Arch Linux\n\nInstall `copyq` package.\n\n### Other Linux Distributions\n\nInstall [Flatpak](https://flatpak.org/) and `com.github.hluk.copyq` from\n[Flathub](https://flathub.org/).\n\n```bash\nflatpak install flathub com.github.hluk.copyq\n```\n\nStart CopyQ from the menu or with the following command:\n\n```bash\nflatpak run com.github.hluk.copyq\n```\n\n## Using the App\n\nTo start CopyQ, double-click the program icon or run `copyq`.\n\nThe list with the clipboard history is accessible by clicking on the system tray icon\nor by running `copyq toggle`.\n\nCopying text or image to the clipboard will create a new item in the list.\n\nSelected items can be:\n\n* edited (`F2`)\n* removed (`Delete`)\n* sorted (`Ctrl+Shift+S`, `Ctrl+Shift+R`)\n* repositioned (with mouse or `Ctrl+Up/Down`)\n* copied back to the clipboard (`Ctrl+C`)\n* pasted to the previously active window (`Enter`)\n\nAll items will be restored when CopyQ is next started.\n\nTo exit CopyQ, select Exit from the tray menu or press `Ctrl-Q` in the\nCopyQ window.\n\nRead more:\n\n- [Basic Usage](https://copyq.readthedocs.io/en/latest/basic-usage.html)\n- [Keyboard](https://copyq.readthedocs.io/en/latest/keyboard.html)\n\n### Adding Functionality\n\nTo create custom actions that can be executed\nfrom the menu, with keyboard shortcuts, or when the clipboard changes:\n- go to the Command dialog (`F6` shortcut)\n- click the `Add` button, then select a predefined command, or create a new one\n- optionally change the command details (shortcut, name)\n- click `OK` to save the command\n\nOne of the very useful predefined commands is \"Show/hide main window\".\n\nRead more:\n\n- [Writing Commands](https://copyq.readthedocs.io/en/latest/writing-commands-and-adding-functionality.html)\n- [CopyQ Commands Repository](https://github.com/hluk/copyq-commands)\n\n### Command Line\n\nCopyQ has a powerful command line and scripting interface.\n\nNote: The main application must be running to be able to issue commands using the\ncommand line.\n\nPrint help for some useful command line arguments:\n\n    copyq --help\n    copyq --help add\n\nInsert some text in the history:\n\n    copyq add -- 'first item' 'second item' 'third item'\n\nOmitting the double-dash (`--`) in the command above would mean that slashes\n(`\\`) in arguments will be treated as special characters.  For example, `\\n` will be treated as\nthe new line character, `\\t` as tab, `\\\\` as slash, `\\x` as `x`, etc.\n\nCreate a single item containing two lines:\n\n    copyq add 'first line\\nsecond line'\n\nPrint the content of the first three items:\n\n    copyq read 0 1 2\n    copyq separator \",\" read 0 1 2\n\nShow the current clipboard content:\n\n    copyq clipboard\n    copyq clipboard text/html\n    copyq clipboard \\?    # lists formats in clipboard\n\nCopy text to the clipboard:\n\n    copyq copy \"Some Text\"\n\nLoad file content into the clipboard:\n\n    copyq copy - < file.txt\n    copyq copy text/html < index.html\n    copyq copy image/jpeg - < image.jpg\n\nCreate image items:\n\n    copyq write image/gif - < image.gif\n    copyq write image/svg - < image.svg\n\nRead more:\n\n- [Scripting](https://copyq.readthedocs.io/en/latest/scripting.html)\n- [Scripting API](https://copyq.readthedocs.io/en/latest/scripting-api.html)\n\n## Build from Source Code\n\nSee the documentation section [Build from Source\nCode](https://copyq.readthedocs.io/en/latest/build-source-code.html).\n\n## Contributions\n\nYou can help translate CopyQ (click the banner below)\nor help [fix issues and implement new features](https://github.com/hluk/CopyQ/issues).\n\n[![Translations](https://hosted.weblate.org/widgets/copyq/-/287x66-white.png)](https://hosted.weblate.org/engage/copyq/?utm_source=widget)\n\nRead more:\n\n- [Build from Source Code](https://copyq.readthedocs.io/en/latest/build-source-code.html)\n- [Fixing Bugs and Adding Features](https://copyq.readthedocs.io/en/latest/fixing-bugs.html)\n- [Translations](https://copyq.readthedocs.io/en/latest/translations.html)\n"
  },
  {
    "path": "RELEASE.md",
    "content": "This is step-by-step description on how to release new version of CopyQ.\n\n# Update Version and Changelog\n\nUpdate `CHANGES.md` file (go through all commits since the last release tag).\n\nBump the version:\n\n    utils/bump_version.sh 14.0.0\n\nVerify and push the changes:\n\n    for r in origin gitlab; do git push --follow-tags $r master || break; done\n\n# Build Flatpak\n\nUpdate [flathub package](https://github.com/flathub/com.github.hluk.copyq):\n\n1. Update \"tag\" and \"commit\" in \"com.github.hluk.copyq.json\" file.\n2. Push to your fork.\n3. [Create pull request](https://github.com/flathub/com.github.hluk.copyq/compare/master...hluk:master).\n4. Verify the build when the build finishes (flathubbot will add comments).\n5. Merge the changes if the build is OK.\n\n# Download Packages\n\nPushing the version tag triggers GitHub Actions workflows that build and upload\npackages to the draft GitHub Release automatically:\n\n- Windows installer (`copyq-VERSION-setup.exe`)\n- Windows portable zip (`copyq-VERSION.zip`)\n- macOS Intel DMG (`CopyQ-macos-13.dmg`)\n- macOS Apple Silicon DMG (`CopyQ-macos-12-m1.dmg`)\n\nCheck the [Actions tab](https://github.com/hluk/CopyQ/actions) for build progress.\n\n- Create source package:\n\n      $COPYQ_SOURCE/utils/create_source_package.sh 14.0.0\n\n# Checksums and Signing\n\nCreate checksums and sign all new packages, source tarball and binaries:\n\n    $COPYQ_SOURCE/utils/sign_released_files.sh\n\nThis creates `checksums-sha512.txt` with the checksums and its signature in\n`cosign.bundle`.\n\n# Publish Release\n\nCreate [release on GitHub](https://github.com/hluk/CopyQ/releases) for the new version tag.\n\nUpload packages and binaries to:\n\n- [github](https://github.com/hluk/CopyQ/releases) (include `checksums-sha512.txt` and `cosign.bundle`)\n- [sourceforge](https://sourceforge.net/projects/copyq/files/)\n\nWrite release announcement to [CopyQ group](https://groups.google.com/forum/#!forum/copyq).\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = python -msphinx\nSPHINXPROJ    = CopyQ\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/autobuild.sh",
    "content": "#!/bin/bash\n# Automatically re-build the documentation whenever it changes.\n#\n# Requires sphinx-autobuild script:\n#\n#     pip install --user sphinx-autobuild\n#     export PATH=\"$HOME/.local/bin:$PATH\"\n#\nexec sphinx-autobuild \\\n    --ignore '.*' \\\n    --ignore \"*.swp\" \\\n    --ignore \"*~\" \\\n    . _build/html\n"
  },
  {
    "path": "docs/backup.rst",
    "content": ".. _backup:\n\nBackup\n======\n\nThis page describes how to back up tabs, configuration and commands in\nCopyQ.\n\nBack Up All Data Automatically on Exit\n--------------------------------------\n\nYou can use `command that backs up all items, tabs and settings after exit\n<https://github.com/hluk/copyq-commands/tree/master/Scripts#backup-on-exit>`__.\n\nTo install the command see `the description in the repository\n<https://github.com/hluk/copyq-commands/blob/master/README.md>`__.\n\nBack Up Manually\n----------------\n\nTo back up all the data, **exit the application** first and **copy\nthe configuration directory** and **the data directory**.\n\nPath to the configuration is usually:\n\n-  Windows: ``%APPDATA%\\copyq``\n-  Portable version for Windows: ``config`` sub-folder in unzipped\n   application directory\n-  Linux: ``~/.config/copyq``\n\nPath to the data is usually:\n\n-  Windows: ``%APPDATA%\\copyq\\items``\n-  Portable version for Windows: ``items`` sub-folder in unzipped\n   application directory\n-  Linux: ``~/.local/share/copyq/copyq/items``\n\nTo copy the configuration path to clipboard from CopyQ:\n\n1. Open Action dialog (``F5`` shortcut).\n2. Enter the command:\n\n.. code-block:: js\n\n    copyq:\n    dir = Dir(info('config') + '/..')\n    copy(dir.absolutePath())\n\n3. Click OK dialog button.\n\nTo copy the data path, change ``'config'`` to ``'data'``.\n\nTo restore the backup, exit the application and replace the\nconfiguration directory.\n\n.. warning::\n\n    Before making or restoring back up, always exit CopyQ\n    (don't only close the main window).\n\nExport and Import\n-----------------\n\nYou can easily export selected tabs and optionally\nconfiguration and commands within the application.\n\n.. warning::\n\n    Tabs are exported **without any encryption** by default (you would need\n    CopyQ 14.0.0 and above) and if a tab is synchronized with directory on disk\n    the files themselves will not be exported.\n\nTo export the data click \"Export...\" in \"File\" menu, select what to\nexport, confirm with OK button and select target file to save.\n\nTo restore the data click \"Import...\" in \"File\" menu, select file to\nimport and select what to import.\n\n.. note::\n\n    Import will not overwrite existing tabs and commands but create new ones.\n\nAlternatively you can use command line for export and import everything\n(selection dialogs won't be opened).\n\n.. code-block:: bash\n\n    copyq exportData {FILE/PATH/TO/EXPORT}\n    copyq importData {FILE/PATH/TO/IMPORT}\n"
  },
  {
    "path": "docs/basic-usage.rst",
    "content": "Basic Usage\n===========\n\nThis page describes the basic functionality of CopyQ clipboard manager.\n\nFirst Start\n-----------\n\nTo start CopyQ, double-click the program icon or run command ``copyq``.\nThis starts the graphical interface which can be accessed from the tray (NOTE: on OS X the tray defaults to the top-right of the screen and is not to be confused with Launchpad).\nClick the tray icon to show application window or right-click the tray icon and select \"Show/Hide\" or run ``copyq show`` command.\n\n.. image:: images/copyq-show.png\n  :width: 400\n  :alt: copyq show\n\nThe central element in the application window is **item list** containing\n**clipboard history**. By default, the application **stores any new clipboard\ncontent** in the list.\n\nIf you copy some text it will immediately show at the top of the list.\nTry copying text or images from various application to see how this works.\n\n.. seealso::\n\n        :ref:`faq-disable-clipboard-storing`\n\nBasic Item Manipulation\n-----------------------\n\nIn the item list, press ``F2`` to **edit selected text items**.\nAfter editing, press ``F2`` again to **save the text**.\n\nCreate **new item** with ``Ctrl+N``, type some text and press ``F2`` to save\nthe new item.\n\n**Copy the selected items** back to clipboard with Enter key or ``Ctrl+C``.\n\n**Move items** around with ``Ctrl+Down`` and ``Ctrl+Up``.\n\nYou can move important or special items to new tabs (see\n:ref:`tabs` for more info).\n\nSearch\n------\n\nIn the list you can **filter items by typing some text**.\n\nFor example, typing \"Example\" hides items that don't contain\n\"Example\" text. Press Enter key to copy the first found item.\n\nTray\n----\n\nTo quickly copy item to clipboard, you can select the item from tray\nmenu. To display the menu either right-click on tray icon, run command\n``copyq menu`` or use a custom system shortcut.\n\n.. image:: images/copyq-menu.png\n  :width: 400\n  :alt: copyq menu\n\n\nAfter selecting an item in tray menu and pressing enter (pressing a\nnumber key works as well), the item is copied to the clipboard.\n\n.. seealso::\n\n    :ref:`faq-show-app`\n\n    :ref:`faq-paste-from-window`\n"
  },
  {
    "path": "docs/build-source-code.rst",
    "content": "Build from Source Code\n======================\n\nThis page describes how to build the application from source code.\n\nGet the Source Code\n-------------------\n\nDownload the source code from git repository\n\n::\n\n    git clone https://github.com/hluk/CopyQ.git\n\nor download the latest source code archive from:\n\n- `latest release <https://github.com/hluk/CopyQ/releases>`__\n- `master branch in zip <https://github.com/hluk/CopyQ/archive/master.zip>`__\n- `master branch in tar.gz <https://github.com/hluk/CopyQ/archive/master.tar.gz>`__\n\nInstall Dependencies\n--------------------\n\nThe build requires:\n\n- `CMake <https://cmake.org/download/>`__\n- `Qt <https://download.qt.io/archive/qt/>`__\n\nOptional:\n\n- `miniaudio <https://miniaud.io/>`__ -- for built-in audio playback (``playSound``)\n\nDebian / Ubuntu\n^^^^^^^^^^^^^^^\nOn **Debian** and derivatives you can install all build dependencies with:\n\n::\n\n    sudo apt install \\\n      build-essential \\\n      cmake \\\n      extra-cmake-modules \\\n      git \\\n      libminiaudio-dev \\\n      libqt6svg6-dev \\\n      libqt6waylandclient6 \\\n      libwayland-dev \\\n      libxfixes-dev \\\n      libxtst-dev \\\n      qt6-base-dev \\\n      qt6-base-dev-tools \\\n      qt6-base-private-dev \\\n      qt6-declarative-dev \\\n      qt6-l10n-tools \\\n      qt6-tools-dev \\\n      qt6-tools-dev-tools \\\n      qt6-wayland \\\n      qt6-wayland-dev \\\n      qt6-wayland-dev-tools \\\n      qtkeychain-qt6-dev\n\n\nOn Debian 13 or Ubuntu 24.04 and newer, you can also install `QCA` packages:\n\n::\n\n    sudo apt install \\\n      libqca-qt6-dev \\\n      libqca-qt6-plugins\n\nOn Debian 13 or Ubuntu 25.04 and newer, you can also install `KF6` packages:\n\n::\n\n    sudo apt install \\\n      libkf6guiaddons-dev\n\nFedora / RHEL / CentOS\n^^^^^^^^^^^^^^^^^^^^^^\nOn **Fedora** and derivatives you can install all build dependencies with:\n\n::\n\n    sudo dnf install \\\n      cmake \\\n      extra-cmake-modules \\\n      gcc-c++ \\\n      git \\\n      kf6-kguiaddons-devel \\\n      kf6-knotifications-devel \\\n      kf6-kstatusnotifieritem-devel \\\n      libSM-devel \\\n      libXfixes-devel \\\n      libXtst-devel \\\n      miniaudio-devel \\\n      qca-qt6-devel \\\n      qca-qt6-ossl \\\n      qt6-qtbase-devel \\\n      qt6-qtbase-private-devel \\\n      qt6-qtdeclarative-devel \\\n      qt6-qtsvg-devel \\\n      qt6-qttools-devel \\\n      qt6-qtwayland-devel \\\n      qtkeychain-qt6-devel \\\n      wayland-devel\n\nminiaudio (manual download)\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf your distribution does not package miniaudio, you can download the single\nheader file directly into the source tree:\n\n::\n\n    curl -sSLo src/miniaudio.h \\\n      https://raw.githubusercontent.com/mackron/miniaudio/0.11.25/miniaudio.h\n\nCMake will find it automatically.  Alternatively, place ``miniaudio.h`` anywhere\nand point CMake to it with ``-DMINIAUDIO_INCLUDE_DIR=/path/to/dir``.\n\n\nBuild and Install\n-----------------\n\nBuild the source code with CMake and make or using an IDE of your choice (see next sections).\n\n::\n\n    cd CopyQ\n    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local .\n    # Add -DWITH_QCA_ENCRYPTION=OFF for systems without `QCA` packages\n    # Add -DWITH_NATIVE_NOTIFICATIONS=OFF for systems without `KF6` packages\n    # Add -DWITH_AUDIO=OFF to disable audio support (or if miniaudio is unavailable)\n    make\n    make install\n\nQt Creator\n----------\n\nQt Creator is IDE focused on developing C++ and Qt applications.\n\nInstall Qt Creator from your package manager or by selecting it from Qt installation utility.\n\nSet up Qt library, C++ compiler and CMake.\n\n.. seealso::\n\n    `Adding Kits <https://doc.qt.io/qtcreator/creator-targets.html>`__\n\nOpen file ``CMakeLists.txt`` in repository clone to create new project.\n\nVisual Studio\n-------------\n\nYou need to install Qt for given version Visual Studio.\n\nIn Visual Studio 2017 open folder containing repository clone using \"File - Open - Folder\".\n\nIn older versions, create solution manually by running ``cmake -G \"Visual Studio 14 2015 Win64\" .``\n(select appropriate generator name) in repository clone folder.\n\n.. seealso::\n\n    `CMake - Visual Studio Generators <https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#visual-studio-generators>`__\n\nBuilding and Packaging for OS X\n-------------------------------\n\nOn OS X, required Qt 6 libraries and utilities can be easily installed with `Homebrew <https://brew.sh/>`__.\n\n::\n\n    cd CopyQ\n    git -C \"utils/github/homebrew\" init .\n    git -C \"utils/github/homebrew\" add .\n    git -C \"utils/github/homebrew\" commit -m \"Initial\"\n\n    brew tap copyq/kde utils/github/homebrew/\n    # if the above \"brew tap\" command produces an error like\n    #     \"Error: Tap copyq/kde remote mismatch\"\n    # then run\n    #     brew untap --force copyq/kde\n    # and re-run the above \"brew tap\" command\n\n    brew install qt6 copyq/kde/kf6-knotifications copyq/kde/kf6-kstatusnotifieritem\n\nBuild with the following commands:\n\n::\n\n    cmake -DCMAKE_PREFIX_PATH=\"$(brew --prefix qt6)\" .\n    cmake --build .\n    cpack\n\nTo build with Qt 5 (make sure to install qt@5 yourself):\n\n::\n\n\n    cmake -DCMAKE_PREFIX_PATH=\"$(brew --prefix qt5)\" -DWITH_QT6=OFF .\n    cmake --build .\n    cpack\n\n\nThis will produce a self-contained application bundle ``CopyQ.app``\nwhich can then be copied or moved into ``/Applications``.\n\nNOTE: If no Items are shown when you start CopyQ and open \"File - Preferences - Items\",\nthen your CopyQ plugins were not installed. If you saw warning messages like this::\n\n     /<some_path>/install_name_tool: warning: changes being made to the file will invalidate the code signature in: /<some_path>/CopyQ/_CPack_Packages/Darwin/DragNDrop/copyq-6.2.0-Darwin/CopyQ.app/Contents/Plugins/<some_file>.dylib\n\nwhen you ran the above \"cpack\" command, then you have likely encountered\n`issue 1903 <https://github.com/hluk/CopyQ/issues/1903/>`__.\n\nIn that case you may codesign the CopyQ app again using the following command,\nun-install the previous CopyQ app, and install the re-signed ``CopyQ.app``::\n\n    codesign --force --deep --sign - $PWD/_CPack_Packages/Darwin/DragNDrop/copyq-*-Darwin/CopyQ.app\n"
  },
  {
    "path": "docs/command-examples.rst",
    "content": ".. _command-examples:\n\nCommand Examples\n================\n\nHere are some useful commands for creating custom menu items, global\nshortcuts and automatically process new clipboard content in CopyQ.\n\nIf you want to use any of the commands below, copy it to clipboard and\npaste it to the command list in Command dialog (opened with F6\nshortcut). For detailed info see :ref:`faq-share-commands`.\n\nAll these and more commands are available at\n`CopyQ command repository <https://github.com/hluk/copyq-commands>`__.\n\nJoin Selected Items\n~~~~~~~~~~~~~~~~~~~\n\nCreates new item containing concatenated text of selected items.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Join Selected Items\n    Command=copyq add -- %1\n    InMenu=true\n    Icon=\\xf066\n    Shortcut=Space\n\nPaste Current Date and Time\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCopies current date/time text to clipboard and pastes to current window\non global shortcut Win+Alt+T.\n\n.. code-block:: ini\n\n    [Command]\n    Command=\"\n        copyq:\n        var time = dateString('yyyy-MM-dd hh:mm:ss')\n        copy('Current date/time is ' + time)\n        paste()\"\n    GlobalShortcut=meta+alt+t\n    Icon=\\xf017\n    Name=Paste Current Time\n\nPlay Sound when Copying to Clipboard\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe following commands will play an audio file whenever something is\ncopied to the clipboard.\n\nBuilt-in (Cross-Platform)\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe built-in audio capabilities are available since version 14.0.0 and supports\nWAV, MP3 and FLAC formats on all platforms.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Play Sound on Copy\n    Command=\"\n         copyq:\n         playSound('/path/to/notification.wav')\"\n    Automatic=true\n    Icon=\\xf028\n\nTo play at a lower volume:\n\n.. code-block:: ini\n\n    [Command]\n    Name=Play Sound on Copy (Quiet)\n    Command=\"\n         copyq:\n         playSound({file: '/path/to/notification.wav', volume: 25})\"\n    Automatic=true\n    Icon=\\xf028\n\nAlternatively, if audio is not available in the app itself, you can use\nexternal utilities to play audio file mentioned below.\n\nWindows\n^^^^^^^\n\nPlays the user-specified audio file whenever something is copied to the\nclipboard. By default, this adds to the sound associated to native\nnotifications rather than replacing it, so you may want to use Qt\n(non-native) notifications to use this.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Play Sound on Copy\n    Command=\"\n         powershell:\n         (New-Object Media.SoundPlayer \\\"C:\\\\Users\\\\copy.wav\\\").PlaySync()\"\n    Automatic=true\n    Icon=\\xf028\n\nGNU/Linux\n^^^^^^^^^\n\nRequires VLC multimedia player:\n\n.. code-block:: ini\n\n    [Command]\n    Name=Play Sound on Copy\n    Command=\"\n         bash:\n         cvlc --play-and-exit ~/audio/example.mp3\"\n    Automatic=true\n    Icon=\\xf028\n\n`Alternative using the mpv player <https://github.com/hluk/copyq-commands/blob/master/commands/play-sound-when-copying-to-clipboard-linux.ini>`__\n\nEdit and Paste\n~~~~~~~~~~~~~~\n\nFollowing command allows to edit current clipboard text before pasting\nit. If the editing is canceled the text won't be pasted.\n\n.. code-block:: ini\n\n    [Command]\n    Command=\"\n        copyq:\n        var text = dialog('paste', str(clipboard()))\n        if (text) {\n          copy(text)\n          copySelection(text)\n          paste()\n        }\"\n    GlobalShortcut=ctrl+shift+v\n    Icon=\\xf0ea\n    Name=Edit and Paste\n\nRemove Background and Text Colors\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nRemoves background and text colors from rich text (e.g. text copied from\nweb pages).\n\nCommand can be both automatically applied on text copied to clipboard\nand invoked from menu (or using custom shortcut).\n\n.. code-block:: ini\n\n    [Command]\n    Automatic=true\n    Command=\"\n        copyq:\n        var html = str(input())\n        html = html.replace(/color\\\\s*:/g, 'xxx:')\n        setData('text/html', html)\"\n    Icon=\\xf042\n    InMenu=true\n    Input=text/html\n    Name=Remove Background and Text Colors\n\nLinkify\n~~~~~~~\n\nStores an item with interactive link from plain text URL copied to clipboard.\n\n.. code-block:: ini\n\n    [Command]\n    Automatic=true\n    Command=\"\n        copyq:\n        const link = str(input());\n        const href = `<a href=\\\"${link}\\\">${link}</a>`;\n        setData('text/html', href);\"\n    Icon=\\xf127\n    Input=text/plain\n    Match=^(https?|ftps?|file|mailto)://\n    Name=Linkify\n\nHighlight Text\n~~~~~~~~~~~~~~\n\nHighlight all occurrences of a text (change ``x = \"text\"`` to match\nsomething else than ``text``).\n\n.. code-block:: ini\n\n    [Command]\n    Name=Highlight Text\n    Command=\"\n        copyq:\n        x = 'text'\n        style = 'background: yellow; text-decoration: underline'\n\n        text = str(input())\n        x = x.toLowerCase()\n        lowertext = text.toLowerCase()\n        html = ''\n        a = 0\n        esc = function(a, b) {\n            return escapeHTML( text.substr(a, b - a) )\n        }\n\n        while (1) {\n            b = lowertext.indexOf(x, a)\n            if (b != -1) {\n                html += esc(a, b) + '<span>' + esc(b, b + x.length) + '</span>'\n            } else {\n                html += esc(a, text.length)\n                break\n            }\n            a = b + x.length;\n        }\n\n        tab( selectedtab() )\n        write(\n            index(),\n            'text/plain', text,\n            'text/html',\n                '<html><head><style>span{'\n                + style +\n                '}</style></head><body>'\n                + html +\n                '</body></html>'\n        )\"\n    Input=text/plain\n    Wait=true\n    InMenu=true\n\nRender HTML\n~~~~~~~~~~~\n\nRender HTML code.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Render HTML\n    Match=^\\\\s*<(!|html)\n    Command=\"\n        copyq:\n        tab(selectedtab())\n        write(index() + 1, 'text/html', input())\"\n    Input=text/plain\n    InMenu=true\n\nTranslate to English\n~~~~~~~~~~~~~~~~~~~~\n\nPass to text to `Google Translate <https://translate.google.com/>`__.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Translate to English\n    Command=\"\n        copyq:\n        text = str(input())\n        url = \\\"https://translate.google.com/#auto/en/???\\\"\n\n        x = url.replace(\\\"???\\\", encodeURIComponent(text))\n        html = '<html><head><meta http-equiv=\\\"refresh\\\" content=\\\"0;url=' + x + '\\\" /></head></html>'\n\n        tab(selectedtab())\n        write(index() + 1, \\\"text/html\\\", html)\"\n    Input=text/plain\n    InMenu=true\n\nPaste and Forget\n~~~~~~~~~~~~~~~~\n\nPaste selected items and clear clipboard.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Paste and Forget\n    Command=\"\n        copyq:\n        tab(selectedtab())\n        items = selecteditems()\n        if (items.length > 1) {\n            text = ''\n            for (i in items)\n                text += read(items[i]);\n            copy(text)\n        } else {\n            select(items[0])\n        }\n\n        hide()\n        paste()\n        copy('')\"\n    InMenu=true\n    Icon=\\xf0ea\n    Shortcut=Ctrl+Return\n\nRender Math Equations\n~~~~~~~~~~~~~~~~~~~~~\n\nRender math equations using `MathJax <http://www.mathjax.org/>`__ (e.g.\n``$$x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}$$``).\n\n.. code-block:: ini\n\n    [Command]\n    Name=Render Math Equations\n    Command=\"\n        copyq:\n        text = str(input())\n        js = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'\n\n        html = '<html><head><script type=\\\"text/javascript\\\" src=\\\"' + js + '\\\"></script></head><body>' + escapeHTML(text) + '</body></html>';\n\n        tab(selectedtab())\n        write(index() + 1, 'text/html', html)\"\n    Input=text/plain\n    InMenu=true\n    Icon=\\xf12b\n\nMove Images to Other Tab\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nWith this command active, images won't be saved in the first tab. This\ncan make application a bit more snappier since big image data won't need\nto be loaded when main window is displayed or clipboard is stored for\nthe first time.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Move Images to Other Tab\n    Input=image/png\n    Automatic=true\n    Remove=true\n    Icon=\\xf03e\n    Tab=&Images\n\nCopy Clipboard to Window Tabs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFollowing command automatically adds new clipboard to tab with same name\nas title of the window where copy operation was performed.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Window Tabs\n    Command=\"copyq:\n        item = unpack(input())\n        window_title = item[\\\"application/x-copyq-owner-window-title\\\"]\n        if (window_title) {\n            // Remove the part of window title before dash\n            // (it's usually document name or URL).\n            tabname = str(window_title).replace(/.* (-|\\x2013) /, \\\"\\\")\n            tab(\\\"Windows/\\\" + tabname)\n            write(\\\"application/x-copyq-item\\\", input())\n        }\n        \"\n    Input=application/x-copyq-item\n    Automatic=true\n    Icon=\\xf009\n\nQuickly Show Current Clipboard Content\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nQuickly pop up notification with text in clipboard using ``Win+Alt+C``\nsystem shortcut.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Show clipboard\n    Command=\"\n        copyq:\n        seconds = 2;\n        popup(\\\"\\\", clipboard(), seconds * 1000)\"\n    GlobalShortcut=Meta+Alt+C\n\nReplace All Occurrences in Selected Text\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: ini\n\n    [Command]\n    Command=\"\n        copyq:\n        copy();\n        const text = str(clipboard());\n        if (text) {\n          const r1 = 'Text';\n          const r2 = 'Replace with';\n          const reply = dialog(r1, '', r2, '');\n          if (reply) {\n            copy(text.replace(new RegExp(reply[r1], 'g'), reply[r2]));\n            paste();\n          }\n        }\"\n    GlobalShortcut=meta+alt+r\n    Icon=\n    IsGlobalShortcut=true\n    Name=Replace in Selection\n\nCopy Nth Item\n~~~~~~~~~~~~~\n\nCopy item in row depending on which shortcut was pressed. E.g. Ctrl+2\nfor item in row \"2\".\n\n.. code-block:: ini\n\n    [Command]\n    Name=Copy Nth Item\n    Command=\"\n        copyq:\n        var shortcut = str(data(\\\"application/x-copyq-shortcut\\\"));\n        var row = shortcut ? shortcut.replace(/^\\\\D+/g, '') : currentItem();\n        var itemIndex = (config('row_index_from_one') == 'true') ? row - 1 : row;\n        selectItems(itemIndex);\n        copy(\\\"application/x-copyq-item\\\", pack(getItem(itemIndex)));\"\n    InMenu=true\n    Icon=\\xf0cb\n    Shortcut=ctrl+1, ctrl+2, ctrl+3, ctrl+4, ctrl+5, ctrl+6, ctrl+7, ctrl+8, ctrl+9, ctrl+0\n\nEdit Files\n~~~~~~~~~~\n\nOpens files referenced by selected item in external editor (uses\n\"External editor command\" from \"History\" config tab).\n\nWorks with following path formats (some editors may not support all of\nthese).\n\n-  ``C:/...``\n-  ``file://...``\n-  ``~...`` (some shells)\n-  ``%...%...`` (Windows environment variables)\n-  ``$...`` (environment variables)\n-  ``/c/...`` (gitbash)\n\n.. code-block:: ini\n\n    [Command]\n    Name=Edit Files\n    Match=^([a-zA-Z]:[\\\\\\\\/]|~|file://|%\\\\w+%|$\\\\w+|/)\n    Command=\"\n        copyq:\n        var editor = config('editor')\n            .replace(/ %1/, '')\n\n        var filePaths = str(input())\n            .replace(/^file:\\\\/{2}/gm, '')\n            .replace(/^\\\\/(\\\\w):?\\\\//gm, '$1:/')\n            .split('\\\\n')\n\n        var args = [editor].concat(filePaths)\n\n        execute.apply(this, args)\"\n    Input=text/plain\n    InMenu=true\n    Icon=\\xf040\n    Shortcut=f4\n\nChange Monitoring State Permanently\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDisables clipboard monitoring permanently, i.e. the state is restored\nwhen clipboard changes even after application is restarted.\n\nShould be the first automatic command in the list of commands so other\ncommands are not invoked.\n\n.. code-block:: ini\n\n    [Command]\n    Automatic=true\n    Command=\"\n        copyq:\n        var option = 'disable_monitoring'\n        var disabled = str(settings(option)) === 'true'\n\n        if (str(data('application/x-copyq-shortcut'))) {\n          disabled = !disabled\n          settings(option, disabled)\n          popup('', disabled ? 'Monitoring disabled' : 'Monitoring enabled')\n        }\n\n        if (disabled) {\n          disable()\n          ignore()\n        } else {\n          enable()\n        }\"\n    GlobalShortcut=meta+alt+x\n    Icon=\\xf05e\n    Name=Toggle Monitoring\n\nShow Window Title\n~~~~~~~~~~~~~~~~~\n\nShows source application window title for new items in tag (\"Tags\"\nplugin must be enabled in \"Items\" config tab).\n\n.. code-block:: ini\n\n    [Command]\n    Automatic=true\n    Command=\"\n        copyq:\n        var window = str(data('application/x-copyq-owner-window-title'))\n        var tagsMime = 'application/x-copyq-tags'\n        var tags = str(data(tagsMime)) + ', ' + window\n        setData(tagsMime, tags)\"\n    Icon=\\xf009\n    Name=Store Window Title\n\nShow Copy Time\n~~~~~~~~~~~~~~\n\nShows copy time of new items in tag (\"Tags\" plugin must be enabled in\n\"Items\" config tab).\n\n.. code-block:: ini\n\n    [Command]\n    Automatic=true\n    Command=\"\n        copyq:\n        var time = dateString('yyyy-MM-dd hh:mm:ss')\n        setData('application/x-copyq-user-copy-time', time)\n\n        var tagsMime = 'application/x-copyq-tags'\n        var tags = str(data(tagsMime)) + ', ' + time\n        setData(tagsMime, tags)\"\n    Icon=\\xf017\n    Name=Store Copy Time\n\nMark Selected Items\n~~~~~~~~~~~~~~~~~~~\n\nToggles highlighting of selected items.\n\n.. code-block:: ini\n\n    [Command]\n    Command=\"\n        copyq:\n        var color = 'rgba(255, 255, 0, 0.5)'\n        var mime = 'application/x-copyq-color'\n\n        var firstSelectedItem = selectedItems()[0]\n        var currentColor = str(read(mime, firstSelectedItem))\n        if (currentColor != color)\n          setData(mime, color)\n        else\n          removeData(mime)\"\n    Icon=\\xf1fc\n    InMenu=true\n    Name=Mark/Unmark Items\n    Shortcut=ctrl+m\n\nChange Upper/Lower Case of Selected Text\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: ini\n\n    [Command]\n    Command=\"\n        copyq:\n        if (!copy())\n          abort()\n\n        var text = str(clipboard())\n\n        var newText = text.toUpperCase()\n        if (text == newText)\n          newText = text.toLowerCase()\n\n        if (text == newText)\n          abort();\n\n        copy(newText)\n        paste()\"\n    GlobalShortcut=meta+ctrl+u\n    Icon=\\xf034\n    Name=Toggle Upper/Lower Case\n\n\n\nChange Copied Text to Title Case\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: ini\n\n    [Command]\n    Name=Paste as title case\n    Command=\"\n        copyq:\n        function toTitleCase(str) {\n          return str.replace(\n            /\\\\w\\\\S*/g,\n            function(txt) {\n              return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n            }\n          );\n        }\n        copy(toTitleCase(str(input())))\n               paste()\n        \"\n    Input=text/plain\n    IsGlobalShortcut=true\n    HideWindow=true\n    Icon=\\xf15b\n    GlobalShortcut=meta+ctrl+t\n"
  },
  {
    "path": "docs/command-line.rst",
    "content": "Command Line\n============\n\nTabs, items, clipboard and configuration can be changed through command\nline interface. Run command ``copyq help`` to see complete list of\ncommands and their description.\n\n.. warning::\n\n    On Windows, you may not see any output when executing CopyQ in\n    terminal/console (PowerShell or cmd).\n\n    See workarounds in :ref:`known-issue-windows-console-output`.\n\nTo add new item to tab with name \"notes\" run:\n\n::\n\n    copyq tab notes add \"This is the first note.\"\n\nTo print the item:\n\n::\n\n    copyq tab notes read 0\n\nAdd other item:\n\n::\n\n    copyq tab notes add \"This is second note.\"\n\nand print all items in the tab:\n\n::\n\n    copyq eval -- \"tab('notes'); for(i=size(); i>0; --i) print(str(read(i-1)) + '\\n');\"\n\nThis will print:\n\n::\n\n    This is the first note.\n    This is second note.\n\nAmong other things that are possible with CopyQ are:\n\n* open video player if text copied in clipboard is URL with multimedia\n* store text copied from a code editor in \"code\" tab\n* store URLs in different tab\n* save screenshots (print-screen)\n* load all files from directory to items (create image gallery)\n* replace a text in all matching items\n* run item as a Python script\n"
  },
  {
    "path": "docs/commands-display.rst",
    "content": ".. _commands-display:\n\nDisplay Commands\n================\n\nDisplay command is type of command that modifies item data before displaying.\nThe modified data are only used for displaying the item and are not stored.\n\nThe command is executed just before an item needs to be displayed. This can\nsometimes happen multiple times for the same item if the data or\nconfiguration changes or the tab was unloaded.\n\nDisplay commands can be created in Command dialog by setting Type of Action\nto :ref:`command-dialog-display`.\n\nUse ``data()`` to retrieve current item data and ``setData()`` to set the\ndata to display (these are not stored permanently).\n\nE.g. use slightly different color for plain text items.\n\n.. code-block:: js\n\n    copyq:\n    if ( str(data(mimeText)) && !str(data(mimeHtml)) ) {\n        html = escapeHtml(data(mimeText))\n        setData(mimeHtml, '<span style=\"color:#764\">' + html + '</span>')\n    }\n\nE.g. try to interpret text as Markdown (with ``marked`` external utility).\n\n.. code-block:: js\n\n    copyq:\n    var text = data(mimeText)\n    var result = execute('marked', null, text)\n    if (result && result.exit_code == 0) {\n        setData(mimeHtml, result.stdout)\n    }\n"
  },
  {
    "path": "docs/commands-script.rst",
    "content": ".. _commands-script:\n\nScript Commands\n===============\n\nScript command is type of command which allows overriding existing functions\nand creating new ones (allowing new command line arguments to be used).\n\nThe command is executed before any script and all defined variables and\nfunctions are available to the scripts.\n\nScript commands can be created in Command dialog by setting Type of Action to\n:ref:`command-dialog-script`.\n\nExtending Command Line Interface\n--------------------------------\n\nBy adding following script command you can use ``hello()`` from other script\nor on command line (``copyq hello``):\n\n.. code-block:: js\n\n    global.hello = function() {\n        print('Hello, World!\\n')\n    }\n\nScript commands are executed in own scope so as to avoid adding temporary\nvariables in the global scope which contains all functions like ``copy()`` or\n``add()``. Using ``global`` object allows to modify the global scope.\n\nIt's useful to move code used by multiple commands to a new script command.\n\nIt can also simplify using ``copyq`` from another application or shell script.\n\nOverride Functionality\n----------------------\n\nExisting functions can be overridden from script commands.\n\nSpecifically :any:`onClipboardChanged` and functions it calls can be\noverridden to customize handling of new clipboard content.\n\nE.g. following command saves only textual clipboard data and removes any\nformatted text:\n\n.. code-block:: js\n\n    var saveData_ = saveData\n\n    saveData = function() {\n        if ( str(data(mimeText)) != \"\" ) {\n            popup('Saving only text')\n            removeData(mimeHtml)\n            saveData_()\n        } else {\n            popup('Not saving non-textual data')\n        }\n    }\n\nE.g. following command overrides ``paste()`` to use an external utility for\npasting clipboard:\n\n.. code-block:: js\n\n    paste = function() {\n        var x = execute(\n            'xdotool',\n            'keyup', 'alt', 'ctrl', 'shift', 'super', 'meta',\n            'key', 'shift+Insert')\n        if (!x)\n            throw 'Failed to run xdotool'\n        if (x.stderr)\n            throw 'Failed to run xdotool: ' + str(x.stderr)\n    }\n\nE.g. show custom notifications for clipboard and primary selection changes.\n\n.. code-block:: js\n\n    function clipboardNotification(owns, hidden) {\n        var id = isClipboard() ? 'clipboard' : 'selection'\n        var icon = isClipboard() ? '\\uf0ea' : '\\uf246'\n        var owner = owns ? 'CopyQ' : str(data(mimeWindowTitle))\n        var title = id + ' - ' + owner\n        var message = hidden ? '<HIDDEN>' : data(mimeText).left(100)\n        notification(\n        '.id', id,\n        '.title', title,\n        '.message', message,\n        '.icon', icon\n        )\n    }\n\n    var onClipboardChanged_ = onClipboardChanged\n    onClipboardChanged = function() {\n        clipboardNotification(false, false)\n        onClipboardChanged_()\n    }\n\n    var onOwnClipboardChanged_ = onOwnClipboardChanged\n    onOwnClipboardChanged = function() {\n        clipboardNotification(true, false)\n        onOwnClipboardChanged_()\n    }\n\n    var onHiddenClipboardChanged_ = onHiddenClipboardChanged\n    onHiddenClipboardChanged = function() {\n        clipboardNotification(true, true)\n        onHiddenClipboardChanged_()\n    }\n"
  },
  {
    "path": "docs/conf.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n#\n# CopyQ documentation build configuration file, created by\n# sphinx-quickstart on Sat May 27 07:37:30 2017.\n#\n# This file is execfile()d with the current directory set to its\n# containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\n# import os\n# import sys\n# sys.path.insert(0, os.path.abspath('.'))\n\n\n# -- General configuration ------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = []\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\n#source_suffix = ['.rst', '.md']\nsource_suffix = '.rst'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# General information about the project.\nproject = 'CopyQ'\ncopyright = '2024, Lukas Holecek'\nauthor = 'Lukas Holecek'\ntitle = 'CopyQ Documentation'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\n#version = ''\n# The full version, including alpha/beta/rc tags.\n#release = ''\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = 'en'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This patterns also effect to html_static_path and html_extra_path\nexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n# If true, `todo` and `todoList` produce output, else they produce nothing.\ntodo_include_todos = False\n\n\n# -- Options for HTML output ----------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'sphinx_rtd_theme'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\n# html_theme_options = {}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\n#html_static_path = ['_static']\n\n# Logo and favicon\nhtml_logo = '../src/images/icon_64x64.png'\nhtml_favicon = '../src/images/icon_32x32.png'\n\n\n# -- Options for HTMLHelp output ------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'CopyQdoc'\n\n\n# -- Options for LaTeX output ---------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    # 'papersize': 'letterpaper',\n\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    # 'pointsize': '10pt',\n\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, 'CopyQ.tex', title, author, 'manual'),\n]\n\n\n# -- Options for manual page output ---------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    (master_doc, 'copyq', title, [author], 1)\n]\n\n\n# -- Options for Texinfo output -------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (master_doc, 'CopyQ', title,\n     author, 'CopyQ', 'One line description of project.',\n     'Miscellaneous'),\n]\n\n\n# Localization\nlocale_dirs = ['locale/']\n"
  },
  {
    "path": "docs/customize-and-build-the-windows-installer.rst",
    "content": "Customize and Build the Windows Installer\n=========================================\n\nTranslations\n------------\n\nMost of the translations for the installer are taken directly from the\ninstaller generator Inno Setup (http://www.jrsoftware.org/isinfo.php).\n\nYou can add translations for CopyQ-specific messages in\n``shared/copyq.iss``. Just copy lines starting with ``en.`` from\n``[Custom Messages]`` section and change prefix to ``de.`` (for german\ntranslation).\n\nModify and Test Installation\n----------------------------\n\nNormally the installation file is generated automatically by CI\nwhich creates a portable app folder from build files and runs Inno Setup.\n\nYou don't have to build the app again, you just need:\n\n1. Download the unzipped portable version of the app.\n2. Clone of this repository.\n3. Install `Inno Setup <http://www.jrsoftware.org/isinfo.php>`__.\n4. Open\n   `shared/copyq.iss <https://github.com/hluk/CopyQ/blob/master/shared/copyq.iss>`__\n   in Inno Setup and add few lines at the beginning of the file.\n\n::\n\n    #define AppVersion 2.8.1-beta\n    #define Source C:\\path\\to\\CopyQ-repository-clone\n    #define Destination C:\\path\\to\\CopyQ-portable\n\nYou should now be able to modify the file in Inno Setup and run it\neasily.\n"
  },
  {
    "path": "docs/faq.rst",
    "content": "FAQ - Frequently Asked Questions\n================================\n\n.. _faq-show-app:\n\nHow to open CopyQ window or tray menu using shortcut?\n-----------------------------------------------------\n\nAdd new command to open the CopyQ window or menu with a global shortcut:\n\n1. Open \"Command\" dialog (``F6`` shortcut).\n2. Click \"Add\" button in the dialog.\n3. Select \"Show/hide main window\" or \"Show the tray menu\" from the list\n   and click \"OK\" button.\n4. Click the button next to \"Global Shortcut\" label and set the\n   shortcut.\n5. Click \"OK\" button to save the changes.\n\nFor more information about commands see :ref:`writing-commands`.\n\n.. _faq-paste-from-window:\n\nHow to paste double-clicked item from CopyQ window?\n---------------------------------------------------\n\n1. Open \"Preferences\" (``Ctrl+P`` shortcut).\n2. Go to \"History\" tab.\n3. Enable \"Paste to current window\" option.\n\nNext time you open the CopyQ main window and activate an item,\nit should be pasted.\n\n.. _faq-paste-text:\n\nHow to paste as plain text?\n---------------------------\n\nTo **paste clipboard as plain text**:\n\n1. Open \"Command\" dialog (``F6`` shortcut).\n2. Click \"Add\" button in the dialog.\n3. Select \"Paste clipboard as plain text\" from the list and click \"OK\" button.\n4. Click the button next to \"Global Shortcut\" label and set the shortcut.\n5. Click \"OK\" button to save the changes.\n\nTo **paste selected items as plain text** (from CopyQ window) follow the steps above\nbut add \"Paste as Plain Text\" command instead and change \"Shortcut\".\n\n.. _faq-store-text:\n\nHow to store only plain text?\n-----------------------------\n\nTo **disallow storing HTML and rich text**:\n\n1. Open \"Preferences\" (``Ctrl+P`` shortcut).\n2. Go to \"Items\" tab.\n3. Disable \"Web\" item in the list.\n4. Select \"Text\" item.\n5. Disable \"Save and display HTML and rich text\".\n\nSimilarly, you can also disable \"Images\" in the list to avoid storing and\nrendering images.\n\nExisting items won't be affected but **any data formats can be removed**:\n\n1. Select an item.\n2. Press ``F4`` shortcut (\"Item - Show Content...\" in menu).\n3. Select format from list.\n4. Press ``Delete`` key.\n\n.. _faq-disable-clipboard-storing:\n\nHow to disable storing clipboard?\n---------------------------------\n\nTo temporarily disable storing the clipboard in the CopyQ item list,\nselect menu item \"File - Disable Clipboard Storing\" (``Ctrl+Shift+X`` shortcut).\nTo re-enable the functionality select \"File - Enable Clipboard Storing\" (same shortcut).\n\nTo permanently disable storing the clipboard in CopyQ:\n\n1. Open \"Preferences\" (``Ctrl+P`` shortcut).\n2. Go to \"History\" tab.\n3. Clear \"Tab for storing clipboard\" field.\n\nHow to back up tabs, configuration and commands?\n------------------------------------------------\n\nFrom menu select \"File - Export\" and choose which tabs to export and whether to export\nconfiguration and commands.\n\nTo restore the backup, select menu item \"File - Import\", select the exported file, and\nthen choose what to import back.\n\n.. note::\n\n   Importing tabs and commands won't override existing tabs, and will create new ones.\n\nSee also: :ref:`backup`\n\n.. _faq-disable-notifications:\n\nHow to enable or disable displaying notification when clipboard changes?\n------------------------------------------------------------------------\n\nTo enable displaying the notifications:\n\n1. Open \"Preferences\" (``Ctrl+P`` shortcut).\n2. Go to \"Notifications\" tab.\n3. Set non-zero value for \"Interval in seconds to display notifications\".\n4. Set non-zero value for \"Number of lines for clipboard notification\".\n5. Click \"OK\" button.\n\nTo enable displaying the notifications, set either of the options\nmentioned above to zero.\n\n.. _faq-share-commands:\n\nHow to load shared commands and share them?\n-------------------------------------------\n\nYou can stumble upon code that looks like this.\n\n.. code-block:: ini\n\n    [Command]\n    Name=Show/hide main window\n    Command=copyq: toggle()\n    Icon=\\xf022\n    GlobalShortcut=ctrl+shift+1\n\nThis code represents a command that can used in CopyQ (specifically it\nopens main window on Ctrl+Shift+1). To use the command in CopyQ:\n\n1. Copy the code above.\n2. Open \"Command\" dialog (``F6`` shortcut).\n3. Click \"Paste Commands\" button at the bottom of the dialog.\n4. Click OK button.\n\n(Now you should be able to open main window with Ctrl+Shift+1.)\n\nTo share your commands, you can select the commands from command list in\n\"Command\" dialog and press \"Copy Selected\" button (or just hit Ctrl+C).\n\n.. _faq-ignore-password-manager:\n\nHow to omit storing text copied from specific windows like a password manager?\n------------------------------------------------------------------------------\n\nAdd and modify automatic command to ignore text copied from the window:\n\n1. Open \"Command\" dialog (``F6`` shortcut).\n2. Click \"Add\" button in the dialog.\n3. Select \"Ignore *Password* window\" from the list and click \"OK\"\n   Button.\n4. Select \"Show Advanced\"\n5. Change \"Window\" text box to match the title (or part of it) of the\n   Window to ignore (e.g. ``KeePass``). But for **KeePassXC** (and possibly\n   other apps), it is better to set \"Format\" to ``x-kde-passwordManagerHint``\n   instead (also remember to remove the default that is set in the \"Window\"\n   setting, since both \"Window\" and \"Format\" need to match if they're set).\n6. Click \"OK\" button to save the changes.\n\n.. note::\n\n    This new command should be at the top of the command list because\n    automatic commands are executed in the order they appear in the list,\n    and we don't want to process sensitive data in any way.\n\nIn some cases, e.g. the password manager is an extension of a web browser or a\npassword is copied from a menu instead of a window, the command above won't\nwork. You can try setting the \"Window\" text box to ``^$``, which usually matches\npopup menus.\n\nFor a more reliable way, use `a command to blacklist texts\n<https://github.com/hluk/copyq-commands/tree/master/Scripts#blacklisted-texts>`__\n(it stores just a salted hash, the text itself is not stored anywhere).\n\n.. _faq-logging:\n\nHow to enable logging?\n----------------------\n\nSet environment variable ``COPYQ_LOG_LEVEL`` to ``DEBUG`` for verbose logging\nand set ``COPYQ_LOG_FILE`` to a file path for the log.\n\nYou can copy current log file path to clipboard from Action dialog (F5 shortcut)\nby entering command ``copyq 'copy(info(\"log\"))'``. Alternatively, press ``F12``\nto directly access the log.\n\nIf you **cannot access GUI**, you can **restart CopyQ from terminal** and **log\nto a separate file**. On Linux and macOS:\n\n.. code-block:: zsh\n\n    copyq exit\n    export COPYQ_LOG_LEVEL='DEBUG'\n    export COPYQ_LOG_FILE=\"$HOME/copyq.log\"\n    echo \"Logs will be written to $COPYQ_LOG_FILE\"\n    copyq\n\nOn Windows (in PowerShell):\n\n.. code-block:: powershell\n\n    & 'C:\\Program Files\\CopyQ\\copyq.exe' exit\n    $env:COPYQ_LOG_LEVEL = 'DEBUG'\n    $env:COPYQ_LOG_FILE = [Environment]::GetFolderPath(\"MyDocuments\") + '\\copyq.log'\n    echo \"Logs will be written to $env:COPYQ_LOG_FILE\"\n    & 'C:\\Program Files\\CopyQ\\copyq.exe'\n\nHow to preserve the order of copied items when copying or pasting multiple items?\n---------------------------------------------------------------------------------\n\na. Reverse order of selected items with ``Ctrl+Shift+R`` and copy them.\nb. Alternatively, select items in reverse order and then copy.\n\nSee `#165 <https://github.com/hluk/CopyQ/issues/165#issuecomment-34745058>`__.\n\nHow does pasting single/multiple items work internally?\n-------------------------------------------------------\n\n``Return`` key copies the whole item (with all formats) to the clipboard\nand -- if the \"Paste to current window\" option is enabled -- it sends\n``Shift+Insert`` to previous window. So the target application decides\nwhat format to paste on ``Shift+Insert``.\n\nIf you select more items and press ``Return``, just the concatenated\ntext of selected items is put into the clipboard. Though it could do more\nin future, like join HTML, images or other formats.\n\nSee `#165 <https://github.com/hluk/CopyQ/issues/165#issuecomment-34957089>`__.\n\nWhy does pasting from CopyQ not work?\n-------------------------------------\n\nPasting from CopyQ works only on Windows, macOS and X11 on Linux.\n\nSpecifically, this feature is not supported on Wayland, but you can use\nthe workaround: :ref:`known-issue-wayland`\n\nFirst, check if you have the appropriate options enabled:\n\na. For pasting from main window, enable \"Paste to current window\" in \"History\"\n   configuration tab.\nb. For pasting from tray menu, enable \"Paste activated item to current window\"\n   in \"Tray\" configuration tab.\n\nIf the pasting still doesn't work, check if ``Shift+Insert`` shortcut pastes to\nthe target window. That's the shortcut CopyQ uses by default. To change this to\n``Ctrl+V`` see `#633\n<https://github.com/hluk/CopyQ/issues/633#issuecomment-278326916>`__.\n\nIf pasting still doesn't work, it could be caused by either of these problems:\n\n- CopyQ fails to focus the target window correctly.\n- The format copied to the clipboard is not supported by the target application.\n\nHow to open the menu or context menu with only the keyboard?\n------------------------------------------------------------\n\nUse ``Alt+I`` to open the item menu or use the ``Menu`` key on your keyboard\nto open the context menu for selected items.\n\n.. _faq-hide-menu-bar:\n\nHow to hide the menu bar in the main CopyQ window?\n--------------------------------------------------\n\nThe menu bar can be hidden by modifying the style sheet of the current theme.\n\n1. Open \"Preferences\" (``Ctrl+P`` shortcut).\n2. Go to \"Appearance\" tab.\n3. Enable checkbox \"Set colors for tabs, tool bar and menus\".\n4. Click \"Edit Theme\" button.\n5. Find ``menu_bar_css`` option and add ``height: 0``:\n\n.. code-block:: ini\n\n    menu_bar_css=\"\n        ;height: 0\n        ;background: ${bg}\n        ;color: ${fg}\"\n\nHow to reuse file paths copied from a file manager?\n---------------------------------------------------\n\nBy default, only the text is stored in item list when you copy or cut\nfiles from a file manager. Other data is usually needed to be able to\ncopy/paste files from CopyQ.\n\nYou have to add additional data formats (MIME) using an automatic command\n(similar to one below). The commonly used format in many file managers is\n``text/uri-list``. Other special formats include\n``x-special/gnome-copied-files`` for Nautilus and\n``application/x-kde-cutselection`` for Dolphin. These formats are used to\nspecify type of action (copy or cut).\n\n.. code-block:: ini\n\n    [Command]\n    Command=\"\n        var originalFunction = global.clipboardFormatsToSave\n        global.clipboardFormatsToSave = function() {\n            return originalFunction().concat([\n                mimeUriList,\n                'x-special/gnome-copied-files',\n                'application/x-kde-cutselection',\n            ])\n        }\"\n    Icon=\\xf0c1\n    IsScript=true\n    Name=Store File Manager Metadata\n\nHow to trigger a command based on primary selection only?\n---------------------------------------------------------\n\nYou can check ``application/x-copyq-clipboard-mode`` format in automatic commands.\n\nE.g. if you set input format of a command it will be only executed on Linux\nmouse selection change:\n\n.. code-block:: ini\n\n    [Command]\n    Automatic=true\n    Command=\"\n        copyq:\n        popup(input())\"\n    Input=application/x-copyq-clipboard-mode\n    Name=Executed only on X11 selection change\n\nOtherwise you can check it in command:\n\n.. code-block:: ini\n\n    [Command]\n    Automatic=true\n    Command=\"\n        copyq:\n        if (str(data(mimeClipboardMode)) == 'selection')\n          popup('selection changed')\n        else\n          popup('clipboard changed')\"\n    Name=Show clipboard/selection change\n\nWhy can I no longer paste from the application on macOS?\n--------------------------------------------------------\n\nSee: :ref:`known-issue-macos-paste-after-install`\n\nWhy does my external editor fail to edit items?\n-----------------------------------------------\n\nCopyQ creates a temporary file with content of the edited item and passes it as\nargument to the custom editor command. If the file changes, the item is also\nmodified.\n\nUsual issues are:\n\n- External editor opens an empty file.\n- External editor warns that the file is missing.\n- Saving the file doesn't have any effect on the origin item.\n\nThis happens if **the command to launch the editor exits, but the editor\napplication itself is still running**. Since the command exited, CopyQ assumes\nthat the editor itself is no longer running, and stops monitoring the changes\nin the temporary file (and removes the file).\n\nHere is the correct command to use for some editors::\n\n    emacsclientw.exe --alternate-editor=\"\" %1\n    gvim --nofork %1\n    sublime_text --wait %1\n    code --wait %1\n    open -t -W -n %1\n\n.. _faq-config-path:\n\nWhere to find saved items and configuration?\n--------------------------------------------\n\nYou can find configuration and saved items in:\n\na. Windows folder ``%APPDATA%\\copyq`` for installed version of CopyQ.\nb. Windows sub-folder ``config`` in unzipped portable version of CopyQ.\nc. Linux directory ``~/.config/copyq``.\nd. In a directory specific to a given CopyQ instance - see :ref:`sessions`.\n\nRun ``copyq info config`` to get absolute path to the configuration file\n(parent directory contains saved items).\n\nWhy are items and configuration not saved?\n------------------------------------------\n\nCheck access rights to configuration directory and files.\n\nWhy do global shortcuts not work?\n---------------------------------\n\nGlobal/system shortcuts (or specific key combinations) don't work in some\ndesktop environments (e.g. Wayland on Linux).\n\nAs a workaround, you can try to assign the shortcuts in your system settings.\n\nTo get the command to launch for a shortcut:\n\n1. Open Command dialog (F6 from main window).\n2. Click on the command with the global shortcut in the left panel.\n3. Enable \"Show Advanced\" checkbox.\n4. Copy the content of \"Command\" text field.\n\n.. note::\n\n   If the command looks like this:\n\n   ::\n\n      copyq: toggle()\n\n   the actual command to use is:\n\n   ::\n\n      copyq -e \"toggle()\"\n\n.. _faq-force-hide-main-window:\n\nWhy doesn't the main window close on tiling window managers?\n------------------------------------------------------------\n\nThe main window remains open if it cannot minimize to task bar and tray icon is\nnot available. This is a safety feature to allow users to see that the\napplication is running and make any initial setup when the app is started for\nthe first time.\n\nTo force hiding main window:\n\n1. Open \"Preferences\" (``Ctrl+P`` shortcut).\n2. Go to \"Layout\" tab.\n3. Enable \"Hide main window\" option.\n\nAlternatively, run the following command::\n\n    copyq config hide_main_window true\n\nWhy does encryption ask for password so often?\n----------------------------------------------\n\nCopyQ 14.0.0 and above has a built-in encryption support, which requires\npassword only at start (and when changing encryption password). Even that can\nbe avoided if \"Use external key store\" option is enabled and the system\nsupports it (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet).\n\nIn older versions, there is an Encryption plugin which uses ``gpg2`` utility to\ndecrypt tabs and items. The password usually needs to be entered once every few\nminutes.\n\nIf the password prompt is showing up too often, either increase tab unloading\ninterval (\"Unload tab after an interval\" option in \"History\" tab in\nPreferences), or change ``gpg`` configuration (see `#946\n<https://github.com/hluk/CopyQ/issues/946#issuecomment-389538964>`__).\n\nHow to fix \"copyq: command not found\" errors?\n---------------------------------------------\n\nIf you're getting ``copyq: command not found`` or similar error, it means that\nthe ``copyq`` executable cannot be found by the shell or a language interpreter.\n\nThis usually happens if the executable's directory is not in the ``PATH``\nenvironmental variable.\n\nIf this happens when running from within the command, e.g.\n\n.. code-block:: bash\n\n    bash:\n    text=\"SOME TEXT\"\n    copyq copy \"$text\"\n\nyou can **fix it by using** ``COPYQ`` environment variable instead.\n\n.. code-block:: bash\n\n    bash:\n    text=\"SOME TEXT\"\n    \"$COPYQ\" copy \"$text\"\n\nWhat to do when CopyQ crashes or misbehaves?\n--------------------------------------------\n\nWhen CopyQ crashes or doesn't behave as expected, try to look up\na similar `issue <https://github.com/hluk/CopyQ/issues>`__ first\nand provide details in a comment for that issue.\n\nIf you cannot find any such an issue, `report a new bug\n<https://github.com/hluk/CopyQ/issues/new>`__.\n\nTry to provide the following details:\n\n- CopyQ version\n- operating system (desktop environment, window manager, etc.)\n- steps to reproduce the issue\n- application log (see :ref:`faq-share-commands`)\n- stacktrace if available (e.g. on Linux ``coredumpctl dump --reverse copyq``)\n"
  },
  {
    "path": "docs/fixing-bugs.rst",
    "content": "Fixing Bugs and Adding Features\n===============================\n\nThis page describes how to build, fix and improve the source code.\n\nMaking Changes\n--------------\n\nPull requests are welcome at `github project\npage <https://github.com/hluk/CopyQ>`__.\n\nFor more info see `Creating a pull request from a fork <https://help.github.com/articles/creating-a-pull-request-from-a-fork/>`__.\n\nTry to keep the code style consistent with the existing code.\n\nBuild the Debug Version\n-----------------------\n\n.. code-block:: bash\n\n    mkdir build\n    cd build\n    cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_TESTS=ON ..\n    make\n\nRun Tests\n---------\n\nYou can run automated tests if the application is built either in debug\nmode, with CMake flag ``-DWITH_TESTS=ON``.\n\nRun the tests with following command.\n\n.. code-block:: bash\n\n    copyq tests\n\nThis command will execute all test cases in new special CopyQ session so\nthat user configuration, tabs and items are not modified. It's better to\nclose any other CopyQ session before running tests since they can affect\ntest results.\n\nWhile running tests there must be **no keyboard and mouse interaction**.\nPreferably you can execute the tests in separate virtual environment. On\nLinux you can run the tests on virtual X11 server with ``xvfb-run``.\n\n.. code-block:: bash\n\n    xvfb-run sh -c 'openbox & sleep 1; copyq tests'\n\nTest invocation examples:\n\n- Print help for tests: ``copyq tests --help``\n- Run specific tests: ``copyq tests commandHelp commandVersion``\n- Run specific tests for a plugin: ``copyq tests 'PLUGINS:pinned' isPinned``\n- Run tests only for specific plugins: ``copyq tests 'PLUGINS:pinned|tags'``\n- List tests: ``copyq tests -functions``\n- List tests for a plugin: ``copyq tests PLUGINS:tags -functions``\n- Less verbose tests: ``copyq tests -silent``\n- Slower GUI tests: ``COPYQ_TESTS_KEYS_WAIT=1000 COPYQ_TESTS_KEY_DELAY=50 copyq tests editItems``\n"
  },
  {
    "path": "docs/glossary.rst",
    "content": ".. _glossary:\n\nGlossary\n========\n\nHere is a list of frequent terms from CopyQ.\n\n- Action - a command run from Action dialog\n- Clipboard - system clipboard that stores and provides copied stuff (``Ctrl+C``)\n- Command - user-defined command or script executed by the app\n- Item - element stored in a tab, usually automatically created from a new clipboard content\n- Main window - main application window shown by selecting \"Show\" from tray menu\n- Plugin - a binary file which adds some functionality when app starts\n- Process - an executed command\n- Script - simple code written in internal scripting language used by the app\n- Tray - tray or notification area in panel, contains small icons for various applications\n- Tray menu - menu invoked from app icon in tray (usually by right mouse button click)\n- Tab - container for multiple items, similar to tabs in modern web browsers\n"
  },
  {
    "path": "docs/images.rst",
    "content": "Images\n======\n\nThis page describes how to display and work with images in CopyQ.\n\nDisplay Image Items\n-------------------\n\nDisplaying images can be configured in \"Items\" configuration tab.\n\nOn Windows, \"Item Image\" plugin needs to be installed.\n\nTo disable storing and displaying image, disable the Image plugin\n(uncheck the checkbox next to \"Image\" in configuration).\n\nEditor\n------\n\nEditors for bitmap and SVG images can be set in the configuration.\n\n.. image:: images/image-editor.png\n\nEditing an image item (default shortcut is Ctrl+E) should open the image\neditor.\n\nUnfortunately, sometimes an item looks like an image but is an HTML. You\ncan list available formats in Content dialog F4.\n\nPreview Image\n-------------\n\nIt's useful to limit size of image item to a maximum width and height in\nthe configuration.\n\nYou can still display the whole image in Preview dock (F7) or using\nContent dialog (F4).\n\nTake Screenshots\n----------------\n\nYou can use built-in functionality for `taking\nscreenshots <https://github.com/hluk/copyq-commands/tree/master/Global#screenshot>`__\nof whole or part of the desktop.\n\nPaste taken screenshots to CopyQ to store them for later use.\n\nSave Image to a File\n--------------------\n\nTo save an image to a file, either copy it or drag'n'drop it to a file\nmanager (if supported) or save it using command line.\n\n.. code-block:: bash\n\n    copyq read image/png 0 > image.png\n\nAlternatively use `\"Save Item/Clipboard To a File\"\ncommand <https://github.com/hluk/copyq-commands/tree/master/Application#save-itemclipboard-to-a-file>`__.\n"
  },
  {
    "path": "docs/index.rst",
    "content": "Welcome to CopyQ's documentation!\n=================================\n\nCopyQ is clipboard manager -- a desktop application which stores content of the\nsystem clipboard whenever it changes and allows to search the history and copy\nit back to the system clipboard or paste it directly to other applications.\n\nThis documentation describes some basic concepts and workflows as well as more\nadvanced topics like scripting and application development process.\n\n.. toctree::\n    :caption: The Basics\n    :maxdepth: 2\n\n    installation\n    basic-usage\n    tabs-and-items\n    keyboard\n    images\n    tags\n    security\n    theme\n    faq\n    known-issues\n    glossary\n\n.. toctree::\n    :caption: Advanced Topics\n    :maxdepth: 2\n\n    command-line\n    sessions\n    pin-items\n    password-protection\n    synchronize\n    writing-commands-and-adding-functionality\n    scripting\n    command-examples\n    commands-script\n    commands-display\n    backup\n    writing-raw-data\n    scripting-api\n\n.. toctree::\n    :caption: Development\n    :maxdepth: 2\n\n    build-source-code\n    fixing-bugs\n    source-code-overview\n    translations\n    text-encoding\n    customize-and-build-the-windows-installer\n"
  },
  {
    "path": "docs/installation.rst",
    "content": "Installation\n============\n\nPackages and installation files are available at `Releases page <https://github.com/hluk/CopyQ/releases>`__.\n\nAlternatively, you can install the app with one of the following methods:\n\nOn **Windows**, you can install `Chocolatey package <https://chocolatey.org/packages/copyq>`__.\n\nOn **macOS** (13 and above), you can use `Homebrew <https://brew.sh/>`__ to install the app\n(also see the problem in the next section):\n\n.. code-block:: bash\n\n    brew install --cask copyq\n\nOn **macOS**, if you encounter an issue where the app crashes with a dialog\nsaying \"CopyQ is damaged\" or \"CopyQ cannot be opened\", you may need to run the\nfollowing commands (for details, see `issue #2652\n<https://github.com/hluk/CopyQ/issues/2652>`__):\n\n.. code-block:: bash\n\n    xattr -d com.apple.quarantine /Applications/CopyQ.app\n    codesign --force --deep --sign - /Applications/CopyQ.app\n\nOn **macOS**, after Homebrew installation, the ``copyq`` CLI command is not\navailable by default. To enable CLI access, create a symlink manually:\n\n.. code-block:: bash\n\n    sudo ln -sf /Applications/CopyQ.app/Contents/MacOS/CopyQ /usr/local/bin/copyq\n\nAfter this, you can use the CLI:\n\n.. code-block:: bash\n\n    copyq --version\n    copyq clipboard\n    copyq size\n\nOn **Debian** and **Ubuntu+** install a stable version from official\nrepositories:\n\n.. code-block:: bash\n\n    sudo apt install copyq\n    # copyq-plugins and copyq-doc is split out and can be installed independently\n\nOn **Fedora**, install \"copyq\" package:\n\n.. code-block:: bash\n\n    sudo dnf install copyq\n\nOn other Linux distributions, you can use `Flatpak <https://flatpak.org/>`__\nto install the app:\n\n.. code-block:: bash\n\n    # Install from Flathub.\n    flatpak install --user --from https://flathub.org/repo/appstream/com.github.hluk.copyq.flatpakref\n\n    # Run the app.\n    flatpak run com.github.hluk.copyq\n"
  },
  {
    "path": "docs/keyboard.rst",
    "content": "Keyboard\n========\n\nThis page lists useful default shortcuts and key mappings for CopyQ and\ndescribes how to change them.\n\nCopyQ is keyboard-friendly, i.e. it should be possible to quickly access\nany functionality with keyboard without using mouse.\n\nDefault Shortcuts\n-----------------\n\n.. note::\n\n   On OS X, use ⌘ key instead of Ctrl for the shortcuts.\n\n-  PgDown/PgUp, Home/End, Up/Down - item list navigation\n-  Left, Right, Ctrl+Tab, Ctrl+Shift+Tab - tab navigation\n-  Ctrl+T, Ctrl+W - create and remove tabs\n-  Ctrl+Up, Ctrl+Down - move selected items\n-  Esc - cancel search, hide window\n-  Ctrl+Q - exit\n-  F2 - edit selected items\n-  Ctrl+E - edit items in an external editor\n-  F5 - open action dialog for selected items\n-  Delete - delete selected items\n-  Ctrl+A - select all\n-  Enter - put current item into clipboard and paste item (optional)\n-  Ctrl+1...Ctrl+9 - focus a tab in given order\n-  Ctrl+0 - focus last tab\n\nSearch\n------\n\nStart typing a text to search items. This works in main application\nwindow and ``copyq menu``.\n\nChange Shortcuts\n----------------\n\nTo change the shortcuts:\n\n1. Open \"File - Preferences\".\n2. Select \"Shortcuts\" tab.\n3. Click the button next to action you need to change.\n4. Press a shortcut on keyboard.\n5. Click OK to save the dialog.\n\nCreate new Shortcut\n-------------------\n\nIf and action with shortcut is missing in the Shortcuts configuration\ntab, you can use predefined ones:\n\n1. Open \"File - Commands/Global Shortcuts...\".\n2. Click \"Add\" button.\n3. Select command (e.g. \"Show/hide main window\").\n4. Press a shortcut on keyboard.\n5. Click OK to save the dialog.\n"
  },
  {
    "path": "docs/known-issues.rst",
    "content": "Known Issues\n============\n\nThis document lists known commonly occurring issues and possible solutions.\n\n.. _known-issue-window-tray-hidden:\n\nOn Windows, tray icon is hidden/repositioned after restart\n----------------------------------------------------------\n\nWith current official builds of CopyQ, the tray icon position and hide/show\nstatus are not restored after the application is restarted or after logging in.\n\n**Workaround** is to use CopyQ binaries build with older Qt framework version (Qt\n5.9); these are provided in latest comments in the issue link below.\n\n.. seealso::\n\n    `Issue #1258 <https://github.com/hluk/CopyQ/issues/1258>`__\n\n.. _known-issue-windows-console-output:\n\nOn Windows, CopyQ does not print anything on console\n----------------------------------------------------\n\nOn Windows, you may not see any output when executing CopyQ in a\nconsole/terminal application (PowerShell or cmd).\n\n**Workarounds:**\n\n* Use different console application: Git Bash, Cygwin or similar.\n* Use Action dialog in CopyQ (``F5`` shortcut) and set \"Store standard output\"\n  to \"text/plain\" to save the output as new item in current tab.\n* Append ``| Write-Output`` to commands in PowerShell:\n\n  .. code-block:: powershell\n\n    & 'C:\\Program Files\\CopyQ\\copyq.exe' help | Write-Output\n\n.. seealso::\n\n    `Issue #349 <https://github.com/hluk/CopyQ/issues/349>`__\n\n.. _known-issue-macos-paste-after-install:\n\nOn macOS, CopyQ won't paste after installation/update\n-----------------------------------------------------\n\nCopyQ is not signed app, you need to grant Accessibility again when it's\ninstalled or updated.\n\n**To fix this**, try following steps:\n\n1. Go to System Preferences -> Security & Privacy -> Privacy -> Accessibility\n   (or just search for \"Allow apps to use Accessibility\").\n2. Click the unlock button.\n3. Select CopyQ from the list and remove it (with the \"-\" button).\n\n.. seealso::\n\n    - `Issue #1030 <https://github.com/hluk/CopyQ/issues/1030>`__\n    - `Issue #1245 <https://github.com/hluk/CopyQ/issues/1245>`__\n\n.. _known-issue-gnome:\n\nOn GNOME, new clipboard is not stored\n-------------------------------------\n\nThe app requires CopyQ Clipboard Monitor GNOME extension to be enabled so it\ncan watch clipboard changes and store them. The GNOME extension can be\ninstalled with CopyQ 14.0.0.\n\n.. _known-issue-wayland:\n\nOn Linux, global shortcuts, pasting or clipboard monitoring does not work\n-------------------------------------------------------------------------\n\nThis can be caused by running CopyQ under a **Wayland** window manager instead\nof the X11 server.\n\nDepending on the desktop environment, these features may not be supported:\n\n- global shortcuts\n- clipboard monitoring\n- pasting from CopyQ and issuing copy command to other apps (that is passing\n  shortcuts to application)\n- screenshot functionality\n- retrieving and matching window titles\n- querying keyboard modifiers and mouse position\n\n**Workaround:** try using the **Wayland Support** command mentioned below or\nset ``QT_QPA_PLATFORM`` environment variable to run the app under **Xwayland**\nmode (additional package may be needed, for example:\n``xorg-x11-server-Xwayland`` in Fedora).\n\nFor example, launch CopyQ with::\n\n    env QT_QPA_PLATFORM=xcb copyq\n\nIf CopyQ autostarts, you can change ``Exec=...`` line in\n``~/.config/autostart/copyq.desktop``::\n\n    Exec=env QT_QPA_PLATFORM=xcb copyq\n\nFor **Flatpak** application, see `this workaround\n<https://github.com/hluk/CopyQ/issues/2948#issuecomment-2614271330>`__.\n\n.. note::\n\n    Mouse selection will still work only if the source application itself\n    supports it.\n\n.. seealso::\n\n    `Wayland Support\n    <https://github.com/hluk/copyq-commands/tree/master/Scripts#wayland-support>`__\n    command reimplements some features on Wayland through external tools (see\n    `README <https://github.com/hluk/copyq-commands/blob/master/README.md>`__\n    for details on how to add the command).\n\n    `Issue #27 <https://github.com/hluk/CopyQ/issues/27>`__\n\nScripting command \"copy()\" fails\n--------------------------------\n\nThe command ``copy()`` sends the Ctrl+C shortcut to the current window.\nThis can fail depending on the active application.\nIf CopyQ won't detect a clipboard change, it throws an exception.\nThe execution then fails with the message ``Failed to copy to clipboard!``.\n\nAn alternative under Windows is to use a Powershell script to override the ``copy`` operation\n(see :ref:`faq-share-commands`):\n\n.. code-block:: powershell\n\n    [Command]\n    Command=\"\n        copy = function() {\n            execute('powershell', '-Command', `\n                Add-Type -AssemblyName System.Windows.Forms;\n                Start-Sleep -Milliseconds 300;\n                [System.Windows.Forms.SendKeys]::SendWait(\\\"^c\\\");\n                Start-Sleep -Milliseconds 300;\n            `);\n        }\"\n    IsScript=true\n    Name=Override copy()\n\nThe delays are added to make sure no focus issues occur and the text is copied to the clipboard.\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=python -msphinx\n)\nset SOURCEDIR=.\nset BUILDDIR=_build\nset SPHINXPROJ=CopyQ\n\nif \"%1\" == \"\" goto help\n\n%SPHINXBUILD% >NUL 2>NUL\nif errorlevel 9009 (\n\techo.\n\techo.The Sphinx module was not found. Make sure you have Sphinx installed,\n\techo.then set the SPHINXBUILD environment variable to point to the full\n\techo.path of the 'sphinx-build' executable. Alternatively you may add the\n\techo.Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.http://sphinx-doc.org/\n\texit /b 1\n)\n\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%\ngoto end\n\n:help\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%\n\n:end\npopd\n"
  },
  {
    "path": "docs/password-protection.rst",
    "content": ".. _encrypt:\n\nPassword Protection\n===================\n\nThis page describes how to encrypt and protect selected tabs and single\nitems with a password.\n\n.. note::\n\n   CopyQ 14.0.0 and above will support encrypting all data using a custom\n   Password. This can be enabled with \"Encrypt Tabs\" option in Preferences. As\n   An alternative, available in older versions, the below describes using\n   Encryption plugin to encrypt specific tabs or single items (this requires a\n   GnuPG utility to be installed).\n\nInstallation\n------------\n\nTo enable this feature you need to have \"Encryption\" item plugin.\n\n.. image:: images/encryption-install.png\n\nThe plugin configuration (under \"Items\" configuration tab in\nConfiguration dialog) may prompt you to install\n`GnuPG <http://www.gnupg.org/>`__:\n\n-  For Windows you can use `Chocolatey <https://chocolatey.org/install>`__ to\n   install `Gpg4win <https://chocolatey.org/packages/gpg4win>`__::\n\n       choco install gpg4win\n\n-  For Linux install ``gpg`` command line utility. It's usually provided\n   by ``gnupg`` package but the package name may differ on some\n   distributions.\n\nGenerate Keys and Set Password\n------------------------------\n\nTo be able to encrypt tabs and items you first need to generate private\nand public key files.\n\nClick on the \"Generate Ney Keys...\" button and wait.\n\n.. image:: images/encryption-generate-keys.png\n\nIf didn't set a password in previous step click \"Change Password...\"\nbutton and set it.\n\n.. image:: images/encryption-password.png\n\nLast step in configuration is to set tabs to encrypt. You can skip this\nstep if you only need to encrypt single item in each tab (see next\nsection).\n\n.. image:: images/encryption-tabs.png\n\nClick \"OK\" button to confirm Configuration dialog.\n\nProtect Tabs\n------------\n\nNow you can create the tabs you want to encrypt (Ctrl+T to create new\ntab).\n\nThe tab name should be same as one of the tabs entered in plugin\nconfiguration in previous step.\n\n.. image:: images/encryption-tab.png\n\nYou'll be prompt to enter password in future (you only need to enter it\nonce in a while).\n\nIf you enter wrong password or cancel the password prompt you can later\nclick on \"Reload\" button in tab to enter password again.\n\n.. image:: images/encryption-reload.png\n\nProtect Single Items\n--------------------\n\nTo protect items in unprotected tab you can add menu and tool bar\nactions with keyboard shortcut.\n\nGo to Command dialog F6, click on \"Add\" button, \"Encryption\" commands\nfrom list and confirm dialogs with \"OK\" button.\n\nNow you can select items and press Ctrl+L to encrypt (\"Items -\nEncryption - Encrypt\" in menu).\n\nTo decrypt selected item press Ctrl+L (\"Items - Encryption - Decrypt\" in\nmenu).\n"
  },
  {
    "path": "docs/pin-items.rst",
    "content": "Pin Items\n=========\n\nThis page describes how to pin selected items in a tab so they cannot be\naccidentally removed or moved from current row.\n\nWhy pin items?\n--------------\n\nThere are two main reasons to pin items.\n\nIf a new item is added to a list (e.g. automatically when clipboard changed),\nrest of the items need to move one row down, except pinned items which stay on\nthe same row. This is useful to **pin important items to the top of the list**.\n\nIf a tab is full (see option \"Maximum number of items in history\" in \"History\"\nconfiguration tab), adding a new item removes old item from bottom of the list.\n**Pinned items cannot be removed** so the last unpinned item is removed\ninstead.\n\n.. note::\n\n    New items cannot be added to a tab if all its items are pinned and the tab\n    is full.\n\nConfiguration\n-------------\n\n.. note::\n\n    On Windows, to enable this feature you need to install \"Pinned Items\"\n    plugin.\n\nTo enable this functionality, assign keyboard shortcut for Pin and Unpin\nactions in \"Shortcuts\" tab in Preferences (``Ctrl+P``).\n\n.. note::\n\n    Keyboard shortcut for both menu items can be the same since at most one of\n    the menu items is always visible.\n\nPinning Items\n-------------\n\nIf set up correctly, when you select items, Pin action should be available in\ntoolbar, context menu and \"Item\" menu.\n\nSelecting the Pin menu item (or pressing assigned keyboard shortcut) will pin\nselected items to their current rows.\n\nPinned items will show with **gray bar on the right side** in the list.\n\nDeleting pinned items won't work, unpin the items first.\nUnpin action is available if an pinned item is selected.\n\nPinned items also will stay in same rows unless you **move them with mouse or\nusing keyboard shortcuts** (``Ctrl+Up/Down/Home/End``).\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "sphinx==7.2.6\nsphinx-rtd-theme==1.3.0\n"
  },
  {
    "path": "docs/scripting-api.rst",
    "content": ".. _scripting-api:\n\nScripting API\n=============\n\nCopyQ provides scripting capabilities to automatically handle clipboard\nchanges, organize items, change settings and much more.\n\nSupported language features and functions can be found at `ECMAScript Reference\n<https://doc.qt.io/qt-6/qtqml-javascript-functionlist.html>`__. The language is\nmostly equivalent to modern JavaScript. Some features may be missing but feel\nfree to use for example `JavaScript reference on MDN\n<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/>`__.\n\nCopyQ-specific features described in this document:\n\n- `Functions`_\n- `Types`_\n- `Objects`_\n- `MIME types`_\n- `Plugins`_\n\n.. note::\n\n    These terms are equivalent: format, MIME type, media type\n\nExecute Script\n--------------\n\nThe scripts can be executed from:\n\na.  Action or Command dialogs (F5, F6 shortcuts), if\n    the first line starts with ``copyq:``\nb.  command line as ``copyq eval '<SCRIPT>'``\nc.  command line as ``cat script.js | copyq eval -``\nd.  command line as\n    ``copyq <SCRIPT_FUNCTION> <FUNCTION_ARGUMENT_1> <FUNCTION_ARGUMENT_2> ...``\n\nWhen run from command line, result of last expression is printed on\nstdout.\n\nCommand exit values are:\n\n-  0 - script finished without error\n-  1 - :js:func:`fail` was called\n-  2 - bad syntax\n-  3 - exception was thrown\n\nCommand Line\n------------\n\nIf number of arguments that can be passed to function is limited you can\nuse\n\n.. code-block:: bash\n\n    copyq <FUNCTION1> <FUNCTION1_ARGUMENT_1> <FUNCTION1_ARGUMENT_2> \\\n              <FUNCTION2> <FUNCTION2_ARGUMENT> \\\n                  <FUNCTION3> <FUNCTION3_ARGUMENTS> ...\n\nwhere ``<FUNCTION1>`` and ``<FUNCTION2>`` are scripts where result of\nlast expression is functions that take two and one arguments\nrespectively.\n\nExample:\n\n.. code-block:: bash\n\n    copyq tab clipboard separator \",\" read 0 1 2\n\nAfter :js:func:`eval` no arguments are treated as functions since it can access\nall arguments.\n\nArguments recognize escape sequences ``\\n`` (new line), ``\\t``\n(tabulator character) and ``\\\\`` (backslash).\n\nArgument ``-e`` is identical to :js:func:`eval`.\n\nArgument ``-`` is replaced with data read from stdin.\n\nArgument ``--`` is skipped and all the remaining arguments are\ninterpreted as they are (escape sequences are ignored and ``-e``, ``-``,\n``--`` are left unchanged).\n\nFunctions\n---------\n\nArgument list parts ``...`` and ``[...]`` are optional and can be\nomitted.\n\nComment `/*set*/` in function declaration indicates a specific function\noverload.\n\nItem **row** values in scripts always **start from 0** (like array index),\nunlike in GUI, where row numbers start from 1 by default.\n\n.. js:function:: version()\n\n   Returns version string.\n\n   :returns: Version string.\n   :rtype: string\n\n   Example of the version string::\n\n       CopyQ Clipboard Manager v4.0.0-19-g93d95a7f\n       Qt: 5.15.2\n       KNotifications: 5.79.0\n       Compiler: GCC\n       Arch: x86_64-little_endian-lp64\n       OS: Fedora 33 (Workstation Edition)\n\n.. js:function:: help()\n\n   Returns help string.\n\n   :returns: Help string.\n   :rtype: string\n\n.. js:function:: /*search*/ help(searchString, ...)\n\n   Returns help for matched commands.\n\n   :returns: Help string.\n   :rtype: string\n\n.. js:function:: show()\n\n   Shows main window.\n\n   This uses the last window position and size which is updated whenever the\n   window is moved or resized.\n\n.. js:function:: /*tab*/ show(tabName)\n\n   Shows tab.\n\n   This uses the last window position and size which is updated whenever the\n   window is moved or resized.\n\n.. js:function:: showAt(x, y, [width, height])\n\n   Shows main window with given geometry.\n\n   The new window position and size will not be stored for ``show()``.\n\n.. js:function:: /*cursor*/ showAt()\n\n   Shows main window under mouse cursor.\n\n   The new window position will not be stored for ``show()``.\n\n.. js:function:: /*tab*/ showAt(x, y, width, height, tabName)\n\n   Shows tab with given geometry.\n\n   The new window position and size will not be stored for ``show()``.\n\n.. js:function:: hide()\n\n   Hides main window.\n\n.. js:function:: toggle()\n\n   Shows or hides main window.\n\n   This uses the last window position and size which is updated whenever the\n   window is moved or resized.\n\n   :returns: ``true`` only if main window is being shown, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: menu()\n\n   Opens context menu.\n\n.. js:function:: /*tab*/ menu(tabName, [maxItemCount, [x, y]])\n\n   Shows context menu for given tab.\n\n   This menu doesn't show clipboard and doesn't have any special actions.\n\n   Second argument is optional maximum number of items. The default value\n   same as for tray (i.e. value of ``config('tray_items')``).\n\n   Optional arguments x, y are coordinates in pixels on screen where menu\n   should show up. By default menu shows up under the mouse cursor.\n\n.. js:function:: exit()\n\n   Exits server.\n\n.. js:function:: disable()\n                 enable()\n\n   Disables or enables clipboard content storing.\n\n.. js:function:: monitoring()\n\n   Returns true only if clipboard storing is enabled.\n\n   :returns: ``true`` if clipboard storing is enabled, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: visible()\n\n   Returns true only if main window is visible.\n\n   :returns: ``true`` if main window is visible, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: focused()\n\n   Returns true only if main window has focus.\n\n   :returns: ``true`` if main window has focus, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: focusPrevious()\n\n   Activates window that was focused before the main window.\n\n   :throws Error: Thrown if previous window cannot be activated.\n\n.. js:function:: preview([true|false])\n\n   Shows/hides item preview and returns true only if preview was visible.\n\n   Example -- toggle the preview:\n\n   .. code-block:: js\n\n       preview(false) || preview(true)\n\n.. js:function:: filter()\n\n   Returns the current text for filtering items in main window.\n\n   :returns: Current filter.\n   :rtype: string\n\n.. js:function:: /*set*/ filter(filterText)\n\n   Sets text for filtering items in main window.\n\n.. js:function:: ignore()\n\n   Ignores current clipboard content (used for automatic commands).\n\n   This does all of the below.\n\n   -  Skips any next automatic commands.\n   -  Omits changing window title and tray tool tip.\n   -  Won't store content in clipboard tab.\n\n.. js:function:: clipboard([mimeType])\n\n   Returns clipboard data for MIME type (default is text).\n\n   Pass argument ``\"?\"`` to list available MIME types.\n\n   :returns: Clipboard data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: selection([mimeType])\n\n   Same as :js:func:`clipboard` for `primary selection`_.\n\n   :returns: Selection data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: hasClipboardFormat(mimeType)\n\n   Returns true only if clipboard contains MIME type.\n\n   :returns: ``true`` if clipboard contains the format, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: hasSelectionFormat(mimeType)\n\n   Same as :js:func:`hasClipboardFormat` for `primary selection`_.\n\n   :returns: ``true`` if selection contains the format, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: isClipboard()\n\n   Returns true only in automatic command triggered by clipboard change.\n\n   This can be used to check if current automatic command was triggered by\n   clipboard and not `primary selection`_ change.\n\n   :returns: ``true`` if current automatic command is triggered by clipboard\n             change, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: copy(text)\n\n   Sets clipboard plain text.\n\n   Same as ``copy(mimeText, text)``.\n\n   :throws Error: Thrown if clipboard fails to be set.\n\n.. js:function:: /*data*/ copy(mimeType, data, [mimeType, data]...)\n\n   Sets clipboard data.\n\n   This also sets :js:data:`mimeOwner` format so automatic commands are not run\n   on the new data and it's not stored in clipboard tab.\n\n   All other data formats are dropped from clipboard.\n\n   :throws Error: Thrown if clipboard fails to be set.\n\n   Example -- set both text and rich text:\n\n   .. code-block:: js\n\n       copy(mimeText, 'Hello, World!',\n            mimeHtml, '<p>Hello, World!</p>')\n\n.. js:function:: /*item*/ copy(Item)\n\n   Function override with an item argument.\n\n   :throws Error: Thrown if clipboard fails to be set.\n\n   Example -- set both text and rich text:\n\n   .. code-block:: js\n\n       var item = {}\n       item[mimeText] = 'Hello, World!'\n       item[mimeHtml] = '<p>Hello, World!</p>'\n       copy(item)\n\n.. js:function:: /*window*/ copy()\n\n   Sends ``Ctrl+C`` to the current application or window to trigger a copy\n   operation.\n\n   The function resets the clipboard before sending the shortcut so it can\n   detect changes properly.\n\n   :throws Error: Thrown if the clipboard does not change. This can indicate\n      that sending the shortcut failed, the target current window could not be\n      retrieved, or that nothing valid was selected to copy. In such case, see\n      logs for more details.\n\n   Example:\n\n   .. code-block:: js\n\n       try {\n           copy()\n       } catch (e) {\n           popup('Copying Failed', e)\n           abort()\n       }\n       let text = str(clipboard())\n       popup('Copied Text', text)\n\n.. js:function:: copySelection(text)\n\n   Sets primary selection plain text.\n\n   Equivalent to ``copy(text)`` but for `primary selection`_.\n\n   :throws Error: Thrown if selection fails to be set.\n\n.. js:function:: /*data*/ copySelection(mimeType, data, [mimeType, data]...)\n\n   Sets primary selection data.\n\n   Equivalent to ``copy(mimeType, data, ...)`` but for `primary selection`_.\n\n   :throws Error: Thrown if selection fails to be set.\n\n.. js:function:: /*item*/ copySelection(Item)\n\n   Sets primary selection from an item.\n\n   Equivalent to ``copy(Item)`` but for `primary selection`_.\n\n   :throws Error: Thrown if selection fails to be set.\n\n.. js:function:: paste()\n\n   Sends ``Shift+Insert`` (or ``Ctrl+V``) to the current application or window\n   to trigger a paste operation.\n\n   If the regular expression in the option ``window_paste_with_ctrl_v_regex``\n   matches the current window title, the shortcut ``Ctrl+V`` is sent instead of\n   the default ``Shift+Insert``. For example, to override the option so that\n   ``Ctrl+V`` is sent for all windows, call:\n\n   .. code-block:: js\n\n       config('window_paste_with_ctrl_v_regex', '.*')\n\n   Correct functionality depends a lot on target application and window\n   manager.\n\n   :throws Error: Thrown if paste operation fails. This can indicate that\n      sending the shortcut failed, the target current window could not be\n      retrieved. In such case, see logs for more details.\n\n   Example:\n\n   .. code-block:: js\n\n       copy(text)\n       try {\n           paste()\n       } catch (e) {\n           popup('Pasting Failed', e)\n           abort()\n       }\n       popup('Pasting Successful')\n\n.. js:function:: tab()\n\n   Returns tab names.\n\n   :returns: Array with names of existing tab.\n   :rtype: array of strings\n\n.. js:function:: /*set*/ tab(tabName)\n\n   Sets current tab for the script.\n\n   Example -- select third item at index 2 from tab \"Notes\":\n\n   .. code-block:: js\n\n       tab('Notes')\n       select(2)\n\n.. js:function:: removeTab(tabName)\n\n   Removes tab.\n\n.. js:function:: renameTab(tabName, newTabName)\n\n   Renames tab.\n\n.. js:function:: tabIcon(tabName)\n\n   Returns path to icon for tab.\n\n   :returns: Path to icon for tab.\n   :rtype: string\n\n.. js:function:: /*set*/ tabIcon(tabName, iconPath)\n\n   Sets icon for tab.\n\n.. js:function:: unload([tabNames...])\n\n   Unload tabs (i.e. items from memory).\n\n   If no tabs are specified, unloads all tabs.\n\n   If a tab is open and visible or has an editor open, it won't be unloaded.\n\n   :returns: Array of successfully unloaded tabs.\n   :rtype: array of strings\n\n.. js:function:: forceUnload([tabNames...])\n\n   Force-unload tabs (i.e. items from memory).\n\n   If no tabs are specified, unloads all tabs.\n\n   Refresh button needs to be clicked to show the content of a force-unloaded\n   tab.\n\n   If a tab has an editor open, the editor will be closed first even if it has\n   unsaved changes.\n\n.. js:function:: count()\n                 length()\n                 size()\n\n   Returns amount of items in current tab.\n\n   :returns: Item count.\n   :rtype: int\n\n.. js:function:: select(row)\n\n   Copies item in the row to clipboard.\n\n   Additionally, moves selected item to top depending on settings.\n\n.. js:function:: next()\n\n   Copies next item from current tab to clipboard.\n\n.. js:function:: previous()\n\n   Copies previous item from current tab to clipboard.\n\n.. js:function:: add(text|Item...)\n\n   Same as ``insert(0, ...)``.\n\n.. js:function:: insert(row, text|Item...)\n\n   Inserts new items to current tab.\n\n   :throws Error: Thrown if space for the items cannot be allocated.\n\n.. js:function:: remove(row, ...)\n\n   Removes items in current tab.\n\n   :throws Error: Thrown if some items cannot be removed.\n\n.. js:function:: move(row)\n\n    Moves selected items to given row in same tab.\n\n.. js:function:: edit([row|text] ...)\n\n   Edits items in the current tab.\n\n   Opens external editor if set, otherwise opens internal editor.\n\n   If row is -1 (or other negative number) edits clipboard instead\n   and creates new item.\n\n.. js:function:: editItem(row, [mimeType, [data]])\n\n   Edits specific format for the item.\n\n   Opens external editor if set, otherwise opens internal editor.\n\n   If row is -1 (or other negative number) edits clipboard instead\n   and creates new item.\n\n.. js:function:: read([mimeType])\n\n   Same as :js:func:`clipboard`.\n\n.. js:function:: /*row*/ read(mimeType, row, ...)\n\n   Returns concatenated data from items, or clipboard if row is negative.\n\n   Pass argument ``\"?\"`` to list available MIME types.\n\n   :returns: Concatenated data in the rows.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: write(row, mimeType, data, [mimeType, data]...)\n\n   Inserts new item to current tab.\n\n   :throws Error: Thrown if space for the items cannot be allocated.\n\n.. js:function:: /*item*/ write(row, Item...)\n\n   Function override with one or more item arguments.\n\n.. js:function:: /*items*/ write(row, Item[])\n\n   Function override with item list argument.\n\n.. js:function:: change(row, mimeType, data, [mimeType, data]...)\n\n   Changes data in item in current tab.\n\n   If data is ``undefined`` the format is removed from item.\n\n.. js:function:: /*item*/ change(row, Item...)\n\n   Function override with one or more item arguments.\n\n.. js:function:: /*items*/ change(row, Item[])\n\n   Function override with item list argument.\n\n.. js:function:: separator()\n\n   Returns item separator (used when concatenating item data).\n\n   :returns: Current separator.\n   :rtype: string\n\n.. js:function:: /*set*/ separator(separator)\n\n   Sets item separator for concatenating item data.\n\n.. js:function:: action()\n\n   Opens action dialog.\n\n.. js:function:: /*row*/ action([rows, ...], command, [outputItemSeparator])\n\n   Runs command for items in current tab.\n\n   If rows arguments is specified, ``%1`` in the command will be replaced with\n   concatenated text of the rows. If a row is negative, the text is taken from\n   the clipboard.\n\n   If no rows are specified, ``%1`` in the command will be replaced with\n   clipboard text.\n\n   The concatenated text is also passed on standard input of the command.\n\n.. js:function:: popup(title, message, [time=8000])\n\n   Shows popup message for given time in milliseconds.\n\n   If ``time`` argument is set to -1, the popup is hidden only after mouse\n   click.\n\n.. js:function:: notification(...)\n\n   Shows popup message with icon and buttons.\n\n   Each button can have script and data.\n\n   If button is clicked the notification is hidden and script is executed\n   with the data passed as stdin.\n\n   The function returns immediately (doesn't wait on user input).\n\n   Special arguments:\n\n   -  '.title' - notification title\n   -  '.message' - notification message (can contain basic HTML)\n   -  '.icon' - notification icon (path to image or font icon)\n   -  '.id' - notification ID - this replaces notification with same ID\n   -  '.time' - duration of notification in milliseconds (default is -1,\n      i.e. waits for mouse click)\n   -  '.button' - adds button (three arguments: name, script and data)\n   -  '.urgency' - sets notification urgency if it is supported; value can be:\n      'low', 'normal', 'high', 'critical'\n   -  '.persistent' - enables/disables persistent notification if it is\n      supported; value can be ``true`` or ``false``\n\n   Example:\n\n   .. code-block:: js\n\n       notification(\n             '.title', 'Example',\n             '.message', 'Notification with button',\n             '.button', 'Cancel', '', '',\n             '.button', 'OK', 'copyq:popup(input())', 'OK Clicked'\n             )\n\n.. js:function:: exportTab(fileName)\n\n   Exports current tab into file.\n\n   :throws Error: Thrown if export fails.\n\n.. js:function:: importTab(fileName)\n\n   Imports items from file to a new tab.\n\n   :throws Error: Thrown if import fails.\n\n.. js:function:: exportData(fileName)\n\n   Exports all tabs and configuration into file.\n\n   :throws Error: Thrown if export fails.\n\n.. js:function:: importData(fileName)\n\n   Imports all tabs and configuration from file.\n\n   :throws Error: Thrown if import fails.\n\n.. js:function:: config()\n\n   Returns help with list of available application options.\n\n   Users can change most of these options via the CopyQ GUI, mainly via\n   the \"Preferences\" window.\n\n   These options are persisted within the ``[Options]`` section of a corresponding\n   ``copyq.ini`` or ``copyq.conf`` file (``copyq.ini`` is used on Windows).\n\n   :returns: Available options.\n   :rtype: string\n\n.. js:function:: /*get*/ config(optionName)\n\n   Returns value of given application option.\n\n   :returns: Current value of the option.\n   :rtype: string\n   :throws Error: Thrown if the option is invalid.\n\n.. js:function:: /*set*/ config(optionName, value)\n\n   Sets application option and returns new value.\n\n   :returns: New value of the option.\n   :rtype: string\n   :throws Error: Thrown if the option is invalid.\n\n.. js:function:: /*set-more*/ config(optionName, value, ...)\n\n   Sets multiple application options and return list with values in format\n   ``optionName=newValue``.\n\n   :returns: New values of the options.\n   :rtype: string\n   :throws Error: Thrown if there is an invalid option in which case it won't set\n                  any options.\n\n.. js:function:: toggleConfig(optionName)\n\n   Toggles an option (true to false and vice versa) and returns the new value.\n\n   :returns: New value of the option.\n   :rtype: bool\n\n.. js:function:: info([pathName])\n\n   Returns paths and flags used by the application.\n\n   :returns: Path for given identifier.\n   :rtype: string\n\n   Example -- print path to the configuration file:\n\n   .. code-block:: js\n\n       info('config')\n\n.. js:function:: eval(script)\n\n   Evaluates script and returns result.\n\n   :returns: Result of the last expression.\n\n.. js:function:: source(fileName)\n\n   Evaluates script file and returns result of last expression in the script.\n\n   This is useful to move some common code out of commands.\n\n   :returns: Result of the last expression.\n\n   .. code-block:: js\n\n       // File: c:/copyq/replace_clipboard_text.js\n       replaceClipboardText = function(replaceWhat, replaceWith)\n       {\n           var text = str(clipboard())\n           var newText = text.replace(replaceWhat, replaceWith)\n           if (text != newText)\n               copy(newText)\n       }\n\n   .. code-block:: js\n\n       source('c:/copyq/replace_clipboard_text.js')\n       replaceClipboardText('secret', '*****')\n\n.. js:function:: currentPath()\n\n   Get current path.\n\n   :returns: Current path.\n   :rtype: string\n\n   .. code-block:: bash\n\n       cd /tmp\n       copyq currentPath\n       # Prints: /tmp\n\n.. js:function:: /*set*/ currentPath(path)\n\n   Set current path.\n\n.. js:function:: str(value)\n\n   Converts a value to string.\n\n   If ByteArray object is the argument, it assumes UTF8 encoding. To use\n   different encoding, use :js:func`toUnicode`.\n\n   :returns: Value as string.\n   :rtype: string\n\n.. js:function:: input()\n\n   Returns standard input passed to the script.\n\n   :returns: Data on stdin.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: toUnicode(ByteArray)\n\n   Returns string for bytes with encoding detected by checking Byte Order Mark (BOM).\n\n   :returns: Value as string.\n   :rtype: string\n\n.. js:function:: /*encoding*/ toUnicode(ByteArray, encodingName)\n\n   Returns string for bytes with given encoding.\n\n   :returns: Value as string.\n   :rtype: string\n\n.. js:function:: fromUnicode(String, encodingName)\n\n   Returns encoded text.\n\n   :returns: Value as ByteArray.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: data(mimeType)\n\n   Returns data for automatic commands or selected items.\n\n   If run from menu or using non-global shortcut the data are taken from\n   selected items.\n\n   If run for automatic command the data are clipboard content.\n\n   :returns: Data for the format.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: setData(mimeType, data)\n\n   Set data for automatic and display commands, or the current item selection.\n\n   Next automatic command will receive the updated data.\n\n   This is also the data used to create new item from clipboard.\n\n   :returns: ``true`` if data were set, ``false`` if parsing data failed (in\n             case of :js:data:`mimeItems`).\n   :rtype: bool\n\n   Example -- automatic command that adds a creation time data and tag to new\n   items:\n\n   ::\n\n       copyq:\n       var timeFormat = 'yyyy-MM-dd hh:mm:ss'\n       setData('application/x-copyq-user-copy-time', dateString(timeFormat))\n       setData(mimeTags, 'copied: ' + time)\n\n   Example -- menu command that adds a tag to selected items:\n\n   ::\n\n       copyq:\n       setData('application/x-copyq-tags', 'Important')\n\n.. js:function:: removeData(mimeType)\n\n   Removes data for automatic and display commands, or the current item selection.\n\n.. js:function:: dataFormats()\n\n   Returns formats available for :js:func:`data`.\n\n   :returns: Array of data formats.\n   :rtype: array of strings\n\n.. js:function:: print(value)\n\n   Prints value to standard output.\n\n.. js:function:: serverLog(value)\n\n   Prints value to application log.\n\n.. js:function:: logs()\n\n   Returns application logs.\n\n   :returns: Application logs.\n   :rtype: ByteArray\n\n.. js:function:: abort()\n\n   Aborts script evaluation.\n\n.. js:function:: fail()\n\n   Aborts script evaluation with nonzero exit code.\n\n.. js:function:: setCurrentTab(tabName)\n\n   Focus tab without showing main window.\n\n.. js:function:: selectItems(row, ...)\n\n   Selects items in current tab.\n\n.. js:function:: selectedTab()\n\n   Returns tab that was selected when script was executed.\n\n   :returns: Currently selected tab name (see `Selected Items`_).\n   :rtype: string\n\n.. js:function:: selectedItems()\n\n   Returns selected rows in current tab.\n\n   :returns: Currently selected rows (see `Selected Items`_).\n   :rtype: array of ints\n\n.. js:function:: selectedItemData(index)\n\n   Returns data for given selected item.\n\n   The data can empty if the item was removed during execution of the\n   script.\n\n   :returns: Currently selected items (see `Selected Items`_).\n   :rtype: array of :js:class:`Item`\n\n.. js:function:: setSelectedItemData(index, Item)\n\n   Set data for given selected item.\n\n   Returns false only if the data cannot be set, usually if item was\n   removed.\n\n   See `Selected Items`_.\n\n   :returns: ``true`` if data were set, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: selectedItemsData()\n\n   Returns data for all selected items.\n\n   Some data can be empty if the item was removed during execution of the\n   script.\n\n   :returns: Currently selected item data (see `Selected Items`_).\n   :rtype: array of :js:class:`Item`\n\n.. js:function:: setSelectedItemsData(Item[])\n\n   Set data to all selected items.\n\n   Some data may not be set if the item was removed during execution of the\n   script.\n\n   See `Selected Items`_.\n\n.. js:function:: currentItem()\n                 index()\n\n   Returns current row in current tab.\n\n   See `Selected Items`_.\n\n   :returns: Current row (see `Selected Items`_).\n   :rtype: int\n\n.. js:function:: escapeHtml(text)\n\n   Returns text with special HTML characters escaped.\n\n   :returns: Escaped HTML text.\n   :rtype: string\n\n.. js:function:: unpack(data)\n\n   Returns deserialized object from serialized items.\n\n   :returns: Deserialize item.\n   :rtype: :js:class:`Item`\n\n.. js:function:: pack(Item)\n\n   Returns serialized item.\n\n   :returns: Serialize item.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: getItem(row)\n\n   Returns an item in current tab.\n\n   :returns: Item data for the row.\n   :rtype: :js:class:`Item`\n\n   Example -- show data of the first item in a tab in popups:\n\n   .. code-block:: js\n\n       tab('work')  // change current tab for the script to 'work'\n       var item = getItem(0)\n       for (var format in item) {\n           var data = item[format]\n           popup(format, data)\n       }\n\n   .. seealso::\n\n      - :js:func:`selectedItemsData`\n\n.. js:function:: setItem(row, text|Item)\n\n   Inserts item to current tab.\n\n   Same as ``insert(row, something)``.\n\n   .. seealso::\n\n      - :js:func:`insert`\n      - :js:func:`setSelectedItemsData`\n\n.. js:function:: toBase64(data)\n\n   Returns base64-encoded data.\n\n   :returns: Base64-encoded data.\n   :rtype: string\n\n.. js:function:: fromBase64(base64String)\n\n   Returns base64-decoded data.\n\n   :returns: Base64-decoded data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: md5sum(data)\n\n   Returns MD5 checksum of data.\n\n   :returns: MD5 checksum of the data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: sha1sum(data)\n\n   Returns SHA1 checksum of data.\n\n   :returns: SHA1 checksum of the data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: sha256sum(data)\n\n   Returns SHA256 checksum of data.\n\n   :returns: SHA256 checksum of the data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: sha512sum(data)\n\n   Returns SHA512 checksum of data.\n\n   :returns: SHA512 checksum of the data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: open(url, ...)\n\n   Tries to open URLs in appropriate applications.\n\n   :returns: ``true`` if all URLs were successfully opened, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: execute(argument, ..., null, stdinData, ...)\n\n   Executes a command.\n\n   All arguments after ``null`` are passed to standard input of the\n   command.\n\n   If argument is function it will be called with array of lines read from\n   stdout whenever available.\n\n   An exception is thrown if executable was not found or could not be executed.\n\n   :returns: Finished command properties.\n   :rtype: :js:class:`FinishedCommand`\n\n   Example -- create item for each line on stdout:\n\n   .. code-block:: js\n\n       execute('tail', '-f', 'some_file.log',\n               function(lines) { add.apply(this, lines) })\n\n   Returns object for the finished command or ``undefined`` on failure.\n\n.. js:function:: playSound(fileOrObject)\n\n   Plays audio file.\n\n   The argument can be a file path string or an object with ``file`` and\n   optional ``volume`` properties.\n\n   Supports WAV, MP3 and FLAC formats. The function starts playback and\n   returns immediately.\n\n   An exception is thrown if the file doesn't exist or cannot be played.\n\n   Requires the application to be built with audio capabilities. You can verify\n   this with ``info('has-audio')``.\n\n   :param fileOrObject: Path to the audio file, or an object\n       ``{file: 'path', volume: 50}``.\n   :type fileOrObject: string or object\n\n   The ``volume`` property is a percentage (default ``100``). Values above\n   ``100`` amplify the sound; the maximum is ``200``.\n\n   Example --- play a notification sound:\n\n   .. code-block:: js\n\n       playSound('/path/to/notification.wav')\n\n   Example --- play at 50% volume:\n\n   .. code-block:: js\n\n       playSound({file: '/path/to/notification.wav', volume: 50})\n\n\n.. js:function:: String currentWindowTitle()\n\n   Returns window title of currently focused window.\n\n   :returns: Current window title.\n   :rtype: string\n\n.. js:function:: String currentClipboardOwner()\n\n   Returns name of the current clipboard owner.\n\n   The default implementation returns `currentWindowTitle()`.\n\n   This is used to set `mimeWindowTitle` format for the clipboard data in\n   automatic commands and filtering by window title.\n\n   Depending on the current system, option `update_clipboard_owner_delay_ms`\n   can introduce a delay before any new owner value return by this function is\n   used. The reason is to avoid using an incorrect clipboard owner from the\n   current window title if the real clipboard owner set the clipboard after or\n   just before hiding its window (like with some password managers).\n\n   :returns: Current clipboard owner name.\n   :rtype: string\n\n.. js:function:: dialog(...)\n\n   Shows messages or asks user for input.\n\n   Arguments are names and associated values.\n\n   Special arguments:\n\n   -  '.title' - dialog title\n   -  '.icon' - dialog icon (see below for more info)\n   -  '.style' - Qt style sheet for dialog\n   -  '.height', '.width', '.x', '.y' - dialog geometry\n   -  '.label' - dialog message (can contain basic HTML)\n   -  '.modal' - set to true to make the dialog modal (to avoid other CopyQ windows to get input focus)\n   -  '.onTop' - set to true for the dialog to stay above other windows\n\n   :returns: Value or values from accepted dialog or ``undefined`` if dialog\n             was canceled.\n\n   .. code-block:: js\n\n       dialog(\n         '.title', 'Command Finished',\n         '.label', 'Command <b>successfully</b> finished.'\n         )\n\n   Accepting a dialog containing only a question returns ``true``\n   (rejecting/cancelling the dialog returns ``undefined``).\n\n   .. code-block:: js\n\n       const remove = dialog(\n         '.title', 'Remove Items',\n         '.label', 'Do you really want to remove all items?'\n         )\n       if (!remove)\n           abort();\n\n   Other arguments are used to get user input.\n\n   .. code-block:: js\n\n       var amount = dialog('.title', 'Amount?', 'Enter Amount', 'n/a')\n       var filePath = dialog('.title', 'File?', 'Choose File', new File('/home'))\n\n   If multiple inputs are required, object is returned.\n\n   .. code-block:: js\n\n       var result = dialog(\n         'Enter Amount', 'n/a',\n         'Choose File', new File(str(currentPath))\n         )\n       print('Amount: ' + result['Enter Amount'] + '\\n')\n       print('File: ' + result['Choose File'] + '\\n')\n\n   A combo box with an editable custom text/value can be created by passing an\n   array argument. The default text can be provided using ``.defaultChoice``\n   (by default it's the first item).\n\n   .. code-block:: js\n\n       var text = dialog('.defaultChoice', '', 'Select', ['a', 'b', 'c'])\n\n   A combo box with non-editable text can be created by prefixing the label\n   argument with ``.combo:``.\n\n   .. code-block:: js\n\n       var text = dialog('.combo:Select', ['a', 'b', 'c'])\n\n   An item list can be created by prefixing the label argument with ``.list:``.\n\n   .. code-block:: js\n\n       var items = ['a', 'b', 'c']\n       var selected_index = dialog('.list:Select', items)\n       if (selected_index !== undefined)\n           print('Selected item: ' + items[selected_index])\n\n   Icon for custom dialog can be set from icon font, file path or theme.\n   Icons from icon font can be copied from icon selection dialog in Command\n   dialog or dialog for setting tab icon (in menu 'Tabs/Change Tab Icon').\n\n   .. code-block:: js\n\n       var search = dialog(\n         '.title', 'Search',\n         '.icon', 'search', // Set icon 'search' from theme.\n         'Search', ''\n         )\n\n.. js:function:: menuItems(text...)\n\n   Opens menu with given items and returns selected item or an empty string.\n\n   :returns: Selected item or empty string if menu was canceled.\n   :rtype: string\n\n   .. code-block:: js\n\n       var selectedText = menuItems('x', 'y', 'z')\n       if (selectedText)\n           popup('Selected', selectedText)\n\n.. js:function:: /*items*/ menuItems(items[])\n\n   Opens menu with given items and returns index of selected item or -1.\n\n   Menu item label is taken from :js:data:`mimeText` format an icon is taken\n   from :js:data:`mimeIcon` format.\n\n   :returns: Selected item index or `-1` if menu was canceled.\n   :rtype: int\n\n   .. code-block:: js\n\n       var items = selectedItemsData()\n       var selectedIndex = menuItems(items)\n       if (selectedIndex != -1)\n           popup('Selected', items[selectedIndex][mimeText])\n\n.. js:function:: settings()\n\n   Returns array with names of all custom user options.\n\n   These options can be managed by various commands, much like cookies\n   are used by web applications in a browser. A typical usage is to remember\n   options lastly selected by user in a custom dialog displayed by a command.\n\n   These options are persisted within the ``[General]`` section of a corresponding\n   ``copyq-scripts.ini`` file. But if an option is named like ``group/...``,\n   then it is written to a section named ``[group]`` instead.\n   By grouping options like this, we can avoid potential naming collisions\n   with other commands.\n\n   :returns: Available custom options.\n   :rtype: array of strings\n\n.. js:function:: /*get*/ Value settings(optionName)\n\n   Returns value for a custom user option.\n\n   :returns: Current value of the custom options, ``undefined`` if the option\n             was not set.\n\n.. js:function:: /*set*/ settings(optionName, value)\n\n   Sets value for a new custom user option or overrides existing one.\n\n.. js:function:: dateString(format)\n\n   Returns text representation of current date and time.\n\n   See `Date QML Type <https://doc.qt.io/qt-6/qdatetime.html#toString>`__ for\n   details on formatting date and time.\n\n   :returns: Current date and time as string.\n   :rtype: string\n\n   Example:\n\n   .. code-block:: js\n\n       var now = dateString('yyyy-MM-dd HH:mm:ss')\n\n.. js:function:: commands()\n\n   Return list of all commands.\n\n   :returns: Array of all commands.\n   :rtype: array of :js:class:`Command`\n\n.. js:function:: setCommands(Command[])\n\n   Clear previous commands and set new ones.\n\n   To add new command:\n\n   .. code-block:: js\n\n       var cmds = commands()\n       cmds.unshift({\n               name: 'New Command',\n               automatic: true,\n               input: 'text/plain',\n               cmd: 'copyq: popup(\"Clipboard\", input())'\n               })\n       setCommands(cmds)\n\n.. js:function:: Command[] importCommands(String)\n\n   Return list of commands from exported commands text.\n\n   :returns: Array of commands loaded from a file path.\n   :rtype: array of :js:class:`Command`\n\n.. js:function:: String exportCommands(Command[])\n\n   Return exported command text.\n\n   :returns: Serialized commands.\n   :rtype: string\n\n.. js:function:: addCommands(Command[])\n\n   Opens Command dialog, adds commands and waits for user to confirm the\n   dialog.\n\n.. js:function:: NetworkReply networkGet(url)\n\n   Sends HTTP GET request.\n\n   :returns: HTTP reply.\n   :rtype: :js:class:`NetworkReply`\n\n.. js:function:: NetworkReply networkPost(url, postData)\n\n   Sends HTTP POST request.\n\n   :returns: HTTP reply.\n   :rtype: :js:class:`NetworkReply`\n\n.. js:function:: NetworkReply networkGetAsync(url)\n\n   Same as :js:func:`networkGet` but the request is asynchronous.\n\n   The request is handled asynchronously and may not be finished until you get\n   a property of the reply.\n\n   :returns: HTTP reply.\n   :rtype: :js:class:`NetworkReply`\n\n.. js:function:: NetworkReply networkPostAsync(url, postData)\n\n   Same as :js:func:`networkPost` but the request is asynchronous.\n\n   The request is handled asynchronously and may not be finished until you get\n   a property of the reply.\n\n   :returns: HTTP reply.\n   :rtype: :js:class:`NetworkReply`\n\n.. js:function:: env(name)\n\n   Returns value of environment variable with given name.\n\n   :returns: Value of the environment variable.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: setEnv(name, value)\n\n   Sets environment variable with given name to given value.\n\n   :returns: ``true`` if the variable was set, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: sleep(time)\n\n   Wait for given time in milliseconds.\n\n.. js:function:: afterMilliseconds(time, function)\n\n   Executes function after given time in milliseconds.\n\n.. js:function:: screenNames()\n\n   Returns list of available screen names.\n\n   :returns: Available screen names.\n   :rtype: array of strings\n\n.. js:function:: screenshot(format='png', [screenName])\n\n   Returns image data with screenshot.\n\n   Default ``screenName`` is name of the screen with mouse cursor.\n\n   You can list valid values for ``screenName`` with :js:func:`screenNames`.\n\n   :returns: Image data.\n   :rtype: :js:class:`ByteArray`\n\n   Example:\n\n   .. code-block:: js\n\n       copy('image/png', screenshot())\n\n.. js:function:: screenshotSelect(format='png', [screenName])\n\n   Same as :js:func:`screenshot` but allows to select an area on screen.\n\n   :returns: Image data.\n   :rtype: :js:class:`ByteArray`\n\n.. js:function:: queryKeyboardModifiers()\n\n   Returns list of currently pressed keyboard modifiers which can be 'Ctrl',\n   'Shift', 'Alt', 'Meta'.\n\n   :returns: Currently pressed keyboard modifiers.\n   :rtype: array of strings\n\n.. js:function:: pointerPosition()\n\n   Returns current mouse pointer position (x, y coordinates on screen).\n\n   :returns: Current mouse pointer coordinates.\n   :rtype: array of ints (with two elements)\n\n.. js:function:: setPointerPosition(x, y)\n\n   Moves mouse pointer to given coordinates on screen.\n\n   :throws Error: Thrown if the pointer position couldn't be set (for example,\n                  unsupported on current the system).\n\n.. js:function:: iconColor()\n\n   Get current tray and window icon color name.\n\n   :returns: Current icon color.\n   :rtype: string\n\n.. js:function:: /*set*/ iconColor(colorName)\n\n   Set current tray and window icon color name (examples: 'orange', '#ffa500', '#09f').\n\n   Resets color if color name is empty string.\n\n   :throws Error: Thrown if the color name is empty or invalid.\n\n   .. code-block:: js\n\n       // Flash icon for few moments to get attention.\n       var color = iconColor()\n       for (var i = 0; i < 10; ++i) {\n         iconColor(\"red\")\n         sleep(500)\n         iconColor(color)\n         sleep(500)\n       }\n\n   .. seealso::\n\n      :js:data:`mimeColor`\n\n.. js:function:: iconTag()\n\n   Get current tray and window icon tag text.\n\n   :returns: Current icon tag.\n   :rtype: string\n\n.. js:function:: /*set*/ iconTag(tag)\n\n   Set current tray and window tag text.\n\n.. js:function:: iconTagColor()\n\n   Get current tray and window tag color name.\n\n   :returns: Current icon tag color.\n   :rtype: string\n\n.. js:function:: /*set*/ iconTagColor(colorName)\n\n   Set current tray and window tag color name.\n\n   :throws Error: Thrown if the color name is invalid.\n\n.. js:function:: loadTheme(path)\n\n   Loads theme from an INI file.\n\n   :throws Error: Thrown if the file cannot be read or is not valid INI format.\n\n.. js:function:: onClipboardChanged()\n\n   Called when clipboard or `primary selection`_ changes and is not set by\n   CopyQ, is not marked as hidden nor secret (see the other callbacks).\n\n   Default implementation is:\n\n   .. code-block:: js\n\n       if (!hasData()) {\n           updateClipboardData();\n       } else if (runAutomaticCommands()) {\n           saveData();\n           updateClipboardData();\n       } else {\n           clearClipboardData();\n       }\n\n.. js:function:: onOwnClipboardChanged()\n\n   Called when clipboard or `primary selection`_ is set by CopyQ and is not\n   marked as hidden nor secret (see the other callbacks).\n\n   Owned clipboard data contains :js:data:`mimeOwner` format.\n\n   Default implementation calls :js:func:`updateClipboardData`.\n\n.. js:function:: onHiddenClipboardChanged()\n\n   Called when clipboard or `primary selection`_ changes and is marked as\n   hidden but not secret (see the other callbacks).\n\n   Hidden clipboard data contains :js:data:`mimeHidden` format set to ``1``.\n\n   Default implementation calls :js:func:`updateClipboardData`.\n\n.. js:function:: onSecretClipboardChanged()\n\n   Called if the clipboard or `primary selection`_ changes and contains a\n   password or other secret (for example, copied from clipboard manager).\n\n   The default implementation clears all data, so they are not accessible using\n   :js:func:`data` and :js:func:`dataFormats`, except :js:data:`mimeSecret`,\n   and calls :js:func:`updateClipboardData`.\n\n   **Be careful overriding** this function (via a Script command). Calling\n   `onClipboardChanged()` without clearing the data and without any further\n   checks can cause storing and processing secrets from password managers. On\n   the other hand, it can help to get access to the data copied, for example\n   from a web browser in private mode.\n\n.. js:function:: onClipboardUnchanged()\n\n   Called when clipboard or `primary selection`_ changes but data remained the same.\n\n   Default implementation does nothing.\n\n.. js:function:: onStart()\n\n   Called when application starts.\n\n.. js:function:: onExit()\n\n   Called just before application exists.\n\n.. js:function:: runAutomaticCommands()\n\n   Executes automatic commands on current data.\n\n   If an executed command calls :js:func:`ignore` or have \"Remove Item\" or\n   \"Transform\" check box enabled, following automatic commands won't be\n   executed and the function returns ``false``. Otherwise ``true`` is returned.\n\n   :returns: ``true`` if clipboard data should be stored, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: clearClipboardData()\n\n   Clear clipboard visibility in GUI.\n\n   Default implementation is:\n\n   .. code-block:: js\n\n       if (isClipboard()) {\n           setTitle();\n           hideDataNotification();\n       }\n\n.. js:function:: updateTitle()\n\n   Update main window title and tool tip from current data.\n\n   Called when clipboard changes.\n\n.. js:function:: updateClipboardData()\n\n   Sets current clipboard data for tray menu, window title and notification.\n\n   Default implementation is:\n\n   .. code-block:: js\n\n       if (isClipboard()) {\n           updateTitle();\n           showDataNotification();\n           setClipboardData();\n       }\n\n.. js:function:: setTitle([title])\n\n   Set main window title and tool tip.\n\n.. js:function:: synchronizeToSelection(text)\n\n   Synchronize current data from clipboard to `primary selection`_.\n\n   Called automatically from clipboard monitor process if option\n   ``copy_clipboard`` is enabled.\n\n   Default implementation calls :js:func:`provideSelection`.\n\n.. js:function:: synchronizeFromSelection(text)\n\n   Synchronize current data from `primary selection`_ to clipboard.\n\n   Called automatically from clipboard monitor process if option\n   ``copy_selection`` is enabled.\n\n   Default implementation calls :js:func:`provideClipboard`.\n\n.. js:function:: provideClipboard()\n\n   Starts a process provides a data for clipboard.\n\n   The data can be set using :js:func:`setData`.\n\n   The script must be started with ``--clipboard-access`` command line flag.\n\n.. js:function:: provideSelection()\n\n   Starts a process that provides a data for `primary selection`_.\n\n   The data can be set using :js:func:`setData`.\n\n   The script must be started with ``--clipboard-access`` command line flag.\n\n.. js:function:: monitorClipboard()\n\n   Starts a clipboard monitor process.\n\n   The script must be started with ``--clipboard-access`` command line flag.\n\n.. js:function:: clipboardFormatsToSave()\n\n   Returns list of clipboard format to save automatically.\n\n   :returns: Formats to get and save automatically from clipboard.\n   :rtype: array of strings\n\n   Override the function, for example, to save only plain text:\n\n   .. code-block:: js\n\n       global.clipboardFormatsToSave = function() {\n           return [\"text/plain\"]\n       }\n\n   Or to save additional formats:\n\n   .. code-block:: js\n\n       var originalFunction = global.clipboardFormatsToSave;\n       global.clipboardFormatsToSave = function() {\n           return originalFunction().concat([\n               \"text/uri-list\",\n               \"text/xml\"\n           ])\n       }\n\n.. js:function:: saveData()\n\n   Save current data (depends on `mimeOutputTab`).\n\n.. js:function:: hasData()\n\n   Returns true only if some non-empty data can be returned by data().\n\n   Empty data is combination of whitespace and null characters or some internal\n   formats (`mimeWindowTitle`, `mimeClipboardMode` etc.)\n\n   :returns: ``true`` if there are some data, otherwise ``false``.\n   :rtype: bool\n\n.. js:function:: showDataNotification()\n\n   Show notification for current data.\n\n.. js:function:: hideDataNotification()\n\n   Hide notification for current data.\n\n.. js:function:: setClipboardData()\n\n   Sets clipboard data for menu commands.\n\n.. js:function:: styles()\n\n   List available styles for ``style`` option.\n\n   :returns: Style identifiers.\n   :rtype: array of strings\n\n   To change or update style use:\n\n   .. code-block:: js\n\n       config(\"style\", styleName)\n\n.. js:function:: stats()\n\n   Get runtime diagnostics and statistics about the application state.\n\n   Reports QObject tree class/name counts, clipboard model row counts\n   and data sizes, item data directory size on disk, tab load state,\n   running actions, command counts by type, loaded plugins with\n   enabled/disabled state, log file sizes, and process memory usage.\n\n   :returns: Multi-line string with statistics including:\n      ``TYPE: COUNT`` for QObject instances,\n      ``MODEL path: rows=N, dataSize=B (human)`` for item models,\n      ``DATA_DIR path: size=B (human)`` for the item data directory,\n      ``TABS: total=N, loaded=N`` for tab load state,\n      ``ACTION description`` for each running action,\n      ``COMMANDS: automatic=N, display=N, menu=N, tray_menu=N, script=N`` for command counts,\n      ``PLUGIN id: enabled/disabled`` for each loaded plugin,\n      ``LOG_FILES: count=N, size=B (human)`` for log file total size,\n      ``MEMORY: rss=B (human)`` for process resident memory (platform-dependent).\n   :rtype: string\n\n.. js:function:: onItemsAdded()\n\n   Called when items are added to a tab.\n\n   The target tab is returned by `selectedTab()`.\n\n   The new items can be accessed with `selectedItemsData()`,\n   `selectedItemData()`, `selectedItems()` and `ItemSelection().current()`.\n\n.. js:function:: onItemsRemoved()\n\n   Called when items are being removed from a tab.\n\n   The target tab is returned by `selectedTab()`.\n\n   The items scheduled for removal can be accessed with `selectedItemsData()`,\n   `selectedItemData()`, `selectedItems()` and `ItemSelection().current()`.\n\n   If the exit code is non-zero (for example `fail()` is called), items will\n   not be removed. But this can also cause a new items not to be added if the\n   tab is full.\n\n.. js:function:: onItemsChanged()\n\n   Called when data in items change.\n\n   The target tab is returned by `selectedTab()`.\n\n   The modified items can be accessed with `selectedItemsData()`,\n   `selectedItemData()`, `selectedItems()` and `ItemSelection().current()`.\n\n.. js:function:: onTabSelected()\n\n   Called when another tab is opened.\n\n   The newly selected tab is returned by `selectedTab()`.\n\n   The changed items can be accessed with `selectedItemsData()`,\n   `selectedItemData()`, `selectedItems()` and `ItemSelection().current()`.\n\n.. js:function:: onItemsLoaded()\n\n   Called when all items are loaded into a tab.\n\n   The target tab is returned by `selectedTab()`.\n\nTypes\n-----\n\n.. js:class:: ByteArray\n\n   Wrapper for QByteArray Qt class.\n\n   See `QByteArray <http://doc.qt.io/qt-6/qbytearray.html>`__.\n\n   ``ByteArray`` is used to store all item data (image data, HTML and even\n   plain text).\n\n   Use :js:func:`str` to convert it to string. Strings are usually more\n   versatile. For example to concatenate two items, the data need to be\n   converted to strings first.\n\n   .. code-block:: js\n\n       var text = str(read(0)) + str(read(1))\n\n.. js:class:: File\n\n   Wrapper for QFile Qt class.\n\n   See `QFile <http://doc.qt.io/qt-6/qfile.html>`__.\n\n   To open file in different modes use:\n\n   - `open()` - read/write\n   - `openReadOnly()` - read only\n   - `openWriteOnly()` - write only, truncates the file\n   - `openAppend()` - write only, appends to the file\n\n   Following code reads contents of \"README.md\" file from current\n   directory:\n\n   .. code-block:: js\n\n       var f = new File('README.md')\n       if (!f.openReadOnly())\n         throw 'Failed to open the file: ' + f.errorString()\n       var bytes = f.readAll()\n\n   Following code writes to a file in home directory:\n\n   .. code-block:: js\n\n       var dataToWrite = 'Hello, World!'\n       var filePath = Dir().homePath() + '/copyq.txt'\n       var f = new File(filePath)\n       if (!f.openWriteOnly() || f.write(dataToWrite) == -1)\n         throw 'Failed to save the file: ' + f.errorString()\n\n       // Always flush the data and close the file,\n       // before opening the file in other application.\n       f.close()\n\n.. js:class:: Dir\n\n   Wrapper for QDir Qt class.\n\n   Use forward slash as path separator, for example \"D:/Documents/\".\n\n   See `QDir <http://doc.qt.io/qt-6/qdir.html>`__.\n\n.. js:class:: TemporaryFile\n\n   Wrapper for QTemporaryFile Qt class.\n\n   See `QTemporaryFile <https://doc.qt.io/qt-6/qtemporaryfile.html>`__.\n\n   .. code-block:: js\n\n       var f = new TemporaryFile()\n       f.open()\n       f.setAutoRemove(false)\n       popup('New temporary file', f.fileName())\n\n   To open file in different modes, use same open methods as for `File`.\n\n.. js:class:: Settings\n\n   Reads and writes INI configuration files. Wrapper for QSettings Qt class.\n\n   See `QSettings <https://doc.qt.io/qt-6/qsettings.html>`__.\n\n   .. code-block:: js\n\n       // Open INI file\n       var configPath = Dir().homePath() + '/copyq.ini'\n       var settings = new Settings(configPath)\n\n       // Save an option\n       settings.setValue('option1', 'test')\n\n       // Store changes to the config file now instead of at the end of\n       // executing the script\n       settings.sync()\n\n       // Read the option value\n       var value = settings.value('option1')\n\n   Working with arrays:\n\n   .. code-block:: js\n\n       // Write array\n       var settings = new Settings(configPath)\n       settings.beginWriteArray('array1')\n       settings.setArrayIndex(0)\n       settings.setValue('some_option', 1)\n       settings.setArrayIndex(1)\n       settings.setValue('some_option', 2)\n       settings.endArray()\n       settings.sync()\n\n       // Read array\n       var settings = new Settings(configPath)\n       const arraySize = settings.beginReadArray('array1')\n       for (var i = 0; i < arraySize; i++) {\n           settings.setArrayIndex(i);\n           print('Index ' + i + ': ' + settings.value('some_option') + '\\n')\n       }\n\n.. js:class:: Item\n\n   Object with MIME types of an item.\n\n   Each property is MIME type with data.\n\n   Example:\n\n   .. code-block:: js\n\n       var item = {}\n       item[mimeText] = 'Hello, World!'\n       item[mimeHtml] = '<p>Hello, World!</p>'\n       write(mimeItems, pack(item))\n\n.. js:class:: ItemSelection\n\n   List of items from given tab.\n\n   An item in the list represents the same item in tab even if it is moved to a\n   different row.\n\n   New items in the tab are not added automatically into the selection.\n\n   To create new empty selection use ``ItemSelection()`` then add items with\n   ``select*()`` methods.\n\n   Example - move matching items to the top of the tab:\n\n   .. code-block:: js\n\n       ItemSelection().select(/^prefix/).move(0)\n\n   Example - remove all items from given tab but keep pinned items:\n\n   .. code-block:: js\n\n       ItemSelection(tabName).selectRemovable().removeAll();\n\n   Example - modify items containing \"needle\" text:\n\n   .. code-block:: js\n\n       var sel = ItemSelection().select(/needle/, mimeText);\n       for (var index = 0; index < sel.length; ++index) {\n           var item = sel.itemAtIndex(index);\n           item[mimeItemNotes] = 'Contains needle';\n           sel.setItemAtIndex(index, item);\n       }\n\n   Example - selection with new items only:\n\n   .. code-block:: js\n\n       var sel = ItemSelection().selectAll()\n       add(\"New Item 1\")\n       add(\"New Item 2\")\n       sel.invert()\n       sel.items();\n\n   Example - sort items alphabetically:\n\n   .. code-block:: js\n\n       var sel = ItemSelection().selectAll();\n       const texts = sel.itemsFormat(mimeText);\n       sel.sort(function(i,j){\n           return texts[i] < texts[j];\n       });\n\n   .. js:attribute:: tab\n\n       Tab name\n\n   .. js:attribute:: length\n\n       Number of filtered items in the selection\n\n   .. js:method:: selectAll()\n\n       Select all items in the tab.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: select(regexp, [mimeType])\n\n       Select additional items matching the regular expression.\n\n       If regexp is a valid regular expression and ``mimeType`` is not set,\n       this selects items with matching text.\n\n       If regexp matches empty strings and ``mimeType`` is set, this selects\n       items containing the MIME type.\n\n       If regexp is ``undefined`` and ``mimeType`` is set, this select items\n       not containing the MIME type.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: selectRemovable()\n\n       Select only items that can be removed.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: invert()\n\n       Select only items not in the selection.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: deselectIndexes(int[])\n\n       Deselect items at given indexes in the selection.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: deselectSelection(ItemSelection)\n\n       Deselect items in other selection.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: current()\n\n       Deselects all and selects only the items which were selected when the\n       command was triggered.\n\n       See `Selected Items`_.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: removeAll()\n\n       Delete all items in the selection (if possible).\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: move(row)\n\n       Move all items in the selection to the target row.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: sort(comparisonFunction)\n\n       Sort items with a comparison function.\n\n       The comparison function takes two arguments, indexes to the selection,\n       and returns true only if the item in the selection under the first index\n       should be sorted above the item under the second index.\n\n       Items will be reordered in the tab and in the selection object.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: copy()\n\n       Clone the selection object.\n\n       :returns: cloned object\n       :rtype: ItemSelection\n\n   .. js:method:: rows()\n\n       Returns selected rows.\n\n       :returns: Selected rows\n       :rtype: array of ints\n\n   .. js:method:: itemAtIndex(index)\n\n       Returns item data at given index in the selection.\n\n       :returns: Item data\n       :rtype: :js:class:`Item`\n\n   .. js:method:: setItemAtIndex(index, Item)\n\n       Sets data to the item at given index in the selection.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: items()\n\n       Return list of data from selected items.\n\n       :returns: Selected item data\n       :rtype: array of :js:class:`Item`\n\n   .. js:method:: setItems(Item[])\n\n       Set data for selected items.\n\n       :returns: self\n       :rtype: ItemSelection\n\n   .. js:method:: itemsFormat(mimeType)\n\n       Return list of data from selected items containing specified MIME type.\n\n       :returns: Selected item data containing only the format\n       :rtype: array of :js:class:`Item`\n\n   .. js:method:: setItemsFormat(mimeType, data)\n\n       Set data for given MIME type for the selected items.\n\n       :returns: self\n       :rtype: ItemSelection\n\n.. js:class:: FinishedCommand\n\n   Properties of finished command.\n\n   .. js:attribute:: stdout\n\n       Standard output\n\n   .. js:attribute:: stderr\n\n       Standard error output\n\n   .. js:attribute:: exit_code\n\n       Exit code\n\n.. js:class:: NetworkRequest\n\n   Make HTTP requests.\n\n   Example:\n\n   .. code-block:: js\n\n       let req = NetworkRequest();\n\n       // allow redirects\n       req.maxRedirects = 5;\n\n       // set request headers\n       req.headers = {\n          'User-Agent': req.headers['User-Agent'],\n          'Accept': 'application/json',\n       };\n\n       // create JSON data\n       const data = JSON.stringify({text: 'Hello, **world**!'});\n\n       // send POST request\n       const reply = req.request(\n           'POST', 'https://api.github.com/markdown', data)\n\n       // the request is synchronous and may not be finished\n       // until a property is called (like reply.data or reply.status)\n       if (!reply.finished) { serverLog('Processing...'); }\n       print(reply.data);\n\n   .. js:attribute:: headers\n\n       Object with HTTP headers\n\n   .. js:attribute:: maxRedirects\n\n       Maximum number of redirects to follow (default is 0)\n\n.. js:class:: NetworkReply\n\n   Received network reply object.\n\n   .. js:attribute:: data\n\n       Reply data\n\n   .. js:attribute:: status\n\n       HTTP status\n\n   .. js:attribute:: error``\n\n       Error string (set only if an error occurred)\n\n   .. js:attribute:: redirect\n\n       URL for redirection (set only if redirection is needed)\n\n   .. js:attribute:: headers\n\n       Reply headers (array of pairs with header name and header content)\n\n   .. js:attribute:: finished\n\n       True only if request has been completed, false only for unfinished\n       asynchronous requests\n\n   .. js:attribute:: url\n\n       URL of the final request (may be different from the original if\n       redirects are enabled)\n\n.. js:class:: Command\n\n   Wrapper for a command (from Command dialog).\n\n   Properties are same as members of `Command\n   struct <https://github.com/hluk/CopyQ/blob/master/src/common/command.h>`__.\n\nObjects\n-------\n\n.. js:data:: arguments (Array)\n\n   Array for accessing arguments passed to current function or the script\n   (``arguments[0]`` is the script itself).\n\n.. js:data:: global\n\n    Object allowing to modify global scope which contains all functions like\n    :js:func:`copy` or :js:func:`add`.\n\n    This is useful for :ref:`commands-script`.\n\n.. js:data:: console\n\n    Allows some logging and debugging.\n\n   .. code-block:: js\n\n        // Print a message if COPYQ_LOG_LEVEL=DEBUG\n        // environment variable is set\n        console.log(\n            'Supported console properties/functions:',\n            Object.getOwnPropertyNames(console))\n        console.warn('Changing clipboard...')\n\n        // Elapsed time\n        console.time('copy')\n        copy('TEST')\n        console.timeEnd('copy')\n\n        // Ensure a condition is true before continuing\n        console.assert(str(clipboard()) == 'TEST')\n\nMIME Types\n----------\n\nItem and clipboard can provide multiple formats for their data. Type of\nthe data is determined by MIME type.\n\nHere is list of some common and builtin (start with\n``application/x-copyq-``) MIME types.\n\nThese MIME types values are assigned to global variables prefixed with\n``mime``.\n\n.. note::\n\n   Content for following types is UTF-8 encoded.\n\n.. js:data:: mimeText\n\n   Data contains plain text content. Value: 'text/plain'.\n\n.. js:data:: mimeHtml\n\n   Data contains HTML content. Value: 'text/html'.\n\n.. js:data:: mimeUriList\n\n   Data contains list of links to files, web pages etc. Value: 'text/uri-list'.\n\n.. js:data:: mimeWindowTitle\n\n   Current window title for copied clipboard. Value: 'application/x-copyq-owner-window-title'.\n\n.. js:data:: mimeItems\n\n   Serialized items. Value: 'application/x-copyq-item'.\n\n.. js:data:: mimeItemNotes\n\n   Data contains notes for item. Value: 'application/x-copyq-item-notes'.\n\n.. js:data:: mimeIcon\n\n   Data contains icon for item. Value: 'application/x-copyq-item-icon'.\n\n.. js:data:: mimeOwner\n\n   If available, the clipboard was set from CopyQ (from script or copied items). Value: 'application/x-copyq-owner'.\n\n   Such clipboard is ignored in CopyQ, i.e. it won't be stored in clipboard\n   tab and automatic commands won't be executed on it.\n\n.. js:data:: mimeClipboardMode\n\n   Contains ``selection`` if data is from `primary selection`_. Value: 'application/x-copyq-clipboard-mode'.\n\n.. js:data:: mimeCurrentTab\n\n   Current tab name when invoking command from main window. Value: 'application/x-copyq-current-tab'.\n\n   Following command print the tab name when invoked from main window:\n\n   ::\n\n       copyq data application/x-copyq-current-tab\n       copyq selectedTab\n\n.. js:data:: mimeSelectedItems\n\n   Selected items when invoking command from main window. Value: 'application/x-copyq-selected-items'.\n\n.. js:data:: mimeCurrentItem\n\n   Current item when invoking command from main window. Value: 'application/x-copyq-current-item'.\n\n.. js:data:: mimeHidden\n\n   If set to ``1``, the clipboard or item content will be hidden in GUI. Value: 'application/x-copyq-hidden'.\n\n   This won't hide notes and tags.\n\n   Example -- clear window title and tool tip:\n\n   ::\n\n       copyq copy application/x-copyq-hidden 1 plain/text \"This is secret\"\n\n.. js:data:: mimeSecret\n\n   If set to ``1``, the clipboard contains a password or other secret (for example, copied from clipboard manager).\n\n.. js:data:: mimeShortcut\n\n   Application or global shortcut which activated the command. Value: 'application/x-copyq-shortcut'.\n\n   ::\n\n       copyq:\n       var shortcut = data(mimeShortcut)\n       popup(\"Shortcut Pressed\", shortcut)\n\n.. js:data:: mimeColor\n\n   Item color (same as the one used by themes). Value: 'application/x-copyq-color'.\n\n   Examples::\n\n       #ffff00\n       rgba(255,255,0,0.5)\n       bg - #000099\n\n.. js:data:: mimeOutputTab\n\n   Name of the tab where to store new item. Value: 'application/x-copyq-output-tab'.\n\n   The clipboard data will be stored in tab with this name after all\n   automatic commands are run.\n\n   Clear or remove the format to omit storing the data.\n\n   Example -- automatic command that avoids storing clipboard data:\n\n   .. code-block:: js\n\n       removeData(mimeOutputTab)\n\n   Valid only in automatic commands.\n\n.. js:data:: mimeDisplayItemInMenu\n\n   Indicates if display commands run for a menu. Value: 'application/x-copyq-display-item-in-menu'.\n\n   Set to \"1\" for display commands if the item data is related to a menu item\n   instead of an item list.\n\nSelected Items\n--------------\n\nThe internal state for currently evaluated script/command stores references\n(not rows or item data) to the current and selected items and it do not change\nafter the state is retrieved from GUI.\n\nThe state is retrieved before the script/command starts if it is invoked from\nthe application with a shortcut, from menu, toolbar or the Action dialog.\nOtherwise, the state is retrieved when needed (for example the first\n``selectedItems()`` call) for scripts/commands run externally (for example from\ncommand line or from automatic commands on clipboard content change).\n\nIf a selected or current item is moved, script functions will return the new\nrows. For example ``selectedItems()`` returning ``[0,1]`` will return ``[1,0]``\nafter the items are swapped. Same goes for selected item data.\n\nIf a selected or current item is removed, their references in the internal\nstate are invalidated. These references will return -1 for row and empty object\nfor item data. For example ``selectedItems()`` returning ``[0,1]`` will return\n``[0,-1]`` after the item on the second row is removed.\n\nIf tab is renamed, all references to current and selected items are invalidated\nbecause the tab data need to be initiated again.\n\nPrimary Selection\n-----------------\n\nOn many Linux and BSD desktop environments, selecting text with the mouse\nplaces it in the *primary selection*, which can be pasted with a middle mouse\nbutton click. This is separate from the regular clipboard used by copy/paste\nshortcuts.\n\nCopyQ supports reading and writing the primary selection on platforms that\nprovide it (X11 and Wayland). On Wayland, support depends on the compositor\nand the `KGuiAddons <https://invent.kde.org/frameworks/kguiaddons>`_ library;\nnotably, GNOME does not support it natively, but CopyQ 14.0.0 and later work\naround this via the bundled *CopyQ Clipboard Monitor* GNOME extension.\n\nOn unsupported platforms, functions that use the primary selection do nothing\n(for example :js:func:`copySelection`) or return ``undefined`` (in case of\n:js:func:`selection`).\n\nCopyQ can synchronize the clipboard with the primary selection. This can be\nenabled in Preferences on the General tab under *Clipboard Manipulation*, or\nfrom the command line:\n\n.. code-block:: js\n\n   config('copy_clipboard', 'true')  // clipboard to primary selection\n   config('copy_selection', 'true')  // primary selection to clipboard\n\nFor synchronization, CopyQ runs a helper process (for example\n``copyq --clipboard-access synchronizeToSelection``). Running helpers can be\ninspected from *File — Process Manager*.\n\nCustom automatic commands run on primary selection changes by default. This\ncan be disabled in the *Clipboard Manipulation* section or from the command\nline:\n\n.. code-block:: js\n\n   config('run_selection', 'false')\n\nCopyQ can also store primary selection data automatically. Enable it in the\n*Clipboard Manipulation* section or from the command line:\n\n.. code-block:: js\n\n   config('check_selection', 'true')\n\nSee also:\n\n- `QClipboard — Notes for X11 Users <https://doc.qt.io/qt-6/qclipboard.html#notes-for-x11-users>`_\n- `freedesktop.org Clipboards Wiki <https://www.freedesktop.org/wiki/Specifications/ClipboardsWiki/>`_\n\nPlugins\n-------\n\nUse ``plugins`` object to access functionality of plugins.\n\n.. js:function:: plugins.itemsync.selectedTabPath()\n\n   Returns synchronization path for current tab (mimeCurrentTab).\n\n   .. code-block:: js\n\n       var path = plugins.itemsync.selectedTabPath()\n       var baseName = str(data(plugins.itemsync.mimeBaseName))\n       var absoluteFilePath = Dir(path).absoluteFilePath(baseName)\n       // NOTE: Known file suffix/extension can be missing in the full path.\n\n.. js:class:: plugins.itemsync.tabPaths\n\n   Object that maps tab name to synchronization path.\n\n   .. code-block:: js\n\n       var tabName = 'Downloads'\n       var path = plugins.itemsync.tabPaths[tabName]\n\n.. js:data:: plugins.itemsync.mimeBaseName (application/x-copyq-itemsync-basename)\n\n   MIME type for accessing base name (without full path).\n\n   Known file suffix/extension can be missing in the base name.\n\n.. js:data:: plugins.itemtags.userTags (Array)\n\n   List of user-defined tags.\n\n.. js:function:: plugins.itemtags.tags(row, ...)\n\n   List of tags for items in given rows.\n\n.. js:function:: plugins.itemtags.tag(tagName, [rows, ...])\n\n   Add given tag to items in given rows or selected items.\n\n   See `Selected Items`_.\n\n.. js:function:: plugins.itemtags.untag(tagName, [rows, ...])\n\n   Remove given tag from items in given rows or selected items.\n\n   See `Selected Items`_.\n\n.. js:function:: plugins.itemtags.clearTags([rows, ...])\n\n   Remove all tags from items in given rows or selected items.\n\n   See `Selected Items`_.\n\n.. js:function:: plugins.itemtags.hasTag(tagName, [rows, ...])\n\n   Return true if given tag is present in any of items in given rows or\n   selected items.\n\n   See `Selected Items`_.\n\n.. js:data:: plugins.itemtags.mimeTags (application/x-copyq-tags)\n\n   MIME type for accessing list of tags.\n\n   Tags are separated by comma.\n\n.. js:function:: plugins.itempinned.isPinned(rows, ...)\n\n   Returns true only if any item in given rows is pinned.\n\n.. js:function:: plugins.itempinned.pin(rows, ...)\n\n   Pin items in given rows or selected items or new item created from clipboard\n   (if called from automatic command).\n\n.. js:function:: plugins.itempinned.unpin(rows, ...)\n\n   Unpin items in given rows or selected items.\n\n.. js:data:: plugins.itempinned.mimePinned (application/x-copyq-item-pinned)\n\n   Presence of the format in an item indicates that it is pinned.\n"
  },
  {
    "path": "docs/scripting.rst",
    "content": "Scripting\n=========\n\nIf you need to process items in some non-trivial way you can take\nadvantage of the scripting interface the application provides. This is\naccessible on command line as ``copyq eval SCRIPT`` or\n``copyq -e SCRIPT`` where ``SCRIPT`` is string containing commands\nwritten in JavaScript-similar scripting language (see :ref:`scripting-api`).\n\nEvery command line option is available as function in the scripting\ninterface. Command ``copyq help tab`` can be written as\n``copyq eval 'print(help(\"tab\"))'`` (note: ``print`` is needed to print\nthe return value of ``help(\"tab\")`` function call).\n\nSearching Items\n---------------\n\nYou can print each item with ``copyq read N`` where N is item number\nfrom 0 to ``copyq size`` (i.e. number of items in the first tab) and put\nitem to clipboard with ``copyq select N``. With these commands it's\npossible to search items and copy the right one with a script. E.g.\nhaving file ``script.js`` containing\n\n::\n\n    var match = \"MATCH-THIS\";\n    var i = 0;\n    while (i < size() && str(read(i)).indexOf(match) === -1)\n        ++i;\n    select(i);\n\nand passing it to CopyQ using ``cat script.js | copyq eval -`` will put\nfirst item containing \"MATCH-THIS\" string to clipboard.\n\nWorking with Tabs\n-----------------\n\nBy default commands and functions work with items in the first tab.\nCalling ``read(0, 1, 2)`` will read first three items from the first\ntab. To access items in other tab you need to switch the current tab\nwith ``tab(\"TAB_NAME\")`` (or ``copyq tab TAB_NAME`` on command line)\nwhere ``TAB_NAME`` is name of the tab.\n\nFor example to search for an item as in the previous script but in all\ntabs you'll have to run:\n\n::\n\n    var match = \"MATCH-THIS\";\n    var tabs = tab();\n    for (var i in tabs) {\n        tab(tabs[i]);\n        var j = 0;\n        while (j < size() && str(read(j)).indexOf(match) === -1)\n            ++j;\n        if (j < size())\n            print(\"Match in tab \\\"\" + tabs[i] + \"\\\" item number \" + j + \".\\n\");\n    }\n\nScripting Functions\n-------------------\n\nAs mentioned above, all command line options are also available for\nscripting e.g.: ``show()``, ``hide()``, ``toggle()``, ``copy()``,\n``paste()``.\n\nReference for available scripting functions and language features can be found\nat :ref:`scripting-api`.\n"
  },
  {
    "path": "docs/security.rst",
    "content": "Security\n========\n\nThis page describes how CopyQ handles the clipboard data and how to make the\nclipboard safer.\n\nData Storage\n============\n\nBy default, Any text or image in the clipboard is stored automatically in CopyQ.\n\nYou can completely disable automatic clipboard storing or avoid storing content\ncopied from windows with matching window titles.\n\n.. seealso::\n\n    - :ref:`faq-disable-clipboard-storing`\n    - :ref:`faq-ignore-password-manager`\n\nThe data from all tabs are stored in the configuration directory unencrypted\n(unless the Encryption is enabled).\n\n.. seealso::\n\n    - :ref:`faq-config-path`\n    - :ref:`encrypt`\n\nCopyQ does not collect any other data and does not send anything over network.\n\nClipboard Content Visibility\n============================\n\nThe clipboard content is normally shown in the item list of a clipboard tab,\nmain window title, tray tool tip and notification.\n\nTo disable showing the current clipboard in GUI, use `\"No Clipboard\nin Title and Tool Tip\" command\n<https://github.com/hluk/copyq-commands/tree/master/Scripts#no-clipboard-in-title-and-tool-tip>`__\nand disable notifications (in Preferences).\n\n.. seealso::\n\n    - :ref:`faq-disable-notifications`\n    - :ref:`faq-share-commands`\n\nClipboard Access\n================\n\nUsually other applications can access clipboard content without any\nrestriction.\n\nTo restrict accessing the data after a long time, use `\"Clear Clipboard After\nInterval\" command\n<https://github.com/hluk/copyq-commands/tree/master/Scripts#clear-clipboard-after-interval>`__.\n"
  },
  {
    "path": "docs/sessions.rst",
    "content": ".. _sessions:\n\nSessions\n========\n\nYou can run multiple instances of the application given that they have\ndifferent session names.\n\nRunning Multiple Instances\n--------------------------\n\nEach application instance should have unique name.\n\nTo start new instance with ``test1`` name, run:\n\n::\n\n    copyq --session=test1\n\nThis instance uses configuration, tabs and items unique to given session\nname.\n\nYou can still start default session (with empty session name) with just:\n\n::\n\n    copyq\n\nIn the same manner you can manipulate the session. E.g. to add an item\nto first tab in ``test1`` session, run:\n\n::\n\n    copyq --session=test1 add \"Some text\"\n\nDefault session has empty name but it can be overridden by setting\n``COPYQ_SESSION_NAME`` environment variable.\n\nYou need to use same session name for clients launched outside the application.\n\n::\n\n    $ copyq -s test2 tab\n    ERROR: Cannot connect to server! Start CopyQ server first.\n\n    $ copyq -s test1 tab\n    &clipboard\n\nConfiguration Path\n------------------\n\nCurrent configuration path can be overridden with ``COPYQ_SETTINGS_PATH``\nenvironment variable.\n\n::\n\n    $ copyq info config\n    /home/user/.config/copyq/copyq.conf\n\n    $ COPYQ_SETTINGS_PATH=$HOME/copyq-settings copyq info config\n    /home/user/copyq-settings/copyq/copyq.conf\n\nYou need to use same configuration path (and session name) for clients launched\noutside the application.\n\n::\n\n    $ copyq tab\n    ERROR: Cannot connect to server! Start CopyQ server first.\n\n    $ COPYQ_SETTINGS_PATH=$HOME/copyq-settings copyq tab\n    &clipboard\n\nItem Data Path\n--------------\n\nItem data path can be overridden with ``COPYQ_ITEM_DATA_PATH``\nenvironment variable.\n\n::\n\n    $ copyq info data\n    /home/user/.local/share/copyq/copyq\n\n    $ COPYQ_ITEM_DATA_PATH=$HOME/copyq-data copyq info data\n    /home/user/copyq-data/copyq/copyq.conf\n\nThe directory contains data for items that exceeds 4096 bytes. The default\nthreshold can be overridden with ``item_data_threshold`` option.\n\n::\n\n    $ copyq config item_data_threshold\n    4096\n\nTo disable using the data directory and store everything into tab data files,\nset the threshold to a negative value. The tab data file will be updated only\nafter the items in the tab change.\n\n::\n\n    $ copyq config item_data_threshold -1\n    -1\n\nNote: Using data directory ensure that the application is fast even if there\nare a lot of large items in tabs.\n\nIcon Color\n----------\n\nIcon for each session is bit different. The color is generated from session\nname and can be changed using ``COPYQ_SESSION_COLOR`` environment variable.\n\n::\n\n    COPYQ_SESSION_COLOR=\"yellow\" copyq\n    COPYQ_SESSION_COLOR=\"#f90\" copyq\n\nOn Linux, changing icon color won't work if current icon theme contains icon\nnamed \"copyq-normal\" or doesn't contain \"copyq-mask\".\nUse ``COPYQ_DEFAULT_ICON`` environment variable to avoid using the application\nicon from icon theme.\n\n::\n\n    COPYQ_DEFAULT_ICON=1 copyq\n"
  },
  {
    "path": "docs/source-code-overview.rst",
    "content": "Source Code Overview\n====================\n\nThis page describes application processes and source code.\n\nApplications, Frameworks and Libraries\n--------------------------------------\n\nThe application is written in C++17 and uses Qt framework.\n\nSource code can be build either with CMake.\n\nMost icons in the application are taken from theme by default (which\ncurrently works only on Linux) with fallback to built-in icons provided\nby `FontAwesome <http://fontawesome.io/>`__.\n\nThe application logo and icons were created in `Inkscape\n<https://inkscape.org/>`__ (icon source is in `src/images/icon.svg\n<https://github.com/hluk/CopyQ/blob/master/src/images/icon.svg>`__).\n\nApplication Processes\n---------------------\n\nThere are these system processes related to CopyQ:\n\n- Main GUI application\n- Clipboard monitor - executes automatic clipboard commands\n- Menu command filter - enables/hides custom menu items based on \"Filter\" field\n  in menu commands\n- Display command - executes display commands as needed\n- Clipboard and X11 selection owner and synchronization - provides clipboard\n  data; launched as needed\n- Multiple clients - anything run by user from Action dialog or triggered as\n  menu, automatic or global-shortcut command\n\nMain GUI Application\n~~~~~~~~~~~~~~~~~~~~\n\nThe main GUI application (or server) can be executed by running\n``copyq`` binary without attributes (session name can be optionally\nspecified on command line).\n\nIt creates local server allowing communication with clipboard monitor\nprocess and other client processes.\n\nEach user can run multiple main application processes each with unique\nsession name (default name is empty).\n\nClipboard Monitor\n~~~~~~~~~~~~~~~~~\n\nClipboard monitoring happens in separate process because otherwise it\nwould block GUI (in Qt clipboard needs to be accessed in main GUI\nthread). The process is allowed to crash or loop indefinitely due to\nbugs on some platforms.\n\nSetting and retrieving clipboard can still happen in GUI thread (copying\nand pasting in various GUI widgets) but it's preferred to send and\nreceive clipboard data using monitor process.\n\nThe monitor process is launched as soon as GUI application starts and is\nrestarted whenever it doesn't respond to keep-alive requests.\n\nClients and Scripting\n~~~~~~~~~~~~~~~~~~~~~\n\nScripting language is `Qt\nScript <https://doc.qt.io/qt-6/qtqml-javascript-functionlist.html>`__ (mostly\nsame syntax and functions as JavaScript).\n\nAPI is described in :ref:`scripting-api`.\n\nA script can be started by passing arguments to ``copyq``.\nFor example: ``copyq \"1+1\"``\n\nAfter script finishes, the server sends back output of last command and\nexit code (non-zero if script crashes).\n\n.. code-block:: bash\n\n    copyq eval 'read(0,1,2)' # prints first three items in list\n    copyq eval 'fail()' # exit code will be non-zero\n\nWhile script is running, it can send print requests to client.\n\n.. code-block:: bash\n\n    copyq eval 'print(\"Hello, \"); print(\"World!\\n\")'\n\nScripts can ask for stdin from client.\n\n.. code-block:: bash\n\n    copyq eval 'var client_stdin = input()'\n\nThe script run in current directory of client process.\n\n.. code-block:: bash\n\n    copyq eval 'Dir().absolutePath()'\n    copyq eval 'execute(\"ls\", \"-l\").stdout'\n\nSingle function call where all arguments are numbers or strings can be\nexecuted by passing function name and function arguments on command\nline. Following commands are equal.\n\n.. code-block:: bash\n\n    copyq eval 'copy(\"Hello, World!\")'\n    copyq copy \"Hello, World!\"\n\nGetting application version or help mustn't require the server to be\nrunning.\n\n.. code-block:: bash\n\n    copyq help\n    copyq version\n\nScripts run in separate thread and communicate with main thread by\ncalling methods on an object of ``ScriptableProxy`` class. If called\nfrom non-main thread, these methods invoke a slot on an ``QObject`` in\nmain thread and pass it a function object which simply calls the method\nagain.\n\n.. code-block:: cpp\n\n    bool ScriptableProxy::loadTab(const QString &tabName)\n    {\n        // This section is wrapped in an macro so to remove duplicate code.\n        if (!m_inMainThread) {\n            // Callable object just wraps the lambda so it's possible to send it to a slot.\n            auto callable = createCallable([&]{ return loadTab(tabName); });\n\n            m_inMainThread = true;\n            QMetaObject::invokeMethod(m_wnd, \"invoke\", Qt::BlockingQueuedConnection, Q_ARG(Callable*, &callable));\n            m_inMainThread = false;\n\n            return callable.result();\n        }\n\n        // Now it's possible to call method on an object in main thread.\n        return m_wnd->loadTab(tabName);\n    }\n\nPlatform-dependent Code\n-----------------------\n\nCode for various platforms is stored in\n`src/platform <https://github.com/hluk/CopyQ/tree/master/src/platform>`__.\n\nThis leverages amount of ``#if``\\ s and similar preprocessor directives\nin common code.\n\nEach supported platform implements\n`PlatformNativeInterface <https://github.com/hluk/CopyQ/blob/master/src/platform/platformnativeinterface.h>`__\nand ``platformNativeInterface()``.\n\nThe implementations can contain:\n\n-  Creating Qt application objects\n-  Clipboard handling (for clipboard monitor)\n-  Focusing window and getting window titles\n-  Getting system paths\n-  Setting \"autostart\" option\n-  Handling global shortcuts (**note:** this part is in\n   `qxt/ <https://github.com/hluk/CopyQ/tree/master/qxt>`__)\n\nFor unsupported platforms there is `simple\nimplementation <https://github.com/hluk/CopyQ/tree/master/src/platform/dummy>`__\nto get started.\n\nPlugins\n-------\n\nPlugins are built as dynamic libraries which are loaded from runtime\nplugin directory (platform-dependent) after application start.\n\nCode is stored in\n`plugins <https://github.com/hluk/CopyQ/tree/master/plugins>`__.\n\nPlugins implement interfaces from\n`src/item/itemwidget.h <https://github.com/hluk/CopyQ/tree/master/src/item/itemwidget.h>`__.\n\nTo create new plugin just duplicate and rewrite an existing plugin. You\ncan build the plugin with ``make {PLUGIN_NAME}``.\n\nContinuous Integration (CI)\n---------------------------\n\nThe application binaries and packages are built and tested on multiple\nCI servers.\n\n-  `GitHub Actions <https://github.com/hluk/CopyQ/actions>`__\n    -  Builds packages for OS X.\n    -  Builds and runs tests for Linux binaries.\n\n-  `GitLab CI <https://gitlab.com/CopyQ/CopyQ/builds>`__\n    -  Builds and runs tests for Ubuntu 22.04 binaries.\n    -  Screenshots are taken while GUI tests are running. These are\n       available if a test fails.\n\n-  `GitHub Actions <https://github.com/hluk/CopyQ/actions>`__\n    -  Builds and runs tests for Windows.\n    -  Provides downloads for recent commits.\n\n-  `OBS Linux Packages <https://build.opensuse.org/project/show/home:lukho:copyq>`__\n    -  Builds release packages for various Linux distributions.\n\n-  `Beta OBS Linux Packages <https://build.opensuse.org/project/show/home:lukho:copyq-beta>`__\n    -  Builds beta and unstable packages for various Linux distributions.\n\n-  `Codecov <https://app.codecov.io/gh/hluk/CopyQ>`__\n    -  Contains coverage report from tests run with GitHub Actions.\n"
  },
  {
    "path": "docs/synchronize.rst",
    "content": "Synchronize with Documents\n==========================\n\nThis page describes how to keep items in a tab synchronized with files in a\ndirectory on a disk (or a Dropbox folder).\n\nConfiguration\n-------------\n\n.. note::\n\n    On Windows, to enable this feature you need to install \"Synchronize\"\n    plugin. All plugins are installed by default and also included in the\n    portable zip version of the app.\n\nSet path synchronization directory for a tab.\n\n1. Open \"Preferences\" (``Ctrl+P`` shortcut).\n2. Go to \"Items\" tab.\n3. Select \"Synchronize\".\n\n    .. image:: images/synchronize-config.png\n       :scale: 50%\n       :alt: Configure synchronization directory\n\n4. Double-click an empty space in **Tab Name** column and enter name of the tab to synchronize.\n5. Click the browse button on the same row and select directory for the tab.\n6. Click OK to save changes.\n\nNow any items in the synchronized tab will be saved in the directory and\nexisting files will show up in the tab even if the tab or a file is created\nlater.\n\nSynchronized items can be copied and edited as normal items.\n\nFile Types\n----------\n\nOnly files with known format can be shown as items. By default:\n\n- Files with ``.txt`` suffix show up as text items.\n- Files with ``.html`` suffix show up as formatted text items.\n- Files with ``.png`` suffix (and others) show up as images.\n\nTo show other files as items you need to set their file suffix in the second\ntable in the configuration. Here you can set icon and MIME format for the file\ndata.\n\n    .. image:: images/synchronize-formats.png\n       :scale: 50%\n       :alt: Configure file formats to show\n\nThe configuration in the image above allows for content of all files with\n``.cpp`` suffix in synchronized directories to show up text items, i.e. items\nhave ``text/plain`` format containing the file data.\n"
  },
  {
    "path": "docs/tabs-and-items.rst",
    "content": "Tabs and Items\n==============\n\n.. _tabs:\n\nTabs\n----\n\nTabs are means to organize texts, images and other data.\n\nInitially there is only one tab which is used for storing clipboard and\nthe tab bar is hidden.\n\nUser can create new tabs from \"Tabs\" menu or using ``Ctrl+T``. The tab\nbar will appear if there is more than one tab. Using mouse, user can\nreorder tabs and drop items and other data into tabs.\n\nIf tab name contains ``&``, the following letter is used for quick\naccess to the tab (the letter is underlined in tab bar or tab tree and\n``&`` is hidden). For example, tab named \"&Clipboard\" can be opened\nusing ``Alt+C`` shortcut.\n\nOption \"Tab Tree\" enables user to organize tabs into groups. Tabs with\nnames \"Job/Tasks/1\" and \"Job/Tasks/2\" will create following structure in\ntab tree.\n\n::\n\n    > Job\n        > Tasks\n            > 1\n            > 2\n\nStoring Clipboard\n-----------------\n\nIf \"Store Clipboard\" option is enabled (under \"General\" tab in config\ndialog) and \"Tab for storing clipboard\" is set (under \"History\" tab in\nconfig dialog), every time user copies something to clipboard a new item\nwill be created in that particular tab. The item will contain only text\nand data that are needed by plugins (e.g. plugin \"Images\" requires\n``image/svg``, ``image/png`` or similar).\n\nOrganizing Items\n----------------\n\nAny data or item can be moved or copied to other tab by dragging it\nusing mouse or by pasting it in item list.\n\nCommands can automatically organize items into tabs. For example,\nfollowing command will put copied images to \"Images\" tab (to use the\ncommand, copy it to the command list in configuration).\n\n.. code-block:: ini\n\n    [Command]\n    Name=Move Images to Other Tab\n    Input=image/png\n    Automatic=true\n    Remove=true\n    Icon=\\xf03e\n    Tab=&Images\n"
  },
  {
    "path": "docs/tags.rst",
    "content": "Tags\n====\n\nTags are small icons or short texts in upper right corner of an item\nused to mark important or special items.\n\n.. image:: images/tags.png\n\nTags can be configured in \"Items\" configuration tab. On Windows, \"Item\nTags\" plugin needs to be installed.\n\n.. image:: images/tags-config.png\n\nConfiguration consists solely of table where each row contains matching\nand styling rules for tags.\n\nStyle from the first row which matches tag text is applied on the tag.\n\nColumn in the table are following.\n\n-  \"Tag Name\"\n\nText for the tag. This is used for matching if \"Match\" column is empty.\nExpressions like ``\\1``, ``\\2`` etc. will be replaced with\ncaptured texts from \"Match\" column.\n\n-  \"Match\"\n\nRegular expression for matching the tags.\n\nE.g. ``.*`` (any tag), ``Important: .*`` (match prefix),\n``\\d\\d\\d\\d-\\d\\d-\\d\\d.*`` (date time).\n\n-  \"Style Sheet\"\n\nSimple style sheet (https://doc.qt.io/qt-6/stylesheet-reference.html).\n\nE.g. ``border: 1px solid white; border-radius: 3px; font-size: 7pt``.\n\n-  \"Color\" - Text color.\n\n-  \"Icon\" - Icon for tag. To show only icon without text you have to set\n   \"Match\" and keep \"Tag Name\" field empty.\n\n-  \"Lock\" - If enabled, items with such tag will have to be untagged before\n   deleting.\n\nTagging items can be accessed from context menu if appropriate commands\nare added in Command dialog (generated commands are available in the\nlist under \"Add\" button).\n\n.. image:: images/tags-add-command.png\n\nAlternatively, tags are added to an item by setting\n\"application/x-copyq-tags\" format. It can contain multiple tags\nseparated by comma. The tag text itself can be written as simple HTML.\n\nExample:\n\n::\n\n    copyq write text/plain \"Item with tag\" application/x-copyq-tags \"Some tag text\"\n"
  },
  {
    "path": "docs/text-encoding.rst",
    "content": "Text Encoding\n=============\n\nThis page serves as concept for adding additional CopyQ command line\nswitch to print and read texts in UTF-8 (i.e. without using system\nencoding).\n\nEvery time the bytes are read from a command (standard output or\narguments from client) the input is expected to be either just series of\nbytes or text in system encoding (possibly Latin1 on Windows). But\ntexts/strings in CopyQ and in clipboard are UTF-8 formatted (except some\nMIME types with specified encoding).\n\nWhen reading system-encoded text (MIME starts with \"text/\") CopyQ\nre-encodes the data from system encoding to UTF-8. That's not a problem\nif the received data is really in system encoding. But if you send data\nfrom Perl with the UTF-8 switch, CopyQ must also know that UTF-8 is used\ninstead of system encoding.\n\nThe same goes for other way. CopyQ sends texts back to client or to a\ncommand in system encoding so it needs to convert these texts from\nUTF-8.\n\nAs for the re-encoding part, Qt does nice job transforming characters\nfrom UTF-8 but of course for lot of characters in UTF-8 there is no\nalternative in Latin1 and other encodings.\n"
  },
  {
    "path": "docs/theme.rst",
    "content": ".. _theme:\n\nTheme\n=====\n\nApplication style can be configured in the Appearance configuration tab and\nusing Cascading Style Sheets (CSS).\n\nAppearance Configuration\n------------------------\n\nThe Appearance tab in configuration dialog allows to change font and colors of\nthe item list and other GUI elements in the main window.\n\nBy default, only the item list and internal item editor style is changed. To\nchange theme of whole the main window (menu bar, tool bar, tabs) and menus,\nenable option \"Set colors for tabs, tool bar and menus\".\n\n.. note::\n\n    Some desktop environments handle the tray menu style by themselves and it\n    cannot be changed in CopyQ.\n\nYou can change style in more detail by using \"Edit Theme\" button.\n\n.. seealso::\n\n    :ref:`faq-hide-menu-bar`\n\nStyle Sheets\n------------\n\nThe appearance options are the used in application CSS files installed with\nCopyQ (e.g.  placeholders in the files like ``${font}``). You can list the\ntheme installation path with ``copyq info themes`` command.\n\nTo override a CSS file, copy the file to your configuration directory under\n``themes`` subdirectory. For example, override the style sheet for the item\nlist:\n\n.. code-block:: bash\n\n    $ copyq info themes\n    /usr/share/copyq/themes\n\n    $ copyq info config\n    /home/me/.config/copyq/copyq.conf\n\n    $ cp /usr/share/copyq/themes/items.css /home/me/.config/copyq/themes/\n\n    $ $EDITOR /home/me/.config/copyq/themes/items.css\n\nTo reload the style sheets, you need to restart CopyQ or go to the\nconfiguration dialog and click OK button.\n\nYou can set ``COPYQ_THEME_PREFIX`` environment variable for the preferred path\nfor CSS files.\n\nCSS files can contain placeholders like ``${bg}`` which are defined in theme\nconfiguration file. You can edit this file in Appearance configuration tab with\n\"Edit Theme\" button.\n\nPlaceholder can be assigned to colors in following formats:\n\n- ``#RGB`` (each of R, G, and B is a single hex digit)\n- ``#RRGGBB``\n- ``#AARRGGBB`` (with alpha channel)\n- `a color name <https://www.w3.org/TR/SVG11/types.html#ColorKeywords>`__\n- ``transparent``\n- ``rgba(R,G,B,A)`` (each of R, G, and B is 0-255, A is alpha channel 0.0-1.0)\n\nThere are extra color names for current system theme:\n\n- ``default_bg`` - background for list and line/text edit widgets\n- ``default_text`` - foreground color for the above\n- ``default_placeholder_text`` - placeholder text color\n- ``default_alt_bg`` - alternative item background\n- ``default_highlight_bg`` - highlight background\n- ``default_highlight_text`` - highlighted text color\n- ``default_tooltip_bg`` - tooltip background\n- ``default_tooltip_text`` - tooltip text color\n- ``default_window`` - window background\n- ``default_window_text`` - window text color\n- ``default_button`` - button background\n- ``default_button_text`` - button text color\n- ``default_bright_text`` - bright window text color\n- ``default_light`` - lighter than button\n- ``default_midlight`` - between button and light\n- ``default_dark`` - darker than button\n- ``default_mid`` - between button and dark\n- ``default_shadow`` - very dark\n- ``default_link`` - hyperlink color\n- ``default_link_visited`` - visited hyperlink color\n\nPlaceholder can be also assigned color expressions, for example:\n\n- ``sel_bg=bg + #000409 - #100``\n- ``menu_bar_css=\"background: ${bg}; color: ${fg + #444}\"``\n- ``${bg + #333}`` (directly in CSS)\n\nHere are some special placeholders for CSS files:\n\n- ``${css:scrollbar}`` - include ``scrollbar.css`` style sheet.\n- ``${scale = 0.5}`` - set scaling for sizes and font (reset with value 1)\n- ``${hsv_saturation_factor = 2}`` - set saturation for colors in the rest of\n  the style sheet\n- ``${hsv_value_factor = 0.9}`` - set value for colors in the rest of the style\n  sheet\n"
  },
  {
    "path": "docs/translations.rst",
    "content": "Translations\n============\n\nTranslations can be done either via\n`Weblate <https://hosted.weblate.org/projects/copyq/>`__ (preferred) or\nby using Qt utilities.\n\nFor explanation for some frequent words see :ref:`glossary`.\n\nTranslating Keyboard Accelerators\n---------------------------------\n\nSome texts contain single ``&`` character that is not visible in UI and is used\nto mark the following character as keyboard accelerator (the character is\nusually underlined in UI). This is used to quickly access labels, menu items\netc. with keyboard shortcut.\n\nE.g. ``&File`` menu item can be accesses with ``Alt+F`` shortcut on most\nsystems.\n\nIf multiple UI elements have the same keyboard accelerator, associated shortcut\ncycles through them (if pressed multiple times). It's better to avoid this by\ndefining **unique accelerator**, but that's not always easy.\n\nIf unsure, use the original one enclosed in parentheses, e.g. label\n``For&mat:`` can be translated to simplified Chinese as ``格式(&M):``.\n\nWriting Translatable Code\n-------------------------\n\nAll GUI strings should be translatable. This is indicated in code with\n``tr(\"Some GUI text\", \"Hints for translators\")``.\n\nAdding New Language\n-------------------\n\nTo add new language for the application follow these steps.\n\n1. Create new translation file with\n   ``utils/lupdate.sh translations/copyq_<LANGUAGE>.ts``.\n2. Add new language file to Git repository.\n3. Translate with Weblate service or locally with\n   ``linguist translations/copyq_<LANGUAGE>.ts``.\n\nUpdating Translations\n---------------------\n\nTo push and pull changes from Weblate safely, `avoiding merge conflicts\n<https://docs.weblate.org/en/latest/admin/continuous.html#avoiding-merge-conflicts>`_,\nyou can use `Weblate Client <https://docs.weblate.org/en/latest/wlc.html>`_.\n\nInstall Weblate Client:\n\n.. code-block:: bash\n\n    pip3 install -U --user wlc\n\nLock and push changes from Weblate (remember to unlock later):\n\n.. code-block:: bash\n\n    wlc lock\n    wlc push\n    git pull\n\nUpdate and push new translations to repository:\n\n.. code-block:: bash\n\n    utils/lupdate.sh\n    git add translations/\n    git commit -m \"Update translations\"\n    git push\n\nPull changes to Weblate and unlock:\n\n.. code-block:: bash\n\n    wlc pull\n    wlc unlock\n"
  },
  {
    "path": "docs/writing-commands-and-adding-functionality.rst",
    "content": ".. _writing-commands:\n\nWriting Commands and Adding Functionality\n=========================================\n\nCopyQ allows you to extend its functionality through commands in\nfollowing ways:\n\n- Add custom commands to context menu for selected items in history.\n- Run custom commands automatically when clipboard changes.\n- Assign global/system-wide shortcuts to custom commands.\n\nHere are some examples what can be achieved by using commands:\n\n-  Automatically store web links or other types of clipboard content in\n   special tabs to keep the history clean.\n-  Paste current date and time or modified clipboard on a global\n   shortcut.\n-  Pass selected items or clipboard to external application (e.g. web\n   browser or image editor).\n-  Keep TODO lists and tag items as \"important\" or use custom tags.\n-  See :ref:`command-examples` for some other ideas and useful commands.\n\nCommand Dialog\n--------------\n\nYou can create new commands in Command dialog. To open the dialog\neither:\n\na. Press default shortcut F6.\nb. Select menu item \"Commands/Global Shortcuts...\" in \"File\" menu.\n\nCommand dialog contains:\n\n- list of custom commands on the left\n- settings for currently selected command on the right\n- command filter text field at the top\n- buttons to modify the command list (add, remove and move commands) at the top\n- buttons to save, load, copy and paste commands at the bottom\n\nCreate New Command\n~~~~~~~~~~~~~~~~~~\n\nTo create new command click the \"Add\" button in Command dialog. This\nopens list with predefined commands.\n\n\"New Command\" creates new empty command (but it won't do anything\nwithout being configured). One of the most frequently used predefined\ncommand is \"Show/hide main window\" which allows you to assign global\nshortcut for showing and hiding CopyQ window.\n\nIf you double click a predefined command (or select one or multiple\ncommands and click OK) it will be added to list of commands. The right\npart of the Command dialog now shows the configuration for the new\ncommand.\n\nFor example, for the \"Show/hide main window\" you'll most likely need to\nchange only the \"Global Shortcut\" option so click on the button next to\nit and press the shortcut you want to assign.\n\nCommands can be quickly disabled by clicking the check box next to them\nin command list.\n\nBy clicking on \"OK\" or \"Apply\" button in the dialog all commands will be\nsaved permanently.\n\nCommand Options\n^^^^^^^^^^^^^^^\n\nThe following options can be set for commands.\n\nIf unsure what an option does, hover mouse pointer over it and tool tip\nwith description will appear.\n\nName\n''''\n\nName of the command. This is used in context menu if \"In Menu\" check box\nis enabled. Use the pipe character ``|`` in the name to create sub-menus.\n\nGroup: Type of Action\n'''''''''''''''''''''\n\nThis group sets the main type of the command. Usually only one\nsub-option is set.\n\nAutomatic\n\"\"\"\"\"\"\"\"\"\n\nIf enabled, the command is triggered whenever clipboard changes.\n\nAutomatic items are run in order they appear in the command list. No\nother automatic commands will be run if a triggered automatic command\nhas \"Remove Item\" option set or calls ``copyq ignore``.\n\nThe command is **applied on current clipboard data** - i.e. options\nbelow access text or other data in clipboard.\n\nIn Menu\n\"\"\"\"\"\"\"\n\nIf enabled, the command can be run from main window either with\napplication shortcut, from context menu or \"Item\" menu. The command can\nbe also run from tray menu.\n\nShortcuts can be assigned by clicking on the button next to the option.\nThese **application shortcuts work only while CopyQ window has focus**.\n\nIf the command is run from **tray menu**, it is **applied on clipboard\ndata**, otherwise it's **applied on data in selected items**.\n\nGlobal Shortcut\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nGlobal or system shortcut is a keyboard shortcut that **works even if the main\napplication window is not focused**.\n\nIf enabled, the command is triggered whenever assigned shortcut is pressed.\n\nThis command is **not applied on data** in clipboard nor selected items.\n\n.. _command-dialog-script:\n\nScript\n\"\"\"\"\"\"\n\nIf enabled, the command is script which is loaded before any other script is\nstarted. This allows overriding existing functions and creating new ones\n(allowing new command line arguments to be used).\n\nSee :ref:`commands-script`.\n\n.. _command-dialog-display:\n\nDisplay\n\"\"\"\"\"\"\"\n\nIf enabled, the command is used to modify item data before displaying. Use\n``data()`` to retrieve current item data and ``setData()`` to modify the data\nto display (these are not stored permanently).\n\nSee :ref:`commands-display`.\n\nGroup: Match Items\n''''''''''''''''''\n\nThis group is visible only for \"Automatic\" or \"In Menu\" commands.\nSub-options specify when the command can be used.\n\n1. Content\n\"\"\"\"\"\"\"\"\"\"\n\n`Regular expression <https://doc.qt.io/qt-4.8/qregexp.html#introduction>`__\nto match text of selected items (for \"In Menu\" command) or clipboard\n(for \"Automatic\" command).\n\nFor example, ``^https?://`` will match simple web addresses (text\nstarting with ``http://`` or ``https://``).\n\n2. Window\n\"\"\"\"\"\"\"\"\"\n\n`Regular expression <https://doc.qt.io/qt-4.8/qregexp.html#introduction>`__\nto match window title of active window (only for \"Automatic\" command).\n\nFor example, ``- Chromium$`` or ``Mozilla Firefox$`` to match some web\nbrowser window titles (``$`` in the expression means end of the title).\n\n3. Filter\n\"\"\"\"\"\"\"\"\"\n\nA command for validating text of selected items (for \"In Menu\" command)\nor clipboard (for \"Automatic\" command).\n\nIf the command exits with non-zero exit code it won't be shown in\ncontext menu and automatically triggered on clipboard change.\n\nExample, ``copyq: if (tab().indexOf(\"Web\") == -1) fail()`` triggers the\ncommand only if tab \"Web\" is available.\n\n4. Format\n\"\"\"\"\"\"\"\"\"\n\nMatch format of selected items or clipboard.\n\nThe data of this format will be sent to **standard input** of the\ncommand - this doesn't apply if the command is triggered with global\nshortcut.\n\nCommand\n'''''''\n\nThe command to run.\n\nThis can contain either:\n\na. simple command line (e.g. ``copyq popup %1`` - expression ``%1`` means text of the selected item or clipboard)\nb. input for command interpreter (prefixed with ``bash:``, ``powershell:``, ``python:`` etc.)\nc. CopyQ script (prefixed with ``copyq:``)\n\nYou can use ``COPYQ`` environment variable to get path of application\nbinary.\n\nCurrent CopyQ session name is stored in ``COPYQ_SESSION_NAME``\nenvironment variable (see :ref:`sessions`).\n\nExample (call CopyQ from Python):\n\n.. code-block:: python\n\n    python:\n    import os\n    from subprocess import call\n    copyq = os.environ['COPYQ']\n    call([copyq, 'read', '0'])\n\nExample (call CopyQ from PowerShell on Windows):\n\n::\n\n    powershell:\n    $Item1 = (& \"$env:COPYQ\" read 0 | Out-String)\n    echo \"First item: $Item1\"\n\nGroup: Action\n'''''''''''''\n\nThis group is visible only for \"Automatic\" or \"In Menu\" commands.\n\n1. Copy to tab\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nCreates new item in given tab.\n\n2. Remove Item\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nRemoves selected items. If enabled for \"Automatic\" command, the\nclipboard will be ignored and no other automatic commands will be\nexecuted.\n\nGroup: Menu Action\n''''''''''''''''''\n\nThis group is visible only for \"In Menu\" commands.\n\n1. Hide main window after activation\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nIf enabled, main window will be hidden after the command is executed.\n\nGroup: Command options\n''''''''''''''''''''''\n\nThis group is visible only for \"Automatic\" or \"In Menu\" commands.\n\n1. Wait\n\"\"\"\"\"\"\"\n\nShow action dialog before applying options below.\n\n2. Transform\n\"\"\"\"\"\"\"\"\"\"\"\"\n\nModify selected items - i.e. remove them and replace with **standard\noutput** of the command.\n\n3. Output\n\"\"\"\"\"\"\"\"\"\n\nFormat of **standard output** to save as new item.\n\n4. Separator\n\"\"\"\"\"\"\"\"\"\"\"\"\n\nSeparator for splitting output to multiple items (``\\n`` to split\nlines).\n\n5. Output tab\n\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nTab for saving the output of command.\n\nSave and Share Commands\n~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can back up or share commands by saving them in a file (\"Save\nSelected Commands...\" button) or by copying them to clipboard.\n\nThe saved commands can be loaded back to command list (\"Load\nCommands...\" button) or pasted to the list from clipboard.\n\nYou can try some examples by copying commands from :ref:`command-examples`.\n"
  },
  {
    "path": "docs/writing-raw-data.rst",
    "content": "Writing Raw Data\n================\n\nApplication allows you to save any kind of data using *drag and drop* or\nscripting interface.\n\nTo add an image to ``Images`` tab you can run:\n\n::\n\n    cat image1.png | copyq tab Images write image/png -\n\nThis works for any other MIME data type (though unknown formats won't be\ndisplayed properly).\n"
  },
  {
    "path": "gpl.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/CMakeLists.txt",
    "content": "macro (copyq_add_plugin copyq_pkg)\n    file(GLOB copyq_plugin_SOURCES\n        ${copyq_plugin_${copyq_pkg}_external_SOURCES}\n        *.cpp\n        )\n    file(GLOB copyq_plugin_FORMS\n        ${copyq_plugin_${copyq_pkg}_FORMS}\n        *.ui\n        )\n\n    set_source_files_properties(\n        ${copyq_plugin_${copyq_pkg}_SOURCES} PROPERTIES\n        COMPILE_OPTIONS \"${copyq_pedantic_flags}\")\n\n    qt_wrap_ui(copyq_plugin_FORMS_HEADERS ${copyq_plugin_FORMS})\n    qt_add_resources(copyq_plugin_RCC ${copyq_plugin_${copyq_pkg}_RESOURCES})\n\n    add_library(${copyq_pkg} MODULE\n        ${copyq_plugin_SOURCES}\n        ${copyq_plugin_FORMS_HEADERS}\n        ${copyq_plugin_RCC}\n        ${copyq_plugin_${copyq_pkg}_SOURCES}\n        $<TARGET_OBJECTS:copyq-plugin-common>\n        )\n\n    set_target_properties(${copyq_pkg} PROPERTIES\n        COMPILE_DEFINITIONS \"${copyq_plugin_${copyq_pkg}_DEFINITIONS}\")\n\n    target_link_libraries(${copyq_pkg} ${copyq_LIBRARIES} ${copyq_plugin_${copyq_pkg}_LIBRARIES})\n\n    target_include_directories(${copyq_pkg} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ../../src)\n\n    if (UNIX AND NOT APPLE)\n        install(TARGETS ${copyq_pkg} DESTINATION ${PLUGIN_INSTALL_PREFIX})\n    elseif (APPLE)\n        set(copyq_plugins_dest_dir \"${COPYQ_EXECUTABLE_NAME}.app/Contents/PlugIns/copyq\")\n        install(TARGETS ${copyq_pkg} DESTINATION \"${copyq_plugins_dest_dir}\" COMPONENT Runtime)\n        get_property(_copyq_installed_plugins GLOBAL PROPERTY COPYQ_INSTALLED_PLUGINS)\n        # We need this list to perform fixups during the creation of an application bundle (in src)\n        list(APPEND _copyq_installed_plugins\n            \"\\$ENV{DESTDIR}\\${CMAKE_INSTALL_PREFIX}/${copyq_plugins_dest_dir}/${CMAKE_SHARED_MODULE_PREFIX}${copyq_pkg}${CMAKE_SHARED_MODULE_SUFFIX}\"\n        )\n        set_property(GLOBAL PROPERTY COPYQ_INSTALLED_PLUGINS \"${_copyq_installed_plugins}\")\n    endif()\nendmacro()\n\nset(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/plugins)\n\nmacro (copyq_add_plugin_obj copyq_mod)\n    add_library(${copyq_mod} OBJECT ${ARGN})\n    set_target_properties(${copyq_mod} PROPERTIES POSITION_INDEPENDENT_CODE ON)\n    target_link_libraries(${copyq_mod} ${copyq_LIBRARIES})\n    target_include_directories(${copyq_mod} PRIVATE ../src)\nendmacro()\n\ncopyq_add_plugin_obj(copyq-plugin-common\n    ../src/item/itemwidget.cpp\n    ../src/common/mimetypes.cpp\n)\ncopyq_add_plugin_obj(copyq-plugin-wrapper ../src/item/itemwidgetwrapper.cpp)\ncopyq_add_plugin_obj(copyq-plugin-textdata ../src/common/textdata.cpp)\ncopyq_add_plugin_obj(copyq-plugin-geometry ../src/gui/geometry.cpp)\ncopyq_add_plugin_obj(copyq-plugin-screen ../src/gui/screen.cpp)\ncopyq_add_plugin_obj(copyq-plugin-serialize\n    ../src/item/serialize.cpp\n    ../src/common/encryption.cpp\n)\ncopyq_add_plugin_obj(copyq-plugin-config ../src/common/config.cpp)\ncopyq_add_plugin_obj(copyq-plugin-iconfont ../src/gui/iconfont.cpp)\ncopyq_add_plugin_obj(copyq-plugin-iconwidget ../src/gui/iconwidget.cpp)\n\nadd_subdirectory(\"itemencrypted\")\nadd_subdirectory(\"itemfakevim\")\nadd_subdirectory(\"itemimage\")\nadd_subdirectory(\"itemnotes\")\nadd_subdirectory(\"itempinned\")\nadd_subdirectory(\"itemtags\")\nadd_subdirectory(\"itemtext\")\nadd_subdirectory(\"itemsync\")\n"
  },
  {
    "path": "plugins/itemencrypted/CMakeLists.txt",
    "content": "set(copyq_plugin_itemencrypted_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-config>\n    $<TARGET_OBJECTS:copyq-plugin-iconfont>\n    $<TARGET_OBJECTS:copyq-plugin-iconwidget>\n    $<TARGET_OBJECTS:copyq-plugin-screen>\n    $<TARGET_OBJECTS:copyq-plugin-serialize>\n    $<TARGET_OBJECTS:copyq-plugin-textdata>\n    ../../src/common/shortcuts.cpp\n    )\n\ncopyq_add_plugin(itemencrypted)\n"
  },
  {
    "path": "plugins/itemencrypted/itemencrypted.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemencrypted.h\"\n#include \"ui_itemencryptedsettings.h\"\n\n#include \"common/command.h\"\n#include \"common/config.h\"\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/shortcuts.h\"\n#include \"common/processsignals.h\"\n#include \"common/textdata.h\"\n#include \"gui/icons.h\"\n#include \"gui/iconwidget.h\"\n#include \"gui/fromiconid.h\"\n#include \"item/serialize.h\"\n\n#include <QAbstractItemModel>\n#include <QDebug>\n#include <QDir>\n#include <QIODevice>\n#include <QLabel>\n#include <QLoggingCategory>\n#include <QModelIndex>\n#include <QSettings>\n#include <QTextEdit>\n#include <QtPlugin>\n#include <QVBoxLayout>\n#include <QVariantMap>\n\nnamespace {\n\nconst QLatin1String mimeEncryptedData(\"application/x-copyq-encrypted\");\n\nconst QLatin1String dataFileHeader(\"CopyQ_encrypted_tab\");\nconst QLatin1String dataFileHeaderV2(\"CopyQ_encrypted_tab v2\");\n\nconst QLatin1String configEncryptTabs(\"encrypt_tabs\");\n\nconst int maxItemCount = 100'000;\n\nQ_DECLARE_LOGGING_CATEGORY(plugin)\nQ_LOGGING_CATEGORY(plugin, \"copyq.plugin.itemencrypted\")\n\nbool waitOrTerminate(QProcess *p, int timeoutMs)\n{\n    p->waitForStarted();\n\n    if ( p->state() != QProcess::NotRunning && !p->waitForFinished(timeoutMs) ) {\n        p->terminate();\n        if ( !p->waitForFinished(5000) )\n            p->kill();\n        return false;\n    }\n\n    return true;\n}\n\nbool verifyProcess(QProcess *p, int timeoutMs = 30000)\n{\n    if ( !waitOrTerminate(p, timeoutMs) ) {\n        qCCritical(plugin) << \"Process timed out; stderr:\" << p->readAllStandardError();\n        return false;\n    }\n\n    const int exitCode = p->exitCode();\n    if ( p->exitStatus() != QProcess::NormalExit ) {\n        qCCritical(plugin) << \"Failed to run GnuPG:\" << p->errorString();\n        return false;\n    }\n\n    if (exitCode != 0) {\n        if (const QString errors = p->readAllStandardError(); !errors.isEmpty()) {\n            qCCritical(plugin) << \"GnuPG stderr:\" << errors;\n        }\n        return false;\n    }\n\n    return true;\n}\n\nQString getGpgVersionOutput(const QString &executable) {\n    QProcess p;\n    p.start(executable, QStringList(\"--version\"), QIODevice::ReadWrite);\n    p.closeReadChannel(QProcess::StandardError);\n\n    if ( !verifyProcess(&p, 5000) )\n        return QString();\n\n    return p.readAllStandardOutput();\n}\n\nstruct GpgVersion {\n    int major;\n    int minor;\n};\n\nGpgVersion parseVersion(const QString &versionOutput)\n{\n    const int lineEndIndex = versionOutput.indexOf('\\n');\n    const auto firstLine = QStringView{versionOutput}.mid(0, lineEndIndex);\n    const QRegularExpression versionRegex(QStringLiteral(R\"( (\\d+)\\.(\\d+))\"));\n    const QRegularExpressionMatch match = versionRegex.match(firstLine);\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    const int major = match.hasMatch() ? match.capturedView(1).toInt() : 0;\n    const int minor = match.hasMatch() ? match.capturedView(2).toInt() : 0;\n#else\n    const int major = match.hasMatch() ? match.capturedRef(1).toInt() : 0;\n    const int minor = match.hasMatch() ? match.capturedRef(2).toInt() : 0;\n#endif\n    return GpgVersion{major, minor};\n}\n\nclass GpgExecutable {\npublic:\n    GpgExecutable() = default;\n\n    explicit GpgExecutable(const QString &executable)\n        : m_executable(executable)\n    {\n        const auto versionOutput = getGpgVersionOutput(executable);\n        if ( !versionOutput.isEmpty() ) {\n            qCDebug(plugin).nospace()\n                << \"'\" << executable << \" --version' output: \" << versionOutput;\n\n            const GpgVersion version = parseVersion(versionOutput);\n            m_isSupported = version.major >= 2;\n            qCDebug(plugin).nospace()\n                << (m_isSupported ? \"Supported\" : \"Unsupported\")\n                << \" gpg version: \" << version.major << \".\" << version.minor;\n\n            const bool needsSecring = version.major == 2 && version.minor == 0;\n\n            const QString path = getConfigurationFilePath(\"\");\n            m_pubring = path + \".pub\";\n            m_pubringNative = QDir::toNativeSeparators(m_pubring);\n            if (needsSecring) {\n                m_secring = path + \".sec\";\n                m_secringNative = QDir::toNativeSeparators(m_secring);\n            }\n\n#ifdef Q_OS_WIN\n            const bool isUnixGpg = versionOutput.contains(\"Home: /c/\");\n            if (isUnixGpg) {\n                m_pubringNative = QString(m_pubring).replace(\":\", \"\").insert(0, '/');\n                if (needsSecring)\n                    m_secringNative = QString(m_secring).replace(\":\", \"\").insert(0, '/');\n            }\n#endif\n        }\n    }\n\n    const QString &executable() const { return m_executable; }\n    bool isSupported() const { return m_isSupported; }\n    bool needsSecring() const { return !m_secring.isEmpty(); }\n    const QString &pubring() const { return m_pubring; }\n    const QString &secring() const { return m_secring; }\n    const QString &pubringNative() const { return m_pubringNative; }\n    const QString &secringNative() const { return m_secringNative; }\n\nprivate:\n    QString m_executable;\n    QString m_pubring;\n    QString m_secring;\n    QString m_pubringNative;\n    QString m_secringNative;\n    bool m_isSupported = false;\n};\n\nGpgExecutable findGpgExecutable()\n{\n    for (const auto &executable : {\"gpg2\", \"gpg\"}) {\n        GpgExecutable gpg(executable);\n        if ( gpg.isSupported() )\n            return gpg;\n    }\n\n    return GpgExecutable();\n}\n\nconst GpgExecutable &gpgExecutable()\n{\n    static const auto gpg = findGpgExecutable();\n    return gpg;\n}\n\nQStringList getDefaultEncryptCommandArguments(const QString &publicKeyPath)\n{\n    return QStringList() << \"--trust-model\" << \"always\" << \"--recipient\" << \"copyq\"\n                         << \"--charset\" << \"utf-8\" << \"--display-charset\" << \"utf-8\" << \"--no-tty\"\n                         << \"--no-default-keyring\" << \"--keyring\" << publicKeyPath;\n}\n\nvoid startGpgProcess(QProcess *p, const QStringList &args, QIODevice::OpenModeFlag mode)\n{\n    const auto &gpg = gpgExecutable();\n    p->start(gpg.executable(), getDefaultEncryptCommandArguments(gpg.pubringNative()) + args, mode);\n}\n\nQString importGpgKey()\n{\n    const auto &gpg = gpgExecutable();\n    if ( !gpg.needsSecring() )\n        return QString();\n\n    QProcess p;\n    p.start(gpg.executable(), getDefaultEncryptCommandArguments(gpg.pubringNative()) << \"--import\" << gpg.secringNative());\n    if ( !verifyProcess(&p) )\n        return \"Failed to import private key (see log).\";\n\n    return QString();\n}\n\nQString exportGpgKey()\n{\n    const auto &gpg = gpgExecutable();\n    if ( !gpg.needsSecring() )\n        return QString();\n\n    // Private key already created or exported.\n    if ( QFile::exists(gpg.secring()) )\n        return QString();\n\n    QProcess p;\n    p.start(gpg.executable(), getDefaultEncryptCommandArguments(gpg.pubringNative()) << \"--export-secret-key\" << gpg.secringNative());\n    if ( !verifyProcess(&p) )\n        return \"Failed to export private key (see log).\";\n\n    QFile secKey(gpg.secring());\n    if ( !secKey.open(QIODevice::WriteOnly) )\n        return \"Failed to create private key.\";\n\n    if ( !secKey.setPermissions(QFile::ReadOwner | QFile::WriteOwner) )\n        return \"Failed to set permissions for private key.\";\n\n    const QByteArray secKeyData = p.readAllStandardOutput();\n    secKey.write(secKeyData);\n    secKey.close();\n\n    return QString();\n}\n\nQByteArray readGpgOutput(const QStringList &args, const QByteArray &input = QByteArray())\n{\n    QProcess p;\n    startGpgProcess(&p, args, QIODevice::ReadWrite);\n    p.write(input);\n    p.closeWriteChannel();\n    p.waitForFinished();\n    verifyProcess(&p);\n    return p.readAllStandardOutput();\n}\n\nbool keysExist()\n{\n    return !readGpgOutput( QStringList(\"--list-keys\") ).isEmpty();\n}\n\nbool decryptMimeData(QVariantMap *data)\n{\n    const QByteArray encryptedBytes = data->take(mimeEncryptedData).toByteArray();\n    const QByteArray bytes = readGpgOutput( QStringList() << \"--decrypt\", encryptedBytes );\n    if ( bytes.isEmpty() )\n        return false;\n\n    return deserializeData(data, bytes);\n}\n\nbool encryptMimeData(const QVariantMap &data, const QModelIndex &index, QAbstractItemModel *model)\n{\n    QVariantMap dataToEncrypt;\n    QVariantMap dataMap;\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        if ( it.key().startsWith(COPYQ_MIME_PREFIX) )\n            dataMap.insert(it.key(), it.value());\n        else\n            dataToEncrypt.insert(it.key(), it.value());\n    }\n\n    if ( dataToEncrypt.isEmpty() )\n        return false;\n\n    const QByteArray bytes = serializeData(dataToEncrypt);\n    const QByteArray encryptedBytes = readGpgOutput( QStringList(\"--encrypt\"), bytes );\n    if ( encryptedBytes.isEmpty() )\n        return false;\n\n    dataMap.insert(mimeEncryptedData, encryptedBytes);\n    return model->setData(index, dataMap, contentType::updateData);\n}\n\nvoid startGenerateKeysProcess(QProcess *process, bool useTransientPasswordlessKey = false)\n{\n    const auto &gpg = gpgExecutable();\n\n    auto args = QStringList() << \"--batch\" << \"--gen-key\";\n\n    QByteArray transientOptions;\n    if (useTransientPasswordlessKey) {\n        args << \"--debug-quick-random\";\n        transientOptions =\n                \"\\n%no-protection\"\n                \"\\n%transient-key\";\n    }\n\n    startGpgProcess(process, args, QIODevice::ReadWrite);\n    process->write(\n        \"\\nKey-Type: RSA\"\n        \"\\nKey-Usage: encrypt\"\n        \"\\nKey-Length: 4096\"\n        \"\\nName-Real: copyq\"\n        + transientOptions +\n        \"\\n%pubring \" + gpg.pubringNative().toUtf8()\n    );\n\n    if ( gpg.needsSecring() )\n        process->write(\"\\n%secring \" + gpg.secringNative().toUtf8());\n\n    process->write(\"\\n%commit\\n\");\n    process->closeWriteChannel();\n}\n\nQString exportImportGpgKeys()\n{\n    if (const auto error = exportGpgKey(); !error.isEmpty())\n        return error;\n\n    return importGpgKey();\n}\n\nbool isGpgInstalled()\n{\n    return gpgExecutable().isSupported();\n}\n\n} // namespace\n\nItemEncrypted::ItemEncrypted(QWidget *parent)\n    : QWidget(parent)\n    , ItemWidget(this)\n{\n    auto layout = new QVBoxLayout(this);\n    layout->setContentsMargins(0, 0, 0, 0);\n\n    // Show small icon.\n    QWidget *iconWidget = new IconWidget(IconLock, this);\n    layout->addWidget(iconWidget);\n}\n\nbool ItemEncryptedSaver::saveItems(const QString &, const QAbstractItemModel &model, QIODevice *file)\n{\n    const auto length = model.rowCount();\n    QByteArray bytes;\n\n    {\n        QDataStream stream(&bytes, QIODevice::WriteOnly);\n        stream.setVersion(QDataStream::Qt_4_7);\n\n        stream << static_cast<quint64>(length);\n\n        for (int i = 0; i < length && stream.status() == QDataStream::Ok; ++i) {\n            QModelIndex index = model.index(i, 0);\n            QVariantMap dataMap = index.data(contentType::data).toMap();\n            for (auto it = dataMap.begin(); it != dataMap.end(); ++it) {\n                if (it.value().type() != QVariant::ByteArray)\n                    it.value() = it.value().toByteArray();\n            }\n            stream << dataMap;\n        }\n    }\n\n    bytes = readGpgOutput(QStringList(\"--encrypt\"), bytes);\n    if ( bytes.isEmpty() ) {\n        emitEncryptFailed();\n        qCCritical(plugin) << \"Failed to read encrypted data\";\n        return false;\n    }\n\n    QDataStream stream(file);\n    stream.setVersion(QDataStream::Qt_4_7);\n    stream << QString(dataFileHeaderV2);\n    stream.writeRawData( bytes.data(), bytes.size() );\n\n    if ( stream.status() != QDataStream::Ok ) {\n        emitEncryptFailed();\n        qCCritical(plugin) << \"Failed to write encrypted data\";\n        return false;\n    }\n\n    return true;\n}\n\nvoid ItemEncryptedSaver::emitEncryptFailed()\n{\n    emit error( ItemEncryptedLoader::tr(\"Encryption failed!\") );\n}\n\nbool ItemEncryptedScriptable::isEncrypted()\n{\n    const auto args = currentArguments();\n    for (const auto &arg : args) {\n        bool ok;\n        const int row = arg.toInt(&ok);\n        if (ok) {\n            const auto result = call(\"read\", {QStringLiteral(\"?\"), row});\n            if ( result.toByteArray().contains(mimeEncryptedData.data()) )\n                return true;\n        }\n    }\n\n    return false;\n}\n\nQByteArray ItemEncryptedScriptable::encrypt()\n{\n    const auto args = currentArguments();\n    const auto bytes = args.value(0).toByteArray();\n    return encrypt(bytes);\n}\n\nQByteArray ItemEncryptedScriptable::decrypt()\n{\n    const auto args = currentArguments();\n    const auto bytes = args.value(0).toByteArray();\n    return decrypt(bytes);\n}\n\nvoid ItemEncryptedScriptable::encryptItem()\n{\n    QVariantMap dataMap;\n    const auto formats = call(\"dataFormats\", {}).toList();\n    for (const auto &formatValue : formats) {\n        const auto format = formatValue.toString();\n        if ( !format.startsWith(COPYQ_MIME_PREFIX) ) {\n            const auto data = call(\"data\", {format}).toByteArray();\n            dataMap.insert(format, data);\n        }\n    }\n\n    const auto bytes = call(\"pack\", {dataMap}).toByteArray();\n    const auto encryptedBytes = encrypt(bytes);\n    if (encryptedBytes.isEmpty())\n        return;\n\n    call(\"setData\", {mimeEncryptedData, encryptedBytes});\n\n    for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it)\n        call(\"removeData\", {it.key()});\n}\n\nvoid ItemEncryptedScriptable::decryptItem()\n{\n    const auto encryptedBytes = call(\"data\", {mimeEncryptedData}).toByteArray();\n    const auto itemData = decrypt(encryptedBytes);\n    if (itemData.isEmpty())\n        return;\n\n    const auto dataMap = call(\"unpack\", {itemData}).toMap();\n    for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it) {\n        const auto &format = it.key();\n        call(\"setData\", {format, dataMap[format]});\n    }\n}\n\nvoid ItemEncryptedScriptable::encryptItems()\n{\n    const auto dataValueList = call(\"selectedItemsData\", {}).toList();\n\n    QVariantList dataList;\n    for (const auto &itemDataValue : dataValueList) {\n        auto itemData = itemDataValue.toMap();\n\n        QVariantMap itemDataToEncrypt;\n        const auto formats = itemData.keys();\n        for (const auto &format : formats) {\n            if ( !format.startsWith(COPYQ_MIME_PREFIX) ) {\n                itemDataToEncrypt.insert(format, itemData[format]);\n                itemData.remove(format);\n            }\n        }\n\n        const auto bytes = call(\"pack\", {itemDataToEncrypt}).toByteArray();\n        const auto encryptedBytes = encrypt(bytes);\n        if (encryptedBytes.isEmpty())\n            return;\n        itemData.insert(mimeEncryptedData, encryptedBytes);\n\n        dataList.append(itemData);\n    }\n\n    call( \"setSelectedItemsData\", {QVariant(dataList)} );\n}\n\nvoid ItemEncryptedScriptable::decryptItems()\n{\n    const auto dataValueList = call(\"selectedItemsData\", {}).toList();\n\n    QVariantList dataList;\n    for (const auto &itemDataValue : dataValueList) {\n        auto itemData = itemDataValue.toMap();\n\n        const auto encryptedBytes = itemData.value(mimeEncryptedData).toByteArray();\n        if ( !encryptedBytes.isEmpty() ) {\n            itemData.remove(mimeEncryptedData);\n\n            const auto decryptedBytes = decrypt(encryptedBytes);\n            if (decryptedBytes.isEmpty())\n                return;\n\n            const auto decryptedItemData = call(\"unpack\", {decryptedBytes}).toMap();\n            for (auto it = decryptedItemData.constBegin(); it != decryptedItemData.constEnd(); ++it)\n                itemData.insert(it.key(), it.value());\n        }\n\n        dataList.append(itemData);\n    }\n\n    call( \"setSelectedItemsData\", {QVariant(dataList)} );\n}\n\nvoid ItemEncryptedScriptable::copyEncryptedItems()\n{\n    const auto dataValueList = call(\"selectedItemsData\", {}).toList();\n    QString text;\n    for (const auto &dataValue : dataValueList) {\n        if ( !text.isEmpty() )\n            text.append('\\n');\n\n        const auto data = dataValue.toMap();\n        const auto itemTextValue = data.value(mimeText);\n        if ( itemTextValue.isValid() ) {\n            text.append( getTextData(itemTextValue.toByteArray()) );\n        } else {\n            const auto encryptedBytes = data.value(mimeEncryptedData).toByteArray();\n            if ( !encryptedBytes.isEmpty() ) {\n                const auto itemData = decrypt(encryptedBytes);\n                if (itemData.isEmpty())\n                    return;\n                const auto dataMap = call(\"unpack\", {itemData}).toMap();\n                text.append( getTextData(dataMap) );\n            }\n        }\n    }\n\n    const QVariantList args{mimeText, text, mimeHidden, \"1\"};\n    call(\"copy\", args);\n    call(\"copySelection\", args);\n}\n\nvoid ItemEncryptedScriptable::pasteEncryptedItems()\n{\n    copyEncryptedItems();\n    const auto script =\n        R\"(\n        if (focused()) {\n            hide();\n            sleep(100);\n        }\n        paste();\n        sleep(2000);\n        copy('');\n        copySelection('');\n        )\";\n    call(\"eval\", {script});\n}\n\nQString ItemEncryptedScriptable::generateTestKeys()\n{\n    const auto &gpg = gpgExecutable();\n\n    const QStringList keys = gpg.needsSecring()\n        ? QStringList{gpg.pubring(), gpg.secring()}\n        : QStringList{gpg.pubring()};\n\n    for (const auto &keyFileName : keys) {\n        if ( QFile::exists(keyFileName) && !QFile::remove(keyFileName) )\n            return QString(\"Failed to remove \\\"%1\\\"\").arg(keyFileName);\n    }\n\n    QProcess process;\n    startGenerateKeysProcess(&process, true);\n\n    if ( !verifyProcess(&process) ) {\n        return QString(\"ItemEncrypt: %1; stderr: %2\")\n                .arg( process.errorString(),\n                      QString::fromUtf8(process.readAllStandardError()) );\n    }\n\n    if ( const auto error = exportImportGpgKeys(); !error.isEmpty() )\n        return error;\n\n    for (const auto &keyFileName : keys) {\n        if ( !QFile::exists(keyFileName) )\n            return QString(\"Failed to create \\\"%1\\\"\").arg(keyFileName);\n    }\n\n    return QString();\n}\n\nbool ItemEncryptedScriptable::isGpgInstalled()\n{\n    return ::isGpgInstalled();\n}\n\nQByteArray ItemEncryptedScriptable::encrypt(const QByteArray &bytes)\n{\n    const auto encryptedBytes = readGpgOutput(QStringList(\"--encrypt\"), bytes);\n    if ( encryptedBytes.isEmpty() )\n        throwError(\"Failed to execute GPG!\");\n    return encryptedBytes;\n}\n\nQByteArray ItemEncryptedScriptable::decrypt(const QByteArray &bytes)\n{\n    importGpgKey();\n\n    const auto decryptedBytes = readGpgOutput(QStringList(\"--decrypt\"), bytes);\n    if ( decryptedBytes.isEmpty() )\n        throwError(\"Failed to execute GPG!\");\n    return decryptedBytes;\n}\n\nItemEncryptedLoader::ItemEncryptedLoader()\n    : ui()\n    , m_gpgProcessStatus(GpgCheckIfInstalled)\n    , m_gpgProcess(nullptr)\n{\n}\n\nItemEncryptedLoader::~ItemEncryptedLoader()\n{\n    terminateGpgProcess();\n}\n\nItemWidget *ItemEncryptedLoader::create(const QVariantMap &data, QWidget *parent, bool) const\n{\n    if ( data.value(mimeHidden).toBool() )\n        return nullptr;\n\n    return data.contains(mimeEncryptedData) ? new ItemEncrypted(parent) : nullptr;\n}\n\nQStringList ItemEncryptedLoader::formatsToSave() const\n{\n    return QStringList(mimeEncryptedData);\n}\n\nvoid ItemEncryptedLoader::applySettings(QSettings &settings)\n{\n    Q_ASSERT(ui != nullptr);\n    settings.setValue( configEncryptTabs, ui->plainTextEditEncryptTabs->toPlainText().split('\\n') );\n}\n\nvoid ItemEncryptedLoader::loadSettings(const QSettings &settings)\n{\n    m_encryptTabs = settings.value(configEncryptTabs).toStringList();\n}\n\nQWidget *ItemEncryptedLoader::createSettingsWidget(QWidget *parent)\n{\n    ui.reset(new Ui::ItemEncryptedSettings);\n    QWidget *w = new QWidget(parent);\n    ui->setupUi(w);\n\n    ui->plainTextEditEncryptTabs->setPlainText(\n        m_encryptTabs.join('\\n') );\n\n    if (status() != GpgNotInstalled) {\n        const auto &gpg = gpgExecutable();\n        ui->labelShareInfo->setTextFormat(Qt::RichText);\n        QString text = ItemEncryptedLoader::tr(\n            \"To share encrypted items on other computer or\"\n            \" session, you'll need these secret key files (keep them in a safe place):\"\n        );\n        if (gpg.needsSecring()) {\n            text.append( QStringLiteral(\n                \"<ul>\"\n                \"<li>%1</li>\"\n                \"<li>%2</li>\"\n                \"</ul>\"\n                ).arg(quoteString(gpg.pubringNative()), quoteString(gpg.secringNative()))\n            );\n        } else {\n            text.append( QStringLiteral(\n                \"<ul>\"\n                \"<li>%1</li>\"\n                \"</ul>\"\n                ).arg(quoteString(gpg.pubringNative()))\n            );\n        }\n        ui->labelShareInfo->setText(text);\n    }\n\n    updateUi();\n\n    connect( ui->pushButtonPassword, &QAbstractButton::clicked,\n             this, &ItemEncryptedLoader::setPassword );\n\n    return w;\n}\n\nbool ItemEncryptedLoader::canLoadItems(QIODevice *file) const\n{\n    QDataStream stream(file);\n    stream.setVersion(QDataStream::Qt_4_7);\n\n    QString header;\n    stream >> header;\n\n    return stream.status() == QDataStream::Ok\n            && (header == dataFileHeader || header == dataFileHeaderV2);\n}\n\nbool ItemEncryptedLoader::canSaveItems(const QString &tabName) const\n{\n    for (const auto &encryptTabName : m_encryptTabs) {\n        if ( encryptTabName.isEmpty() )\n            continue;\n\n        QString tabName1 = tabName;\n\n        // Ignore ampersands (usually just for underlining mnemonics) if none is specified.\n        if ( !hasKeyHint(encryptTabName) )\n            removeKeyHint(&tabName1);\n\n        // Ignore path in tab tree if none path separator is specified.\n        if ( !encryptTabName.contains('/') ) {\n            const int i = tabName1.lastIndexOf('/');\n            tabName1.remove(0, i + 1);\n        }\n\n        if ( tabName1 == encryptTabName )\n            return true;\n    }\n\n    return false;\n}\n\nItemSaverPtr ItemEncryptedLoader::loadItems(const QString &, QAbstractItemModel *model, QIODevice *file, int maxItems)\n{\n    // This is needed to skip header.\n    if ( !canLoadItems(file) )\n        return nullptr;\n\n    if (status() == GpgNotInstalled) {\n        emit error( ItemEncryptedLoader::tr(\"GnuPG must be installed to view encrypted tabs.\") );\n        return nullptr;\n    }\n\n    importGpgKey();\n\n    QProcess p;\n    startGpgProcess( &p, QStringList(\"--decrypt\"), QIODevice::ReadWrite );\n\n    char encryptedBytes[4096];\n\n    QDataStream stream(file);\n    while ( !stream.atEnd() ) {\n        const int bytesRead = stream.readRawData(encryptedBytes, 4096);\n        if (bytesRead == -1) {\n            emitDecryptFailed();\n            qCCritical(plugin) << \"Failed to read encrypted data\";\n            return nullptr;\n        }\n        p.write(encryptedBytes, bytesRead);\n    }\n\n    p.closeWriteChannel();\n\n    // Wait for password entry dialog.\n    p.waitForFinished(-1);\n\n    if ( !verifyProcess(&p) ) {\n        emitDecryptFailed();\n        return nullptr;\n    }\n\n    const QByteArray bytes = p.readAllStandardOutput();\n    if ( bytes.isEmpty() ) {\n        emitDecryptFailed();\n        qCCritical(plugin) << \"Failed to read encrypted data\";\n        verifyProcess(&p);\n        return nullptr;\n    }\n\n    QDataStream stream2(bytes);\n\n    quint64 length;\n    stream2 >> length;\n    if ( stream2.status() != QDataStream::Ok ) {\n        emitDecryptFailed();\n        qCCritical(plugin) << \"Failed to parse item count\";\n        return nullptr;\n    }\n    length = qMin(length, static_cast<quint64>(maxItems)) - static_cast<quint64>(model->rowCount());\n\n    const auto count = length < maxItemCount ? static_cast<int>(length) : maxItemCount;\n    for ( int i = 0; i < count && stream2.status() == QDataStream::Ok; ++i ) {\n        if ( !model->insertRow(i) ) {\n            emitDecryptFailed();\n            qCCritical(plugin) << \"Failed to insert item\";\n            return nullptr;\n        }\n        QVariantMap dataMap;\n        stream2 >> dataMap;\n        model->setData( model->index(i, 0), dataMap, contentType::data );\n    }\n\n    if ( stream2.status() != QDataStream::Ok ) {\n        emitDecryptFailed();\n        qCCritical(plugin) << \"Failed to decrypt item\";\n        return nullptr;\n    }\n\n    return createSaver();\n}\n\nItemSaverPtr ItemEncryptedLoader::initializeTab(const QString &, QAbstractItemModel *, int)\n{\n    if (status() == GpgNotInstalled)\n        return nullptr;\n\n    return createSaver();\n}\n\nItemScriptable *ItemEncryptedLoader::scriptableObject()\n{\n    return new ItemEncryptedScriptable();\n}\n\nQVector<Command> ItemEncryptedLoader::commands() const\n{\n    if ( status() == GpgNotInstalled || !keysExist() )\n        return QVector<Command>();\n\n    QVector<Command> commands;\n\n    Command c;\n    c.internalId = QStringLiteral(\"copyq_encrypted_encrypt\");\n    c.name = ItemEncryptedLoader::tr(\"Encrypt (needs GnuPG)\");\n    c.icon = fromIconId(IconLock);\n    c.input = \"!OUTPUT\";\n    c.output = mimeEncryptedData;\n    c.inMenu = true;\n    c.cmd = \"copyq: plugins.itemencrypted.encryptItems()\";\n    c.shortcuts.append( toPortableShortcutText(ItemEncryptedLoader::tr(\"Ctrl+L\")) );\n    commands.append(c);\n\n    c = Command();\n    c.internalId = QStringLiteral(\"copyq_encrypted_decrypt\");\n    c.name = ItemEncryptedLoader::tr(\"Decrypt\");\n    c.icon = fromIconId(IconUnlock);\n    c.input = mimeEncryptedData;\n    c.output = mimeItems;\n    c.inMenu = true;\n    c.cmd = \"copyq: plugins.itemencrypted.decryptItems()\";\n    c.shortcuts.append( toPortableShortcutText(ItemEncryptedLoader::tr(\"Ctrl+L\")) );\n    commands.append(c);\n\n    c = Command();\n    c.internalId = QStringLiteral(\"copyq_encrypted_decrypt_and_copy\");\n    c.name = ItemEncryptedLoader::tr(\"Decrypt and Copy\");\n    c.icon = fromIconId(IconUnlockKeyhole);\n    c.input = mimeEncryptedData;\n    c.inMenu = true;\n    c.cmd = \"copyq: plugins.itemencrypted.copyEncryptedItems()\";\n    c.shortcuts.append( toPortableShortcutText(ItemEncryptedLoader::tr(\"Ctrl+Shift+L\")) );\n    commands.append(c);\n\n    c = Command();\n    c.internalId = QStringLiteral(\"copyq_encrypted_decrypt_and_paste\");\n    c.name = ItemEncryptedLoader::tr(\"Decrypt and Paste\");\n    c.icon = fromIconId(IconUnlockKeyhole);\n    c.input = mimeEncryptedData;\n    c.inMenu = true;\n    c.cmd = \"copyq: plugins.itemencrypted.pasteEncryptedItems()\";\n    c.shortcuts.append( toPortableShortcutText(ItemEncryptedLoader::tr(\"Enter\")) );\n    commands.append(c);\n\n    return commands;\n}\n\nvoid ItemEncryptedLoader::setPassword()\n{\n    if (status() != GpgNotRunning)\n        return;\n\n    if ( !keysExist() ) {\n        m_gpgProcessStatus = GpgGeneratingKeys;\n        m_gpgProcess = new QProcess(this);\n        startGenerateKeysProcess(m_gpgProcess);\n    } else {\n        // Change password.\n        m_gpgProcessStatus = GpgChangingPassword;\n        m_gpgProcess = new QProcess(this);\n        startGpgProcess( m_gpgProcess, QStringList() << \"--edit-key\" << \"copyq\" << \"passwd\" << \"save\", QIODevice::ReadOnly );\n    }\n\n    m_gpgProcess->waitForStarted();\n    if ( m_gpgProcess->state() == QProcess::NotRunning ) {\n        onGpgProcessFinished( m_gpgProcess->exitCode(), m_gpgProcess->exitStatus() );\n    } else {\n        connectProcessFinished(m_gpgProcess, this, &ItemEncryptedLoader::onGpgProcessFinished);\n        updateUi();\n    }\n}\n\nvoid ItemEncryptedLoader::terminateGpgProcess()\n{\n    if (m_gpgProcess == nullptr)\n        return;\n    QProcess *p = m_gpgProcess;\n    m_gpgProcess = nullptr;\n    p->terminate();\n    p->waitForFinished();\n    p->deleteLater();\n    m_gpgProcessStatus = GpgNotRunning;\n    updateUi();\n}\n\nvoid ItemEncryptedLoader::onGpgProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)\n{\n    QString error;\n\n    if (m_gpgProcess != nullptr) {\n        if (ui != nullptr) {\n            if (exitStatus != QProcess::NormalExit)\n                error = m_gpgProcess->errorString();\n            else if (exitCode != 0)\n                error = getTextData(m_gpgProcess->readAllStandardError());\n            else if ( m_gpgProcess->error() != QProcess::UnknownError )\n                error = m_gpgProcess->errorString();\n            else if ( !keysExist() )\n                error = ItemEncryptedLoader::tr(\"Failed to generate keys.\");\n        }\n\n        m_gpgProcess->deleteLater();\n        m_gpgProcess = nullptr;\n    }\n\n    // Export and import private key to a file in configuration.\n    if ( status() == GpgGeneratingKeys && error.isEmpty() )\n        error = exportImportGpgKeys();\n\n    if (!error.isEmpty())\n        error = ItemEncryptedLoader::tr(\"Error: %1\").arg(error);\n\n    m_gpgProcessStatus = GpgNotRunning;\n\n    updateUi();\n    ui->labelInfo->setText( error.isEmpty() ? ItemEncryptedLoader::tr(\"Done\") : error );\n}\n\nvoid ItemEncryptedLoader::updateUi()\n{\n    if (ui == nullptr)\n        return;\n\n    if (status() == GpgNotInstalled) {\n        ui->labelInfo->setText(\"To use item encryption, install\"\n                               \" <a href=\\\"http://www.gnupg.org/\\\">GnuPG</a>\"\n                               \" application and restart CopyQ.\");\n        ui->pushButtonPassword->hide();\n        ui->groupBoxEncryptTabs->hide();\n        ui->groupBoxShareInfo->hide();\n    } else if (status() == GpgGeneratingKeys) {\n        ui->labelInfo->setText( ItemEncryptedLoader::tr(\"Creating new keys (this may take a few minutes)...\") );\n        ui->pushButtonPassword->setText( ItemEncryptedLoader::tr(\"Cancel\") );\n    } else if (status() == GpgChangingPassword) {\n        ui->labelInfo->setText( ItemEncryptedLoader::tr(\"Setting new password...\") );\n        ui->pushButtonPassword->setText( ItemEncryptedLoader::tr(\"Cancel\") );\n    } else if ( !keysExist() ) {\n        ui->labelInfo->setText( ItemEncryptedLoader::tr(\n                    \"Encryption keys <strong>must be generated</strong>\"\n                    \" before item encryption can be used.\") );\n        ui->pushButtonPassword->setText( ItemEncryptedLoader::tr(\"Generate New Keys...\") );\n    } else {\n        ui->pushButtonPassword->setText( ItemEncryptedLoader::tr(\"Change Password...\") );\n    }\n}\n\nvoid ItemEncryptedLoader::emitDecryptFailed()\n{\n    emit error( ItemEncryptedLoader::tr(\"Decryption failed!\") );\n}\n\nItemSaverPtr ItemEncryptedLoader::createSaver()\n{\n    auto saver = std::make_shared<ItemEncryptedSaver>();\n    connect( saver.get(), &ItemEncryptedSaver::error,\n             this, &ItemEncryptedLoader::error );\n    return saver;\n}\n\nItemEncryptedLoader::GpgProcessStatus ItemEncryptedLoader::status() const\n{\n    if (m_gpgProcessStatus == GpgCheckIfInstalled) {\n        if (isGpgInstalled())\n            m_gpgProcessStatus = GpgNotRunning;\n        else\n            m_gpgProcessStatus = GpgNotInstalled;\n    }\n\n    return m_gpgProcessStatus;\n}\n\nbool ItemEncryptedLoader::data(QVariantMap *data, const QModelIndex &) const\n{\n    return !data->contains(mimeEncryptedData) || decryptMimeData(data);\n}\n\nbool ItemEncryptedLoader::setData(const QVariantMap &data, const QModelIndex &index, QAbstractItemModel *model) const\n{\n    if ( !index.data(contentType::data).toMap().contains(mimeEncryptedData) )\n        return false;\n\n    return encryptMimeData(data, index, model);\n}\n"
  },
  {
    "path": "plugins/itemencrypted/itemencrypted.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"item/itemwidget.h\"\n#include \"gui/icons.h\"\n\n#include <QProcess>\n#include <QVariant>\n#include <QWidget>\n\n#include <memory>\n\nnamespace Ui {\nclass ItemEncryptedSettings;\n}\n\nclass QIODevice;\n\nclass ItemEncrypted final : public QWidget, public ItemWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit ItemEncrypted(QWidget *parent);\n};\n\nclass ItemEncryptedSaver final : public QObject, public ItemSaverInterface\n{\n    Q_OBJECT\n\npublic:\n    bool saveItems(const QString &tabName, const QAbstractItemModel &model, QIODevice *file) override;\n\nsignals:\n    void error(const QString &);\n\nprivate:\n    void emitEncryptFailed();\n};\n\nclass ItemEncryptedScriptable final : public ItemScriptable\n{\n    Q_OBJECT\npublic slots:\n    bool isEncrypted();\n    QByteArray encrypt();\n    QByteArray decrypt();\n\n    void encryptItem();\n    void decryptItem();\n\n    void encryptItems();\n    void decryptItems();\n\n    void copyEncryptedItems();\n    void pasteEncryptedItems();\n\n    QString generateTestKeys();\n    bool isGpgInstalled();\n\nprivate:\n    QByteArray encrypt(const QByteArray &bytes);\n    QByteArray decrypt(const QByteArray &bytes);\n};\n\nclass ItemEncryptedLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemEncryptedLoader();\n\n    ~ItemEncryptedLoader();\n\n    ItemWidget *create(const QVariantMap &data, QWidget *parent, bool) const override;\n\n    QString id() const override { return \"itemencrypted\"; }\n    QString name() const override { return tr(\"Encryption\"); }\n    QString author() const override { return QString(); }\n    QString description() const override { return tr(\"Encrypt items and tabs.\"); }\n    QVariant icon() const override { return QVariant(IconLock); }\n\n    QStringList formatsToSave() const override;\n\n    void applySettings(QSettings &settings) override;\n\n    void loadSettings(const QSettings &settings) override;\n\n    QWidget *createSettingsWidget(QWidget *parent) override;\n\n    bool canLoadItems(QIODevice *file) const override;\n\n    bool canSaveItems(const QString &tabName) const override;\n\n    ItemSaverPtr loadItems(const QString &tabName, QAbstractItemModel *model, QIODevice *file, int maxItems) override;\n\n    ItemSaverPtr initializeTab(const QString &, QAbstractItemModel *model, int maxItems) override;\n\n    const QObject *signaler() const override { return this; }\n\n    ItemScriptable *scriptableObject() override;\n\n    QVector<Command> commands() const override;\n\n    bool data(QVariantMap *data, const QModelIndex &) const override;\n\n    bool setData(const QVariantMap &data, const QModelIndex &index, QAbstractItemModel *model) const override;\n\nsignals:\n    void error(const QString &);\n\nprivate:\n    void setPassword();\n    void terminateGpgProcess();\n    void onGpgProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);\n\n    enum GpgProcessStatus {\n        GpgCheckIfInstalled,\n        GpgNotInstalled,\n        GpgNotRunning,\n        GpgGeneratingKeys,\n        GpgChangingPassword\n    };\n\n    void updateUi();\n\n    void emitDecryptFailed();\n\n    ItemSaverPtr createSaver();\n\n    GpgProcessStatus status() const;\n\n    std::unique_ptr<Ui::ItemEncryptedSettings> ui;\n    QStringList m_encryptTabs;\n\n    mutable GpgProcessStatus m_gpgProcessStatus;\n    QProcess *m_gpgProcess;\n};\n"
  },
  {
    "path": "plugins/itemencrypted/itemencryptedsettings.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemEncryptedSettings</class>\n <widget class=\"QWidget\" name=\"ItemEncryptedSettings\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>324</width>\n    <height>367</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n    <horstretch>0</horstretch>\n    <verstretch>1</verstretch>\n   </sizepolicy>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>To encrypt and decrypt items add appropriate commands under Commands tab.</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n     <property name=\"openExternalLinks\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"labelInfo\">\n     <property name=\"text\">\n      <string/>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QPushButton\" name=\"pushButtonPassword\">\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\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    </layout>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBoxShareInfo\">\n     <property name=\"title\">\n      <string>Sharing Encrypted Items and Tabs</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <widget class=\"QLabel\" name=\"labelShareInfo\">\n        <property name=\"text\">\n         <string/>\n        </property>\n        <property name=\"wordWrap\">\n         <bool>true</bool>\n        </property>\n        <property name=\"textInteractionFlags\">\n         <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBoxEncryptTabs\">\n     <property name=\"title\">\n      <string>Encrypted Tabs</string>\n     </property>\n     <layout class=\"QGridLayout\" name=\"gridLayout\">\n      <item row=\"0\" column=\"0\" colspan=\"2\">\n       <widget class=\"QLabel\" name=\"label_4\">\n        <property name=\"text\">\n         <string>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</string>\n        </property>\n        <property name=\"wordWrap\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QPlainTextEdit\" name=\"plainTextEditEncryptTabs\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n          <horstretch>0</horstretch>\n          <verstretch>1</verstretch>\n         </sizepolicy>\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 <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "plugins/itemfakevim/CMakeLists.txt",
    "content": "file(GLOB copyq_plugin_itemfakevim_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-wrapper>\n    )\nfile(GLOB copyq_plugin_itemfakevim_external_SOURCES\n    fakevim/*.cpp\n    )\n\nset(copyq_plugin_itemfakevim_DEFINITIONS\n    QT_NO_CAST_TO_ASCII\n    QT_RESTRICTED_CAST_FROM_ASCII\n    DEBUG_KEY=0\n    DEBUG_UNDO=0\n    )\n\nset(copyq_plugin_itemfakevim_RESOURCES itemfakevim.qrc)\n\ncopyq_add_plugin(itemfakevim)\ntarget_include_directories(itemfakevim SYSTEM PRIVATE fakevim)\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/LGPL_EXCEPTION.TXT",
    "content": "Digia Qt LGPL Exception version 1.1\n\nAs an additional permission to the GNU Lesser General Public License version\n2.1, the object code form of a \"work that uses the Library\" may incorporate\nmaterial from a header file that is part of the Library.  You may distribute\nsuch object code under terms of your choice, provided that:\n    (i)   the header files of the Library have not been modified; and\n    (ii)  the incorporated material is limited to numerical parameters, data\n          structure layouts, accessors, macros, inline functions and\n          templates; and\n    (iii) you comply with the terms of Section 6 of the GNU Lesser General\n          Public License version 2.1.\n\nMoreover, you may apply this exception to a modified version of the Library,\nprovided that such modification does not involve copying material from the\nLibrary into the modified Library's header files unless such material is\nlimited to (i) numerical parameters; (ii) data structure layouts;\n(iii) accessors; and (iv) small macros, templates and inline functions of\nfive lines or less in length.\n\nFurthermore, you are not required to apply this additional permission to a\nmodified version of the Library.\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/LICENSE.LGPL",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n\n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/fakevimactions.cpp",
    "content": "// Copyright (C) 2016 The Qt Company Ltd.\n// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0\n\n#include \"fakevimactions.h\"\n#include \"fakevimhandler.h\"\n\n// Please do not add any direct dependencies to other Qt Creator code  here.\n// Instead emit signals and let the FakeVimPlugin channel the information to\n// Qt Creator. The idea is to keep this file here in a \"clean\" state that\n// allows easy reuse with any QTextEdit or QPlainTextEdit derived class.\n\nnamespace FakeVim {\nnamespace Internal {\n\n#ifdef FAKEVIM_STANDALONE\nFvBaseAspect::FvBaseAspect()\n{\n}\n\nvoid FvBaseAspect::setValue(const QVariant &value)\n{\n    m_value = value;\n}\n\nQVariant FvBaseAspect::value() const\n{\n    return m_value;\n}\n\nvoid FvBaseAspect::setDefaultValue(const QVariant &value)\n{\n    m_defaultValue = value;\n    m_value = value;\n}\n\nQVariant FvBaseAspect::defaultValue() const\n{\n    return m_defaultValue;\n}\n\nvoid FvBaseAspect::setSettingsKey(const QString &group, const QString &key)\n{\n    m_settingsGroup = group;\n    m_settingsKey = key;\n}\n\nQString FvBaseAspect::settingsKey() const\n{\n    return m_settingsKey;\n}\n\n// unused but kept for compile\nvoid setAutoApply(bool ) {}\n#endif\n\nFakeVimSettings::FakeVimSettings()\n{\n    setAutoApply(false);\n\n#ifndef FAKEVIM_STANDALONE\n    setup(&useFakeVim,     false, \"UseFakeVim\",     {},    tr(\"Use FakeVim\"));\n#endif\n    // Specific FakeVim settings\n    setup(&readVimRc,      false, \"ReadVimRc\",      {},    tr(\"Read .vimrc from location:\"));\n    setup(&vimRcPath,      QString(), \"VimRcPath\",  {},    {}); // tr(\"Path to .vimrc\")\n    setup(&showMarks,      false, \"ShowMarks\",      \"sm\",  tr(\"Show position of text marks\"));\n    setup(&passControlKey, false, \"PassControlKey\", \"pck\", tr(\"Pass control keys\"));\n    setup(&passKeys,       true,  \"PassKeys\",       \"pk\",  tr(\"Pass keys in insert mode\"));\n\n    // Emulated Vsetting\n    setup(&startOfLine,    true,  \"StartOfLine\",    \"sol\", tr(\"Start of line\"));\n    setup(&tabStop,        8,     \"TabStop\",        \"ts\",  tr(\"Tabulator size:\"));\n    setup(&smartTab,       false, \"SmartTab\",       \"sta\", tr(\"Smart tabulators\"));\n    setup(&hlSearch,       true,  \"HlSearch\",       \"hls\", tr(\"Highlight search results\"));\n    setup(&shiftWidth,     8,     \"ShiftWidth\",     \"sw\",  tr(\"Shift width:\"));\n    setup(&expandTab,      false, \"ExpandTab\",      \"et\",  tr(\"Expand tabulators\"));\n    setup(&autoIndent,     false, \"AutoIndent\",     \"ai\",  tr(\"Automatic indentation\"));\n    setup(&smartIndent,    false, \"SmartIndent\",    \"si\",  tr(\"Smart indentation\"));\n    setup(&incSearch,      true,  \"IncSearch\",      \"is\",  tr(\"Incremental search\"));\n    setup(&useCoreSearch,  false, \"UseCoreSearch\",  \"ucs\", tr(\"Use search dialog\"));\n    setup(&smartCase,      false, \"SmartCase\",      \"scs\", tr(\"Use smartcase\"));\n    setup(&ignoreCase,     false, \"IgnoreCase\",     \"ic\",  tr(\"Use ignorecase\"));\n    setup(&wrapScan,       true,  \"WrapScan\",       \"ws\",  tr(\"Use wrapscan\"));\n    setup(&tildeOp,        false, \"TildeOp\",        \"top\", tr(\"Use tildeop\"));\n    setup(&showCmd,        true,  \"ShowCmd\",        \"sc\",  tr(\"Show partial command\"));\n    setup(&relativeNumber, false, \"RelativeNumber\", \"rnu\", tr(\"Show line numbers relative to cursor\"));\n    setup(&blinkingCursor, false, \"BlinkingCursor\", \"bc\",  tr(\"Blinking cursor\"));\n    setup(&scrollOff,      0,     \"ScrollOff\",      \"so\",  tr(\"Scroll offset:\"));\n    setup(&backspace,      \"indent,eol,start\",\n                                  \"Backspace\",      \"bs\",  tr(\"Backspace:\"));\n    setup(&isKeyword,      \"@,48-57,_,192-255,a-z,A-Z\",\n                                  \"IsKeyword\",      \"isk\", tr(\"Keyword characters:\"));\n    setup(&clipboard,      {},    \"Clipboard\",      \"cb\",  tr(\"\"));\n    setup(&formatOptions,  {},    \"formatoptions\",  \"fo\",  tr(\"\")); // pragma: codespell-ignore\n\n    // Emulated plugins\n    setup(&emulateVimCommentary, false, \"commentary\", {}, \"vim-commentary\");\n    setup(&emulateReplaceWithRegister, false, \"ReplaceWithRegister\", {}, \"ReplaceWithRegister\");\n    setup(&emulateExchange, false, \"exchange\", {}, \"vim-exchange\");\n    setup(&emulateArgTextObj, false, \"argtextobj\", {}, \"argtextobj.vim\");\n    setup(&emulateSurround, false, \"surround\", {}, \"vim-surround\");\n\n    // Some polish\n    useFakeVim.setDisplayName(tr(\"Use Vim-style Editing\"));\n\n    relativeNumber.setToolTip(tr(\"Displays line numbers relative to the line containing \"\n        \"text cursor.\"));\n\n    passControlKey.setToolTip(tr(\"Does not interpret key sequences like Ctrl-S in FakeVim \"\n        \"but handles them as regular shortcuts. This gives easier access to core functionality \"\n        \"at the price of losing some features of FakeVim.\"));\n\n    passKeys.setToolTip(tr(\"Does not interpret some key presses in insert mode so that \"\n        \"code can be properly completed and expanded.\"));\n\n    tabStop.setToolTip(tr(\"Vim tabstop option.\"));\n\n#ifndef FAKEVIM_STANDALONE\n    backspace.setDisplayStyle(FvStringAspect::LineEditDisplay);\n    isKeyword.setDisplayStyle(FvStringAspect::LineEditDisplay);\n\n    const QString vimrcDefault = QLatin1String(\n#ifdef Q_OS_UNIX\n        \"$HOME/.vimrc\"\n#else\n        \"%USERPROFILE%\\\\_vimrc\"\n#endif\n    )\n    vimRcPath.setExpectedKind(PathChooser::File);\n    vimRcPath.setToolTip(tr(\"Keep empty to use the default path, i.e. \"\n               \"%USERPROFILE%\\\\_vimrc on Windows, ~/.vimrc otherwise.\"));\n    vimRcPath.setPlaceHolderText(tr(\"Default: %1\").arg(vimrcDefault));\n    vimRcPath.setDisplayStyle(FvStringAspect::PathChooserDisplay);\n#endif\n}\n\nFakeVimSettings::~FakeVimSettings() = default;\n\nFvBaseAspect *FakeVimSettings::item(const QString &name)\n{\n    return m_nameToAspect.value(name, nullptr);\n}\n\nQString FakeVimSettings::trySetValue(const QString &name, const QString &value)\n{\n    FvBaseAspect *aspect = m_nameToAspect.value(name, nullptr);\n    if (!aspect)\n        return tr(\"Unknown option: %1\").arg(name);\n    if (aspect == &tabStop || aspect == &shiftWidth) {\n        if (value.toInt() <= 0)\n            return tr(\"Argument must be positive: %1=%2\")\n                    .arg(name).arg(value);\n    }\n    aspect->setValue(value);\n    return QString();\n}\n\nvoid FakeVimSettings::setup(FvBaseAspect *aspect,\n                            const QVariant &value,\n                            const QString &settingsKey,\n                            const QString &shortName,\n                            const QString &labelText)\n{\n    aspect->setSettingsKey(\"FakeVim\", settingsKey);\n    aspect->setDefaultValue(value);\n#ifndef FAKEVIM_STANDALONE\n    aspect->setLabelText(labelText);\n    aspect->setAutoApply(false);\n    registerAspect(aspect);\n\n    if (auto boolAspect = dynamic_cast<FvBoolAspect *>(aspect))\n        boolAspect->setLabelPlacement(FvBoolAspect::LabelPlacement::AtCheckBoxWithoutDummyLabel);\n#else\n    Q_UNUSED(labelText)\n#endif\n\n    const QString longName = settingsKey.toLower();\n    if (!longName.isEmpty()) {\n        m_nameToAspect[longName] = aspect;\n        m_aspectToName[aspect] = longName;\n    }\n    if (!shortName.isEmpty())\n        m_nameToAspect[shortName] = aspect;\n}\n\nFakeVimSettings *fakeVimSettings()\n{\n    static FakeVimSettings s;\n    return &s;\n}\n\n} // namespace Internal\n} // namespace FakeVim\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/fakevimactions.h",
    "content": "// Copyright (C) 2016 The Qt Company Ltd.\n// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0\n\n#pragma once\n\n#define FAKEVIM_STANDALONE\n\n#ifdef FAKEVIM_STANDALONE\n#   include \"private/fakevim_export.h\"\n#else\n#   include <utils/savedaction.h>\n#endif\n\n#include <QCoreApplication>\n#include <QHash>\n#include <QObject>\n#include <QString>\n#include <QVariant>\n\nnamespace FakeVim {\nnamespace Internal {\n\n#ifdef FAKEVIM_STANDALONE\nclass FAKEVIM_EXPORT FvBaseAspect\n{\npublic:\n    FvBaseAspect();\n    virtual ~FvBaseAspect() {}\n\n    void setValue(const QVariant &value);\n    QVariant value() const;\n    void setDefaultValue(const QVariant &value);\n    QVariant defaultValue() const;\n    void setSettingsKey(const QString &group, const QString &key);\n    QString settingsKey() const;\n    void setCheckable(bool) {}\n    void setDisplayName(const QString &) {}\n    void setToolTip(const QString &) {}\n\nprivate:\n    QVariant m_value;\n    QVariant m_defaultValue;\n    QString m_settingsGroup;\n    QString m_settingsKey;\n};\n\nclass FvBoolAspect : public FvBaseAspect\n{\npublic:\n    bool value() const { return FvBaseAspect::value().toBool(); }\n};\n\nclass FvIntegerAspect : public FvBaseAspect\n{\npublic:\n    qint64 value() const { return FvBaseAspect::value().toLongLong(); }\n};\n\nclass FvStringAspect : public FvBaseAspect\n{\npublic:\n    QString value() const { return FvBaseAspect::value().toString(); }\n};\n\nclass FvAspectContainer : public FvBaseAspect\n{\npublic:\n};\n\n#else\n\nusing FvAspectContainer = Utils::AspectContainer;\nusing FvBaseAspect = Utils::BaseAspect;\nusing FvBoolAspect = Utils::BoolAspect;\nusing FvIntegerAspect = Utils::IntegerAspect;\nusing FvStringAspect = Utils::StringAspect;\n\n#endif\n\nclass FAKEVIM_EXPORT FakeVimSettings final : public FvAspectContainer\n{\n    Q_DECLARE_TR_FUNCTIONS(FakeVim)\n\npublic:\n    FakeVimSettings();\n    ~FakeVimSettings();\n\n    FvBaseAspect *item(const QString &name);\n    QString trySetValue(const QString &name, const QString &value);\n\n    FvBoolAspect useFakeVim;\n    FvBoolAspect readVimRc;\n    FvStringAspect vimRcPath;\n\n    FvBoolAspect startOfLine;\n    FvIntegerAspect tabStop;\n    FvBoolAspect hlSearch;\n    FvBoolAspect smartTab;\n    FvIntegerAspect shiftWidth;\n    FvBoolAspect expandTab;\n    FvBoolAspect autoIndent;\n    FvBoolAspect smartIndent;\n\n    FvBoolAspect incSearch;\n    FvBoolAspect useCoreSearch;\n    FvBoolAspect smartCase;\n    FvBoolAspect ignoreCase;\n    FvBoolAspect wrapScan;\n\n    // command ~ behaves as g~\n    FvBoolAspect tildeOp;\n\n    // indent  allow backspacing over autoindent\n    // eol     allow backspacing over line breaks (join lines)\n    // start   allow backspacing over the start of insert; CTRL-W and CTRL-U\n    //         stop once at the start of insert.\n    FvStringAspect backspace;\n\n    // @,48-57,_,192-255\n    FvStringAspect isKeyword;\n\n    // other actions\n    FvBoolAspect showMarks;\n    FvBoolAspect passControlKey;\n    FvBoolAspect passKeys;\n    FvStringAspect clipboard;\n    FvBoolAspect showCmd;\n    FvIntegerAspect scrollOff;\n    FvBoolAspect relativeNumber;\n    FvStringAspect formatOptions;\n\n    // Plugin emulation\n    FvBoolAspect emulateVimCommentary;\n    FvBoolAspect emulateReplaceWithRegister;\n    FvBoolAspect emulateExchange;\n    FvBoolAspect emulateArgTextObj;\n    FvBoolAspect emulateSurround;\n\n    FvBoolAspect blinkingCursor;\n\nprivate:\n    void setup(FvBaseAspect *aspect, const QVariant &value,\n                      const QString &settingsKey,\n                      const QString &shortName,\n                      const QString &label);\n\n    QHash<QString, FvBaseAspect *> m_nameToAspect;\n    QHash<FvBaseAspect *, QString> m_aspectToName;\n};\n\nFAKEVIM_EXPORT FakeVimSettings *fakeVimSettings();\n\n} // namespace Internal\n} // namespace FakeVim\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/fakevimhandler.cpp",
    "content": "// Copyright (C) 2016 The Qt Company Ltd.\n// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0\n\n//\n// ATTENTION:\n//\n// 1 Please do not add any direct dependencies to other Qt Creator code here.\n//   Instead emit signals and let the FakeVimPlugin channel the information to\n//   Qt Creator. The idea is to keep this file here in a \"clean\" state that\n//   allows easy reuse with any QTextEdit or QPlainTextEdit derived class.\n//\n// 2 There are a few auto tests located in ../../../tests/auto/fakevim.\n//   Commands that are covered there are marked as \"// tested\" below.\n//\n// 3 Some conventions:\n//\n//   Use 1 based line numbers and 0 based column numbers. Even though\n//   the 1 based line are not nice it matches vim's and QTextEdit's 'line'\n//   concepts.\n//\n//   Do not pass QTextCursor etc around unless really needed. Convert\n//   early to  line/column.\n//\n//   A QTextCursor is always between characters, whereas vi's cursor is always\n//   over a character. FakeVim interprets the QTextCursor to be over the character\n//   to the right of the QTextCursor's position().\n//\n//   A current \"region of interest\"\n//   spans between anchor(), (i.e. the character below anchor()), and\n//   position(). The character below position() is not included\n//   if the last movement command was exclusive (MoveExclusive).\n//\n\n#include \"fakevimhandler.h\"\n\n#include \"fakevimactions.h\"\n#include \"fakevimtr.h\"\n\n#include <QDebug>\n#include <QFile>\n#include <QObject>\n#include <QProcess>\n#include <QPointer>\n#include <QRegularExpression>\n#include <QTextStream>\n#include <QTimer>\n#include <QStack>\n\n#include <QApplication>\n#include <QClipboard>\n#include <QInputMethodEvent>\n#include <QKeyEvent>\n#include <QLineEdit>\n#include <QPlainTextEdit>\n#include <QScrollBar>\n#include <QTextBlock>\n#include <QTextCursor>\n#include <QTextDocumentFragment>\n#include <QTextEdit>\n#include <QMimeData>\n#include <QSharedPointer>\n#include <QDir>\n\n#include <algorithm>\n#include <climits>\n#include <ctype.h>\n#include <functional>\n#include <optional>\n\n//#define DEBUG_KEY  1\n#if DEBUG_KEY\n#   define KEY_DEBUG(s) qDebug() << s\n#else\n#   define KEY_DEBUG(s)\n#endif\n\n//#define DEBUG_UNDO  1\n#if DEBUG_UNDO\n#   define UNDO_DEBUG(s) qDebug() << \"REV\" << revision() << s\n#else\n#   define UNDO_DEBUG(s)\n#endif\n\nnamespace FakeVim {\nnamespace Internal {\n\n///////////////////////////////////////////////////////////////////////\n//\n// FakeVimHandler\n//\n///////////////////////////////////////////////////////////////////////\n\n#define StartOfLine     QTextCursor::StartOfLine\n#define EndOfLine       QTextCursor::EndOfLine\n#define MoveAnchor      QTextCursor::MoveAnchor\n#define KeepAnchor      QTextCursor::KeepAnchor\n#define Up              QTextCursor::Up\n#define Down            QTextCursor::Down\n#define Right           QTextCursor::Right\n#define Left            QTextCursor::Left\n#define EndOfDocument   QTextCursor::End\n#define StartOfDocument QTextCursor::Start\n#define NextBlock       QTextCursor::NextBlock\n\n#define ParagraphSeparator QChar::ParagraphSeparator\n\n#define EDITOR(s) (m_textedit ? m_textedit->s : m_plaintextedit->s)\n\n\n#ifdef Q_OS_DARWIN\n#define ControlModifier Qt::MetaModifier\n#else\n#define ControlModifier Qt::ControlModifier\n#endif\n\n/* Clipboard MIME types used by Vim. */\nstatic const QString vimMimeText = \"_VIM_TEXT\";\nstatic const QString vimMimeTextEncoded = \"_VIMENC_TEXT\";\n\nusing namespace Qt;\n\n/*! A \\e Mode represents one of the basic modes of operation of FakeVim.\n*/\n\nenum Mode\n{\n    InsertMode,\n    ReplaceMode,\n    CommandMode,\n    ExMode\n};\n\nenum BlockInsertMode\n{\n    NoneBlockInsertMode,\n    AppendBlockInsertMode,\n    AppendToEndOfLineBlockInsertMode,\n    InsertBlockInsertMode,\n    ChangeBlockInsertMode\n};\n\n/*! A \\e SubMode is used for things that require one more data item\n    and are 'nested' behind a \\l Mode.\n*/\nenum SubMode\n{\n    NoSubMode,\n    ChangeSubMode,              // Used for c\n    DeleteSubMode,              // Used for d\n    ExchangeSubMode,            // Used for cx\n    DeleteSurroundingSubMode,   // Used for ds\n    ChangeSurroundingSubMode,   // Used for cs\n    AddSurroundingSubMode,      // Used for ys\n    FilterSubMode,              // Used for !\n    IndentSubMode,              // Used for =\n    RegisterSubMode,            // Used for \"\n    ShiftLeftSubMode,           // Used for <\n    ShiftRightSubMode,          // Used for >\n    CommentSubMode,             // Used for gc\n    ReplaceWithRegisterSubMode, // Used for gr\n    InvertCaseSubMode,          // Used for g~\n    DownCaseSubMode,            // Used for gu\n    UpCaseSubMode,              // Used for gU\n    WindowSubMode,              // Used for Ctrl-w\n    YankSubMode,                // Used for y\n    ZSubMode,                   // Used for z\n    CapitalZSubMode,            // Used for Z\n    ReplaceSubMode,             // Used for r\n    MacroRecordSubMode,         // Used for q\n    MacroExecuteSubMode,        // Used for @\n    CtrlVSubMode,               // Used for Ctrl-v in insert mode\n    CtrlRSubMode                // Used for Ctrl-r in insert mode\n};\n\n/*! A \\e SubSubMode is used for things that require one more data item\n    and are 'nested' behind a \\l SubMode.\n*/\nenum SubSubMode\n{\n    NoSubSubMode,\n    FtSubSubMode,                   // Used for f, F, t, T.\n    MarkSubSubMode,                 // Used for m.\n    BackTickSubSubMode,             // Used for `.\n    TickSubSubMode,                 // Used for '.\n    TextObjectSubSubMode,           // Used for thing like iw, aW, as etc.\n    ZSubSubMode,                    // Used for zj, zk\n    OpenSquareSubSubMode,           // Used for [{, {(, [z\n    CloseSquareSubSubMode,          // Used for ]}, ]), ]z\n    SearchSubSubMode,               // Used for /, ?\n    SurroundSubSubMode,             // Used for cs, ds, ys\n    SurroundWithFunctionSubSubMode, // Used for ys{motion}f\n    CtrlVUnicodeSubSubMode          // Used for Ctrl-v based unicode input\n};\n\nenum VisualMode\n{\n    NoVisualMode,\n    VisualCharMode,\n    VisualLineMode,\n    VisualBlockMode\n};\n\nenum MoveType\n{\n    MoveExclusive,\n    MoveInclusive,\n    MoveLineWise\n};\n\n/*!\n    \\enum RangeMode\n\n    The \\e RangeMode serves as a means to define how the \"Range\" between\n    the \\l cursor and the \\l anchor position is to be interpreted.\n\n    \\value RangeCharMode   Entered by pressing \\key v. The range includes\n                           all characters between cursor and anchor.\n    \\value RangeLineMode   Entered by pressing \\key V. The range includes\n                           all lines between the line of the cursor and\n                           the line of the anchor.\n    \\value RangeLineModeExclusive Like \\l RangeLineMode, but keeps one\n                           newline when deleting.\n    \\value RangeBlockMode  Entered by pressing \\key Ctrl-v. The range includes\n                           all characters with line and column coordinates\n                           between line and columns coordinates of cursor and\n                           anchor.\n    \\value RangeBlockAndTailMode Like \\l RangeBlockMode, but also includes\n                           all characters in the affected lines up to the end\n                           of these lines.\n*/\n\nenum EventResult\n{\n    EventHandled,\n    EventUnhandled,\n    EventCancelled, // Event is handled but a sub mode was cancelled.\n    EventPassedToCore\n};\n\nstruct CursorPosition\n{\n    CursorPosition() = default;\n    CursorPosition(int block, int column) : line(block), column(column) {}\n    explicit CursorPosition(const QTextCursor &tc)\n        : line(tc.block().blockNumber()), column(tc.positionInBlock()) {}\n    CursorPosition(const QTextDocument *document, int position)\n    {\n        QTextBlock block = document->findBlock(position);\n        line = block.blockNumber();\n        column = position - block.position();\n    }\n    bool isValid() const { return line >= 0 && column >= 0; }\n    bool operator>(const CursorPosition &other) const\n        { return line > other.line || column > other.column; }\n    bool operator==(const CursorPosition &other) const\n        { return line == other.line && column == other.column; }\n    bool operator!=(const CursorPosition &other) const { return !operator==(other); }\n\n    int line = -1; // Line in document (from 0, folded lines included).\n    int column = -1; // Position on line.\n};\n\nQDebug operator<<(QDebug ts, const CursorPosition &pos)\n{\n    return ts << \"(line: \" << pos.line << \", column: \" << pos.column << \")\";\n}\n\n// vi style configuration\n\nclass Mark\n{\npublic:\n    Mark(const CursorPosition &pos = CursorPosition(), const QString &fileName = QString())\n        : m_position(pos), m_fileName(fileName) {}\n\n    bool isValid() const { return m_position.isValid(); }\n\n    bool isLocal(const QString &localFileName) const\n    {\n        return m_fileName.isEmpty() || m_fileName == localFileName;\n    }\n\n    /* Return position of mark within given document.\n     * If saved line number is too big, mark position is at the end of document.\n     * If line number is in document but column is too big, mark position is at the end of line.\n     */\n    CursorPosition position(const QTextDocument *document) const\n    {\n        QTextBlock block = document->findBlockByNumber(m_position.line);\n        CursorPosition pos;\n        if (block.isValid()) {\n            pos.line = m_position.line;\n            pos.column = qMax(0, qMin(m_position.column, block.length() - 2));\n        } else if (document->isEmpty()) {\n            pos.line = 0;\n            pos.column = 0;\n        } else {\n            pos.line = document->blockCount() - 1;\n            pos.column = qMax(0, document->lastBlock().length() - 2);\n        }\n        return pos;\n    }\n\n    const QString &fileName() const { return m_fileName; }\n\n    void setFileName(const QString &fileName) { m_fileName = fileName; }\n\nprivate:\n    CursorPosition m_position;\n    QString m_fileName;\n};\nusing Marks = QHash<QChar, Mark>;\n\nstruct State\n{\n    State() = default;\n    State(int revision, const CursorPosition &position, const Marks &marks,\n        VisualMode lastVisualMode, bool lastVisualModeInverted) : revision(revision),\n        position(position), marks(marks), lastVisualMode(lastVisualMode),\n        lastVisualModeInverted(lastVisualModeInverted) {}\n\n    bool isValid() const { return position.isValid(); }\n\n    int revision = -1;\n    CursorPosition position;\n    Marks marks;\n    VisualMode lastVisualMode = NoVisualMode;\n    bool lastVisualModeInverted = false;\n};\n\nstruct Column\n{\n    Column(int p, int l) : physical(p), logical(l) {}\n    int physical; // Number of characters in the data.\n    int logical; // Column on screen.\n};\n\nQDebug operator<<(QDebug ts, const Column &col)\n{\n    return ts << \"(p: \" << col.physical << \", l: \" << col.logical << \")\";\n}\n\nstruct Register\n{\n    Register() = default;\n    Register(const QString &c) : contents(c) {}\n    Register(const QString &c, RangeMode m) : contents(c), rangemode(m) {}\n    QString contents;\n    RangeMode rangemode = RangeCharMode;\n};\n\nQDebug operator<<(QDebug ts, const Register &reg)\n{\n    return ts << reg.contents;\n}\n\nstruct SearchData\n{\n    QString needle;\n    bool forward = true;\n    bool highlightMatches = true;\n};\n\nstatic QString replaceTildeWithHome(QString str)\n{\n    str.replace(\"~\", QDir::homePath());\n    return str;\n}\n\n// If string begins with given prefix remove it with trailing spaces and return true.\nstatic bool eatString(const QString &prefix, QString *str)\n{\n    if (!str->startsWith(prefix))\n        return false;\n    *str = str->mid(prefix.size()).trimmed();\n    return true;\n}\n\nstatic QRegularExpression vimPatternToQtPattern(const QString &needle)\n{\n    /* Transformations (Vim regexp -> QRegularExpression):\n     *   \\a -> [A-Za-z]\n     *   \\A -> [^A-Za-z]\n     *   \\h -> [A-Za-z_]\n     *   \\H -> [^A-Za-z_]\n     *   \\l -> [a-z]\n     *   \\L -> [^a-z]\n     *   \\o -> [0-7]\n     *   \\O -> [^0-7]\n     *   \\u -> [A-Z]\n     *   \\U -> [^A-Z]\n     *   \\x -> [0-9A-Fa-f]\n     *   \\X -> [^0-9A-Fa-f]\n     *\n     *   \\< -> \\b\n     *   \\> -> \\b\n     *   [] -> \\[\\]\n     *   \\= -> ?\n     *\n     *   (...)  <-> \\(...\\)\n     *   {...}  <-> \\{...\\}\n     *   |      <-> \\|\n     *   ?      <-> \\?\n     *   +      <-> \\+\n     *   \\{...} -> {...}\n     *\n     *   \\c - set ignorecase for rest\n     *   \\C - set noignorecase for rest\n     */\n\n    // FIXME: Option smartcase should be used only if search was typed by user.\n    const bool ignoreCaseOption = fakeVimSettings()->ignoreCase.value();\n    const bool smartCaseOption = fakeVimSettings()->smartCase.value();\n    const bool initialIgnoreCase = ignoreCaseOption\n        && !(smartCaseOption && needle.contains(QRegularExpression(\"[A-Z]\")));\n\n    bool ignorecase = initialIgnoreCase;\n\n    QString pattern;\n    pattern.reserve(2 * needle.size());\n\n    bool escape = false;\n    bool brace = false;\n    bool embraced = false;\n    bool range = false;\n    bool curly = false;\n    for (const QChar &c : needle) {\n        if (brace) {\n            brace = false;\n            if (c == ']') {\n                pattern.append(\"\\\\[\\\\]\");\n                continue;\n            }\n            pattern.append('[');\n            escape = true;\n            embraced = true;\n        }\n        if (embraced) {\n            if (range) {\n                QChar c2 = pattern[pattern.size() - 2];\n                pattern.remove(pattern.size() - 2, 2);\n                pattern.append(c2.toUpper() + '-' + c.toUpper());\n                pattern.append(c2.toLower() + '-' + c.toLower());\n                range = false;\n            } else if (escape) {\n                escape = false;\n                pattern.append(c);\n            } else if (c == '\\\\') {\n                escape = true;\n            } else if (c == ']') {\n                pattern.append(']');\n                embraced = false;\n            } else if (c == '-') {\n                range = ignorecase && pattern[pattern.size() - 1].isLetter();\n                pattern.append('-');\n            } else if (c.isLetter() && ignorecase) {\n                pattern.append(c.toLower()).append(c.toUpper());\n            } else {\n                pattern.append(c);\n            }\n        } else if (QString(\"(){}+|?\").indexOf(c) != -1) {\n            if (c == '{') {\n                curly = escape;\n            } else if (c == '}' && curly) {\n                curly = false;\n                escape = true;\n            }\n\n            if (escape)\n                escape = false;\n            else\n                pattern.append('\\\\');\n            pattern.append(c);\n        } else if (escape) {\n            // escape expression\n            escape = false;\n            if (c == '<' || c == '>')\n                pattern.append(\"\\\\b\");\n            else if (c == 'a')\n                pattern.append(\"[a-zA-Z]\");\n            else if (c == 'A')\n                pattern.append(\"[^a-zA-Z]\");\n            else if (c == 'h')\n                pattern.append(\"[A-Za-z_]\");\n            else if (c == 'H')\n                pattern.append(\"[^A-Za-z_]\");\n            else if (c == 'c' || c == 'C')\n                ignorecase = (c == 'c');\n            else if (c == 'l')\n                pattern.append(\"[a-z]\");\n            else if (c == 'L')\n                pattern.append(\"[^a-z]\");\n            else if (c == 'o')\n                pattern.append(\"[0-7]\");\n            else if (c == 'O')\n                pattern.append(\"[^0-7]\");\n            else if (c == 'u')\n                pattern.append(\"[A-Z]\");\n            else if (c == 'U')\n                pattern.append(\"[^A-Z]\");\n            else if (c == 'x')\n                pattern.append(\"[0-9A-Fa-f]\");\n            else if (c == 'X')\n                pattern.append(\"[^0-9A-Fa-f]\");\n            else if (c == '=')\n                pattern.append(\"?\");\n            else {\n                pattern.append('\\\\');\n                pattern.append(c);\n            }\n        } else {\n            // unescaped expression\n            if (c == '\\\\')\n                escape = true;\n            else if (c == '[')\n                brace = true;\n            else if (c.isLetter() && ignorecase)\n                pattern.append('[').append(c.toLower()).append(c.toUpper()).append(']');\n            else\n                pattern.append(c);\n        }\n    }\n    if (escape)\n        pattern.append('\\\\');\n    else if (brace)\n        pattern.append('[');\n\n    return QRegularExpression(pattern, initialIgnoreCase ? QRegularExpression::CaseInsensitiveOption\n                                                         : QRegularExpression::NoPatternOption);\n}\n\nstatic bool afterEndOfLine(const QTextDocument *doc, int position)\n{\n    return doc->characterAt(position) == ParagraphSeparator\n        && doc->findBlock(position).length() > 1;\n}\n\nstatic void searchForward(QTextCursor *tc, const QRegularExpression &needleExp, int *repeat)\n{\n    const QTextDocument *doc = tc->document();\n    const int startPos = tc->position();\n\n    QTextDocument::FindFlags flags = {};\n    if (!(needleExp.patternOptions() & QRegularExpression::CaseInsensitiveOption))\n        flags |= QTextDocument::FindCaseSensitively;\n\n    // Search from beginning of line so that matched text is the same.\n    tc->movePosition(StartOfLine);\n\n    // forward to current position\n    *tc = doc->find(needleExp, *tc, flags);\n    while (!tc->isNull() && tc->anchor() < startPos) {\n        if (!tc->hasSelection())\n            tc->movePosition(Right);\n        if (tc->atBlockEnd())\n            tc->movePosition(NextBlock);\n        *tc = doc->find(needleExp, *tc, flags);\n    }\n\n    if (tc->isNull())\n        return;\n\n    --*repeat;\n\n    while (*repeat > 0) {\n        if (!tc->hasSelection())\n            tc->movePosition(Right);\n        if (tc->atBlockEnd())\n            tc->movePosition(NextBlock);\n        *tc = doc->find(needleExp, *tc, flags);\n        if (tc->isNull())\n            return;\n        --*repeat;\n    }\n\n    if (!tc->isNull() && afterEndOfLine(doc, tc->anchor()))\n        tc->movePosition(Left);\n}\n\nstatic void searchBackward(QTextCursor *tc, const QRegularExpression &needleExp, int *repeat)\n{\n    // Search from beginning of line so that matched text is the same.\n    QTextBlock block = tc->block();\n    QString line = block.text();\n\n    QRegularExpressionMatch match;\n    int i = line.indexOf(needleExp, 0, &match);\n    while (i != -1 && i < tc->positionInBlock()) {\n        --*repeat;\n        const int offset = i + qMax(1, match.capturedLength());\n        i = line.indexOf(needleExp, offset, &match);\n        if (i == line.size())\n            i = -1;\n    }\n\n    if (i == tc->positionInBlock())\n        --*repeat;\n\n    while (*repeat > 0) {\n        block = block.previous();\n        if (!block.isValid())\n            break;\n        line = block.text();\n        i = line.indexOf(needleExp, 0, &match);\n        while (i != -1) {\n            --*repeat;\n            const int offset = i + qMax(1, match.capturedLength());\n            i = line.indexOf(needleExp, offset, &match);\n            if (i == line.size())\n                i = -1;\n        }\n    }\n\n    if (!block.isValid()) {\n        *tc = QTextCursor();\n        return;\n    }\n\n    i = line.indexOf(needleExp, 0, &match);\n    while (*repeat < 0) {\n        const int offset = i + qMax(1, match.capturedLength());\n        i = line.indexOf(needleExp, offset, &match);\n        ++*repeat;\n    }\n    tc->setPosition(block.position() + i);\n    tc->setPosition(tc->position() + match.capturedLength(), KeepAnchor);\n}\n\n// Commands [[, []\nstatic void bracketSearchBackward(QTextCursor *tc, const QString &needleExp, int repeat)\n{\n    const QRegularExpression re(needleExp);\n    QTextCursor tc2 = *tc;\n    tc2.setPosition(tc2.position() - 1);\n    searchBackward(&tc2, re, &repeat);\n    if (repeat <= 1)\n        tc->setPosition(tc2.isNull() ? 0 : tc2.position(), KeepAnchor);\n}\n\n// Commands ][, ]]\n// When ]] is used after an operator, then also stops below a '}' in the first column.\nstatic void bracketSearchForward(QTextCursor *tc, const QString &needleExp, int repeat,\n                                 bool searchWithCommand)\n{\n    QRegularExpression re(searchWithCommand ? QString(\"^\\\\}|^\\\\{\") : needleExp);\n    QTextCursor tc2 = *tc;\n    tc2.setPosition(tc2.position() + 1);\n    searchForward(&tc2, re, &repeat);\n    if (repeat <= 1) {\n        if (tc2.isNull()) {\n            tc->setPosition(tc->document()->characterCount() - 1, KeepAnchor);\n        } else {\n            tc->setPosition(tc2.position() - 1, KeepAnchor);\n            if (searchWithCommand && tc->document()->characterAt(tc->position()).unicode() == '}') {\n                QTextBlock block = tc->block().next();\n                if (block.isValid())\n                    tc->setPosition(block.position(), KeepAnchor);\n            }\n        }\n    }\n}\n\nstatic char backslashed(char t)\n{\n    switch (t) {\n        case 'e': return 27;\n        case 't': return '\\t';\n        case 'r': return '\\r';\n        case 'n': return '\\n';\n        case 'b': return 8;\n    }\n    return t;\n}\n\nenum class Modifier {NONE,UPPERCASE,LOWERCASE};\n\nstatic QString applyReplacementLetterCases(QString repl,\n                                           Modifier &toggledModifier,\n                                           Modifier &nextCharacterModifier)\n{\n    if (toggledModifier == Modifier::UPPERCASE)\n        repl = repl.toUpper();\n    else if (toggledModifier == Modifier::LOWERCASE)\n        repl = repl.toLower();\n\n    if (nextCharacterModifier == Modifier::UPPERCASE) {\n        repl.replace(0, 1, repl.at(0).toUpper());\n        nextCharacterModifier = Modifier::NONE;\n    } else if (nextCharacterModifier == Modifier::LOWERCASE) {\n        repl.replace(0, 1, repl.at(0).toLower());\n        nextCharacterModifier = Modifier::NONE;\n    }\n    return repl;\n}\n\nstatic QChar applyReplacementLetterCases(QChar repl,\n                                         Modifier &toggledModifier,\n                                         Modifier &nextCharacterModifier)\n{\n    if (nextCharacterModifier == Modifier::UPPERCASE){\n        nextCharacterModifier = Modifier::NONE;\n        return repl.toUpper();\n    }\n    else if (nextCharacterModifier == Modifier::LOWERCASE) {\n        nextCharacterModifier = Modifier::NONE;\n        return repl.toLower();\n    }\n    else if (toggledModifier == Modifier::UPPERCASE)\n        return repl.toUpper();\n    else if (toggledModifier == Modifier::LOWERCASE)\n        return repl.toLower();\n    else\n        return repl;\n}\n\nstatic bool substituteText(QString *text,\n                           const QRegularExpression &pattern,\n                           const QString &replacement,\n                           bool global)\n{\n    bool substituted = false;\n    int pos = 0;\n    int right = -1;\n    while (true) {\n        const QRegularExpressionMatch match = pattern.match(*text, pos);\n        if (!match.hasMatch())\n            break;\n\n        pos = match.capturedStart();\n\n        // ensure that substitution is advancing towards end of line\n        if (right == text->size() - pos) {\n            ++pos;\n            if (pos == text->size())\n                break;\n            continue;\n        }\n\n        right = text->size() - pos;\n\n        substituted = true;\n        QString matched = text->mid(pos, match.captured(0).size());\n        QString repl;\n        bool escape = false;\n        Modifier toggledModifier = Modifier::NONE;\n        Modifier nextCharacterModifier = Modifier::NONE;\n        // insert captured texts\n        for (int i = 0; i < replacement.size(); ++i) {\n            const QChar &c = replacement[i];\n            if (escape) {\n                escape = false;\n                if (c.isDigit()) {\n                    if (c.digitValue() <= match.lastCapturedIndex()) {\n                        repl += applyReplacementLetterCases(match.captured(c.digitValue()),\n                                                            toggledModifier,\n                                                            nextCharacterModifier);\n\n                    }\n                } else if (c == 'u') {\n                    nextCharacterModifier = Modifier::UPPERCASE;\n                } else if (c == 'l') {\n                    nextCharacterModifier = Modifier::LOWERCASE;\n                } else if (c == 'U') {\n                    toggledModifier = Modifier::UPPERCASE;\n                } else if (c == 'L') {\n                    toggledModifier = Modifier::LOWERCASE;\n                } else if (c == 'e' || c == 'E') {\n                    nextCharacterModifier = Modifier::NONE;\n                    toggledModifier = Modifier::NONE;\n                } else {\n                    repl += backslashed(c.unicode());\n                }\n            } else {\n                if (c == '\\\\')\n                    escape = true;\n                else if (c == '&')\n                    repl += applyReplacementLetterCases(match.captured(0),\n                                                        toggledModifier,\n                                                        nextCharacterModifier);\n                else\n                    repl += applyReplacementLetterCases(c, toggledModifier, nextCharacterModifier);\n            }\n        }\n        text->replace(pos, matched.size(), repl);\n        pos += (repl.isEmpty() && matched.isEmpty()) ? 1 : repl.size();\n\n        if (pos >= text->size() || !global)\n            break;\n    }\n\n    return substituted;\n}\n\nstatic int findUnescaped(QChar c, const QString &line, int from)\n{\n    bool singleBackSlashBefore = false;\n    for (int i = from; i < line.size(); ++i) {\n        const QChar currentChar = line.at(i);\n        if (currentChar == '\\\\') {\n           singleBackSlashBefore = !singleBackSlashBefore;\n           continue;\n        }\n\n        if (currentChar == c && !singleBackSlashBefore)\n            return i;\n\n        singleBackSlashBefore = false;\n    }\n    return -1;\n}\n\nstatic void setClipboardData(const QString &content, RangeMode mode,\n    QClipboard::Mode clipboardMode)\n{\n    QClipboard *clipboard = QApplication::clipboard();\n    char vimRangeMode = mode;\n\n    QByteArray bytes1;\n    bytes1.append(vimRangeMode);\n    bytes1.append(content.toUtf8());\n\n    QByteArray bytes2;\n    bytes2.append(vimRangeMode);\n    bytes2.append(\"utf-8\");\n    bytes2.append('\\0');\n    bytes2.append(content.toUtf8());\n\n    auto data = new QMimeData;\n    data->setText(content);\n    data->setData(vimMimeText, bytes1);\n    data->setData(vimMimeTextEncoded, bytes2);\n    clipboard->setMimeData(data, clipboardMode);\n}\n\nstatic QByteArray toLocalEncoding(const QString &text)\n{\n#if defined(Q_OS_WIN)\n    return QString(text).replace(\"\\n\", \"\\r\\n\").toLocal8Bit();\n#else\n    return text.toLocal8Bit();\n#endif\n}\n\nstatic QString fromLocalEncoding(const QByteArray &data)\n{\n#if defined(Q_OS_WIN)\n    return QString::fromLocal8Bit(data).replace(\"\\n\", \"\\r\\n\");\n#else\n    return QString::fromLocal8Bit(data);\n#endif\n}\n\nstatic QString getProcessOutput(const QString &command, const QString &input)\n{\n    QProcess proc;\n    QStringList arguments = QProcess::splitCommand(command);\n    QString executable = arguments.takeFirst();\n    proc.start(executable, arguments);\n    proc.waitForStarted();\n    proc.write(toLocalEncoding(input));\n    proc.closeWriteChannel();\n\n    // FIXME: Process should be interruptible by user.\n    //        Solution is to create a QObject for each process and emit finished state.\n    proc.waitForFinished();\n\n    return fromLocalEncoding(proc.readAllStandardOutput());\n}\n\nstatic const QMap<QString, int> &vimKeyNames()\n{\n    static const QMap<QString, int> k = {\n        // FIXME: Should be value of mapleader.\n        {\"LEADER\", Key_Backslash},\n\n        {\"SPACE\", Key_Space},\n        {\"TAB\", Key_Tab},\n        {\"NL\", Key_Return},\n        {\"NEWLINE\", Key_Return},\n        {\"LINEFEED\", Key_Return},\n        {\"LF\", Key_Return},\n        {\"CR\", Key_Return},\n        {\"RETURN\", Key_Return},\n        {\"ENTER\", Key_Return},\n        {\"BS\", Key_Backspace},\n        {\"BACKSPACE\", Key_Backspace},\n        {\"ESC\", Key_Escape},\n        {\"BAR\", Key_Bar},\n        {\"BSLASH\", Key_Backslash},\n        {\"DEL\", Key_Delete},\n        {\"DELETE\", Key_Delete},\n        {\"KDEL\", Key_Delete},\n        {\"UP\", Key_Up},\n        {\"DOWN\", Key_Down},\n        {\"LEFT\", Key_Left},\n        {\"RIGHT\", Key_Right},\n\n        {\"LT\", Key_Less},\n        {\"GT\", Key_Greater},\n\n        {\"F1\", Key_F1},\n        {\"F2\", Key_F2},\n        {\"F3\", Key_F3},\n        {\"F4\", Key_F4},\n        {\"F5\", Key_F5},\n        {\"F6\", Key_F6},\n        {\"F7\", Key_F7},\n        {\"F8\", Key_F8},\n        {\"F9\", Key_F9},\n        {\"F10\", Key_F10},\n\n        {\"F11\", Key_F11},\n        {\"F12\", Key_F12},\n        {\"F13\", Key_F13},\n        {\"F14\", Key_F14},\n        {\"F15\", Key_F15},\n        {\"F16\", Key_F16},\n        {\"F17\", Key_F17},\n        {\"F18\", Key_F18},\n        {\"F19\", Key_F19},\n        {\"F20\", Key_F20},\n\n        {\"F21\", Key_F21},\n        {\"F22\", Key_F22},\n        {\"F23\", Key_F23},\n        {\"F24\", Key_F24},\n        {\"F25\", Key_F25},\n        {\"F26\", Key_F26},\n        {\"F27\", Key_F27},\n        {\"F28\", Key_F28},\n        {\"F29\", Key_F29},\n        {\"F30\", Key_F30},\n\n        {\"F31\", Key_F31},\n        {\"F32\", Key_F32},\n        {\"F33\", Key_F33},\n        {\"F34\", Key_F34},\n        {\"F35\", Key_F35},\n\n        {\"INSERT\", Key_Insert},\n        {\"INS\", Key_Insert},\n        {\"KINSERT\", Key_Insert},\n        {\"HOME\", Key_Home},\n        {\"END\", Key_End},\n        {\"PAGEUP\", Key_PageUp},\n        {\"PAGEDOWN\", Key_PageDown},\n\n        {\"KPLUS\", Key_Plus},\n        {\"KMINUS\", Key_Minus},\n        {\"KDIVIDE\", Key_Slash},\n        {\"KMULTIPLY\", Key_Asterisk},\n        {\"KENTER\", Key_Enter},\n        {\"KPOINT\", Key_Period},\n\n        {\"CAPS\", Key_CapsLock},\n        {\"NUM\", Key_NumLock},\n        {\"SCROLL\", Key_ScrollLock},\n        {\"ALTGR\", Key_AltGr}\n    };\n\n    return k;\n}\n\nstatic bool isOnlyControlModifier(const Qt::KeyboardModifiers &mods)\n{\n    return (mods ^ ControlModifier) == Qt::NoModifier;\n}\n\nstatic bool isAcceptableModifier(const Qt::KeyboardModifiers &mods)\n{\n    if (mods & ControlModifier) {\n        // Generally, CTRL is not fine, except in combination with ALT.\n        // See QTCREATORBUG-24673\n        return mods & AltModifier;\n    }\n    return true;\n}\n\n\nRange::Range(int b, int e, RangeMode m)\n    : beginPos(qMin(b, e)), endPos(qMax(b, e)), rangemode(m)\n{}\n\nQString Range::toString() const\n{\n    return QString(\"%1-%2 (mode: %3)\").arg(beginPos).arg(endPos).arg(rangemode);\n}\n\nbool Range::isValid() const\n{\n    return beginPos >= 0 && endPos >= 0;\n}\n\nQDebug operator<<(QDebug ts, const Range &range)\n{\n    return ts << '[' << range.beginPos << ',' << range.endPos << ']';\n}\n\n\nExCommand::ExCommand(const QString &c, const QString &a, const Range &r)\n    : cmd(c), args(a), range(r)\n{}\n\nbool ExCommand::matches(const QString &min, const QString &full) const\n{\n    return cmd.startsWith(min) && full.startsWith(cmd);\n}\n\nQDebug operator<<(QDebug ts, const ExCommand &cmd)\n{\n    return ts << cmd.cmd << ' ' << cmd.args << ' ' << cmd.range;\n}\n\nQDebug operator<<(QDebug ts, const QList<QTextEdit::ExtraSelection> &sels)\n{\n    foreach (const QTextEdit::ExtraSelection &sel, sels)\n        ts << \"SEL: \" << sel.cursor.anchor() << sel.cursor.position();\n    return ts;\n}\n\nQString quoteUnprintable(const QString &ba)\n{\n    QString res;\n    for (int i = 0, n = ba.size(); i != n; ++i) {\n        const QChar c = ba.at(i);\n        const int cc = c.unicode();\n        if (c.isPrint())\n            res += c;\n        else if (cc == '\\n')\n            res += \"<CR>\";\n        else\n            res += QString(\"\\\\x%1\").arg(cc, 2, 16, QLatin1Char('0'));\n    }\n    return res;\n}\n\nstatic bool startsWithWhitespace(const QString &str, int col)\n{\n    if (col > str.size()) {\n        qWarning(\"Wrong column\");\n        return false;\n    }\n    for (int i = 0; i < col; ++i) {\n        uint u = str.at(i).unicode();\n        if (u != ' ' && u != '\\t')\n            return false;\n    }\n    return true;\n}\n\ninline QString msgMarkNotSet(const QString &text)\n{\n    return Tr::tr(\"Mark \\\"%1\\\" not set.\").arg(text);\n}\n\nclass Input\n{\npublic:\n    // Remove some extra \"information\" on Mac.\n    static Qt::KeyboardModifiers cleanModifier(Qt::KeyboardModifiers m)\n    {\n        return m & ~Qt::KeypadModifier;\n    }\n\n    Input() = default;\n    explicit Input(QChar x)\n        : m_key(x.unicode()), m_xkey(x.unicode()), m_text(x)\n    {\n        if (x.isUpper())\n            m_modifiers = Qt::ShiftModifier;\n        else if (x.isLower())\n            m_key = x.toUpper().unicode();\n    }\n\n    Input(int k, Qt::KeyboardModifiers m, const QString &t = QString())\n        : m_key(k), m_modifiers(cleanModifier(m)), m_text(t)\n    {\n        if (m_text.size() == 1) {\n            QChar x = m_text.at(0);\n\n            // On Mac, QKeyEvent::text() returns non-empty strings for\n            // cursor keys. This breaks some of the logic later on\n            // relying on text() being empty for \"special\" keys.\n            // FIXME: Check the real conditions.\n            if (x.unicode() < ' ' && x.unicode() != 27)\n                m_text.clear();\n            else if (x.isLetter())\n                m_key = x.toUpper().unicode();\n        }\n\n        // Set text only if input is ascii key without control modifier.\n        if (m_text.isEmpty() && k >= 0 && k <= 0x7f && (m & ControlModifier) == 0) {\n            QChar c = QChar(k);\n            if (c.isLetter())\n                m_text = isShift() ? c.toUpper() : c;\n            else if (!isShift())\n                m_text = c;\n        }\n\n        // Normalize <S-TAB>.\n        if (m_key == Qt::Key_Backtab) {\n            m_key = Qt::Key_Tab;\n            m_modifiers |= Qt::ShiftModifier;\n        }\n\n        // m_xkey is only a cache.\n        m_xkey = (m_text.size() == 1 ? m_text.at(0).unicode() : m_key);\n    }\n\n    bool isValid() const\n    {\n        return m_key != 0 || !m_text.isNull();\n    }\n\n    bool isDigit() const\n    {\n        return m_xkey >= '0' && m_xkey <= '9';\n    }\n\n    bool isKey(int c) const\n    {\n        return !m_modifiers && m_key == c;\n    }\n\n    bool isBackspace() const\n    {\n        return m_key == Key_Backspace || isControl('h');\n    }\n\n    bool isReturn() const\n    {\n        return m_key == '\\n' || m_key == Key_Return || m_key == Key_Enter;\n    }\n\n    bool isEscape() const\n    {\n        return isKey(Key_Escape) || isShift(Key_Escape) || isKey(27) || isShift(27) || isControl('c')\n            || isControl(Key_BracketLeft);\n    }\n\n    bool is(int c) const\n    {\n        return m_xkey == c && isAcceptableModifier(m_modifiers);\n    }\n\n    bool isControl() const\n    {\n        return isOnlyControlModifier(m_modifiers);\n    }\n\n    bool isControl(int c) const\n    {\n        return isControl()\n            && (m_xkey == c || m_xkey + 32 == c || m_xkey + 64 == c || m_xkey + 96 == c);\n    }\n\n    bool isShift() const\n    {\n        return m_modifiers & Qt::ShiftModifier;\n    }\n\n    bool isShift(int c) const\n    {\n        return isShift() && m_xkey == c;\n    }\n\n    bool operator<(const Input &a) const\n    {\n        if (m_key != a.m_key)\n            return m_key < a.m_key;\n        // Text for some mapped key cannot be determined (e.g. <C-J>) so if text is not set for\n        // one of compared keys ignore it.\n        if (!m_text.isEmpty() && !a.m_text.isEmpty() && m_text != \" \")\n            return m_text < a.m_text;\n        return m_modifiers < a.m_modifiers;\n    }\n\n    bool operator==(const Input &a) const\n    {\n        return !(*this < a || a < *this);\n    }\n\n    bool operator!=(const Input &a) const { return !operator==(a); }\n\n    QString text() const { return m_text; }\n\n    QChar asChar() const\n    {\n        return (m_text.size() == 1 ? m_text.at(0) : QChar());\n    }\n\n    int toInt(bool *ok, int base) const\n    {\n        const int uc = asChar().unicode();\n        int res;\n        if ('0' <= uc && uc <= '9')\n            res = uc -'0';\n        else if ('a' <= uc && uc <= 'z')\n            res = 10 + uc - 'a';\n        else if ('A' <= uc && uc <= 'Z')\n            res = 10 + uc - 'A';\n        else\n            res = base;\n        *ok = res < base;\n        return *ok ? res : 0;\n    }\n\n    int key() const { return m_key; }\n\n    Qt::KeyboardModifiers modifiers() const { return m_modifiers; }\n\n    // Return raw character for macro recording or dot command.\n    QChar raw() const\n    {\n        if (m_key == Key_Tab)\n            return '\\t';\n        if (m_key == Key_Return)\n            return '\\n';\n        if (m_key == Key_Escape)\n            return QChar(27);\n        return QChar(m_xkey & 0xffff); // FIXME\n    }\n\n    QString toString() const\n    {\n        if (!m_text.isEmpty())\n            return QString(m_text).replace(\"<\", \"<LT>\");\n\n        QString key = vimKeyNames().key(m_key);\n        bool namedKey = !key.isEmpty();\n\n        if (!namedKey) {\n            if (m_xkey == '<')\n                key = \"<LT>\";\n            else if (m_xkey == '>')\n                key = \"<GT>\";\n            else\n                key = QChar(m_xkey & 0xffff);  // FIXME\n        }\n\n        bool shift = isShift();\n        bool ctrl = isControl();\n        if (shift)\n            key.prepend(\"S-\");\n        if (ctrl)\n            key.prepend(\"C-\");\n\n        if (namedKey || shift || ctrl) {\n            key.prepend('<');\n            key.append('>');\n        }\n\n        return key;\n    }\n\n    QDebug dump(QDebug ts) const\n    {\n        return ts << m_key << '-' << m_modifiers << '-'\n            << quoteUnprintable(m_text);\n    }\n\n    friend auto qHash(const Input &i)\n    {\n        return ::qHash(i.m_key);\n    }\n\nprivate:\n    int m_key = 0;\n    int m_xkey = 0;\n    Qt::KeyboardModifiers m_modifiers = NoModifier;\n    QString m_text;\n};\n\n// mapping to <Nop> (do nothing)\nstatic const Input Nop(-1, Qt::KeyboardModifiers(-1), QString());\n\nstatic SubMode letterCaseModeFromInput(const Input &input)\n{\n    if (input.is('~'))\n        return InvertCaseSubMode;\n    if (input.is('u'))\n        return DownCaseSubMode;\n    if (input.is('U'))\n        return UpCaseSubMode;\n\n    return NoSubMode;\n}\n\nstatic SubMode indentModeFromInput(const Input &input)\n{\n    if (input.is('<'))\n        return ShiftLeftSubMode;\n    if (input.is('>'))\n        return ShiftRightSubMode;\n    if (input.is('='))\n        return IndentSubMode;\n\n    return NoSubMode;\n}\n\nstatic SubMode changeDeleteYankModeFromInput(const Input &input)\n{\n    if (input.is('c'))\n        return ChangeSubMode;\n    if (input.is('d'))\n        return DeleteSubMode;\n    if (input.is('y'))\n        return YankSubMode;\n\n    return NoSubMode;\n}\n\nQString dotCommandFromSubMode(SubMode submode)\n{\n    if (submode == ChangeSubMode)\n        return QLatin1String(\"c\");\n    if (submode == DeleteSubMode)\n        return QLatin1String(\"d\");\n    if (submode == CommentSubMode)\n        return QLatin1String(\"gc\");\n    if (submode == DeleteSurroundingSubMode)\n        return QLatin1String(\"ds\");\n    if (submode == ChangeSurroundingSubMode)\n        return QLatin1String(\"c\");\n    if (submode == AddSurroundingSubMode)\n        return QLatin1String(\"y\");\n    if (submode == ExchangeSubMode)\n        return QLatin1String(\"cx\");\n    if (submode == ReplaceWithRegisterSubMode)\n        return QLatin1String(\"gr\");\n    if (submode == InvertCaseSubMode)\n        return QLatin1String(\"g~\");\n    if (submode == DownCaseSubMode)\n        return QLatin1String(\"gu\");\n    if (submode == UpCaseSubMode)\n        return QLatin1String(\"gU\");\n    if (submode == IndentSubMode)\n        return QLatin1String(\"=\");\n    if (submode == ShiftRightSubMode)\n        return QLatin1String(\">\");\n    if (submode == ShiftLeftSubMode)\n        return QLatin1String(\"<\");\n\n    return QString();\n}\n\nQDebug operator<<(QDebug ts, const Input &input) { return input.dump(ts); }\n\nclass Inputs : public QVector<Input>\n{\npublic:\n    Inputs() = default;\n\n    explicit Inputs(const QString &str, bool noremap = true, bool silent = false)\n        : m_noremap(noremap), m_silent(silent)\n    {\n        parseFrom(str);\n        squeeze();\n    }\n\n    bool noremap() const { return m_noremap; }\n\n    bool silent() const { return m_silent; }\n\nprivate:\n    void parseFrom(const QString &str);\n\n    bool m_noremap = true;\n    bool m_silent = false;\n};\n\nstatic Input parseVimKeyName(const QString &keyName)\n{\n    if (keyName.length() == 1)\n        return Input(keyName.at(0));\n\n    const QStringList keys = keyName.split('-');\n    const int len = keys.length();\n\n    if (len == 1 && keys.at(0).toUpper() == \"NOP\")\n        return Nop;\n\n    Qt::KeyboardModifiers mods = NoModifier;\n    for (int i = 0; i < len - 1; ++i) {\n        const QString &key = keys[i].toUpper();\n        if (key == \"S\")\n            mods |= Qt::ShiftModifier;\n        else if (key == \"C\")\n            mods |= ControlModifier;\n        else\n            return Input();\n    }\n\n    if (!keys.isEmpty()) {\n        const QString key = keys.last();\n        if (key.length() == 1) {\n            // simple character\n            QChar c = key.at(0).toUpper();\n            return Input(c.unicode(), mods);\n        }\n\n        // find key name\n        QMap<QString, int>::ConstIterator it = vimKeyNames().constFind(key.toUpper());\n        if (it != vimKeyNames().end())\n            return Input(*it, mods);\n    }\n\n    return Input();\n}\n\nvoid Inputs::parseFrom(const QString &str)\n{\n    const int n = str.size();\n    for (int i = 0; i < n; ++i) {\n        const QChar c = str.at(i);\n        if (c == '<') {\n            int j = str.indexOf('>', i);\n            Input input;\n            if (j != -1) {\n                const QString key = str.mid(i+1, j - i - 1);\n                if (!key.contains('<'))\n                    input = parseVimKeyName(key);\n            }\n            if (input.isValid()) {\n                append(input);\n                i = j;\n            } else {\n                append(Input(c));\n            }\n        } else {\n            append(Input(c));\n        }\n    }\n}\n\nclass History\n{\npublic:\n    History() : m_items(QString()) {}\n    void append(const QString &item);\n    const QString &move(QStringView prefix, int skip);\n    const QString &current() const { return m_items[m_index]; }\n    const QStringList &items() const { return m_items; }\n    void restart() { m_index = m_items.size() - 1; }\n\nprivate:\n    // Last item is always empty or current search prefix.\n    QStringList m_items;\n    int m_index = 0;\n};\n\nvoid History::append(const QString &item)\n{\n    if (item.isEmpty())\n        return;\n    m_items.pop_back();\n    m_items.removeAll(item);\n    m_items << item << QString();\n    restart();\n}\n\nconst QString &History::move(QStringView prefix, int skip)\n{\n    if (!current().startsWith(prefix))\n        restart();\n\n    if (m_items.last() != prefix)\n        m_items[m_items.size() - 1] = prefix.toString();\n\n    int i = m_index + skip;\n    if (!prefix.isEmpty())\n        for (; i >= 0 && i < m_items.size() && !m_items[i].startsWith(prefix); i += skip)\n            ;\n    if (i >= 0 && i < m_items.size())\n        m_index = i;\n\n    return current();\n}\n\n// Command line buffer with prompt (i.e. :, / or ? characters), text contents and cursor position.\nclass CommandBuffer\n{\npublic:\n    void setPrompt(const QChar &prompt) { m_prompt = prompt; }\n    void setContents(const QString &s) { m_buffer = s; m_anchor = m_pos = s.size(); }\n\n    void setContents(const QString &s, int pos, int anchor = -1)\n    {\n        m_buffer = s; m_pos = m_userPos = pos; m_anchor = anchor >= 0 ? anchor : pos;\n    }\n\n    QStringView userContents() const { return QStringView{m_buffer}.left(m_userPos); }\n    const QChar &prompt() const { return m_prompt; }\n    const QString &contents() const { return m_buffer; }\n    bool isEmpty() const { return m_buffer.isEmpty(); }\n    int cursorPos() const { return m_pos; }\n    int anchorPos() const { return m_anchor; }\n    bool hasSelection() const { return m_pos != m_anchor; }\n\n    void insertChar(QChar c) { m_buffer.insert(m_pos++, c); m_anchor = m_userPos = m_pos; }\n    void insertText(const QString &s)\n    {\n        m_buffer.insert(m_pos, s); m_anchor = m_userPos = m_pos = m_pos + s.size();\n    }\n    void deleteChar() { if (m_pos) m_buffer.remove(--m_pos, 1); m_anchor = m_userPos = m_pos; }\n\n    void moveLeft() { if (m_pos) m_userPos = --m_pos; }\n    void moveRight() { if (m_pos < m_buffer.size()) m_userPos = ++m_pos; }\n    void moveStart() { m_userPos = m_pos = 0; }\n    void moveEnd() { m_userPos = m_pos = m_buffer.size(); }\n\n    void setHistoryAutoSave(bool autoSave) { m_historyAutoSave = autoSave; }\n    bool userContentsValid() const { return m_userPos >= 0 && m_userPos <= m_buffer.size(); }\n    void historyDown() { if (userContentsValid()) setContents(m_history.move(userContents(), 1)); }\n    void historyUp() { if (userContentsValid()) setContents(m_history.move(userContents(), -1)); }\n    const QStringList &historyItems() const { return m_history.items(); }\n    void historyPush(const QString &item = QString())\n    {\n        m_history.append(item.isNull() ? contents() : item);\n    }\n\n    void clear()\n    {\n        if (m_historyAutoSave)\n            historyPush();\n        m_buffer.clear();\n        m_anchor = m_userPos = m_pos = 0;\n    }\n\n    QString display() const\n    {\n        QString msg(m_prompt);\n        for (int i = 0; i != m_buffer.size(); ++i) {\n            const QChar c = m_buffer.at(i);\n            if (c.unicode() < 32) {\n                msg += '^';\n                msg += QChar(c.unicode() + 64);\n            } else {\n                msg += c;\n            }\n        }\n        return msg;\n    }\n\n    void deleteSelected()\n    {\n        if (m_pos < m_anchor) {\n            m_buffer.remove(m_pos, m_anchor - m_pos);\n            m_anchor = m_pos;\n        } else {\n            m_buffer.remove(m_anchor, m_pos - m_anchor);\n            m_pos = m_anchor;\n        }\n    }\n\n    bool handleInput(const Input &input)\n    {\n        if (input.isShift(Key_Left)) {\n            moveLeft();\n        } else if (input.isShift(Key_Right)) {\n            moveRight();\n        } else if (input.isShift(Key_Home)) {\n            moveStart();\n        } else if (input.isShift(Key_End)) {\n            moveEnd();\n        } else if (input.isKey(Key_Left)) {\n            moveLeft();\n            m_anchor = m_pos;\n        } else if (input.isKey(Key_Right)) {\n            moveRight();\n            m_anchor = m_pos;\n        } else if (input.isKey(Key_Home)) {\n            moveStart();\n            m_anchor = m_pos;\n        } else if (input.isKey(Key_End)) {\n            moveEnd();\n            m_anchor = m_pos;\n        } else if (input.isKey(Key_Up) || input.isKey(Key_PageUp)) {\n            historyUp();\n        } else if (input.isKey(Key_Down) || input.isKey(Key_PageDown)) {\n            historyDown();\n        } else if (input.isKey(Key_Delete)) {\n            if (hasSelection()) {\n                deleteSelected();\n            } else {\n                if (m_pos < m_buffer.size())\n                    m_buffer.remove(m_pos, 1);\n                else\n                    deleteChar();\n            }\n        } else if (!input.text().isEmpty()) {\n            if (hasSelection())\n                deleteSelected();\n            insertText(input.text());\n        } else {\n            return false;\n        }\n        return true;\n    }\n\nprivate:\n    QString m_buffer;\n    QChar m_prompt;\n    History m_history;\n    int m_pos = 0;\n    int m_anchor = 0;\n    int m_userPos = 0; // last position of inserted text (for retrieving history items)\n    bool m_historyAutoSave = true; // store items to history on clear()?\n};\n\n// Mappings for a specific mode (trie structure)\nclass ModeMapping : public QHash<Input, ModeMapping>\n{\npublic:\n    const Inputs &value() const { return m_value; }\n    void setValue(const Inputs &value) { m_value = value; }\nprivate:\n    Inputs m_value;\n};\n\n// Mappings for all modes\nusing Mappings = QHash<char, ModeMapping>;\n\n// Iterator for mappings\nclass MappingsIterator : public QVector<ModeMapping::Iterator>\n{\npublic:\n    MappingsIterator(Mappings *mappings, char mode = -1, const Inputs &inputs = Inputs())\n        : m_parent(mappings)\n    {\n        reset(mode);\n        walk(inputs);\n    }\n\n    // Reset iterator state. Keep previous mode if 0.\n    void reset(char mode = 0)\n    {\n        clear();\n        m_lastValid = -1;\n        m_currentInputs.clear();\n        if (mode != 0) {\n            m_mode = mode;\n            if (mode != -1)\n                m_modeMapping = m_parent->find(mode);\n        }\n    }\n\n    bool isValid() const { return !empty(); }\n\n    // Return true if mapping can be extended.\n    bool canExtend() const { return isValid() && !last()->empty(); }\n\n    // Return true if this mapping can be used.\n    bool isComplete() const { return m_lastValid != -1; }\n\n    // Return size of current map.\n    int mapLength() const { return m_lastValid + 1; }\n\n    bool walk(const Input &input)\n    {\n        m_currentInputs.append(input);\n\n        if (m_modeMapping == m_parent->end())\n            return false;\n\n        ModeMapping::Iterator it;\n        if (isValid()) {\n            it = last()->find(input);\n            if (it == last()->end())\n                return false;\n        } else {\n            it = m_modeMapping->find(input);\n            if (it == m_modeMapping->end())\n                return false;\n        }\n\n        if (!it->value().isEmpty())\n            m_lastValid = size();\n        append(it);\n\n        return true;\n    }\n\n    bool walk(const Inputs &inputs)\n    {\n        for (const Input &input : inputs) {\n            if (!walk(input))\n                return false;\n        }\n        return true;\n    }\n\n    // Return current mapped value. Iterator must be valid.\n    const Inputs &inputs() const\n    {\n        return at(m_lastValid)->value();\n    }\n\n    void remove()\n    {\n        if (isValid()) {\n            if (canExtend()) {\n                last()->setValue(Inputs());\n            } else {\n                if (size() > 1) {\n                    while (last()->empty()) {\n                        at(size() - 2)->erase(last());\n                        pop_back();\n                        if (size() == 1 || !last()->value().isEmpty())\n                            break;\n                    }\n                    if (last()->empty() && last()->value().isEmpty())\n                        m_modeMapping->erase(last());\n                } else if (last()->empty() && !last()->value().isEmpty()) {\n                    m_modeMapping->erase(last());\n                }\n            }\n        }\n    }\n\n    void setInputs(const Inputs &key, const Inputs &inputs, bool unique = false)\n    {\n        ModeMapping *current = &(*m_parent)[m_mode];\n        for (const Input &input : key)\n            current = &(*current)[input];\n        if (!unique || current->value().isEmpty())\n            current->setValue(inputs);\n    }\n\n    const Inputs &currentInputs() const { return m_currentInputs; }\n\nprivate:\n    Mappings *m_parent;\n    Mappings::Iterator m_modeMapping;\n    int m_lastValid = -1;\n    char m_mode = 0;\n    Inputs m_currentInputs;\n};\n\n// state of current mapping\nstruct MappingState {\n    MappingState() = default;\n    MappingState(bool noremap, bool silent, bool editBlock)\n        : noremap(noremap), silent(silent), editBlock(editBlock) {}\n    bool noremap = false;\n    bool silent = false;\n    bool editBlock = false;\n};\n\nclass FakeVimHandler::Private : public QObject\n{\npublic:\n    Private(FakeVimHandler *parent, QWidget *widget);\n\n    EventResult handleEvent(QKeyEvent *ev);\n    bool wantsOverride(QKeyEvent *ev);\n    bool parseExCommand(QString *line, ExCommand *cmd);\n    bool parseLineRange(QString *line, ExCommand *cmd);\n    int parseLineAddress(QString *cmd);\n    void parseRangeCount(const QString &line, Range *range) const;\n    void handleCommand(const QString &cmd); // Sets m_tc + handleExCommand\n    void handleExCommand(const QString &cmd);\n\n    void installEventFilter();\n    void removeEventFilter();\n    void passShortcuts(bool enable);\n    void setupWidget();\n    void restoreWidget(int tabSize);\n\n    friend class FakeVimHandler;\n\n    void init();\n    void focus();\n    void unfocus();\n    void fixExternalCursor(bool focus);\n    void fixExternalCursorPosition(bool focus);\n\n    // Call before any FakeVim processing (import cursor position from editor)\n    void enterFakeVim();\n    // Call after any FakeVim processing\n    // (if needUpdate is true, export cursor position to editor and scroll)\n    void leaveFakeVim(bool needUpdate = true);\n    void leaveFakeVim(EventResult eventResult);\n\n    EventResult handleKey(const Input &input);\n    EventResult handleDefaultKey(const Input &input);\n    bool handleCommandBufferPaste(const Input &input);\n    EventResult handleCurrentMapAsDefault();\n    void prependInputs(const QVector<Input> &inputs); // Handle inputs.\n    void prependMapping(const Inputs &inputs); // Handle inputs as mapping.\n    bool expandCompleteMapping(); // Return false if current mapping is not complete.\n    bool extendMapping(const Input &input); // Return false if no suitable mappig found.\n    void endMapping();\n    bool canHandleMapping();\n    void clearPendingInput();\n    void waitForMapping();\n    EventResult stopWaitForMapping(bool hasInput);\n    EventResult handleInsertOrReplaceMode(const Input &);\n    void handleInsertMode(const Input &);\n    void handleReplaceMode(const Input &);\n    void finishInsertMode();\n\n    EventResult handleCommandMode(const Input &);\n\n    // return true only if input in current mode and sub-mode was correctly handled\n    bool handleEscape();\n    bool handleNoSubMode(const Input &);\n    bool handleChangeDeleteYankSubModes(const Input &);\n    void handleChangeDeleteYankSubModes();\n    bool handleReplaceSubMode(const Input &);\n    bool handleCommentSubMode(const Input &);\n    bool handleReplaceWithRegisterSubMode(const Input &);\n    bool handleExchangeSubMode(const Input &);\n    bool handleDeleteChangeSurroundingSubMode(const Input &);\n    bool handleAddSurroundingSubMode(const Input &);\n    bool handleFilterSubMode(const Input &);\n    bool handleRegisterSubMode(const Input &);\n    bool handleShiftSubMode(const Input &);\n    bool handleChangeCaseSubMode(const Input &);\n    bool handleWindowSubMode(const Input &);\n    bool handleZSubMode(const Input &);\n    bool handleCapitalZSubMode(const Input &);\n    bool handleMacroRecordSubMode(const Input &);\n    bool handleMacroExecuteSubMode(const Input &);\n\n    bool handleCount(const Input &); // Handle count for commands (return false if input isn't count).\n    bool handleMovement(const Input &);\n\n    EventResult handleExMode(const Input &);\n    EventResult handleSearchSubSubMode(const Input &);\n    bool handleCommandSubSubMode(const Input &);\n    void fixSelection(); // Fix selection according to current range, move and command modes.\n    bool finishSearch();\n    void finishMovement(const QString &dotCommandMovement = QString());\n\n    // Returns to insert/replace mode after <C-O> command in insert mode,\n    // otherwise returns to command mode.\n    void leaveCurrentMode();\n\n    // Clear data for current (possibly incomplete) command in current mode.\n    // I.e. clears count, register, g flag, sub-modes etc.\n    void clearCurrentMode();\n\n    QTextCursor search(const SearchData &sd, int startPos, int count, bool showMessages);\n    void search(const SearchData &sd, bool showMessages = true);\n    bool searchNext(bool forward = true);\n    void searchBalanced(bool forward, QChar needle, QChar other);\n    void highlightMatches(const QString &needle);\n    void stopIncrementalFind();\n    void updateFind(bool isComplete);\n\n    void resetCount();\n    bool isInputCount(const Input &) const; // Return true if input can be used as count for commands.\n    int mvCount() const { return qMax(1, g.mvcount); }\n    int opCount() const { return qMax(1, g.opcount); }\n    int count() const { return mvCount() * opCount(); }\n    QTextBlock block() const { return m_cursor.block(); }\n    int leftDist() const { return position() - block().position(); }\n    int rightDist() const { return block().length() - leftDist() - (isVisualCharMode() ? 0 : 1); }\n    bool atBlockStart() const { return m_cursor.atBlockStart(); }\n    bool atBlockEnd() const { return m_cursor.atBlockEnd(); }\n    bool atEndOfLine() const { return atBlockEnd() && block().length() > 1; }\n    bool atDocumentEnd() const { return position() >= lastPositionInDocument(true); }\n    bool atDocumentStart() const { return m_cursor.atStart(); }\n\n    bool atEmptyLine(int pos) const;\n    bool atEmptyLine(const QTextCursor &tc) const;\n    bool atEmptyLine() const;\n    bool atBoundary(bool end, bool simple, bool onlyWords = false,\n        const QTextCursor &tc = QTextCursor()) const;\n    bool atWordBoundary(bool end, bool simple, const QTextCursor &tc = QTextCursor()) const;\n    bool atWordStart(bool simple, const QTextCursor &tc = QTextCursor()) const;\n    bool atWordEnd(bool simple, const QTextCursor &tc = QTextCursor()) const;\n    bool isFirstNonBlankOnLine(int pos);\n\n    int lastPositionInDocument(bool ignoreMode = false) const; // Returns last valid position in doc.\n    int firstPositionInLine(int line, bool onlyVisibleLines = true) const; // 1 based line, 0 based pos\n    int lastPositionInLine(int line, bool onlyVisibleLines = true) const; // 1 based line, 0 based pos\n    int lineForPosition(int pos) const;  // 1 based line, 0 based pos\n    QString lineContents(int line) const; // 1 based line\n    QString textAt(int from, int to) const;\n    void setLineContents(int line, const QString &contents); // 1 based line\n    int blockBoundary(const QString &left, const QString &right,\n        bool end, int count) const; // end or start position of current code block\n    int lineNumber(const QTextBlock &block) const;\n\n    int columnAt(int pos) const;\n    int blockNumberAt(int pos) const;\n    QTextBlock blockAt(int pos) const;\n    QTextBlock nextLine(const QTextBlock &block) const; // following line (respects wrapped parts)\n    QTextBlock previousLine(const QTextBlock &block) const; // previous line (respects wrapped parts)\n\n    int linesOnScreen() const;\n    int linesInDocument() const;\n\n    // The following use all zero-based counting.\n    int cursorLineOnScreen() const;\n    int cursorLine() const;\n    int cursorBlockNumber() const; // \".\" address\n    int physicalCursorColumn() const; // as stored in the data\n    int logicalCursorColumn() const; // as visible on screen\n    int physicalToLogicalColumn(int physical, const QString &text) const;\n    int logicalToPhysicalColumn(int logical, const QString &text) const;\n    int windowScrollOffset() const; // return scrolloffset but max half the current window height\n    Column cursorColumn() const; // as visible on screen\n    void updateFirstVisibleLine();\n    int firstVisibleLine() const;\n    int lastVisibleLine() const;\n    int lineOnTop(int count = 1) const; // [count]-th line from top reachable without scrolling\n    int lineOnBottom(int count = 1) const; // [count]-th line from bottom reachable without scrolling\n    void scrollToLine(int line);\n    void scrollUp(int count);\n    void scrollDown(int count) { scrollUp(-count); }\n    void updateScrollOffset();\n    void alignViewportToCursor(Qt::AlignmentFlag align, int line = -1,\n        bool moveToNonBlank = false);\n\n    int lineToBlockNumber(int line) const;\n\n    void setCursorPosition(const CursorPosition &p);\n    void setCursorPosition(QTextCursor *tc, const CursorPosition &p);\n\n    // Helper functions for indenting/\n    bool isElectricCharacter(QChar c) const;\n    void indentSelectedText(QChar lastTyped = QChar());\n    void indentText(const Range &range, QChar lastTyped = QChar());\n    void shiftRegionLeft(int repeat = 1);\n    void shiftRegionRight(int repeat = 1);\n\n    void moveToFirstNonBlankOnLine();\n    void moveToFirstNonBlankOnLine(QTextCursor *tc);\n    void moveToFirstNonBlankOnLineVisually();\n    void moveToNonBlankOnLine(QTextCursor *tc);\n    void moveToTargetColumn();\n    void setTargetColumn();\n    void moveToMatchingParanthesis();\n    void moveToBoundary(bool simple, bool forward = true);\n    void moveToNextBoundary(bool end, int count, bool simple, bool forward);\n    void moveToNextBoundaryStart(int count, bool simple, bool forward = true);\n    void moveToNextBoundaryEnd(int count, bool simple, bool forward = true);\n    void moveToBoundaryStart(int count, bool simple, bool forward = true);\n    void moveToBoundaryEnd(int count, bool simple, bool forward = true);\n    void moveToNextWord(bool end, int count, bool simple, bool forward, bool emptyLines);\n    void moveToNextWordStart(int count, bool simple, bool forward = true, bool emptyLines = true);\n    void moveToNextWordEnd(int count, bool simple, bool forward = true, bool emptyLines = true);\n    void moveToWordStart(int count, bool simple, bool forward = true, bool emptyLines = true);\n    void moveToWordEnd(int count, bool simple, bool forward = true, bool emptyLines = true);\n\n    // Convenience wrappers to reduce line noise.\n    void moveToStartOfLine();\n    void moveToStartOfLineVisually();\n    void moveToEndOfLine();\n    void moveToEndOfLineVisually();\n    void moveToEndOfLineVisually(QTextCursor *tc);\n    void moveBehindEndOfLine();\n    void moveUp(int n = 1) { moveDown(-n); }\n    void moveDown(int n = 1);\n    void moveUpVisually(int n = 1) { moveDownVisually(-n); }\n    void moveDownVisually(int n = 1);\n    void moveVertically(int n = 1) {\n        if (g.gflag) {\n            g.movetype = MoveExclusive;\n            moveDownVisually(n);\n        } else {\n            g.movetype = MoveLineWise;\n            moveDown(n);\n        }\n    }\n    void movePageDown(int count = 1);\n    void movePageUp(int count = 1) { movePageDown(-count); }\n    void dump(const char *msg) const {\n        qDebug() << msg << \"POS: \" << anchor() << position()\n            << \"VISUAL: \" << g.visualMode;\n    }\n    void moveRight(int n = 1) {\n        if (isVisualCharMode()) {\n            const QTextBlock currentBlock = block();\n            const int max = currentBlock.position() + currentBlock.length() - 1;\n            const int pos = position() + n;\n            setPosition(qMin(pos, max));\n        } else {\n            m_cursor.movePosition(Right, KeepAnchor, n);\n        }\n        if (atEndOfLine())\n            q->fold(1, false);\n        setTargetColumn();\n    }\n    void moveLeft(int n = 1) {\n        m_cursor.movePosition(Left, KeepAnchor, n);\n        setTargetColumn();\n    }\n    void moveToNextCharacter() {\n        moveRight();\n        if (atEndOfLine())\n            moveRight();\n    }\n    void moveToPreviousCharacter() {\n        moveLeft();\n        if (atBlockStart())\n            moveLeft();\n    }\n    void setAnchor() {\n        m_cursor.setPosition(position(), MoveAnchor);\n    }\n    void setAnchor(int position) {\n        m_cursor.setPosition(position, KeepAnchor);\n    }\n    void setPosition(int position) {\n        m_cursor.setPosition(position, KeepAnchor);\n    }\n    void setAnchorAndPosition(int anchor, int position) {\n        m_cursor.setPosition(anchor, MoveAnchor);\n        m_cursor.setPosition(position, KeepAnchor);\n    }\n\n    // Set cursor in text editor widget.\n    void commitCursor();\n\n    // Restore cursor from editor widget.\n    // Update selection, record jump and target column if cursor position\n    // changes externally (e.g. by code completion).\n    void pullCursor();\n\n    QTextCursor editorCursor() const;\n\n    // Values to save when starting FakeVim processing.\n    int m_firstVisibleLine;\n    QTextCursor m_cursor;\n    bool m_cursorNeedsUpdate;\n\n    bool moveToPreviousParagraph(int count = 1) { return moveToNextParagraph(-count); }\n    bool moveToNextParagraph(int count = 1);\n    void moveToParagraphStartOrEnd(int direction = 1);\n\n    bool handleFfTt(const QString &key, bool repeats = false);\n\n    void enterVisualInsertMode(QChar command);\n    void enterReplaceMode();\n    void enterInsertMode();\n    void enterInsertOrReplaceMode(Mode mode);\n    void enterCommandMode(Mode returnToMode = CommandMode);\n    void enterExMode(const QString &contents = QString());\n    void showMessage(MessageLevel level, const QString &msg);\n    void clearMessage() { showMessage(MessageInfo, QString()); }\n    void notImplementedYet();\n    void updateMiniBuffer();\n    void updateSelection();\n    void updateHighlights();\n    void updateCursorShape();\n    void setThinCursor(bool enable = true);\n    bool hasThinCursor() const;\n    QWidget *editor() const;\n    QTextDocument *document() const { return EDITOR(document()); }\n    QChar characterAt(int pos) const { return document()->characterAt(pos); }\n    QChar characterAtCursor() const { return characterAt(position()); }\n\n    void joinPreviousEditBlock();\n    void beginEditBlock(bool largeEditBlock = false);\n    void beginLargeEditBlock() { beginEditBlock(true); }\n    void endEditBlock();\n    void breakEditBlock() { m_buffer->breakEditBlock = true; }\n\n    bool canModifyBufferData() const { return m_buffer->currentHandler.data() == this; }\n\n    void onContentsChanged(int position, int charsRemoved, int charsAdded);\n    void onCursorPositionChanged();\n    void onUndoCommandAdded();\n\n    void onInputTimeout();\n    void onFixCursorTimeout();\n\n    bool isCommandLineMode() const { return g.mode == ExMode || g.subsubmode == SearchSubSubMode; }\n    bool isInsertMode() const { return g.mode == InsertMode || g.mode == ReplaceMode; }\n    // Waiting for movement operator.\n    bool isOperatorPending() const {\n        return g.submode == ChangeSubMode\n            || g.submode == DeleteSubMode\n            || g.submode == ExchangeSubMode\n            || g.submode == CommentSubMode\n            || g.submode == ReplaceWithRegisterSubMode\n            || g.submode == AddSurroundingSubMode\n            || g.submode == FilterSubMode\n            || g.submode == IndentSubMode\n            || g.submode == ShiftLeftSubMode\n            || g.submode == ShiftRightSubMode\n            || g.submode == InvertCaseSubMode\n            || g.submode == DownCaseSubMode\n            || g.submode == UpCaseSubMode\n            || g.submode == YankSubMode; }\n\n    bool isVisualMode() const { return g.visualMode != NoVisualMode; }\n    bool isNoVisualMode() const { return g.visualMode == NoVisualMode; }\n    bool isVisualCharMode() const { return g.visualMode == VisualCharMode; }\n    bool isVisualLineMode() const { return g.visualMode == VisualLineMode; }\n    bool isVisualBlockMode() const { return g.visualMode == VisualBlockMode; }\n    char currentModeCode() const;\n    void updateEditor();\n\n    void selectTextObject(bool simple, bool inner);\n    void selectWordTextObject(bool inner);\n    void selectWORDTextObject(bool inner);\n    void selectSentenceTextObject(bool inner);\n    void selectParagraphTextObject(bool inner);\n    bool changeNumberTextObject(int count);\n    // return true only if cursor is in a block delimited with correct characters\n    bool selectBlockTextObject(bool inner, QChar left, QChar right);\n    bool selectQuotedStringTextObject(bool inner, const QString &quote);\n    bool selectArgumentTextObject(bool inner);\n\n    void commitInsertState();\n    void invalidateInsertState();\n    bool isInsertStateValid() const;\n    void clearLastInsertion();\n    void ensureCursorVisible();\n    void insertInInsertMode(const QString &text);\n\n    // Macro recording\n    bool startRecording(const Input &input);\n    void record(const Input &input);\n    void stopRecording();\n    bool executeRegister(int reg);\n\n    // Handle current command as synonym\n    void handleAs(const QString &command);\n\npublic:\n    QTextEdit *m_textedit;\n    QPlainTextEdit *m_plaintextedit;\n    bool m_wasReadOnly; // saves read-only state of document\n\n    bool m_inFakeVim; // true if currently processing a key press or a command\n\n    FakeVimHandler *q;\n    int m_register;\n    BlockInsertMode m_visualBlockInsert;\n\n    bool m_anchorPastEnd;\n    bool m_positionPastEnd; // '$' & 'l' in visual mode can move past eol\n\n    QString m_currentFileName;\n\n    int m_findStartPosition;\n\n    int anchor() const { return m_cursor.anchor(); }\n    int position() const { return m_cursor.position(); }\n\n    // Transform text selected by cursor in current visual mode.\n    using Transformation = std::function<QString(const QString &)>;\n    void transformText(const Range &range, QTextCursor &tc, const std::function<void()> &transform) const;\n    void transformText(const Range &range, const Transformation &transform);\n\n    void insertText(QTextCursor &tc, const QString &text);\n    void insertText(const Register &reg);\n    void removeText(const Range &range);\n\n    void invertCase(const Range &range);\n\n    void toggleComment(const Range &range);\n\n    void exchangeRange(const Range &range);\n\n    void replaceWithRegister(const Range &range);\n\n    void surroundCurrentRange(const Input &input, const QString &prefix = {});\n\n    void upCase(const Range &range);\n\n    void downCase(const Range &range);\n\n    void replaceText(const Range &range, const QString &str);\n\n    QString selectText(const Range &range) const;\n    void setCurrentRange(const Range &range);\n    Range currentRange() const { return Range(position(), anchor(), g.rangemode); }\n\n    void yankText(const Range &range, int toregister);\n\n    void pasteText(bool afterCursor);\n\n    void cutSelectedText(int reg = 0);\n\n    void joinLines(int count, bool preserveSpace = false);\n\n    void insertNewLine();\n\n    bool handleInsertInEditor(const Input &input);\n    bool passEventToEditor(QEvent &event, QTextCursor &tc); // Pass event to editor widget without filtering. Returns true if event was processed.\n\n    // undo handling\n    int revision() const { return document()->availableUndoSteps(); }\n    void undoRedo(bool undo);\n    void undo();\n    void redo();\n    void pushUndoState(bool overwrite = true);\n\n    // extra data for '.'\n    void replay(const QString &text, int repeat = 1);\n    void setDotCommand(const QString &cmd) { g.dotCommand = cmd; }\n    void setDotCommand(const QString &cmd, int n) { g.dotCommand = cmd.arg(n); }\n    QString visualDotCommand() const;\n\n    // visual modes\n    void toggleVisualMode(VisualMode visualMode);\n    void leaveVisualMode();\n    void saveLastVisualMode();\n\n    // marks\n    Mark mark(QChar code) const;\n    void setMark(QChar code, CursorPosition position);\n    // jump to valid mark return true if mark is valid and local\n    bool jumpToMark(QChar mark, bool backTickMode);\n    // update marks on undo/redo\n    void updateMarks(const Marks &newMarks);\n    CursorPosition markLessPosition() const { return mark('<').position(document()); }\n    CursorPosition markGreaterPosition() const { return mark('>').position(document()); }\n\n    int m_targetColumn; // -1 if past end of line\n    int m_visualTargetColumn; // 'l' can move past eol in visual mode only\n    int m_targetColumnWrapped; // column in current part of wrapped line\n\n    // auto-indent\n    QString tabExpand(int len) const;\n    Column indentation(const QString &line) const;\n    void insertAutomaticIndentation(bool goingDown, bool forceAutoIndent = false);\n    // number of autoindented characters\n    void handleStartOfLine();\n\n    // register handling\n    QString registerContents(int reg) const;\n    void setRegister(int reg, const QString &contents, RangeMode mode);\n    RangeMode registerRangeMode(int reg) const;\n    void getRegisterType(int *reg, bool *isClipboard, bool *isSelection, bool *append = nullptr) const;\n\n    void recordJump(int position = -1);\n    void jump(int distance);\n\n    QList<QTextEdit::ExtraSelection> m_extraSelections;\n    QTextCursor m_searchCursor;\n    int m_searchStartPosition;\n    int m_searchFromScreenLine;\n    QString m_highlighted; // currently highlighted text\n\n    bool handleExCommandHelper(ExCommand &cmd); // Returns success.\n    bool handleExPluginCommand(const ExCommand &cmd); // Handled by plugin?\n    bool handleExBangCommand(const ExCommand &cmd);\n    bool handleExYankDeleteCommand(const ExCommand &cmd);\n    bool handleExChangeCommand(const ExCommand &cmd);\n    bool handleExMoveCommand(const ExCommand &cmd);\n    bool handleExJoinCommand(const ExCommand &cmd);\n    bool handleExGotoCommand(const ExCommand &cmd);\n    bool handleExHistoryCommand(const ExCommand &cmd);\n    bool handleExRegisterCommand(const ExCommand &cmd);\n    bool handleExMapCommand(const ExCommand &cmd);\n    bool handleExMultiRepeatCommand(const ExCommand &cmd);\n    bool handleExNohlsearchCommand(const ExCommand &cmd);\n    bool handleExNormalCommand(const ExCommand &cmd);\n    bool handleExReadCommand(const ExCommand &cmd);\n    bool handleExUndoRedoCommand(const ExCommand &cmd);\n    bool handleExSetCommand(const ExCommand &cmd);\n    bool handleExSortCommand(const ExCommand &cmd);\n    bool handleExShiftCommand(const ExCommand &cmd);\n    bool handleExSourceCommand(const ExCommand &cmd);\n    bool handleExSubstituteCommand(const ExCommand &cmd);\n    bool handleExTabNextCommand(const ExCommand &cmd);\n    bool handleExTabPreviousCommand(const ExCommand &cmd);\n    bool handleExWriteCommand(const ExCommand &cmd);\n    bool handleExEchoCommand(const ExCommand &cmd);\n\n    void setTabSize(int tabSize);\n    void setupCharClass();\n    int charClass(QChar c, bool simple) const;\n    signed char m_charClass[256];\n\n    int m_ctrlVAccumulator;\n    int m_ctrlVLength;\n    int m_ctrlVBase;\n\n    QTimer m_fixCursorTimer;\n    QTimer m_inputTimer;\n\n    void miniBufferTextEdited(const QString &text, int cursorPos, int anchorPos);\n\n    // Data shared among editors with same document.\n    struct BufferData\n    {\n        QStack<State> undo;\n        QStack<State> redo;\n        State undoState;\n        int lastRevision = 0;\n\n        int editBlockLevel = 0; // current level of edit blocks\n        bool breakEditBlock = false; // if true, joinPreviousEditBlock() starts new edit block\n\n        QStack<CursorPosition> jumpListUndo;\n        QStack<CursorPosition> jumpListRedo;\n\n        VisualMode lastVisualMode = NoVisualMode;\n        bool lastVisualModeInverted = false;\n\n        Marks marks;\n\n        // Insert state to get last inserted text.\n        struct InsertState {\n            int pos1;\n            int pos2;\n            int backspaces;\n            int deletes;\n            QSet<int> spaces;\n            bool insertingSpaces;\n            QString textBeforeCursor;\n            bool newLineBefore;\n            bool newLineAfter;\n        } insertState;\n\n        QString lastInsertion;\n\n        // If there are multiple editors with same document,\n        // only the handler with last focused editor can change buffer data.\n        QPointer<FakeVimHandler::Private> currentHandler;\n    };\n\n    using BufferDataPtr = QSharedPointer<BufferData>;\n    void pullOrCreateBufferData();\n    BufferDataPtr m_buffer;\n\n    // Data shared among all editors.\n    static struct GlobalData\n    {\n        GlobalData()\n            : mappings()\n            , currentMap(&mappings)\n        {\n            commandBuffer.setPrompt(':');\n        }\n\n        // Current state.\n        bool passing = false; // let the core see the next event\n        Mode mode = CommandMode;\n        SubMode submode = NoSubMode;\n        SubSubMode subsubmode = NoSubSubMode;\n        Input subsubdata;\n        VisualMode visualMode = NoVisualMode;\n        Input minibufferData;\n\n        // [count] for current command, 0 if no [count] available\n        int mvcount = 0;\n        int opcount = 0;\n\n        MoveType movetype = MoveInclusive;\n        RangeMode rangemode = RangeCharMode;\n        bool gflag = false;  // whether current command started with 'g'\n\n        // Extra data for ';'.\n        Input semicolonType;  // 'f', 'F', 't', 'T'\n        QString semicolonKey;\n\n        // Repetition.\n        QString dotCommand;\n\n        QHash<int, Register> registers;\n\n        // All mappings.\n        Mappings mappings;\n\n        // Input.\n        QList<Input> pendingInput;\n        MappingsIterator currentMap;\n        QStack<MappingState> mapStates;\n        int mapDepth = 0;\n\n        // Command line buffers.\n        CommandBuffer commandBuffer;\n        CommandBuffer searchBuffer;\n\n        // Current mini buffer message.\n        QString currentMessage;\n        MessageLevel currentMessageLevel = MessageInfo;\n        QString currentCommand;\n\n        // Search state.\n        QString lastSearch; // last search expression as entered by user\n        QString lastNeedle; // last search expression translated with vimPatternToQtPattern()\n        bool lastSearchForward = false; // last search command was '/' or '*'\n        bool highlightsCleared = false; // ':nohlsearch' command is active until next search\n        bool findPending = false; // currently searching using external tool (until editor is focused again)\n\n        // Last substitution command.\n        QString lastSubstituteFlags;\n        QString lastSubstitutePattern;\n        QString lastSubstituteReplacement;\n\n        // Global marks.\n        Marks marks;\n\n        // Return to insert/replace mode after single command (<C-O>).\n        Mode returnToMode = CommandMode;\n\n        // Currently recorded macro\n        bool isRecording = false;\n        QString recorded;\n        int currentRegister = 0;\n        int lastExecutedRegister = 0;\n\n        // If empty, cx{motion} will store the range defined by {motion} here.\n        // If non-empty, cx{motion} replaces the {motion} with selectText(*exchangeData)\n        std::optional<Range> exchangeRange;\n\n        bool surroundUpperCaseS; // True for yS and cS, false otherwise\n        QString surroundFunction; // Used for storing the function name provided to ys{motion}f\n    } g;\n\n    FakeVimSettings &s = *fakeVimSettings();\n};\n\nstatic void initSingleShotTimer(QTimer *timer,\n                                int interval,\n                                FakeVimHandler::Private *receiver,\n                                void (FakeVimHandler::Private::*slot)())\n{\n    timer->setSingleShot(true);\n    timer->setInterval(interval);\n    QObject::connect(timer, &QTimer::timeout, receiver, slot);\n}\n\nFakeVimHandler::Private::GlobalData FakeVimHandler::Private::g;\n\nFakeVimHandler::Private::Private(FakeVimHandler *parent, QWidget *widget)\n{\n    q = parent;\n    m_textedit = qobject_cast<QTextEdit *>(widget);\n    m_plaintextedit = qobject_cast<QPlainTextEdit *>(widget);\n\n    init();\n\n    if (editor()) {\n        connect(EDITOR(document()), &QTextDocument::contentsChange,\n                this, &Private::onContentsChanged);\n        connect(EDITOR(document()), &QTextDocument::undoCommandAdded,\n                this, &Private::onUndoCommandAdded);\n        m_buffer->lastRevision = revision();\n    }\n\n#ifndef FAKEVIM_STANDALONE\n    connect(&s.showMarks, &FvBaseAspect::changed,\n            this, &FakeVimHandler::Private::updateSelection);\n#endif\n}\n\nvoid FakeVimHandler::Private::init()\n{\n    m_cursor = QTextCursor(document());\n    m_cursorNeedsUpdate = true;\n    m_inFakeVim = false;\n    m_findStartPosition = -1;\n    m_visualBlockInsert = NoneBlockInsertMode;\n    m_positionPastEnd = false;\n    m_anchorPastEnd = false;\n    m_register = '\"';\n    m_targetColumn = 0;\n    m_visualTargetColumn = 0;\n    m_targetColumnWrapped = 0;\n    m_searchStartPosition = 0;\n    m_searchFromScreenLine = 0;\n    m_firstVisibleLine = 0;\n    m_ctrlVAccumulator = 0;\n    m_ctrlVLength = 0;\n    m_ctrlVBase = 0;\n\n    initSingleShotTimer(&m_fixCursorTimer, 0, this, &FakeVimHandler::Private::onFixCursorTimeout);\n    initSingleShotTimer(&m_inputTimer, 1000, this, &FakeVimHandler::Private::onInputTimeout);\n\n    pullOrCreateBufferData();\n    setupCharClass();\n}\n\nvoid FakeVimHandler::Private::focus()\n{\n    m_buffer->currentHandler = this;\n\n    enterFakeVim();\n\n    stopIncrementalFind();\n    if (isCommandLineMode()) {\n        if (g.subsubmode == SearchSubSubMode) {\n            setPosition(m_searchStartPosition);\n            scrollToLine(m_searchFromScreenLine);\n        } else {\n            leaveVisualMode();\n            setPosition(qMin(position(), anchor()));\n        }\n        leaveCurrentMode();\n        setTargetColumn();\n        setAnchor();\n        commitCursor();\n    } else {\n        clearCurrentMode();\n    }\n    fixExternalCursor(true);\n    updateHighlights();\n\n    leaveFakeVim(false);\n}\n\nvoid FakeVimHandler::Private::unfocus()\n{\n    fixExternalCursor(false);\n}\n\nvoid FakeVimHandler::Private::fixExternalCursor(bool focus)\n{\n    m_fixCursorTimer.stop();\n\n    if (isVisualCharMode() && !focus && !hasThinCursor()) {\n        // Select the character under thick cursor for external operations with text selection.\n        fixExternalCursorPosition(false);\n    } else if (isVisualCharMode() && focus && hasThinCursor()) {\n        // Fix cursor position if changing its shape.\n        // The fix is postponed so context menu action can be finished.\n        m_fixCursorTimer.start();\n    } else {\n        updateCursorShape();\n    }\n}\n\nvoid FakeVimHandler::Private::fixExternalCursorPosition(bool focus)\n{\n    QTextCursor tc = editorCursor();\n    if (tc.anchor() < tc.position()) {\n        tc.movePosition(focus ? Left : Right, KeepAnchor);\n        EDITOR(setTextCursor(tc));\n    }\n\n    setThinCursor(!focus);\n}\n\nvoid FakeVimHandler::Private::enterFakeVim()\n{\n    if (m_inFakeVim) {\n        qWarning(\"enterFakeVim() shouldn't be called recursively!\");\n        return;\n    }\n\n    if (!m_buffer->currentHandler)\n        m_buffer->currentHandler = this;\n\n    pullOrCreateBufferData();\n\n    m_inFakeVim = true;\n\n    removeEventFilter();\n\n    pullCursor();\n\n    updateFirstVisibleLine();\n}\n\nvoid FakeVimHandler::Private::leaveFakeVim(bool needUpdate)\n{\n    if (!m_inFakeVim) {\n        qWarning(\"enterFakeVim() not called before leaveFakeVim()!\");\n        return;\n    }\n\n    // The command might have destroyed the editor.\n    if (m_textedit || m_plaintextedit) {\n        if (s.showMarks.value())\n            updateSelection();\n\n        updateMiniBuffer();\n\n        if (needUpdate) {\n            // Move cursor line to middle of screen if it's not visible.\n            const int line = cursorLine();\n            if (line < firstVisibleLine() || line > firstVisibleLine() + linesOnScreen())\n                scrollToLine(qMax(0, line - linesOnScreen() / 2));\n            else\n                scrollToLine(firstVisibleLine());\n            updateScrollOffset();\n\n            commitCursor();\n        }\n\n        installEventFilter();\n    }\n\n    m_inFakeVim = false;\n}\n\nvoid FakeVimHandler::Private::leaveFakeVim(EventResult eventResult)\n{\n    leaveFakeVim(eventResult == EventHandled || eventResult == EventCancelled);\n}\n\nbool FakeVimHandler::Private::wantsOverride(QKeyEvent *ev)\n{\n    const int key = ev->key();\n    const Qt::KeyboardModifiers mods = ev->modifiers();\n    KEY_DEBUG(\"SHORTCUT OVERRIDE\" << key << \"  PASSING: \" << g.passing);\n\n    if (key == Key_Escape) {\n        if (g.subsubmode == SearchSubSubMode)\n            return true;\n        // Not sure this feels good. People often hit Esc several times.\n        if (isNoVisualMode()\n                && g.mode == CommandMode\n                && g.submode == NoSubMode\n                && g.currentCommand.isEmpty()\n                && g.returnToMode == CommandMode)\n            return false;\n        return true;\n    }\n\n    // We are interested in overriding most Ctrl key combinations.\n    if (isOnlyControlModifier(mods)\n            && !s.passControlKey.value()\n            && ((key >= Key_A && key <= Key_Z && key != Key_K)\n                || key == Key_BracketLeft || key == Key_BracketRight)) {\n        // Ctrl-K is special as it is the Core's default notion of Locator\n        if (g.passing) {\n            KEY_DEBUG(\" PASSING CTRL KEY\");\n            // We get called twice on the same key\n            //g.passing = false;\n            return false;\n        }\n        KEY_DEBUG(\" NOT PASSING CTRL KEY\");\n        return true;\n    }\n\n    // Let other shortcuts trigger.\n    return false;\n}\n\nEventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)\n{\n    const int key = ev->key();\n    const Qt::KeyboardModifiers mods = ev->modifiers();\n\n    if (key == Key_Shift || key == Key_Alt || key == Key_Control\n            || key == Key_AltGr || key == Key_Meta)\n    {\n        KEY_DEBUG(\"PLAIN MODIFIER\");\n        return EventUnhandled;\n    }\n\n    if (g.passing) {\n        passShortcuts(false);\n        KEY_DEBUG(\"PASSING PLAIN KEY...\" << ev->key() << ev->text());\n        //if (input.is(',')) { // use ',,' to leave, too.\n        //    qDebug() << \"FINISHED...\";\n        //    return EventHandled;\n        //}\n        KEY_DEBUG(\"   PASS TO CORE\");\n        return EventPassedToCore;\n    }\n\n#ifndef FAKEVIM_STANDALONE\n    bool inSnippetMode = false;\n    QMetaObject::invokeMethod(editor(),\n        \"inSnippetMode\", Q_ARG(bool *, &inSnippetMode));\n\n    if (inSnippetMode)\n        return EventPassedToCore;\n#endif\n\n    // Fake \"End of line\"\n    //m_tc = m_cursor;\n\n    //bool hasBlock = false;\n    //q->requestHasBlockSelection(&hasBlock);\n    //qDebug() << \"IMPORT BLOCK 2:\" << hasBlock;\n\n    //if (0 && hasBlock) {\n    //    (pos > anc) ? --pos : --anc;\n\n    //if ((mods & RealControlModifier) != 0) {\n    //    if (key >= Key_A && key <= Key_Z)\n    //        key = shift(key); // make it lower case\n    //    key = control(key);\n    //} else if (key >= Key_A && key <= Key_Z && (mods & Qt::ShiftModifier) == 0) {\n    //    key = shift(key);\n    //}\n\n    //QTC_ASSERT(g.mode == InsertMode || g.mode == ReplaceMode\n    //        || !atBlockEnd() || block().length() <= 1,\n    //    qDebug() << \"Cursor at EOL before key handler\");\n\n    const Input input(key, mods, ev->text());\n    if (!input.isValid())\n        return EventUnhandled;\n\n    enterFakeVim();\n    EventResult result = handleKey(input);\n    leaveFakeVim(result);\n    return result;\n}\n\nvoid FakeVimHandler::Private::installEventFilter()\n{\n    EDITOR(installEventFilter(q));\n}\n\nvoid FakeVimHandler::Private::removeEventFilter()\n{\n    EDITOR(removeEventFilter(q));\n}\n\nvoid FakeVimHandler::Private::setupWidget()\n{\n    m_cursorNeedsUpdate = true;\n    if (m_textedit) {\n        connect(m_textedit, &QTextEdit::cursorPositionChanged,\n                this, &FakeVimHandler::Private::onCursorPositionChanged, Qt::UniqueConnection);\n    } else {\n        connect(m_plaintextedit, &QPlainTextEdit::cursorPositionChanged,\n                this, &FakeVimHandler::Private::onCursorPositionChanged, Qt::UniqueConnection);\n    }\n\n    enterFakeVim();\n\n    leaveCurrentMode();\n    m_wasReadOnly = EDITOR(isReadOnly());\n\n    updateEditor();\n\n    leaveFakeVim();\n}\n\nvoid FakeVimHandler::Private::commitInsertState()\n{\n    if (!isInsertStateValid())\n        return;\n\n    QString &lastInsertion = m_buffer->lastInsertion;\n    BufferData::InsertState &insertState = m_buffer->insertState;\n\n    // Get raw inserted text.\n    lastInsertion = textAt(insertState.pos1, insertState.pos2);\n\n    // Escape special characters and spaces inserted by user (not by auto-indentation).\n    for (int i = lastInsertion.size() - 1; i >= 0; --i) {\n        const int pos = insertState.pos1 + i;\n        const QChar c = characterAt(pos);\n        if (c == '<')\n            lastInsertion.replace(i, 1, \"<LT>\");\n        else if ((c == ' ' || c == '\\t') && insertState.spaces.contains(pos))\n            lastInsertion.replace(i, 1, QLatin1String(c == ' ' ? \"<SPACE>\" : \"<TAB>\"));\n    }\n\n    // Remove unnecessary backspaces.\n    while (insertState.backspaces > 0 && !lastInsertion.isEmpty() && lastInsertion[0].isSpace())\n        --insertState.backspaces;\n\n    // backspaces in front of inserted text\n    lastInsertion.prepend(QString(\"<BS>\").repeated(insertState.backspaces));\n    // deletes after inserted text\n    lastInsertion.prepend(QString(\"<DELETE>\").repeated(insertState.deletes));\n\n    // Remove indentation.\n    lastInsertion.replace(QRegularExpression(\"(^|\\n)[\\\\t ]+\"), \"\\\\1\");\n}\n\nvoid FakeVimHandler::Private::invalidateInsertState()\n{\n    BufferData::InsertState &insertState = m_buffer->insertState;\n    insertState.pos1 = -1;\n    insertState.pos2 = position();\n    insertState.backspaces = 0;\n    insertState.deletes = 0;\n    insertState.spaces.clear();\n    insertState.insertingSpaces = false;\n    insertState.textBeforeCursor = textAt(block().position(), position());\n    insertState.newLineBefore = false;\n    insertState.newLineAfter = false;\n}\n\nbool FakeVimHandler::Private::isInsertStateValid() const\n{\n    return m_buffer->insertState.pos1 != -1;\n}\n\nvoid FakeVimHandler::Private::clearLastInsertion()\n{\n    invalidateInsertState();\n    m_buffer->lastInsertion.clear();\n    m_buffer->insertState.pos1 = m_buffer->insertState.pos2;\n}\n\nvoid FakeVimHandler::Private::ensureCursorVisible()\n{\n    int pos = position();\n    int anc = isVisualMode() ? anchor() : position();\n\n    // fix selection so it is outside folded block\n    int start = qMin(pos, anc);\n    int end = qMax(pos, anc) + 1;\n    QTextBlock block = blockAt(start);\n    QTextBlock block2 = blockAt(end);\n    if (!block.isVisible() || !block2.isVisible()) {\n        // FIXME: Moving cursor left/right or unfolding block immediately after block is folded\n        //        should restore cursor position inside block.\n        // Changing cursor position after folding is not Vim behavior so at least record the jump.\n        if (block.isValid() && !block.isVisible())\n            recordJump();\n\n        pos = start;\n        while (block.isValid() && !block.isVisible())\n            block = block.previous();\n        if (block.isValid())\n            pos = block.position() + qMin(m_targetColumn, block.length() - 2);\n\n        if (isVisualMode()) {\n            anc = end;\n            while (block2.isValid() && !block2.isVisible()) {\n                anc = block2.position() + block2.length() - 2;\n                block2 = block2.next();\n            }\n        }\n\n        setAnchorAndPosition(anc, pos);\n    }\n}\n\nvoid FakeVimHandler::Private::updateEditor()\n{\n    setTabSize(s.tabStop.value());\n    setupCharClass();\n}\n\nvoid FakeVimHandler::Private::setTabSize(int tabSize)\n{\n    const int charWidth = QFontMetrics(EDITOR(font())).horizontalAdvance(' ');\n    const int width = charWidth * tabSize;\n    EDITOR(setTabStopDistance(width));\n}\n\nvoid FakeVimHandler::Private::restoreWidget(int tabSize)\n{\n    //EDITOR(removeEventFilter(q));\n    //EDITOR(setReadOnly(m_wasReadOnly));\n    setTabSize(tabSize);\n    g.visualMode = NoVisualMode;\n    // Force \"ordinary\" cursor.\n    setThinCursor();\n    updateSelection();\n    updateHighlights();\n    if (m_textedit) {\n        disconnect(m_textedit, &QTextEdit::cursorPositionChanged,\n                   this, &FakeVimHandler::Private::onCursorPositionChanged);\n    } else {\n        disconnect(m_plaintextedit, &QPlainTextEdit::cursorPositionChanged,\n                   this, &FakeVimHandler::Private::onCursorPositionChanged);\n    }\n}\n\nEventResult FakeVimHandler::Private::handleKey(const Input &input)\n{\n    KEY_DEBUG(\"HANDLE INPUT: \" << input);\n\n    bool hasInput = input.isValid();\n\n    // Waiting on input to complete mapping?\n    EventResult r = stopWaitForMapping(hasInput);\n\n    if (hasInput) {\n        record(input);\n        g.pendingInput.append(input);\n    }\n\n    // Process pending input.\n    // Note: Pending input is global state and can be extended by:\n    //         1. handling a user input (though handleKey() is not called recursively),\n    //         2. expanding a user mapping or\n    //         3. executing a register.\n    while (!g.pendingInput.isEmpty() && r == EventHandled) {\n        const Input in = g.pendingInput.takeFirst();\n\n        // invalid input is used to pop mapping state\n        if (!in.isValid()) {\n            endMapping();\n        } else {\n            // Handle user mapping.\n            if (canHandleMapping()) {\n                if (extendMapping(in)) {\n                    if (!hasInput || !g.currentMap.canExtend())\n                        expandCompleteMapping();\n                } else if (!expandCompleteMapping()) {\n                    r = handleCurrentMapAsDefault();\n                }\n            } else {\n                r = handleDefaultKey(in);\n            }\n        }\n    }\n\n    if (g.currentMap.canExtend()) {\n        waitForMapping();\n        return EventHandled;\n    }\n\n    if (r != EventHandled)\n        clearPendingInput();\n\n    return r;\n}\n\nbool FakeVimHandler::Private::handleCommandBufferPaste(const Input &input)\n{\n    if (input.isControl('r')\n        && (g.subsubmode == SearchSubSubMode || g.mode == ExMode)) {\n        g.minibufferData = input;\n        return true;\n    }\n    if (g.minibufferData.isControl('r')) {\n        g.minibufferData = Input();\n        if (input.isEscape())\n            return true;\n        CommandBuffer &buffer = (g.subsubmode == SearchSubSubMode)\n            ? g.searchBuffer : g.commandBuffer;\n        if (input.isControl('w')) {\n            QTextCursor tc = m_cursor;\n            tc.select(QTextCursor::WordUnderCursor);\n            QString word = tc.selectedText();\n            buffer.insertText(word);\n        } else {\n            QString r = registerContents(input.asChar().unicode());\n            buffer.insertText(r);\n        }\n        updateMiniBuffer();\n        return true;\n    }\n    return false;\n}\n\nEventResult FakeVimHandler::Private::handleDefaultKey(const Input &input)\n{\n    if (g.passing) {\n        passShortcuts(false);\n        QKeyEvent event(QEvent::KeyPress, input.key(), input.modifiers(), input.text());\n        bool accepted = QApplication::sendEvent(editor()->window(), &event);\n        if (accepted || (!m_textedit && !m_plaintextedit))\n            return EventHandled;\n    }\n\n    if (input == Nop)\n        return EventHandled;\n    else if (g.subsubmode == SearchSubSubMode)\n        return handleSearchSubSubMode(input);\n    else if (g.mode == CommandMode)\n        return handleCommandMode(input);\n    else if (g.mode == InsertMode || g.mode == ReplaceMode)\n        return handleInsertOrReplaceMode(input);\n    else if (g.mode == ExMode)\n        return handleExMode(input);\n    return EventUnhandled;\n}\n\nEventResult FakeVimHandler::Private::handleCurrentMapAsDefault()\n{\n    // If mapping has failed take the first input from it and try default command.\n    const Inputs &inputs = g.currentMap.currentInputs();\n    if (inputs.isEmpty())\n        return EventHandled;\n\n    Input in = inputs.front();\n    if (inputs.size() > 1)\n        prependInputs(inputs.mid(1));\n    g.currentMap.reset();\n\n    return handleDefaultKey(in);\n}\n\nvoid FakeVimHandler::Private::prependInputs(const QVector<Input> &inputs)\n{\n    for (int i = inputs.size() - 1; i >= 0; --i)\n        g.pendingInput.prepend(inputs[i]);\n}\n\nvoid FakeVimHandler::Private::prependMapping(const Inputs &inputs)\n{\n    // FIXME: Implement Vim option maxmapdepth (default value is 1000).\n    if (g.mapDepth >= 1000) {\n        const int i = qMax(0, g.pendingInput.lastIndexOf(Input()));\n        const QList<Input> inputs = g.pendingInput.mid(i);\n        clearPendingInput();\n        g.pendingInput.append(inputs);\n        showMessage(MessageError, Tr::tr(\"Recursive mapping\"));\n        return;\n    }\n\n    ++g.mapDepth;\n    g.pendingInput.prepend(Input());\n    prependInputs(inputs);\n    g.commandBuffer.setHistoryAutoSave(false);\n\n    // start new edit block (undo/redo) only if necessary\n    bool editBlock = m_buffer->editBlockLevel == 0 && !(isInsertMode() && isInsertStateValid());\n    if (editBlock)\n        beginLargeEditBlock();\n    g.mapStates << MappingState(inputs.noremap(), inputs.silent(), editBlock);\n}\n\nbool FakeVimHandler::Private::expandCompleteMapping()\n{\n    if (!g.currentMap.isComplete())\n        return false;\n\n    const Inputs &inputs = g.currentMap.inputs();\n    int usedInputs = g.currentMap.mapLength();\n    prependInputs(g.currentMap.currentInputs().mid(usedInputs));\n    prependMapping(inputs);\n    g.currentMap.reset();\n\n    return true;\n}\n\nbool FakeVimHandler::Private::extendMapping(const Input &input)\n{\n    if (!g.currentMap.isValid())\n        g.currentMap.reset(currentModeCode());\n    return g.currentMap.walk(input);\n}\n\nvoid FakeVimHandler::Private::endMapping()\n{\n    if (!g.currentMap.canExtend())\n        --g.mapDepth;\n    if (g.mapStates.isEmpty())\n        return;\n    if (g.mapStates.last().editBlock)\n        endEditBlock();\n    g.mapStates.pop_back();\n    if (g.mapStates.isEmpty())\n        g.commandBuffer.setHistoryAutoSave(true);\n}\n\nbool FakeVimHandler::Private::canHandleMapping()\n{\n    // Don't handle user mapping in sub-modes that cannot be followed by movement and in \"noremap\".\n    return g.subsubmode == NoSubSubMode\n        && g.submode != RegisterSubMode\n        && g.submode != WindowSubMode\n        && g.submode != ZSubMode\n        && g.submode != CapitalZSubMode\n        && g.submode != ReplaceSubMode\n        && g.submode != MacroRecordSubMode\n        && g.submode != MacroExecuteSubMode\n        && (g.mapStates.isEmpty() || !g.mapStates.last().noremap);\n}\n\nvoid FakeVimHandler::Private::clearPendingInput()\n{\n    // Clear pending input on interrupt or bad mapping.\n    g.pendingInput.clear();\n    g.mapStates.clear();\n    g.mapDepth = 0;\n\n    // Clear all started edit blocks.\n    while (m_buffer->editBlockLevel > 0)\n        endEditBlock();\n}\n\nvoid FakeVimHandler::Private::waitForMapping()\n{\n    g.currentCommand.clear();\n    foreach (const Input &input, g.currentMap.currentInputs())\n        g.currentCommand.append(input.toString());\n\n    // wait for user to press any key or trigger complete mapping after interval\n    m_inputTimer.start();\n}\n\nEventResult FakeVimHandler::Private::stopWaitForMapping(bool hasInput)\n{\n    if (!hasInput || m_inputTimer.isActive()) {\n        m_inputTimer.stop();\n        g.currentCommand.clear();\n        if (!hasInput && !expandCompleteMapping()) {\n            // Cannot complete mapping so handle the first input from it as default command.\n            return handleCurrentMapAsDefault();\n        }\n    }\n\n    return EventHandled;\n}\n\nvoid FakeVimHandler::Private::stopIncrementalFind()\n{\n    if (g.findPending) {\n        g.findPending = false;\n        setAnchorAndPosition(m_findStartPosition, m_cursor.selectionStart());\n        finishMovement();\n        setAnchor();\n    }\n}\n\nvoid FakeVimHandler::Private::updateFind(bool isComplete)\n{\n    if (!isComplete && !s.incSearch.value())\n        return;\n\n    g.currentMessage.clear();\n\n    const QString &needle = g.searchBuffer.contents();\n    if (isComplete) {\n        setPosition(m_searchStartPosition);\n        if (!needle.isEmpty())\n            recordJump();\n    }\n\n    SearchData sd;\n    sd.needle = needle;\n    sd.forward = g.lastSearchForward;\n    sd.highlightMatches = isComplete;\n    search(sd, isComplete);\n}\n\nvoid FakeVimHandler::Private::resetCount()\n{\n    g.mvcount = 0;\n    g.opcount = 0;\n}\n\nbool FakeVimHandler::Private::isInputCount(const Input &input) const\n{\n    return input.isDigit() && (!input.is('0') || g.mvcount > 0);\n}\n\nbool FakeVimHandler::Private::atEmptyLine(int pos) const\n{\n    return blockAt(pos).length() == 1;\n}\n\nbool FakeVimHandler::Private::atEmptyLine(const QTextCursor &tc) const\n{\n    return atEmptyLine(tc.position());\n}\n\nbool FakeVimHandler::Private::atEmptyLine() const\n{\n    return atEmptyLine(position());\n}\n\nbool FakeVimHandler::Private::atBoundary(bool end, bool simple, bool onlyWords,\n    const QTextCursor &tc) const\n{\n    if (tc.isNull())\n        return atBoundary(end, simple, onlyWords, m_cursor);\n    if (atEmptyLine(tc))\n        return true;\n    int pos = tc.position();\n    QChar c1 = characterAt(pos);\n    QChar c2 = characterAt(pos + (end ? 1 : -1));\n    int thisClass = charClass(c1, simple);\n    return (!onlyWords || thisClass != 0)\n        && (c2.isNull() || c2 == ParagraphSeparator || thisClass != charClass(c2, simple));\n}\n\nbool FakeVimHandler::Private::atWordBoundary(bool end, bool simple, const QTextCursor &tc) const\n{\n    return atBoundary(end, simple, true, tc);\n}\n\nbool FakeVimHandler::Private::atWordStart(bool simple, const QTextCursor &tc) const\n{\n    return atWordBoundary(false, simple, tc);\n}\n\nbool FakeVimHandler::Private::atWordEnd(bool simple, const QTextCursor &tc) const\n{\n    return atWordBoundary(true, simple, tc);\n}\n\nbool FakeVimHandler::Private::isFirstNonBlankOnLine(int pos)\n{\n    for (int i = blockAt(pos).position(); i < pos; ++i) {\n        if (!document()->characterAt(i).isSpace())\n            return false;\n    }\n    return true;\n}\n\nvoid FakeVimHandler::Private::pushUndoState(bool overwrite)\n{\n    if (m_buffer->editBlockLevel != 0 && m_buffer->undoState.isValid())\n        return; // No need to save undo state for inner edit blocks.\n\n    if (m_buffer->undoState.isValid() && !overwrite)\n        return;\n\n    UNDO_DEBUG(\"PUSH UNDO\");\n    int pos = position();\n    if (!isInsertMode()) {\n        if (isVisualMode() || g.submode == DeleteSubMode\n            || (g.submode == ChangeSubMode && g.movetype != MoveLineWise)) {\n            pos = qMin(pos, anchor());\n            if (isVisualLineMode())\n                pos = firstPositionInLine(lineForPosition(pos));\n            else if (isVisualBlockMode())\n                pos = blockAt(pos).position() + qMin(columnAt(anchor()), columnAt(position()));\n        } else if (g.movetype == MoveLineWise && s.startOfLine.value()) {\n            QTextCursor tc = m_cursor;\n            if (g.submode == ShiftLeftSubMode || g.submode == ShiftRightSubMode\n                || g.submode == IndentSubMode) {\n                pos = qMin(pos, anchor());\n            }\n            tc.setPosition(pos);\n            moveToFirstNonBlankOnLine(&tc);\n            pos = qMin(pos, tc.position());\n        }\n    }\n\n    CursorPosition lastChangePosition(document(), pos);\n    setMark('.', lastChangePosition);\n\n    m_buffer->redo.clear();\n    m_buffer->undoState = State(\n                revision(), lastChangePosition, m_buffer->marks,\n                m_buffer->lastVisualMode, m_buffer->lastVisualModeInverted);\n}\n\nvoid FakeVimHandler::Private::moveDown(int n)\n{\n    if (n == 0)\n        return;\n\n    QTextBlock block = m_cursor.block();\n    const int col = position() - block.position();\n\n    int lines = qAbs(n);\n    int position = 0;\n    while (block.isValid()) {\n        position = block.position() + qMax(0, qMin(block.length() - 2, col));\n        if (block.isVisible()) {\n            --lines;\n            if (lines < 0)\n                break;\n        }\n        block = n > 0 ? nextLine(block) : previousLine(block);\n    }\n\n    setPosition(position);\n    moveToTargetColumn();\n    updateScrollOffset();\n}\n\nvoid FakeVimHandler::Private::moveDownVisually(int n)\n{\n    const QTextCursor::MoveOperation moveOperation = (n > 0) ? Down : Up;\n    int count = qAbs(n);\n    int oldPos = m_cursor.position();\n\n    while (count > 0) {\n        m_cursor.movePosition(moveOperation, KeepAnchor, 1);\n        if (oldPos == m_cursor.position())\n            break;\n        oldPos = m_cursor.position();\n        QTextBlock block = m_cursor.block();\n        if (block.isVisible())\n            --count;\n    }\n\n    QTextCursor tc = m_cursor;\n    tc.movePosition(StartOfLine);\n    const int minPos = tc.position();\n    moveToEndOfLineVisually(&tc);\n    const int maxPos = tc.position();\n\n    if (m_targetColumn == -1) {\n        setPosition(maxPos);\n    } else {\n        setPosition(qMin(maxPos, minPos + m_targetColumnWrapped));\n        const int targetColumn = m_targetColumnWrapped;\n        setTargetColumn();\n        m_targetColumnWrapped = targetColumn;\n    }\n\n    if (!isInsertMode() && atEndOfLine())\n        m_cursor.movePosition(Left, KeepAnchor);\n\n    updateScrollOffset();\n}\n\nvoid FakeVimHandler::Private::movePageDown(int count)\n{\n    const int scrollOffset = windowScrollOffset();\n    const int screenLines = linesOnScreen();\n    const int offset = count > 0 ? scrollOffset - 2 : screenLines - scrollOffset + 2;\n    const int value = count * screenLines - cursorLineOnScreen() + offset;\n    moveDown(value);\n\n    if (count > 0)\n        scrollToLine(cursorLine());\n    else\n        scrollToLine(qMax(0, cursorLine() - screenLines + 1));\n}\n\nvoid FakeVimHandler::Private::commitCursor()\n{\n    QTextCursor tc = m_cursor;\n\n    if (isVisualMode()) {\n        int pos = tc.position();\n        int anc = tc.anchor();\n\n        if (isVisualBlockMode()) {\n            const int col1 = columnAt(anc);\n            const int col2 = columnAt(pos);\n            if (col1 > col2)\n                ++anc;\n            else if (!tc.atBlockEnd())\n                ++pos;\n            // FIXME: After '$' command (i.e. m_visualTargetColumn == -1), end of selected lines\n            //        should be selected.\n        } else if (isVisualLineMode()) {\n            const int posLine = lineForPosition(pos);\n            const int ancLine = lineForPosition(anc);\n            if (anc < pos) {\n                pos = lastPositionInLine(posLine);\n                anc = firstPositionInLine(ancLine);\n            } else {\n                pos = firstPositionInLine(posLine);\n                anc = lastPositionInLine(ancLine) + 1;\n            }\n            // putting cursor on folded line will unfold the line, so move the cursor a bit\n            if (!blockAt(pos).isVisible())\n                ++pos;\n        } else if (isVisualCharMode()) {\n            if (anc > pos)\n                ++anc;\n            else if (!editor()->hasFocus() || isCommandLineMode())\n                m_fixCursorTimer.start();\n        }\n\n        tc.setPosition(anc);\n        tc.setPosition(pos, KeepAnchor);\n    } else if (g.subsubmode == SearchSubSubMode && !m_searchCursor.isNull()) {\n        tc = m_searchCursor;\n    } else {\n        tc.clearSelection();\n    }\n\n    updateCursorShape();\n\n    if (isVisualBlockMode()) {\n        q->requestSetBlockSelection(tc);\n    } else  {\n        q->requestDisableBlockSelection();\n        if (editor())\n            EDITOR(setTextCursor(tc));\n    }\n}\n\nvoid FakeVimHandler::Private::pullCursor()\n{\n    if (!m_cursorNeedsUpdate)\n        return;\n\n    m_cursorNeedsUpdate = false;\n\n    QTextCursor oldCursor = m_cursor;\n\n    bool visualBlockMode = false;\n    q->requestHasBlockSelection(&visualBlockMode);\n\n    if (visualBlockMode)\n        q->requestBlockSelection(&m_cursor);\n    else if (editor())\n        m_cursor = editorCursor();\n\n    // Cursor should be always valid.\n    if (m_cursor.isNull())\n        m_cursor = QTextCursor(document());\n\n    if (visualBlockMode)\n        g.visualMode = VisualBlockMode;\n    else if (m_cursor.hasSelection())\n        g.visualMode = VisualCharMode;\n    else\n        g.visualMode = NoVisualMode;\n\n    // Keep visually the text selection same.\n    // With thick text cursor, the character under cursor is treated as selected.\n    if (isVisualCharMode() && hasThinCursor())\n        moveLeft();\n\n    // Cursor position can be after the end of line only in some modes.\n    if (atEndOfLine() && !isVisualMode() && !isInsertMode())\n        moveLeft();\n\n    // Record external jump to different line.\n    if (lineForPosition(position()) != lineForPosition(oldCursor.position()))\n        recordJump(oldCursor.position());\n\n    setTargetColumn();\n}\n\nQTextCursor FakeVimHandler::Private::editorCursor() const\n{\n    QTextCursor tc = EDITOR(textCursor());\n    tc.setVisualNavigation(false);\n    return tc;\n}\n\nbool FakeVimHandler::Private::moveToNextParagraph(int count)\n{\n    const bool forward = count > 0;\n    int repeat = forward ? count : -count;\n    QTextBlock block = this->block();\n\n    if (block.isValid() && block.length() == 1)\n        ++repeat;\n\n    for (; block.isValid(); block = forward ? block.next() : block.previous()) {\n        if (block.length() == 1) {\n            if (--repeat == 0)\n                break;\n            while (block.isValid() && block.length() == 1)\n                block = forward ? block.next() : block.previous();\n            if (!block.isValid())\n                break;\n        }\n    }\n\n    if (!block.isValid())\n        --repeat;\n\n    if (repeat > 0)\n        return false;\n\n    if (block.isValid())\n        setPosition(block.position());\n    else\n        setPosition(forward ? lastPositionInDocument() : 0);\n\n    return true;\n}\n\nvoid FakeVimHandler::Private::moveToParagraphStartOrEnd(int direction)\n{\n    bool emptyLine = atEmptyLine();\n    int oldPos = -1;\n\n    while (atEmptyLine() == emptyLine && oldPos != position()) {\n        oldPos = position();\n        moveDown(direction);\n    }\n\n    if (oldPos != position())\n        moveUp(direction);\n}\n\nvoid FakeVimHandler::Private::moveToEndOfLine()\n{\n    // Additionally select (in visual mode) or apply current command on hidden lines following\n    // the current line.\n    bool onlyVisibleLines = isVisualMode() || g.submode != NoSubMode;\n    const int id = onlyVisibleLines ? lineNumber(block()) : block().blockNumber() + 1;\n    setPosition(lastPositionInLine(id, onlyVisibleLines));\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToEndOfLineVisually()\n{\n    moveToEndOfLineVisually(&m_cursor);\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToEndOfLineVisually(QTextCursor *tc)\n{\n    // Moving to end of line ends up on following line if the line is wrapped.\n    tc->movePosition(StartOfLine);\n    const int minPos = tc->position();\n    tc->movePosition(EndOfLine);\n    int maxPos = tc->position();\n    tc->movePosition(StartOfLine);\n    if (minPos != tc->position())\n        --maxPos;\n    tc->setPosition(maxPos);\n}\n\nvoid FakeVimHandler::Private::moveBehindEndOfLine()\n{\n    q->fold(1, false);\n    int pos = qMin(block().position() + block().length() - 1,\n        lastPositionInDocument() + 1);\n    setPosition(pos);\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToStartOfLine()\n{\n    setPosition(block().position());\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToStartOfLineVisually()\n{\n    m_cursor.movePosition(StartOfLine, KeepAnchor);\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::fixSelection()\n{\n    if (g.rangemode == RangeBlockMode)\n         return;\n\n    if (g.movetype == MoveInclusive) {\n        // If position or anchor is after end of non-empty line, include line break in selection.\n        if (characterAtCursor() == ParagraphSeparator) {\n            if (!atEmptyLine() && !atDocumentEnd()) {\n                setPosition(position() + 1);\n                return;\n            }\n        } else if (characterAt(anchor()) == ParagraphSeparator) {\n            QTextCursor tc = m_cursor;\n            tc.setPosition(anchor());\n            if (!atEmptyLine(tc)) {\n                setAnchorAndPosition(anchor() + 1, position());\n                return;\n            }\n        }\n    }\n\n    if (g.movetype == MoveExclusive && g.subsubmode == NoSubSubMode) {\n        if (anchor() < position() && atBlockStart()) {\n            // Exclusive motion ending at the beginning of line\n            // becomes inclusive and end is moved to end of previous line.\n            g.movetype = MoveInclusive;\n            moveToStartOfLine();\n            moveLeft();\n\n            // Exclusive motion ending at the beginning of line and\n            // starting at or before first non-blank on a line becomes linewise.\n            if (anchor() < block().position() && isFirstNonBlankOnLine(anchor()))\n                g.movetype = MoveLineWise;\n        }\n    }\n\n    if (g.movetype == MoveLineWise)\n        g.rangemode = (g.submode == ChangeSubMode)\n            ? RangeLineModeExclusive\n            : RangeLineMode;\n\n    if (g.movetype == MoveInclusive) {\n        if (anchor() <= position()) {\n            if (!atBlockEnd())\n                setPosition(position() + 1); // correction\n\n            // Omit first character in selection if it's line break on non-empty line.\n            int start = anchor();\n            int end = position();\n            if (afterEndOfLine(document(), start) && start > 0) {\n                start = qMin(start + 1, end);\n                if (g.submode == DeleteSubMode && !atDocumentEnd())\n                    setAnchorAndPosition(start, end + 1);\n                else\n                    setAnchorAndPosition(start, end);\n            }\n\n            // If more than one line is selected and all are selected completely\n            // movement becomes linewise.\n            if (start < block().position() && isFirstNonBlankOnLine(start) && atBlockEnd()) {\n                if (g.submode != ChangeSubMode) {\n                    moveRight();\n                    if (atEmptyLine())\n                        moveRight();\n                }\n                g.movetype = MoveLineWise;\n            }\n        } else if (!m_anchorPastEnd) {\n            setAnchorAndPosition(anchor() + 1, position());\n        }\n    }\n\n    if (m_positionPastEnd) {\n        moveBehindEndOfLine();\n        moveRight();\n        setAnchorAndPosition(anchor(), position());\n    }\n\n    if (m_anchorPastEnd) {\n        const int pos = position();\n        setPosition(anchor());\n        moveBehindEndOfLine();\n        moveRight();\n        setAnchorAndPosition(position(), pos);\n    }\n}\n\nbool FakeVimHandler::Private::finishSearch()\n{\n    if (g.lastSearch.isEmpty()\n        || (!g.currentMessage.isEmpty() && g.currentMessageLevel == MessageError)) {\n        return false;\n    }\n    if (g.submode != NoSubMode)\n        setAnchorAndPosition(m_searchStartPosition, position());\n    return true;\n}\n\nvoid FakeVimHandler::Private::finishMovement(const QString &dotCommandMovement)\n{\n    //dump(\"FINISH MOVEMENT\");\n    if (g.submode == FilterSubMode) {\n        int beginLine = lineForPosition(anchor());\n        int endLine = lineForPosition(position());\n        setPosition(qMin(anchor(), position()));\n        enterExMode(QString(\".,+%1!\").arg(qAbs(endLine - beginLine)));\n        return;\n    }\n\n    if (g.submode == ChangeSubMode\n        || g.submode == DeleteSubMode\n        || g.submode == CommentSubMode\n        || g.submode == ExchangeSubMode\n        || g.submode == ReplaceWithRegisterSubMode\n        || g.submode == AddSurroundingSubMode\n        || g.submode == YankSubMode\n        || g.submode == InvertCaseSubMode\n        || g.submode == DownCaseSubMode\n        || g.submode == UpCaseSubMode\n        || g.submode == IndentSubMode\n        || g.submode == ShiftLeftSubMode\n        || g.submode == ShiftRightSubMode)\n    {\n        fixSelection();\n\n        if (g.submode == ChangeSubMode\n            || g.submode == DeleteSubMode\n            || g.submode == YankSubMode)\n        {\n            yankText(currentRange(), m_register);\n        }\n    }\n\n    if (g.submode == ChangeSubMode) {\n        pushUndoState(false);\n        beginEditBlock();\n        removeText(currentRange());\n        if (g.movetype == MoveLineWise)\n            insertAutomaticIndentation(true);\n        endEditBlock();\n        setTargetColumn();\n    } else if (g.submode == CommentSubMode) {\n        pushUndoState(false);\n        beginEditBlock();\n        toggleComment(currentRange());\n        endEditBlock();\n    } else if (g.submode == AddSurroundingSubMode) {\n        g.subsubmode = SurroundSubSubMode;\n        g.dotCommand = dotCommandMovement;\n\n        // We now only know the region that should be surrounded, but not the actual\n        // character that should surround it. We thus do NOT want to finish the\n        // movement yet here, so we return early.\n        // The next character entered will be used by the SurroundSubSubMode.\n        return;\n    } else if (g.submode == ExchangeSubMode) {\n        exchangeRange(currentRange());\n    } else if (g.submode == ReplaceWithRegisterSubMode && s.emulateReplaceWithRegister.value()) {\n        pushUndoState(false);\n        beginEditBlock();\n        replaceWithRegister(currentRange());\n        endEditBlock();\n    } else if (g.submode == DeleteSubMode) {\n        pushUndoState(false);\n        beginEditBlock();\n        const int pos = position();\n        // Always delete something (e.g. 'dw' on an empty line deletes the line).\n        if (pos == anchor() && g.movetype == MoveInclusive)\n            removeText(Range(pos, pos + 1));\n        else\n            removeText(currentRange());\n        if (g.movetype == MoveLineWise)\n            handleStartOfLine();\n        endEditBlock();\n    } else if (g.submode == YankSubMode) {\n        bool isVisualModeYank = isVisualMode();\n        leaveVisualMode();\n        const QTextCursor tc = m_cursor;\n        if (g.rangemode == RangeBlockMode) {\n            const int pos1 = tc.block().position();\n            const int pos2 = blockAt(tc.anchor()).position();\n            const int col = qMin(tc.position() - pos1, tc.anchor() - pos2);\n            setPosition(qMin(pos1, pos2) + col);\n        } else {\n            setPosition(qMin(position(), anchor()));\n            if (g.rangemode == RangeLineMode) {\n                if (isVisualModeYank)\n                    moveToStartOfLine();\n                else\n                    moveToTargetColumn();\n            }\n        }\n        setTargetColumn();\n    } else if (g.submode == InvertCaseSubMode\n        || g.submode == UpCaseSubMode\n        || g.submode == DownCaseSubMode) {\n        beginEditBlock();\n        if (g.submode == InvertCaseSubMode)\n            invertCase(currentRange());\n        else if (g.submode == DownCaseSubMode)\n            downCase(currentRange());\n        else if (g.submode == UpCaseSubMode)\n            upCase(currentRange());\n        if (g.movetype == MoveLineWise)\n            handleStartOfLine();\n        endEditBlock();\n    } else if (g.submode == IndentSubMode\n        || g.submode == ShiftRightSubMode\n        || g.submode == ShiftLeftSubMode) {\n        recordJump();\n        pushUndoState(false);\n        if (g.submode == IndentSubMode)\n            indentSelectedText();\n        else if (g.submode == ShiftRightSubMode)\n            shiftRegionRight(1);\n        else if (g.submode == ShiftLeftSubMode)\n            shiftRegionLeft(1);\n    }\n\n    if (!dotCommandMovement.isEmpty()) {\n        QString dotCommand = dotCommandFromSubMode(g.submode);\n        if (!dotCommand.isEmpty()) {\n            if (g.submode == ReplaceWithRegisterSubMode)\n                dotCommand = QString(\"\\\"%1%2\").arg(QChar(m_register)).arg(dotCommand);\n\n            setDotCommand(dotCommand + dotCommandMovement);\n        }\n    }\n\n    // Change command continues in insert mode.\n    if (g.submode == ChangeSubMode) {\n        clearCurrentMode();\n        enterInsertMode();\n    } else {\n        leaveCurrentMode();\n    }\n}\n\nvoid FakeVimHandler::Private::leaveCurrentMode()\n{\n    if (isVisualMode())\n        enterCommandMode(g.returnToMode);\n    else if (g.returnToMode == CommandMode)\n        enterCommandMode();\n    else if (g.returnToMode == InsertMode)\n        enterInsertMode();\n    else\n        enterReplaceMode();\n\n    if (isNoVisualMode())\n        setAnchor();\n}\n\nvoid FakeVimHandler::Private::clearCurrentMode()\n{\n    g.submode = NoSubMode;\n    g.subsubmode = NoSubSubMode;\n    g.movetype = MoveInclusive;\n    g.gflag = false;\n    g.surroundUpperCaseS = false;\n    g.surroundFunction.clear();\n    m_register = '\"';\n    g.rangemode = RangeCharMode;\n    g.currentCommand.clear();\n    resetCount();\n}\n\nvoid FakeVimHandler::Private::updateSelection()\n{\n    QList<QTextEdit::ExtraSelection> selections = m_extraSelections;\n    if (s.showMarks.value()) {\n        for (auto it = m_buffer->marks.cbegin(), end = m_buffer->marks.cend(); it != end; ++it) {\n            QTextEdit::ExtraSelection sel;\n            sel.cursor = m_cursor;\n            setCursorPosition(&sel.cursor, it.value().position(document()));\n            sel.cursor.setPosition(sel.cursor.position(), MoveAnchor);\n            sel.cursor.movePosition(Right, KeepAnchor);\n            sel.format = m_cursor.blockCharFormat();\n            sel.format.setForeground(Qt::blue);\n            sel.format.setBackground(Qt::green);\n            selections.append(sel);\n        }\n    }\n    //qDebug() << \"SELECTION: \" << selections;\n    q->selectionChanged(selections);\n}\n\nvoid FakeVimHandler::Private::updateHighlights()\n{\n    if (s.useCoreSearch.value() || !s.hlSearch.value() || g.highlightsCleared) {\n        if (m_highlighted.isEmpty())\n            return;\n        m_highlighted.clear();\n    } else if (m_highlighted != g.lastNeedle) {\n        m_highlighted = g.lastNeedle;\n    } else {\n        return;\n    }\n\n    q->highlightMatches(m_highlighted);\n}\n\nvoid FakeVimHandler::Private::updateMiniBuffer()\n{\n    if (!m_textedit && !m_plaintextedit)\n        return;\n\n    QString msg;\n    int cursorPos = -1;\n    int anchorPos = -1;\n    MessageLevel messageLevel = MessageMode;\n\n    if (!g.mapStates.isEmpty() && g.mapStates.last().silent && g.currentMessageLevel < MessageInfo)\n        g.currentMessage.clear();\n\n    if (g.passing) {\n        msg = \"PASSING\";\n    } else if (g.subsubmode == SearchSubSubMode) {\n        msg = g.searchBuffer.display();\n        if (g.mapStates.isEmpty()) {\n            cursorPos = g.searchBuffer.cursorPos() + 1;\n            anchorPos = g.searchBuffer.anchorPos() + 1;\n        }\n    } else if (g.mode == ExMode) {\n        msg = g.commandBuffer.display();\n        if (g.mapStates.isEmpty()) {\n            cursorPos = g.commandBuffer.cursorPos() + 1;\n            anchorPos = g.commandBuffer.anchorPos() + 1;\n        }\n    } else if (!g.currentMessage.isEmpty()) {\n        msg = g.currentMessage;\n        g.currentMessage.clear();\n        messageLevel = g.currentMessageLevel;\n    } else if (!g.mapStates.isEmpty() && !g.mapStates.last().silent) {\n        // Do not reset previous message when after running a mapped command.\n        return;\n    } else if (g.mode == CommandMode && !g.currentCommand.isEmpty() && s.showCmd.value()) {\n        msg = g.currentCommand;\n        messageLevel = MessageShowCmd;\n    } else if (g.mode == CommandMode && isVisualMode()) {\n        if (isVisualCharMode())\n            msg = \"-- VISUAL --\";\n        else if (isVisualLineMode())\n            msg = \"-- VISUAL LINE --\";\n        else if (isVisualBlockMode())\n            msg = \"VISUAL BLOCK\";\n    } else if (g.mode == InsertMode) {\n        msg = \"-- INSERT --\";\n        if (g.submode == CtrlRSubMode)\n            msg += \" ^R\";\n        else if (g.submode == CtrlVSubMode)\n            msg += \" ^V\";\n    } else if (g.mode == ReplaceMode) {\n        msg = \"-- REPLACE --\";\n    } else {\n        if (g.returnToMode == CommandMode)\n            msg = \"-- COMMAND --\";\n        else if (g.returnToMode == InsertMode)\n            msg = \"-- (insert) --\";\n        else\n            msg = \"-- (replace) --\";\n    }\n\n    if (g.isRecording && msg.startsWith(\"--\"))\n        msg.append(' ').append(\"Recording\");\n\n    q->commandBufferChanged(msg, cursorPos, anchorPos, messageLevel);\n\n    int linesInDoc = linesInDocument();\n    int l = cursorLine();\n    QString status;\n    const QString pos = QString(\"%1,%2\")\n        .arg(l + 1).arg(physicalCursorColumn() + 1);\n    // FIXME: physical \"-\" logical\n    if (linesInDoc != 0)\n        status = Tr::tr(\"%1%2%\").arg(pos, -10).arg(l * 100 / linesInDoc, 4);\n    else\n        status = Tr::tr(\"%1All\").arg(pos, -10);\n    q->statusDataChanged(status);\n}\n\nvoid FakeVimHandler::Private::showMessage(MessageLevel level, const QString &msg)\n{\n    //qDebug() << \"MSG: \" << msg;\n    g.currentMessage = msg;\n    g.currentMessageLevel = level;\n}\n\nvoid FakeVimHandler::Private::notImplementedYet()\n{\n    qDebug() << \"Not implemented in FakeVim\";\n    showMessage(MessageError, Tr::tr(\"Not implemented in FakeVim.\"));\n}\n\nvoid FakeVimHandler::Private::passShortcuts(bool enable)\n{\n    g.passing = enable;\n    updateMiniBuffer();\n    if (enable)\n        QCoreApplication::instance()->installEventFilter(q);\n    else\n        QCoreApplication::instance()->removeEventFilter(q);\n}\n\nbool FakeVimHandler::Private::handleCommandSubSubMode(const Input &input)\n{\n    bool handled = true;\n\n    if (g.subsubmode == FtSubSubMode) {\n        g.semicolonType = g.subsubdata;\n        g.semicolonKey = input.text();\n        handled = handleFfTt(g.semicolonKey);\n        g.subsubmode = NoSubSubMode;\n        if (handled) {\n            finishMovement(QString(\"%1%2%3\")\n                           .arg(count())\n                           .arg(g.semicolonType.text())\n                           .arg(g.semicolonKey));\n        }\n    } else if (g.subsubmode == TextObjectSubSubMode) {\n        // vim-surround treats aw and aW the same as iw and iW, respectively\n        if ((input.is('w') || input.is('W'))\n                && g.submode == AddSurroundingSubMode && g.subsubdata.is('a'))\n            g.subsubdata = Input('i');\n\n        if (input.is('w'))\n            selectWordTextObject(g.subsubdata.is('i'));\n        else if (input.is('W'))\n            selectWORDTextObject(g.subsubdata.is('i'));\n        else if (input.is('s'))\n            selectSentenceTextObject(g.subsubdata.is('i'));\n        else if (input.is('p'))\n            selectParagraphTextObject(g.subsubdata.is('i'));\n        else if (input.is('[') || input.is(']'))\n            handled = selectBlockTextObject(g.subsubdata.is('i'), '[', ']');\n        else if (input.is('(') || input.is(')') || input.is('b'))\n            handled = selectBlockTextObject(g.subsubdata.is('i'), '(', ')');\n        else if (input.is('<') || input.is('>'))\n            handled = selectBlockTextObject(g.subsubdata.is('i'), '<', '>');\n        else if (input.is('{') || input.is('}') || input.is('B'))\n            handled = selectBlockTextObject(g.subsubdata.is('i'), '{', '}');\n        else if (input.is('\"') || input.is('\\'') || input.is('`'))\n            handled = selectQuotedStringTextObject(g.subsubdata.is('i'), input.asChar());\n        else if (input.is('a') && s.emulateArgTextObj.value())\n            handled = selectArgumentTextObject(g.subsubdata.is('i'));\n        else\n            handled = false;\n        g.subsubmode = NoSubSubMode;\n        if (handled) {\n            finishMovement(QString(\"%1%2%3\")\n                           .arg(count())\n                           .arg(g.subsubdata.text())\n                           .arg(input.text()));\n        }\n    } else if (g.subsubmode == MarkSubSubMode) {\n        setMark(input.asChar(), CursorPosition(m_cursor));\n        g.subsubmode = NoSubSubMode;\n    } else if (g.subsubmode == BackTickSubSubMode\n            || g.subsubmode == TickSubSubMode) {\n        handled = jumpToMark(input.asChar(), g.subsubmode == BackTickSubSubMode);\n        if (handled)\n            finishMovement();\n        g.subsubmode = NoSubSubMode;\n    } else if (g.subsubmode == ZSubSubMode) {\n        handled = false;\n        if (input.is('j') || input.is('k')) {\n            int pos = position();\n            q->foldGoTo(input.is('j') ? count() : -count(), false);\n            if (pos != position()) {\n                handled = true;\n                finishMovement(QString(\"%1z%2\")\n                               .arg(count())\n                               .arg(input.text()));\n            }\n        }\n    } else if (g.subsubmode == OpenSquareSubSubMode || g.subsubmode == CloseSquareSubSubMode) {\n        int pos = position();\n        if (input.is('{') && g.subsubmode == OpenSquareSubSubMode)\n            searchBalanced(false, '{', '}');\n        else if (input.is('}') && g.subsubmode == CloseSquareSubSubMode)\n            searchBalanced(true, '}', '{');\n        else if (input.is('(') && g.subsubmode == OpenSquareSubSubMode)\n            searchBalanced(false, '(', ')');\n        else if (input.is(')') && g.subsubmode == CloseSquareSubSubMode)\n            searchBalanced(true, ')', '(');\n        else if (input.is('[') && g.subsubmode == OpenSquareSubSubMode)\n            bracketSearchBackward(&m_cursor, \"^\\\\{\", count());\n        else if (input.is('[') && g.subsubmode == CloseSquareSubSubMode)\n            bracketSearchForward(&m_cursor, \"^\\\\}\", count(), false);\n        else if (input.is(']') && g.subsubmode == OpenSquareSubSubMode)\n            bracketSearchBackward(&m_cursor, \"^\\\\}\", count());\n        else if (input.is(']') && g.subsubmode == CloseSquareSubSubMode)\n            bracketSearchForward(&m_cursor, \"^\\\\{\", count(), g.submode != NoSubMode);\n        else if (input.is('z'))\n            q->foldGoTo(g.subsubmode == OpenSquareSubSubMode ? -count() : count(), true);\n        handled = pos != position();\n        if (handled) {\n            if (lineForPosition(pos) != lineForPosition(position()))\n                recordJump(pos);\n            finishMovement(QString(\"%1%2%3\")\n                           .arg(count())\n                           .arg(g.subsubmode == OpenSquareSubSubMode ? '[' : ']')\n                           .arg(input.text()));\n        }\n    } else if (g.subsubmode == SurroundWithFunctionSubSubMode) {\n        if (input.isReturn()) {\n            pushUndoState(false);\n            beginEditBlock();\n\n            const QString dotCommand = \"ys\" + g.dotCommand + \"f\" + g.surroundFunction + \"<CR>\";\n\n            surroundCurrentRange(Input(')'), g.surroundFunction);\n\n            g.dotCommand = dotCommand;\n\n            endEditBlock();\n            leaveCurrentMode();\n        } else {\n            g.surroundFunction += input.asChar();\n        }\n        return true;\n    } else if (g.subsubmode == SurroundSubSubMode) {\n        if (input.is('f') && g.submode == AddSurroundingSubMode) {\n            g.subsubmode = SurroundWithFunctionSubSubMode;\n            g.commandBuffer.setContents(\"\");\n            return true;\n        }\n\n        pushUndoState(false);\n        beginEditBlock();\n\n        surroundCurrentRange(input);\n\n        endEditBlock();\n        leaveCurrentMode();\n    } else {\n        handled = false;\n    }\n    return handled;\n}\n\nbool FakeVimHandler::Private::handleCount(const Input &input)\n{\n    if (!isInputCount(input))\n        return false;\n    g.mvcount = g.mvcount * 10 + input.text().toInt();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleMovement(const Input &input)\n{\n    bool handled = true;\n    int count = this->count();\n\n    if (handleCount(input)) {\n        return true;\n    } else if (input.is('0')) {\n        g.movetype = MoveExclusive;\n        if (g.gflag)\n            moveToStartOfLineVisually();\n        else\n            moveToStartOfLine();\n        count = 1;\n    } else if (input.is('a') || input.is('i')) {\n        g.subsubmode = TextObjectSubSubMode;\n        g.subsubdata = input;\n    } else if (input.is('^') || input.is('_')) {\n        if (g.gflag)\n            moveToFirstNonBlankOnLineVisually();\n        else\n            moveToFirstNonBlankOnLine();\n        g.movetype = MoveExclusive;\n    } else if (0 && input.is(',')) {\n        // FIXME: fakevim uses ',' by itself, so it is incompatible\n        g.subsubmode = FtSubSubMode;\n        // HACK: toggle 'f' <-> 'F', 't' <-> 'T'\n        //g.subsubdata = g.semicolonType ^ 32;\n        handleFfTt(g.semicolonKey, true);\n        g.subsubmode = NoSubSubMode;\n    } else if (input.is(';')) {\n        g.subsubmode = FtSubSubMode;\n        g.subsubdata = g.semicolonType;\n        handleFfTt(g.semicolonKey, true);\n        g.subsubmode = NoSubSubMode;\n    } else if (input.is('/') || input.is('?')) {\n        g.lastSearchForward = input.is('/');\n        if (s.useCoreSearch.value()) {\n            // reuse the core dialog.\n            g.findPending = true;\n            m_findStartPosition = position();\n            g.movetype = MoveExclusive;\n            setAnchor(); // clear selection: otherwise, search is restricted to selection\n            q->findRequested(!g.lastSearchForward);\n        } else {\n            // FIXME: make core find dialog sufficiently flexible to\n            // produce the \"default vi\" behaviour too. For now, roll our own.\n            g.currentMessage.clear();\n            g.movetype = MoveExclusive;\n            g.subsubmode = SearchSubSubMode;\n            g.searchBuffer.setPrompt(g.lastSearchForward ? '/' : '?');\n            m_searchStartPosition = position();\n            m_searchFromScreenLine = firstVisibleLine();\n            m_searchCursor = QTextCursor();\n            g.searchBuffer.clear();\n        }\n    } else if (input.is('`')) {\n        g.subsubmode = BackTickSubSubMode;\n    } else if (input.is('#') || input.is('*')) {\n        // FIXME: That's not proper vim behaviour\n        QString needle;\n        QTextCursor tc = m_cursor;\n        tc.select(QTextCursor::WordUnderCursor);\n        needle = QRegularExpression::escape(tc.selection().toPlainText());\n        if (!g.gflag) {\n            needle.prepend(\"\\\\<\");\n            needle.append(\"\\\\>\");\n        }\n        setAnchorAndPosition(tc.position(), tc.anchor());\n        g.searchBuffer.historyPush(needle);\n        g.lastSearch = needle;\n        g.lastSearchForward = input.is('*');\n        handled = searchNext();\n    } else if (input.is('\\'')) {\n        g.subsubmode = TickSubSubMode;\n        if (g.submode != NoSubMode)\n            g.movetype = MoveLineWise;\n    } else if (input.is('|')) {\n        moveToStartOfLine();\n        const int column = count - 1;\n        moveRight(qMin(column, rightDist() - 1));\n        m_targetColumn = column;\n        m_visualTargetColumn = column;\n    } else if (input.is('{') || input.is('}')) {\n        const int oldPosition = position();\n        handled = input.is('}')\n            ? moveToNextParagraph(count)\n            : moveToPreviousParagraph(count);\n        if (handled) {\n            recordJump(oldPosition);\n            setTargetColumn();\n            g.movetype = MoveExclusive;\n        }\n    } else if (input.isReturn()) {\n        moveToStartOfLine();\n        moveDown();\n        moveToFirstNonBlankOnLine();\n    } else if (input.is('-')) {\n        moveToStartOfLine();\n        moveUp(count);\n        moveToFirstNonBlankOnLine();\n    } else if (input.is('+')) {\n        moveToStartOfLine();\n        moveDown(count);\n        moveToFirstNonBlankOnLine();\n    } else if (input.isKey(Key_Home)) {\n        moveToStartOfLine();\n    } else if (input.is('$') || input.isKey(Key_End)) {\n        if (g.gflag) {\n            if (count > 1)\n                moveDownVisually(count - 1);\n            moveToEndOfLineVisually();\n        } else {\n            if (count > 1)\n                moveDown(count - 1);\n            moveToEndOfLine();\n        }\n        g.movetype = atEmptyLine() ? MoveExclusive : MoveInclusive;\n        if (g.submode == NoSubMode)\n            m_targetColumn = -1;\n        if (isVisualMode())\n            m_visualTargetColumn = -1;\n    } else if (input.is('%')) {\n        recordJump();\n        if (g.mvcount == 0) {\n            moveToMatchingParanthesis();\n            g.movetype = MoveInclusive;\n        } else {\n            // set cursor position in percentage - formula taken from Vim help\n            setPosition(firstPositionInLine((count * linesInDocument() + 99) / 100));\n            moveToTargetColumn();\n            handleStartOfLine();\n            g.movetype = MoveLineWise;\n        }\n    } else if (input.is('b') || input.isShift(Key_Left)) {\n        moveToNextWordStart(count, false, false);\n    } else if (input.is('B') || input.isControl(Key_Left)) {\n        moveToNextWordStart(count, true, false);\n    } else if (input.is('e') && g.gflag) {\n        moveToNextWordEnd(count, false, false);\n    } else if (input.is('e')) {\n        moveToNextWordEnd(count, false, true, false);\n    } else if (input.is('E') && g.gflag) {\n        moveToNextWordEnd(count, true, false);\n    } else if (input.is('E')) {\n        moveToNextWordEnd(count, true, true, false);\n    } else if (input.isControl('e')) {\n        // FIXME: this should use the \"scroll\" option, and \"count\"\n        if (cursorLineOnScreen() == 0)\n            moveDown(1);\n        scrollDown(1);\n    } else if (input.is('f')) {\n        g.subsubmode = FtSubSubMode;\n        g.movetype = MoveInclusive;\n        g.subsubdata = input;\n    } else if (input.is('F')) {\n        g.subsubmode = FtSubSubMode;\n        g.movetype = MoveExclusive;\n        g.subsubdata = input;\n    } else if (!g.gflag && input.is('g')) {\n        g.gflag = true;\n        return true;\n    } else if (input.is('g') || input.is('G')) {\n        QString dotCommand = QString(\"%1G\").arg(count);\n        recordJump();\n        if (input.is('G') && g.mvcount == 0)\n            dotCommand = \"G\";\n        int n = (input.is('g')) ? 1 : linesInDocument();\n        n = g.mvcount == 0 ? n : count;\n        if (g.submode == NoSubMode || g.submode == ZSubMode\n                || g.submode == CapitalZSubMode || g.submode == RegisterSubMode) {\n            setPosition(firstPositionInLine(n, false));\n            handleStartOfLine();\n        } else {\n            g.movetype = MoveLineWise;\n            g.rangemode = RangeLineMode;\n            setAnchor();\n            setPosition(firstPositionInLine(n, false));\n        }\n        setTargetColumn();\n        updateScrollOffset();\n    } else if (input.is('h') || input.isKey(Key_Left) || input.isBackspace()) {\n        g.movetype = MoveExclusive;\n        int n = qMin(count, leftDist());\n        moveLeft(n);\n    } else if (input.is('H')) {\n        const CursorPosition pos(lineToBlockNumber(lineOnTop(count)), 0);\n        setCursorPosition(&m_cursor, pos);\n        handleStartOfLine();\n    } else if (input.is('j') || input.isKey(Key_Down)\n            || input.isControl('j') || input.isControl('n')) {\n        moveVertically(count);\n    } else if (input.is('k') || input.isKey(Key_Up) || input.isControl('p')) {\n        moveVertically(-count);\n    } else if (input.is('l') || input.isKey(Key_Right) || input.is(' ')) {\n        g.movetype = MoveExclusive;\n        moveRight(qMax(0, qMin(count, rightDist() - (g.submode == NoSubMode))));\n    } else if (input.is('L')) {\n        const CursorPosition pos(lineToBlockNumber(lineOnBottom(count)), 0);\n        setCursorPosition(&m_cursor, pos);\n        handleStartOfLine();\n    } else if (g.gflag && input.is('m')) {\n        const QPoint pos(EDITOR(viewport()->width()) / 2, EDITOR(cursorRect(m_cursor)).y());\n        QTextCursor tc = EDITOR(cursorForPosition(pos));\n        if (!tc.isNull()) {\n            m_cursor = tc;\n            setTargetColumn();\n        }\n    } else if (input.is('M')) {\n        m_cursor = EDITOR(cursorForPosition(QPoint(0, EDITOR(height()) / 2)));\n        handleStartOfLine();\n    } else if (input.is('n') || input.is('N')) {\n        if (s.useCoreSearch.value()) {\n            bool forward = (input.is('n')) ? g.lastSearchForward : !g.lastSearchForward;\n            int pos = position();\n            q->findNextRequested(!forward);\n            if (forward && pos == m_cursor.selectionStart()) {\n                // if cursor is already positioned at the start of a find result, this is returned\n                q->findNextRequested(false);\n            }\n            setPosition(m_cursor.selectionStart());\n        } else {\n            handled = searchNext(input.is('n'));\n        }\n    } else if (input.is('t')) {\n        g.movetype = MoveInclusive;\n        g.subsubmode = FtSubSubMode;\n        g.subsubdata = input;\n    } else if (input.is('T')) {\n        g.movetype = MoveExclusive;\n        g.subsubmode = FtSubSubMode;\n        g.subsubdata = input;\n    } else if (input.is('w') || input.is('W')\n            || input.isShift(Key_Right) || input.isControl(Key_Right)) { // tested\n        // Special case: \"cw\" and \"cW\" work the same as \"ce\" and \"cE\" if the\n        // cursor is on a non-blank - except if the cursor is on the last\n        // character of a word: only the current word will be changed\n        bool simple = input.is('W') || input.isControl(Key_Right);\n        if (g.submode == ChangeSubMode && !characterAtCursor().isSpace()) {\n            moveToWordEnd(count, simple, true);\n        } else {\n            moveToNextWordStart(count, simple, true);\n            // Command 'dw' deletes to the next word on the same line or to end of line.\n            if (g.submode == DeleteSubMode && count == 1) {\n                const QTextBlock currentBlock = blockAt(anchor());\n                setPosition(qMin(position(), currentBlock.position() + currentBlock.length()));\n            }\n        }\n    } else if (input.is('z')) {\n        g.movetype =  MoveLineWise;\n        g.subsubmode = ZSubSubMode;\n    } else if (input.is('[')) {\n        g.subsubmode = OpenSquareSubSubMode;\n    } else if (input.is(']')) {\n        g.subsubmode = CloseSquareSubSubMode;\n    } else if (input.isKey(Key_PageDown) || input.isControl('f')) {\n        movePageDown(count);\n        handleStartOfLine();\n    } else if (input.isKey(Key_PageUp) || input.isControl('b')) {\n        movePageUp(count);\n        handleStartOfLine();\n    } else {\n        handled = false;\n    }\n\n    if (handled && g.subsubmode == NoSubSubMode) {\n        if (g.submode == NoSubMode) {\n            leaveCurrentMode();\n        } else {\n            // finish movement for sub modes\n            const QString dotMovement =\n                (count > 1 ? QString::number(count) : QString())\n                + QLatin1String(g.gflag ? \"g\" : \"\")\n                + input.toString();\n            finishMovement(dotMovement);\n            setTargetColumn();\n        }\n    }\n\n    return handled;\n}\n\nEventResult FakeVimHandler::Private::handleCommandMode(const Input &input)\n{\n    bool handled = false;\n\n    bool clearGflag = g.gflag;\n    bool clearRegister = g.submode != RegisterSubMode;\n    bool clearCount = g.submode != RegisterSubMode && !isInputCount(input);\n\n    // Process input for a sub-mode.\n    if (input.isEscape()) {\n        handled = handleEscape();\n    } else if (m_wasReadOnly) {\n        return EventUnhandled;\n    } else if (g.subsubmode != NoSubSubMode) {\n        handled = handleCommandSubSubMode(input);\n    } else if (g.submode == NoSubMode) {\n        handled = handleNoSubMode(input);\n    } else if (g.submode == ExchangeSubMode) {\n        handled = handleExchangeSubMode(input);\n    } else if (g.submode == ChangeSubMode && input.is('x') && s.emulateExchange.value()) {\n        // Exchange submode is \"cx\", so we need to switch over from ChangeSubMode here\n        g.submode = ExchangeSubMode;\n        handled = true;\n    } else if (g.submode == DeleteSurroundingSubMode\n               || g.submode == ChangeSurroundingSubMode) {\n        handled = handleDeleteChangeSurroundingSubMode(input);\n    } else if (g.submode == AddSurroundingSubMode) {\n        handled = handleAddSurroundingSubMode(input);\n    } else if (g.submode == ChangeSubMode && (input.is('s') || input.is('S'))\n               && s.emulateSurround.value()) {\n        g.submode = ChangeSurroundingSubMode;\n        g.surroundUpperCaseS = input.is('S');\n        handled = true;\n    } else if (g.submode == DeleteSubMode && input.is('s') && s.emulateSurround.value()) {\n        g.submode = DeleteSurroundingSubMode;\n        handled = true;\n    } else if (g.submode == YankSubMode && (input.is('s') || input.is('S'))\n               && s.emulateSurround.value()) {\n        g.submode = AddSurroundingSubMode;\n        g.movetype = MoveInclusive;\n        g.surroundUpperCaseS = input.is('S');\n        handled = true;\n    } else if (g.submode == ChangeSubMode\n        || g.submode == DeleteSubMode\n        || g.submode == YankSubMode) {\n        handled = handleChangeDeleteYankSubModes(input);\n    } else if (g.submode == CommentSubMode && s.emulateVimCommentary.value()) {\n        handled = handleCommentSubMode(input);\n    } else if (g.submode == ReplaceWithRegisterSubMode\n               && s.emulateReplaceWithRegister.value()) {\n        handled = handleReplaceWithRegisterSubMode(input);\n    } else if (g.submode == ReplaceSubMode) {\n        handled = handleReplaceSubMode(input);\n    } else if (g.submode == FilterSubMode) {\n        handled = handleFilterSubMode(input);\n    } else if (g.submode == RegisterSubMode) {\n        handled = handleRegisterSubMode(input);\n    } else if (g.submode == WindowSubMode) {\n        handled = handleWindowSubMode(input);\n    } else if (g.submode == ZSubMode) {\n        handled = handleZSubMode(input);\n    } else if (g.submode == CapitalZSubMode) {\n        handled = handleCapitalZSubMode(input);\n    } else if (g.submode == MacroRecordSubMode) {\n        handled = handleMacroRecordSubMode(input);\n    } else if (g.submode == MacroExecuteSubMode) {\n        handled = handleMacroExecuteSubMode(input);\n    } else if (g.submode == ShiftLeftSubMode\n        || g.submode == ShiftRightSubMode\n        || g.submode == IndentSubMode) {\n        handled = handleShiftSubMode(input);\n    } else if (g.submode == InvertCaseSubMode\n        || g.submode == DownCaseSubMode\n        || g.submode == UpCaseSubMode) {\n        handled = handleChangeCaseSubMode(input);\n    }\n\n    if (!handled && isOperatorPending())\n       handled = handleMovement(input);\n\n    // Clear state and display incomplete command if necessary.\n    if (handled) {\n        bool noMode =\n            (g.mode == CommandMode && g.submode == NoSubMode && g.subsubmode == NoSubSubMode);\n        clearCount = clearCount && noMode && !g.gflag;\n        if (clearCount && clearRegister) {\n            leaveCurrentMode();\n        } else {\n            // Use gflag only for next input.\n            if (clearGflag)\n                g.gflag = false;\n            // Clear [count] and [register] if its no longer needed.\n            if (clearCount)\n                resetCount();\n            // Show or clear current command on minibuffer (showcmd).\n            if (input.isEscape() || g.mode != CommandMode || clearCount)\n                g.currentCommand.clear();\n            else\n                g.currentCommand.append(input.toString());\n        }\n\n        saveLastVisualMode();\n    } else {\n        leaveCurrentMode();\n        //qDebug() << \"IGNORED IN COMMAND MODE: \" << key << text\n        //    << \" VISUAL: \" << g.visualMode;\n\n        // if a key which produces text was pressed, don't mark it as unhandled\n        // - otherwise the text would be inserted while being in command mode\n        if (input.text().isEmpty())\n            handled = false;\n    }\n\n    m_positionPastEnd = (m_visualTargetColumn == -1) && isVisualMode() && !atEmptyLine();\n\n    return handled ? EventHandled : EventCancelled;\n}\n\nbool FakeVimHandler::Private::handleEscape()\n{\n    if (isVisualMode())\n        leaveVisualMode();\n    leaveCurrentMode();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleNoSubMode(const Input &input)\n{\n    bool handled = true;\n\n    const int oldRevision = revision();\n    QString dotCommand = visualDotCommand()\n            + QLatin1String(g.gflag ? \"g\" : \"\")\n            + QString::number(count())\n            + input.toString();\n\n    if (input.is('&')) {\n        handleExCommand(QLatin1String(g.gflag ? \"%s//~/&\" : \"s\"));\n    } else if (input.is(':')) {\n        enterExMode();\n    } else if (input.is('!') && isNoVisualMode()) {\n        g.submode = FilterSubMode;\n    } else if (input.is('!') && isVisualMode()) {\n        enterExMode(QString(\"!\"));\n    } else if (input.is('\"')) {\n        g.submode = RegisterSubMode;\n    } else if (input.is(',')) {\n        passShortcuts(true);\n    } else if (input.is('.')) {\n        //qDebug() << \"REPEATING\" << quoteUnprintable(g.dotCommand) << count()\n        //    << input;\n        dotCommand.clear();\n        QString savedCommand = g.dotCommand;\n        g.dotCommand.clear();\n        beginLargeEditBlock();\n        replay(savedCommand);\n        endEditBlock();\n        leaveCurrentMode();\n        g.dotCommand = savedCommand;\n    } else if (input.is('<') || input.is('>') || input.is('=')) {\n        g.submode = indentModeFromInput(input);\n        if (isVisualMode()) {\n            leaveVisualMode();\n            const int repeat = count();\n            if (g.submode == ShiftLeftSubMode)\n                shiftRegionLeft(repeat);\n            else if (g.submode == ShiftRightSubMode)\n                shiftRegionRight(repeat);\n            else\n                indentSelectedText();\n            g.submode = NoSubMode;\n        } else {\n            setAnchor();\n        }\n    } else if ((!isVisualMode() && input.is('a')) || (isVisualMode() && input.is('A'))) {\n        if (isVisualMode()) {\n            if (!isVisualBlockMode())\n                dotCommand = QString::number(count()) + \"a\";\n            enterVisualInsertMode('A');\n        } else {\n            moveRight(qMin(rightDist(), 1));\n            breakEditBlock();\n            enterInsertMode();\n        }\n    } else if (input.is('A')) {\n        breakEditBlock();\n        moveBehindEndOfLine();\n        setAnchor();\n        enterInsertMode();\n        setTargetColumn();\n    } else if (input.isControl('a')) {\n        changeNumberTextObject(count());\n    } else if (g.gflag && input.is('c') && s.emulateVimCommentary.value()) {\n        if (isVisualMode()) {\n            pushUndoState();\n\n            QTextCursor start(m_cursor);\n            QTextCursor end(start);\n            end.setPosition(end.anchor());\n\n            const int count = qAbs(start.blockNumber() - end.blockNumber());\n            if (count == 0) {\n                dotCommand = \"gcc\";\n            } else {\n                dotCommand = QString(\"gc%1j\").arg(count);\n            }\n\n            leaveVisualMode();\n            toggleComment(currentRange());\n\n            g.submode = NoSubMode;\n        } else {\n            g.movetype = MoveLineWise;\n            g.submode = CommentSubMode;\n            pushUndoState();\n            setAnchor();\n        }\n    } else if (g.gflag && input.is('r') && s.emulateReplaceWithRegister.value()) {\n        g.submode = ReplaceWithRegisterSubMode;\n        if (isVisualMode()) {\n            dotCommand = visualDotCommand() + QString::number(count()) + \"gr\";\n            pasteText(true);\n        } else {\n            setAnchor();\n        }\n    } else if ((input.is('c') || input.is('d') || input.is('y')) && isNoVisualMode()) {\n        setAnchor();\n        g.opcount = g.mvcount;\n        g.mvcount = 0;\n        g.rangemode = RangeCharMode;\n        g.movetype = MoveExclusive;\n        g.submode = changeDeleteYankModeFromInput(input);\n    } else if ((input.is('c') || input.is('C') || input.is('s') || input.is('R'))\n          && (isVisualCharMode() || isVisualLineMode())) {\n        leaveVisualMode();\n        g.submode = ChangeSubMode;\n        finishMovement();\n    } else if ((input.is('c') || input.is('s')) && isVisualBlockMode()) {\n        resetCount();\n        enterVisualInsertMode(input.asChar());\n    } else if (input.is('C')) {\n        handleAs(\"%1c$\");\n    } else if (input.isControl('c')) {\n        if (isNoVisualMode()) {\n#if defined(Q_OS_MACOS)\n            showMessage(MessageInfo, Tr::tr(\"Type Meta-Shift-Y, Meta-Shift-Y to quit FakeVim mode.\"));\n#else\n            showMessage(MessageInfo, Tr::tr(\"Type Alt-Y, Alt-Y to quit FakeVim mode.\"));\n#endif\n        } else {\n            leaveVisualMode();\n        }\n    } else if ((input.is('d') || input.is('x') || input.isKey(Key_Delete))\n            && isVisualMode()) {\n        cutSelectedText();\n    } else if (input.is('D') && isNoVisualMode()) {\n        handleAs(\"%1d$\");\n    } else if ((input.is('D') || input.is('X')) && isVisualMode()) {\n        if (isVisualCharMode())\n            toggleVisualMode(VisualLineMode);\n        if (isVisualBlockMode() && input.is('D'))\n            m_visualTargetColumn = -1;\n        cutSelectedText();\n    } else if (input.isControl('d')) {\n        const int scrollOffset = windowScrollOffset();\n        int sline = cursorLine() < scrollOffset ? scrollOffset : cursorLineOnScreen();\n        // FIXME: this should use the \"scroll\" option, and \"count\"\n        moveDown(linesOnScreen() / 2);\n        handleStartOfLine();\n        scrollToLine(cursorLine() - sline);\n    } else if (!g.gflag && input.is('g')) {\n        g.gflag = true;\n    } else if (!isVisualMode() && (input.is('i') || input.isKey(Key_Insert))) {\n        breakEditBlock();\n        enterInsertMode();\n        if (atEndOfLine())\n            moveLeft();\n    } else if (input.is('I')) {\n        if (isVisualMode()) {\n            if (!isVisualBlockMode())\n                dotCommand = QString::number(count()) + \"i\";\n            enterVisualInsertMode('I');\n        } else {\n            if (g.gflag)\n                moveToStartOfLine();\n            else\n                moveToFirstNonBlankOnLine();\n            breakEditBlock();\n            enterInsertMode();\n        }\n    } else if (input.isControl('i')) {\n        jump(count());\n    } else if (input.is('J')) {\n        pushUndoState();\n        moveBehindEndOfLine();\n        beginEditBlock();\n        if (g.submode == NoSubMode)\n            joinLines(count(), g.gflag);\n        endEditBlock();\n    } else if (input.isControl('l')) {\n        // screen redraw. should not be needed\n    } else if (!g.gflag && input.is('m')) {\n        g.subsubmode = MarkSubSubMode;\n    } else if (isVisualMode() && (input.is('o') || input.is('O'))) {\n        int pos = position();\n        setAnchorAndPosition(pos, anchor());\n        std::swap(m_positionPastEnd, m_anchorPastEnd);\n        setTargetColumn();\n        if (m_positionPastEnd)\n            m_visualTargetColumn = -1;\n    } else if (input.is('o') || input.is('O')) {\n        bool insertAfter = input.is('o');\n        pushUndoState();\n\n        // Prepend line only if on the first line and command is 'O'.\n        bool appendLine = true;\n        if (!insertAfter) {\n            if (block().blockNumber() == 0)\n                appendLine = false;\n            else\n                moveUp();\n        }\n        const int line = lineNumber(block());\n\n        beginEditBlock();\n        enterInsertMode();\n        setPosition(appendLine ? lastPositionInLine(line) : firstPositionInLine(line));\n        clearLastInsertion();\n        setAnchor();\n        insertNewLine();\n        if (appendLine) {\n            m_buffer->insertState.newLineBefore = true;\n        } else {\n            moveUp();\n            m_buffer->insertState.pos1 = position();\n            m_buffer->insertState.newLineAfter = true;\n        }\n        setTargetColumn();\n        endEditBlock();\n\n        // Close accidentally opened block.\n        if (block().blockNumber() > 0) {\n            moveUp();\n            if (line != lineNumber(block()))\n                q->fold(1, true);\n            moveDown();\n        }\n    } else if (input.isControl('o')) {\n        jump(-count());\n    } else if (input.is('p') || input.is('P') || input.isShift(Qt::Key_Insert)) {\n        dotCommand = QString(\"\\\"%1%2%3\").arg(QChar(m_register)).arg(count()).arg(input.asChar());\n\n        pasteText(!input.is('P'));\n        setTargetColumn();\n        finishMovement();\n    } else if (input.is('q')) {\n        if (g.isRecording) {\n            // Stop recording.\n            stopRecording();\n        } else {\n            // Recording shouldn't work in mapping or while executing register.\n            handled = g.mapStates.empty();\n            if (handled)\n                g.submode = MacroRecordSubMode;\n        }\n    } else if (input.is('r')) {\n        g.submode = ReplaceSubMode;\n    } else if (!isVisualMode() && input.is('R')) {\n        pushUndoState();\n        breakEditBlock();\n        enterReplaceMode();\n    } else if (input.isControl('r')) {\n        dotCommand.clear();\n        int repeat = count();\n        while (--repeat >= 0)\n            redo();\n    } else if (input.is('S') && isVisualMode() && s.emulateSurround.value()) {\n        g.submode = AddSurroundingSubMode;\n        g.subsubmode = SurroundSubSubMode;\n    } else if (input.is('s')) {\n        handleAs(\"c%1l\");\n    } else if (input.is('S')) {\n        handleAs(\"%1cc\");\n    } else if (g.gflag && input.is('t')) {\n        handleExCommand(\"tabnext\");\n    } else if (g.gflag && input.is('T')) {\n        handleExCommand(\"tabprevious\");\n    } else if (input.isControl('t')) {\n        handleExCommand(\"pop\");\n    } else if (!g.gflag && input.is('u') && !isVisualMode()) {\n        dotCommand.clear();\n        int repeat = count();\n        while (--repeat >= 0)\n            undo();\n    } else if (input.isControl('u')) {\n        int sline = cursorLineOnScreen();\n        // FIXME: this should use the \"scroll\" option, and \"count\"\n        moveUp(linesOnScreen() / 2);\n        handleStartOfLine();\n        scrollToLine(cursorLine() - sline);\n    } else if (g.gflag && input.is('v')) {\n        if (isNoVisualMode()) {\n            CursorPosition from = markLessPosition();\n            CursorPosition to = markGreaterPosition();\n            if (m_buffer->lastVisualModeInverted)\n                std::swap(from, to);\n            toggleVisualMode(m_buffer->lastVisualMode);\n            setCursorPosition(from);\n            setAnchor();\n            setCursorPosition(to);\n            setTargetColumn();\n        }\n    } else if (input.is('v')) {\n        toggleVisualMode(VisualCharMode);\n    } else if (input.is('V')) {\n        toggleVisualMode(VisualLineMode);\n    } else if (input.isControl('v')) {\n        toggleVisualMode(VisualBlockMode);\n    } else if (input.isControl('w')) {\n        g.submode = WindowSubMode;\n    } else if (input.is('x') && isNoVisualMode()) {\n        handleAs(\"%1dl\");\n    } else if (input.isControl('x')) {\n        changeNumberTextObject(-count());\n    } else if (input.is('X')) {\n        handleAs(\"%1dh\");\n    } else if (input.is('Y') && isNoVisualMode())  {\n        handleAs(\"%1yy\");\n    } else if (input.isControl('y')) {\n        // FIXME: this should use the \"scroll\" option, and \"count\"\n        if (cursorLineOnScreen() == linesOnScreen() - 1)\n            moveUp(1);\n        scrollUp(1);\n    } else if (input.is('y') && isVisualCharMode()) {\n        g.rangemode = RangeCharMode;\n        g.movetype = MoveInclusive;\n        g.submode = YankSubMode;\n        finishMovement();\n    } else if ((input.is('y') && isVisualLineMode())\n            || (input.is('Y') && isVisualLineMode())\n            || (input.is('Y') && isVisualCharMode())) {\n        g.rangemode = RangeLineMode;\n        g.movetype = MoveLineWise;\n        g.submode = YankSubMode;\n        finishMovement();\n    } else if ((input.is('y') || input.is('Y')) && isVisualBlockMode()) {\n        g.rangemode = RangeBlockMode;\n        g.movetype = MoveInclusive;\n        g.submode = YankSubMode;\n        finishMovement();\n    } else if (input.is('z')) {\n        g.submode = ZSubMode;\n    } else if (input.is('Z')) {\n        g.submode = CapitalZSubMode;\n    } else if ((input.is('~') || input.is('u') || input.is('U'))) {\n        g.movetype = MoveExclusive;\n        g.submode = letterCaseModeFromInput(input);\n        pushUndoState();\n        if (isVisualMode()) {\n            leaveVisualMode();\n            finishMovement();\n        } else if (g.gflag || (g.submode == InvertCaseSubMode && s.tildeOp.value())) {\n            if (atEndOfLine())\n                moveLeft();\n            setAnchor();\n        } else {\n            const QString movementCommand = QString(\"%1l%1l\").arg(count());\n            handleAs(\"g\" + input.toString() + movementCommand);\n        }\n    } else if (input.is('@')) {\n        g.submode = MacroExecuteSubMode;\n    } else if (input.isKey(Key_Delete)) {\n        setAnchor();\n        moveRight(qMin(1, rightDist()));\n        removeText(currentRange());\n        if (atEndOfLine())\n            moveLeft();\n    } else if (input.isControl(Key_BracketRight)) {\n        handleExCommand(\"tag\");\n    } else if (handleMovement(input)) {\n        // movement handled\n        dotCommand.clear();\n    } else {\n        handled = false;\n    }\n\n    // Set dot command if the current input changed document or entered insert mode.\n    if (handled && !dotCommand.isEmpty() && (oldRevision != revision() || isInsertMode()))\n        setDotCommand(dotCommand);\n\n    return handled;\n}\n\nbool FakeVimHandler::Private::handleChangeDeleteYankSubModes(const Input &input)\n{\n    if (g.submode != changeDeleteYankModeFromInput(input))\n        return false;\n\n    handleChangeDeleteYankSubModes();\n\n    return true;\n}\n\nvoid FakeVimHandler::Private::handleChangeDeleteYankSubModes()\n{\n    g.movetype = MoveLineWise;\n\n    const QString dotCommand = dotCommandFromSubMode(g.submode);\n\n    if (!dotCommand.isEmpty())\n        pushUndoState();\n\n    const int anc = firstPositionInLine(cursorLine() + 1);\n    moveDown(count() - 1);\n    const int pos = lastPositionInLine(cursorLine() + 1);\n    setAnchorAndPosition(anc, pos);\n\n    if (!dotCommand.isEmpty())\n        setDotCommand(QString(\"%2%1%1\").arg(dotCommand), count());\n\n    finishMovement();\n\n    g.submode = NoSubMode;\n}\n\nbool FakeVimHandler::Private::handleReplaceSubMode(const Input &input)\n{\n    bool handled = true;\n\n    const QChar c = input.asChar();\n    setDotCommand(visualDotCommand() + 'r' + c);\n    if (isVisualMode()) {\n        pushUndoState();\n        leaveVisualMode();\n        Range range = currentRange();\n        if (g.rangemode == RangeCharMode)\n            ++range.endPos;\n        // Replace each character but preserve lines.\n        transformText(range, [&c](const QString &text) {\n            return QString(text).replace(QRegularExpression(\"[^\\\\n]\"), c);\n        });\n    } else if (count() <= rightDist()) {\n        pushUndoState();\n        setAnchor();\n        moveRight(count());\n        Range range = currentRange();\n        if (input.isReturn()) {\n            beginEditBlock();\n            replaceText(range, QString());\n            insertText(QString(\"\\n\"));\n            endEditBlock();\n        } else {\n            replaceText(range, QString(count(), c));\n            moveRight(count() - 1);\n        }\n        setTargetColumn();\n        setDotCommand(\"%1r\" + input.text(), count());\n    } else {\n        handled = false;\n    }\n    g.submode = NoSubMode;\n    finishMovement();\n\n    return handled;\n}\n\nbool FakeVimHandler::Private::handleCommentSubMode(const Input &input)\n{\n    if (!input.is('c'))\n        return false;\n\n    g.movetype = MoveLineWise;\n\n    const int anc = firstPositionInLine(cursorLine() + 1);\n    moveDown(count() - 1);\n    const int pos = lastPositionInLine(cursorLine() + 1);\n    setAnchorAndPosition(anc, pos);\n\n    setDotCommand(QString(\"%1gcc\").arg(count()));\n\n    finishMovement();\n\n    g.submode = NoSubMode;\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleReplaceWithRegisterSubMode(const Input &input)\n{\n    if (!input.is('r'))\n        return false;\n\n    pushUndoState(false);\n    beginEditBlock();\n\n    const QString movement = (count() == 1)\n                             ? QString() : (QString::number(count() - 1) + \"j\");\n\n    g.dotCommand = \"V\" + movement + \"gr\";\n    replay(g.dotCommand);\n\n    endEditBlock();\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExchangeSubMode(const Input &input)\n{\n    if (input.is('c')) { // cxc\n        g.exchangeRange.reset();\n        g.submode = NoSubMode;\n        return true;\n    }\n\n    if (input.is('x')) { // cxx\n        setAnchorAndPosition(firstPositionInLine(cursorLine() + 1),\n                             lastPositionInLine(cursorLine() + 1) + 1);\n\n        setDotCommand(\"cxx\");\n\n        finishMovement();\n\n        g.submode = NoSubMode;\n\n        return true;\n    }\n\n    return false;\n}\n\nbool FakeVimHandler::Private::handleDeleteChangeSurroundingSubMode(const Input &input)\n{\n    if (g.submode != ChangeSurroundingSubMode && g.submode != DeleteSurroundingSubMode)\n        return false;\n\n    bool handled = false;\n\n    if (input.is('(') || input.is(')') || input.is('b')) {\n        handled = selectBlockTextObject(false, '(', ')');\n    } else if (input.is('{') || input.is('}') || input.is('B')) {\n        handled = selectBlockTextObject(false, '{', '}');\n    } else if (input.is('[') || input.is(']')) {\n        handled = selectBlockTextObject(false, '[', ']');\n    } else if (input.is('<') || input.is('>') || input.is('t')) {\n        handled = selectBlockTextObject(false, '<', '>');\n    } else if (input.is('\"') || input.is('\\'') || input.is('`')) {\n        handled = selectQuotedStringTextObject(false, input.asChar());\n    }\n\n    if (handled) {\n        if (g.submode == DeleteSurroundingSubMode) {\n            pushUndoState(false);\n            beginEditBlock();\n\n            // Surround is always one character, so just delete the first and last one\n            transformText(currentRange(), [](const QString &text) {\n                return text.mid(1, text.size() - 2);\n            });\n\n            endEditBlock();\n            clearCurrentMode();\n\n            g.dotCommand = \"ds\" + input.asChar();\n        } else if (g.submode == ChangeSurroundingSubMode) {\n            g.subsubmode = SurroundSubSubMode;\n        }\n    }\n\n    return handled;\n}\n\nbool FakeVimHandler::Private::handleAddSurroundingSubMode(const Input &input)\n{\n    if (!input.is('s'))\n        return false;\n\n    g.subsubmode = SurroundSubSubMode;\n\n    int anc = firstPositionInLine(cursorLine() + 1);\n    const int pos = lastPositionInLine(cursorLine() + 1);\n\n    // Ignore leading spaces\n    while ((characterAt(anc) == ' ' || characterAt(anc) == '\\t') && anc != pos) {\n        anc++;\n    }\n\n    setAnchorAndPosition(anc, pos);\n\n    finishMovement(\"s\");\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleFilterSubMode(const Input &)\n{\n    return false;\n}\n\nbool FakeVimHandler::Private::handleRegisterSubMode(const Input &input)\n{\n    bool handled = false;\n\n    QChar reg = input.asChar();\n    if (QString(\"*+.%#:-\\\"_\").contains(reg) || reg.isLetterOrNumber()) {\n        m_register = reg.unicode();\n        handled = true;\n    }\n    g.submode = NoSubMode;\n\n    return handled;\n}\n\nbool FakeVimHandler::Private::handleShiftSubMode(const Input &input)\n{\n    if (g.submode != indentModeFromInput(input))\n        return false;\n\n    g.movetype = MoveLineWise;\n    pushUndoState();\n    moveDown(count() - 1);\n    setDotCommand(QString(\"%2%1%1\").arg(input.asChar()), count());\n    finishMovement();\n    g.submode = NoSubMode;\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleChangeCaseSubMode(const Input &input)\n{\n    if (g.submode != letterCaseModeFromInput(input))\n        return false;\n\n    if (!isFirstNonBlankOnLine(position())) {\n        moveToStartOfLine();\n        moveToFirstNonBlankOnLine();\n    }\n    setTargetColumn();\n    pushUndoState();\n    setAnchor();\n    setPosition(lastPositionInLine(cursorLine() + count()) + 1);\n    finishMovement(QString(\"%1%2\").arg(count()).arg(input.raw()));\n    g.submode = NoSubMode;\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleWindowSubMode(const Input &input)\n{\n    if (handleCount(input))\n        return true;\n\n    leaveVisualMode();\n    leaveCurrentMode();\n    q->windowCommandRequested(input.toString(), count());\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleZSubMode(const Input &input)\n{\n    bool handled = true;\n    bool foldMaybeClosed = false;\n    if (input.isReturn() || input.is('t')\n        || input.is('-') || input.is('b')\n        || input.is('.') || input.is('z')) {\n        // Cursor line to top/center/bottom of window.\n        Qt::AlignmentFlag align;\n        if (input.isReturn() || input.is('t'))\n            align = Qt::AlignTop;\n        else if (input.is('.') || input.is('z'))\n            align = Qt::AlignVCenter;\n        else\n            align = Qt::AlignBottom;\n        const bool moveToNonBlank = (input.is('.') || input.isReturn() || input.is('-'));\n        const int line = g.mvcount == 0 ? -1 : firstPositionInLine(count());\n        alignViewportToCursor(align, line, moveToNonBlank);\n    } else if (input.is('o') || input.is('c')) {\n        // Open/close current fold.\n        foldMaybeClosed = input.is('c');\n        q->fold(count(), foldMaybeClosed);\n    } else if (input.is('O') || input.is('C')) {\n        // Recursively open/close current fold.\n        foldMaybeClosed = input.is('C');\n        q->fold(-1, foldMaybeClosed);\n    } else if (input.is('a') || input.is('A')) {\n        // Toggle current fold.\n        foldMaybeClosed = true;\n        q->foldToggle(input.is('a') ? count() : -1);\n    } else if (input.is('R') || input.is('M')) {\n        // Open/close all folds in document.\n        foldMaybeClosed = input.is('M');\n        q->foldAll(foldMaybeClosed);\n    } else if (input.is('j') || input.is('k')) {\n        q->foldGoTo(input.is('j') ? count() : -count(), false);\n    } else {\n        handled = false;\n    }\n    if (foldMaybeClosed)\n        ensureCursorVisible();\n    g.submode = NoSubMode;\n    return handled;\n}\n\nbool FakeVimHandler::Private::handleCapitalZSubMode(const Input &input)\n{\n    // Recognize ZZ and ZQ as aliases for \":x\" and \":q!\".\n    bool handled = true;\n    if (input.is('Z'))\n        handleExCommand(\"x\");\n    else if (input.is('Q'))\n        handleExCommand(\"q!\");\n    else\n        handled = false;\n    g.submode = NoSubMode;\n    return handled;\n}\n\nbool FakeVimHandler::Private::handleMacroRecordSubMode(const Input &input)\n{\n    g.submode = NoSubMode;\n    return startRecording(input);\n}\n\nbool FakeVimHandler::Private::handleMacroExecuteSubMode(const Input &input)\n{\n    g.submode = NoSubMode;\n\n    bool result = true;\n    int repeat = count();\n    while (result && --repeat >= 0)\n        result = executeRegister(input.asChar().unicode());\n\n    return result;\n}\n\nEventResult FakeVimHandler::Private::handleInsertOrReplaceMode(const Input &input)\n{\n    if (position() < m_buffer->insertState.pos1 || position() > m_buffer->insertState.pos2) {\n        commitInsertState();\n        invalidateInsertState();\n    }\n\n    if (g.mode == InsertMode)\n        handleInsertMode(input);\n    else\n        handleReplaceMode(input);\n\n    if (!m_textedit && !m_plaintextedit)\n        return EventHandled;\n\n    if (!isInsertMode() || m_buffer->breakEditBlock\n            || position() < m_buffer->insertState.pos1 || position() > m_buffer->insertState.pos2) {\n        commitInsertState();\n        invalidateInsertState();\n        breakEditBlock();\n        m_visualBlockInsert = NoneBlockInsertMode;\n    }\n\n    // We don't want fancy stuff in insert mode.\n    return EventHandled;\n}\n\nvoid FakeVimHandler::Private::handleReplaceMode(const Input &input)\n{\n    if (input.isEscape()) {\n        commitInsertState();\n        moveLeft(qMin(1, leftDist()));\n        enterCommandMode();\n        g.dotCommand.append(m_buffer->lastInsertion + \"<ESC>\");\n    } else if (input.isKey(Key_Left)) {\n        moveLeft();\n    } else if (input.isKey(Key_Right)) {\n        moveRight();\n    } else if (input.isKey(Key_Up)) {\n        moveUp();\n    } else if (input.isKey(Key_Down)) {\n        moveDown();\n    } else if (input.isKey(Key_Insert)) {\n        g.mode = InsertMode;\n    } else if (input.isControl('o')) {\n        enterCommandMode(ReplaceMode);\n    } else {\n        joinPreviousEditBlock();\n        if (!atEndOfLine()) {\n            setAnchor();\n            moveRight();\n            removeText(currentRange());\n        }\n        const QString text = input.text();\n        setAnchor();\n        insertText(text);\n        setTargetColumn();\n        endEditBlock();\n    }\n}\n\nvoid FakeVimHandler::Private::finishInsertMode()\n{\n    bool newLineAfter = m_buffer->insertState.newLineAfter;\n    bool newLineBefore = m_buffer->insertState.newLineBefore;\n\n    // Repeat insertion [count] times.\n    // One instance was already physically inserted while typing.\n    if (!m_buffer->breakEditBlock && isInsertStateValid()) {\n        commitInsertState();\n\n        QString text = m_buffer->lastInsertion;\n        const QString dotCommand = g.dotCommand;\n        const int repeat = count() - 1;\n        m_buffer->lastInsertion.clear();\n        joinPreviousEditBlock();\n\n        if (newLineAfter) {\n            text.chop(1);\n            text.prepend(\"<END>\\n\");\n        } else if (newLineBefore) {\n            text.prepend(\"<END>\");\n        }\n\n        replay(text, repeat);\n\n        if (m_visualBlockInsert != NoneBlockInsertMode && !text.contains('\\n')) {\n            const CursorPosition lastAnchor = markLessPosition();\n            const CursorPosition lastPosition = markGreaterPosition();\n            const bool change = m_visualBlockInsert == ChangeBlockInsertMode;\n            const int insertColumn = (m_visualBlockInsert == InsertBlockInsertMode || change)\n                    ? qMin(lastPosition.column, lastAnchor.column)\n                    : qMax(lastPosition.column, lastAnchor.column) + 1;\n\n            CursorPosition pos(lastAnchor.line, insertColumn);\n\n            if (change)\n                pos.column = columnAt(m_buffer->insertState.pos1);\n\n            // Cursor position after block insert is on the first selected line,\n            // last selected column for 's' command, otherwise first selected column.\n            const int endColumn = change ? qMax(0, m_cursor.positionInBlock() - 1)\n                                         : qMin(lastPosition.column, lastAnchor.column);\n\n            while (pos.line < lastPosition.line) {\n                ++pos.line;\n                setCursorPosition(&m_cursor, pos);\n                if (m_visualBlockInsert == AppendToEndOfLineBlockInsertMode) {\n                    moveToEndOfLine();\n                } else if (m_visualBlockInsert == AppendBlockInsertMode) {\n                    // Prepend spaces if necessary.\n                    int spaces = pos.column - m_cursor.positionInBlock();\n                    if (spaces > 0) {\n                        setAnchor();\n                        m_cursor.insertText(QString(\" \").repeated(spaces));\n                    }\n                } else if (m_cursor.positionInBlock() != pos.column) {\n                    continue;\n                }\n                replay(text, repeat + 1);\n            }\n\n            setCursorPosition(CursorPosition(lastAnchor.line, endColumn));\n        } else {\n            moveLeft(qMin(1, leftDist()));\n        }\n\n        endEditBlock();\n        breakEditBlock();\n\n        m_buffer->lastInsertion = text;\n        g.dotCommand = dotCommand;\n    } else {\n        moveLeft(qMin(1, leftDist()));\n    }\n\n    if (newLineBefore || newLineAfter)\n        m_buffer->lastInsertion.remove(0, m_buffer->lastInsertion.indexOf('\\n') + 1);\n    g.dotCommand.append(m_buffer->lastInsertion + \"<ESC>\");\n\n    setTargetColumn();\n    enterCommandMode();\n}\n\nvoid FakeVimHandler::Private::handleInsertMode(const Input &input)\n{\n    if (input.isEscape()) {\n        if (g.submode == CtrlRSubMode || g.submode == CtrlVSubMode) {\n            g.submode = NoSubMode;\n            g.subsubmode = NoSubSubMode;\n            updateMiniBuffer();\n        } else {\n            finishInsertMode();\n        }\n    } else if (g.submode == CtrlRSubMode) {\n        m_cursor.insertText(registerContents(input.asChar().unicode()));\n        g.submode = NoSubMode;\n    } else if (g.submode == CtrlVSubMode) {\n        if (g.subsubmode == NoSubSubMode) {\n            g.subsubmode = CtrlVUnicodeSubSubMode;\n            m_ctrlVAccumulator = 0;\n            if (input.is('x') || input.is('X')) {\n                // ^VXnn or ^Vxnn with 00 <= nn <= FF\n                // BMP Unicode codepoints ^Vunnnn with 0000 <= nnnn <= FFFF\n                // any Unicode codepoint ^VUnnnnnnnn with 00000000 <= nnnnnnnn <= 7FFFFFFF\n                // ^Vnnn with 000 <= nnn <= 255\n                // ^VOnnn or ^Vonnn with 000 <= nnn <= 377\n                m_ctrlVLength = 2;\n                m_ctrlVBase = 16;\n            } else if (input.is('O') || input.is('o')) {\n                m_ctrlVLength = 3;\n                m_ctrlVBase = 8;\n            } else if (input.is('u')) {\n                m_ctrlVLength = 4;\n                m_ctrlVBase = 16;\n            } else if (input.is('U')) {\n                m_ctrlVLength = 8;\n                m_ctrlVBase = 16;\n            } else if (input.isDigit()) {\n                bool ok;\n                m_ctrlVAccumulator = input.toInt(&ok, 10);\n                m_ctrlVLength = 2;\n                m_ctrlVBase = 10;\n            } else {\n                insertInInsertMode(input.raw());\n                g.submode = NoSubMode;\n                g.subsubmode = NoSubSubMode;\n            }\n        } else {\n            bool ok;\n            int current = input.toInt(&ok, m_ctrlVBase);\n            if (ok)\n                m_ctrlVAccumulator = m_ctrlVAccumulator * m_ctrlVBase + current;\n            --m_ctrlVLength;\n            if (m_ctrlVLength == 0 || !ok) {\n                QString s;\n                if (QChar::requiresSurrogates(m_ctrlVAccumulator)) {\n                    s.append(QChar(QChar::highSurrogate(m_ctrlVAccumulator)));\n                    s.append(QChar(QChar::lowSurrogate(m_ctrlVAccumulator)));\n                } else {\n                    s.append(QChar(m_ctrlVAccumulator));\n                }\n                insertInInsertMode(s);\n                g.submode = NoSubMode;\n                g.subsubmode = NoSubSubMode;\n\n                // Try again without Ctrl-V interpretation.\n                if (!ok)\n                    handleInsertMode(input);\n            }\n        }\n    } else if (input.isControl('o')) {\n        enterCommandMode(InsertMode);\n    } else if (input.isControl('v')) {\n        g.submode = CtrlVSubMode;\n        g.subsubmode = NoSubSubMode;\n        updateMiniBuffer();\n    } else if (input.isControl('r')) {\n        g.submode = CtrlRSubMode;\n        g.subsubmode = NoSubSubMode;\n        updateMiniBuffer();\n    } else if (input.isControl('w')) {\n        const int blockNumber = m_cursor.blockNumber();\n        const int endPos = position();\n        moveToNextWordStart(1, false, false);\n        if (blockNumber != m_cursor.blockNumber())\n            moveToEndOfLine();\n        const int beginPos = position();\n        Range range(beginPos, endPos, RangeCharMode);\n        removeText(range);\n    } else if (input.isControl('u')) {\n        const int blockNumber = m_cursor.blockNumber();\n        const int endPos = position();\n        moveToStartOfLine();\n        if (blockNumber != m_cursor.blockNumber())\n            moveToEndOfLine();\n        const int beginPos = position();\n        Range range(beginPos, endPos, RangeCharMode);\n        removeText(range);\n    } else if (input.isKey(Key_Insert)) {\n        g.mode = ReplaceMode;\n    } else if (input.isKey(Key_Left)) {\n        moveLeft();\n    } else if (input.isShift(Key_Left) || input.isControl(Key_Left)) {\n        moveToNextWordStart(1, false, false);\n    } else if (input.isKey(Key_Down)) {\n        g.submode = NoSubMode;\n        moveDown();\n    } else if (input.isKey(Key_Up)) {\n        g.submode = NoSubMode;\n        moveUp();\n    } else if (input.isKey(Key_Right)) {\n        moveRight();\n    } else if (input.isShift(Key_Right) || input.isControl(Key_Right)) {\n        moveToNextWordStart(1, false, true);\n    } else if (input.isKey(Key_Home)) {\n        moveToStartOfLine();\n    } else if (input.isKey(Key_End)) {\n        moveBehindEndOfLine();\n        m_targetColumn = -1;\n    } else if (input.isReturn() || input.isControl('j') || input.isControl('m')) {\n        if (!input.isReturn() || !handleInsertInEditor(input)) {\n            joinPreviousEditBlock();\n            g.submode = NoSubMode;\n            insertNewLine();\n            endEditBlock();\n        }\n    } else if (input.isBackspace()) {\n        // pass C-h as backspace, too\n        if (!handleInsertInEditor(Input(Qt::Key_Backspace, Qt::NoModifier))) {\n            joinPreviousEditBlock();\n            if (!m_buffer->lastInsertion.isEmpty()\n                    || s.backspace.value().contains(\"start\")\n                    || s.backspace.value().contains(\"2\")) {\n                const int line = cursorLine() + 1;\n                const Column col = cursorColumn();\n                QString data = lineContents(line);\n                const Column ind = indentation(data);\n                if (col.logical <= ind.logical && col.logical\n                        && startsWithWhitespace(data, col.physical)) {\n                    const int ts = s.tabStop.value();\n                    const int newl = col.logical - 1 - (col.logical - 1) % ts;\n                    const QString prefix = tabExpand(newl);\n                    setLineContents(line, prefix + data.mid(col.physical));\n                    moveToStartOfLine();\n                    moveRight(prefix.size());\n                } else {\n                    setAnchor();\n                    m_cursor.deletePreviousChar();\n                }\n            }\n            endEditBlock();\n        }\n    } else if (input.isKey(Key_Delete)) {\n        if (!handleInsertInEditor(input)) {\n            joinPreviousEditBlock();\n            m_cursor.deleteChar();\n            endEditBlock();\n        }\n    } else if (input.isKey(Key_PageDown) || input.isControl('f')) {\n        movePageDown();\n    } else if (input.isKey(Key_PageUp) || input.isControl('b')) {\n        movePageUp();\n    } else if (input.isKey(Key_Tab)) {\n        m_buffer->insertState.insertingSpaces = true;\n        if (s.expandTab.value()) {\n            const int ts = s.tabStop.value();\n            const int col = logicalCursorColumn();\n            QString str = QString(ts - col % ts, ' ');\n            insertText(str);\n        } else {\n            insertInInsertMode(input.raw());\n        }\n        m_buffer->insertState.insertingSpaces = false;\n    } else if (input.isControl('d')) {\n        // remove one level of indentation from the current line\n        const int shift = s.shiftWidth.value();\n        const int tab = s.tabStop.value();\n        int line = cursorLine() + 1;\n        int pos = firstPositionInLine(line);\n        QString text = lineContents(line);\n        int amount = 0;\n        int i = 0;\n        for (; i < text.size() && amount < shift; ++i) {\n            if (text.at(i) == ' ')\n                ++amount;\n            else if (text.at(i) == '\\t')\n                amount += tab; // FIXME: take position into consideration\n            else\n                break;\n        }\n        removeText(Range(pos, pos+i));\n    } else if (input.isControl('p') || input.isControl('n')) {\n        QTextCursor tc = m_cursor;\n        moveToNextWordStart(1, false, false);\n        QString str = selectText(Range(position(), tc.position()));\n        m_cursor = tc;\n        q->simpleCompletionRequested(str, input.isControl('n'));\n    } else if (input.isShift(Qt::Key_Insert)) {\n        // Insert text from clipboard.\n        QClipboard *clipboard = QApplication::clipboard();\n        const QMimeData *data = clipboard->mimeData();\n        if (data && data->hasText())\n            insertInInsertMode(data->text());\n    } else {\n        m_buffer->insertState.insertingSpaces = input.isKey(Key_Space);\n        if (!handleInsertInEditor(input)) {\n            const QString toInsert = input.text();\n            if (toInsert.isEmpty())\n                return;\n            insertInInsertMode(toInsert);\n        }\n        m_buffer->insertState.insertingSpaces = false;\n    }\n}\n\nvoid FakeVimHandler::Private::insertInInsertMode(const QString &text)\n{\n    joinPreviousEditBlock();\n    insertText(text);\n    if (s.smartIndent.value() && isElectricCharacter(text.at(0))) {\n        const QString leftText = block().text()\n               .left(position() - 1 - block().position());\n        if (leftText.simplified().isEmpty()) {\n            Range range(position(), position(), g.rangemode);\n            indentText(range, text.at(0));\n        }\n    }\n    setTargetColumn();\n    endEditBlock();\n    g.submode = NoSubMode;\n}\n\nbool FakeVimHandler::Private::startRecording(const Input &input)\n{\n    QChar reg = input.asChar();\n    if (reg == '\"' || reg.isLetterOrNumber()) {\n        g.currentRegister = reg.unicode();\n        g.isRecording = true;\n        g.recorded.clear();\n        return true;\n    }\n\n    return false;\n}\n\nvoid FakeVimHandler::Private::record(const Input &input)\n{\n    if (g.isRecording)\n        g.recorded.append(input.toString());\n}\n\nvoid FakeVimHandler::Private::stopRecording()\n{\n    // Remove q from end (stop recording command).\n    g.isRecording = false;\n    g.recorded.chop(1);\n    setRegister(g.currentRegister, g.recorded, g.rangemode);\n    g.currentRegister = 0;\n    g.recorded.clear();\n}\n\nvoid FakeVimHandler::Private::handleAs(const QString &command)\n{\n    QString cmd = QString(\"\\\"%1\").arg(QChar(m_register));\n\n    if (command.contains(\"%1\"))\n        cmd.append(command.arg(count()));\n    else\n        cmd.append(command);\n\n    leaveVisualMode();\n    beginLargeEditBlock();\n    replay(cmd);\n    endEditBlock();\n}\n\nbool FakeVimHandler::Private::executeRegister(int reg)\n{\n    QChar regChar(reg);\n\n    // TODO: Prompt for an expression to execute if register is '='.\n    if (reg == '@' && g.lastExecutedRegister != 0)\n        reg = g.lastExecutedRegister;\n    else if (QString(\"\\\".*+\").contains(regChar) || regChar.isLetterOrNumber())\n        g.lastExecutedRegister = reg;\n    else\n        return false;\n\n    // FIXME: In Vim it's possible to interrupt recursive macro with <C-c>.\n    //        One solution may be to call QApplication::processEvents() and check if <C-c> was\n    //        used when a mapping is active.\n    // According to Vim, register is executed like mapping.\n    prependMapping(Inputs(registerContents(reg), false, false));\n\n    return true;\n}\n\nEventResult FakeVimHandler::Private::handleExMode(const Input &input)\n{\n    // handle C-R, C-R C-W, C-R {register}\n    if (handleCommandBufferPaste(input))\n        return EventHandled;\n\n    if (input.isEscape()) {\n        g.commandBuffer.clear();\n        leaveCurrentMode();\n        g.submode = NoSubMode;\n    } else if (g.submode == CtrlVSubMode) {\n        g.commandBuffer.insertChar(input.raw());\n        g.submode = NoSubMode;\n    } else if (input.isControl('v')) {\n        g.submode = CtrlVSubMode;\n        g.subsubmode = NoSubSubMode;\n        return EventHandled;\n    } else if (input.isBackspace()) {\n        if (g.commandBuffer.isEmpty()) {\n            leaveVisualMode();\n            leaveCurrentMode();\n        } else if (g.commandBuffer.hasSelection()) {\n            g.commandBuffer.deleteSelected();\n        } else {\n            g.commandBuffer.deleteChar();\n        }\n    } else if (input.isKey(Key_Tab)) {\n        // FIXME: Complete actual commands.\n        g.commandBuffer.historyUp();\n    } else if (input.isReturn()) {\n        showMessage(MessageCommand, g.commandBuffer.display());\n        handleExCommand(g.commandBuffer.contents());\n        g.commandBuffer.clear();\n    } else if (!g.commandBuffer.handleInput(input)) {\n        qDebug() << \"IGNORED IN EX-MODE: \" << input.key() << input.text();\n        return EventUnhandled;\n    }\n\n    return EventHandled;\n}\n\nEventResult FakeVimHandler::Private::handleSearchSubSubMode(const Input &input)\n{\n    EventResult handled = EventHandled;\n\n    // handle C-R, C-R C-W, C-R {register}\n    if (handleCommandBufferPaste(input))\n        return handled;\n\n    if (input.isEscape()) {\n        g.currentMessage.clear();\n        setPosition(m_searchStartPosition);\n        scrollToLine(m_searchFromScreenLine);\n    } else if (input.isBackspace()) {\n        if (g.searchBuffer.isEmpty())\n            leaveCurrentMode();\n        else if (g.searchBuffer.hasSelection())\n            g.searchBuffer.deleteSelected();\n        else\n            g.searchBuffer.deleteChar();\n    } else if (input.isReturn()) {\n        const QString &needle = g.searchBuffer.contents();\n        if (!needle.isEmpty())\n            g.lastSearch = needle;\n        else\n            g.searchBuffer.setContents(g.lastSearch);\n\n        updateFind(true);\n\n        if (finishSearch()) {\n            if (g.submode != NoSubMode)\n                finishMovement(g.searchBuffer.prompt() + g.lastSearch + '\\n');\n            if (g.currentMessage.isEmpty())\n                showMessage(MessageCommand, g.searchBuffer.display());\n        } else {\n            handled = EventCancelled; // Not found so cancel mapping if any.\n        }\n    } else if (input.isKey(Key_Tab)) {\n        g.searchBuffer.insertChar(QChar(9));\n    } else if (!g.searchBuffer.handleInput(input)) {\n        //qDebug() << \"IGNORED IN SEARCH MODE: \" << input.key() << input.text();\n        return EventUnhandled;\n    }\n\n    if (input.isReturn() || input.isEscape()) {\n        g.searchBuffer.clear();\n        leaveCurrentMode();\n    } else {\n        updateFind(false);\n    }\n\n    return handled;\n}\n\n// This uses 0 based line counting (hidden lines included).\nint FakeVimHandler::Private::parseLineAddress(QString *cmd)\n{\n    //qDebug() << \"CMD: \" << cmd;\n    if (cmd->isEmpty())\n        return -1;\n\n    int result = -1;\n    QChar c = cmd->at(0);\n    if (c == '.') { // current line\n        result = cursorBlockNumber();\n        cmd->remove(0, 1);\n    } else if (c == '$') { // last line\n        result = document()->blockCount() - 1;\n        cmd->remove(0, 1);\n    } else if (c == '\\'') { // mark\n        cmd->remove(0, 1);\n        if (cmd->isEmpty()) {\n            showMessage(MessageError, msgMarkNotSet(QString()));\n            return -1;\n        }\n        c = cmd->at(0);\n        Mark m = mark(c);\n        if (!m.isValid() || !m.isLocal(m_currentFileName)) {\n            showMessage(MessageError, msgMarkNotSet(c));\n            return -1;\n        }\n        cmd->remove(0, 1);\n        result = m.position(document()).line;\n    } else if (c.isDigit()) { // line with given number\n        result = 0;\n    } else if (c == '-' || c == '+') { // add or subtract from current line number\n        result = cursorBlockNumber();\n    } else if (c == '/' || c == '?'\n        || (c == '\\\\' && cmd->size() > 1 && QString(\"/?&\").contains(cmd->at(1)))) {\n        // search for expression\n        SearchData sd;\n        if (c == '/' || c == '?') {\n            const int end = findUnescaped(c, *cmd, 1);\n            if (end == -1)\n                return -1;\n            sd.needle = cmd->mid(1, end - 1);\n            cmd->remove(0, end + 1);\n        } else {\n            c = cmd->at(1);\n            cmd->remove(0, 2);\n            sd.needle = (c == '&') ? g.lastSubstitutePattern : g.lastSearch;\n        }\n        sd.forward = (c != '?');\n        const QTextBlock b = block();\n        const int pos = b.position() + (sd.forward ? b.length() - 1 : 0);\n        QTextCursor tc = search(sd, pos, 1, true);\n        g.lastSearch = sd.needle;\n        if (tc.isNull())\n            return -1;\n        result = tc.block().blockNumber();\n    } else {\n        return cursorBlockNumber();\n    }\n\n    // basic arithmetic (\"-3+5\" or \"++\" means \"+2\" etc.)\n    int n = 0;\n    bool add = true;\n    int i = 0;\n    for (; i < cmd->size(); ++i) {\n        c = cmd->at(i);\n        if (c == '-' || c == '+') {\n            if (n != 0)\n                result = result + (add ? n - 1 : -(n - 1));\n            add = c == '+';\n            result = result + (add ? 1 : -1);\n            n = 0;\n        } else if (c.isDigit()) {\n            n = n * 10 + c.digitValue();\n        } else if (!c.isSpace()) {\n            break;\n        }\n    }\n    if (n != 0)\n        result = result + (add ? n - 1 : -(n - 1));\n    *cmd = cmd->mid(i).trimmed();\n\n    return result;\n}\n\nvoid FakeVimHandler::Private::setCurrentRange(const Range &range)\n{\n    setAnchorAndPosition(range.beginPos, range.endPos);\n    g.rangemode = range.rangemode;\n}\n\nbool FakeVimHandler::Private::parseExCommand(QString *line, ExCommand *cmd)\n{\n    *cmd = ExCommand();\n    if (line->isEmpty())\n        return false;\n\n    // parse range first\n    if (!parseLineRange(line, cmd))\n        return false;\n\n    // get first command from command line\n    QChar close;\n    bool subst = false;\n    int i = 0;\n    for (; i < line->size(); ++i) {\n        const QChar &c = line->at(i);\n        if (c == '\\\\') {\n            ++i; // skip escaped character\n        } else if (close.isNull()) {\n            if (c == '|') {\n                // split on |\n                break;\n            } else if (c == '/') {\n                subst = i > 0 && (line->at(i - 1) == 's');\n                close = c;\n            } else if (c == '\"' || c == '\\'') {\n                close = c;\n            }\n        } else if (c == close) {\n            if (subst)\n                subst = false;\n            else\n                close = QChar();\n        }\n    }\n\n    cmd->cmd = line->mid(0, i).trimmed();\n\n    // command arguments starts with first non-letter character\n    cmd->args = cmd->cmd.section(QRegularExpression(\"(?=[^a-zA-Z])\"), 1);\n    if (!cmd->args.isEmpty()) {\n        cmd->cmd.chop(cmd->args.size());\n        cmd->args = cmd->args.trimmed();\n\n        // '!' at the end of command\n        cmd->hasBang = cmd->args.startsWith('!');\n        if (cmd->hasBang)\n            cmd->args = cmd->args.mid(1).trimmed();\n    }\n\n    // remove the first command from command line\n    line->remove(0, i + 1);\n\n    return true;\n}\n\nbool FakeVimHandler::Private::parseLineRange(QString *line, ExCommand *cmd)\n{\n    // remove leading colons and spaces\n    line->remove(QRegularExpression(\"^\\\\s*(:+\\\\s*)*\"));\n\n    // special case ':!...' (use invalid range)\n    if (line->startsWith('!')) {\n        cmd->range = Range();\n        return true;\n    }\n\n    // FIXME: that seems to be different for %w and %s\n    if (line->startsWith('%'))\n        line->replace(0, 1, \"1,$\");\n\n    int beginLine = parseLineAddress(line);\n    int endLine;\n    if (line->startsWith(',')) {\n        *line = line->mid(1).trimmed();\n        endLine = parseLineAddress(line);\n    } else {\n        endLine = beginLine;\n    }\n    if (beginLine == -1 || endLine == -1)\n        return false;\n\n    const int beginPos = firstPositionInLine(qMin(beginLine, endLine) + 1, false);\n    const int endPos = lastPositionInLine(qMax(beginLine, endLine) + 1, false);\n    cmd->range = Range(beginPos, endPos, RangeLineMode);\n    cmd->count = beginLine;\n\n    return true;\n}\n\nvoid FakeVimHandler::Private::parseRangeCount(const QString &line, Range *range) const\n{\n    bool ok;\n    const int count = qAbs(line.trimmed().toInt(&ok));\n    if (ok) {\n        const int beginLine = blockAt(range->endPos).blockNumber() + 1;\n        const int endLine = qMin(beginLine + count - 1, document()->blockCount());\n        range->beginPos = firstPositionInLine(beginLine, false);\n        range->endPos = lastPositionInLine(endLine, false);\n    }\n}\n\n// use handleExCommand for invoking commands that might move the cursor\nvoid FakeVimHandler::Private::handleCommand(const QString &cmd)\n{\n    handleExCommand(cmd);\n}\n\nbool FakeVimHandler::Private::handleExSubstituteCommand(const ExCommand &cmd)\n{\n    // :[range]s[ubstitute]/{pattern}/{string}/[flags] [count]\n    if (!cmd.matches(\"s\", \"substitute\")\n        && !(cmd.cmd.isEmpty() && !cmd.args.isEmpty() && QString(\"&~\").contains(cmd.args[0]))) {\n        return false;\n    }\n\n    int count = 1;\n    QString line = cmd.args;\n    const QRegularExpressionMatch match = QRegularExpression(\"\\\\d+$\").match(line);\n    if (match.hasMatch()) {\n        count = match.captured().toInt();\n        line = line.left(match.capturedStart()).trimmed();\n    }\n\n    if (cmd.cmd.isEmpty()) {\n        // keep previous substitution flags on '&&' and '~&'\n        if (line.size() > 1 && line[1] == '&')\n            g.lastSubstituteFlags += line.mid(2);\n        else\n            g.lastSubstituteFlags = line.mid(1);\n        if (line[0] == '~')\n            g.lastSubstitutePattern = g.lastSearch;\n    } else {\n        if (line.isEmpty()) {\n            g.lastSubstituteFlags.clear();\n        } else {\n            // we have /{pattern}/{string}/[flags]  now\n            const QChar separator = line.at(0);\n            int pos1 = findUnescaped(separator, line, 1);\n            if (pos1 == -1)\n                return false;\n            int pos2 = findUnescaped(separator, line, pos1 + 1);\n            if (pos2 == -1)\n                pos2 = line.size();\n\n            g.lastSubstitutePattern = line.mid(1, pos1 - 1);\n            g.lastSubstituteReplacement = line.mid(pos1 + 1, pos2 - pos1 - 1);\n            g.lastSubstituteFlags = line.mid(pos2 + 1);\n        }\n    }\n\n    count = qMax(1, count);\n    QString needle = g.lastSubstitutePattern;\n\n    if (g.lastSubstituteFlags.contains('i'))\n        needle.prepend(\"\\\\c\");\n\n    const QRegularExpression pattern = vimPatternToQtPattern(needle);\n\n    QTextBlock lastBlock;\n    QTextBlock firstBlock;\n    const bool global = g.lastSubstituteFlags.contains('g');\n    for (int a = 0; a != count; ++a) {\n        for (QTextBlock block = blockAt(cmd.range.endPos);\n            block.isValid() && block.position() + block.length() > cmd.range.beginPos;\n            block = block.previous()) {\n            QString text = block.text();\n            if (substituteText(&text, pattern, g.lastSubstituteReplacement, global)) {\n                firstBlock = block;\n                if (!lastBlock.isValid()) {\n                    lastBlock = block;\n                    beginEditBlock();\n                }\n                QTextCursor tc = m_cursor;\n                const int pos = block.position();\n                const int anchor = pos + block.length() - 1;\n                tc.setPosition(anchor);\n                tc.setPosition(pos, KeepAnchor);\n                tc.insertText(text);\n            }\n        }\n    }\n\n    if (lastBlock.isValid()) {\n        m_buffer->undoState.position = CursorPosition(firstBlock.blockNumber(), 0);\n\n        leaveVisualMode();\n        setPosition(lastBlock.position());\n        setAnchor();\n        moveToFirstNonBlankOnLine();\n\n        endEditBlock();\n    }\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExTabNextCommand(const ExCommand &cmd)\n{\n    if (!cmd.matches(\"tabn\", \"tabnext\"))\n        return false;\n\n    q->tabNextRequested();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExTabPreviousCommand(const ExCommand &cmd)\n{\n    if (!cmd.matches(\"tabp\", \"tabprevious\"))\n        return false;\n\n    q->tabPreviousRequested();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExMapCommand(const ExCommand &cmd0) // :map\n{\n    QByteArray modes;\n    enum Type { Map, Noremap, Unmap } type;\n\n    QByteArray cmd = cmd0.cmd.toLatin1();\n\n    // Strange formatting. But everything else is even uglier.\n    if (cmd == \"map\") { modes = \"nvo\"; type = Map; } else\n    if (cmd == \"nm\" || cmd == \"nmap\") { modes = \"n\"; type = Map; } else\n    if (cmd == \"vm\" || cmd == \"vmap\") { modes = \"v\"; type = Map; } else\n    if (cmd == \"xm\" || cmd == \"xmap\") { modes = \"x\"; type = Map; } else\n    if (cmd == \"smap\") { modes = \"s\"; type = Map; } else\n    if (cmd == \"omap\") { modes = \"o\"; type = Map; } else\n    if (cmd == \"map!\") { modes = \"ic\"; type = Map; } else\n    if (cmd == \"im\" || cmd == \"imap\") { modes = \"i\"; type = Map; } else\n    if (cmd == \"lm\" || cmd == \"lmap\") { modes = \"l\"; type = Map; } else\n    if (cmd == \"cm\" || cmd == \"cmap\") { modes = \"c\"; type = Map; } else\n\n    if (cmd == \"no\" || cmd == \"noremap\") { modes = \"nvo\"; type = Noremap; } else\n    if (cmd == \"nn\" || cmd == \"nnoremap\") { modes = \"n\"; type = Noremap; } else\n    if (cmd == \"vn\" || cmd == \"vnoremap\") { modes = \"v\"; type = Noremap; } else\n    if (cmd == \"xn\" || cmd == \"xnoremap\") { modes = \"x\"; type = Noremap; } else\n    if (cmd == \"snor\" || cmd == \"snoremap\") { modes = \"s\"; type = Noremap; } else\n    if (cmd == \"ono\" || cmd == \"onoremap\") { modes = \"o\"; type = Noremap; } else\n    if (cmd == \"no!\" || cmd == \"noremap!\") { modes = \"ic\"; type = Noremap; } else\n    if (cmd == \"ino\" || cmd == \"inoremap\") { modes = \"i\"; type = Noremap; } else\n    if (cmd == \"ln\" || cmd == \"lnoremap\") { modes = \"l\"; type = Noremap; } else\n    if (cmd == \"cno\" || cmd == \"cnoremap\") { modes = \"c\"; type = Noremap; } else\n\n    if (cmd == \"unm\" || cmd == \"unmap\") { modes = \"nvo\"; type = Unmap; } else\n    if (cmd == \"nun\" || cmd == \"nunmap\") { modes = \"n\"; type = Unmap; } else\n    if (cmd == \"vu\" || cmd == \"vunmap\") { modes = \"v\"; type = Unmap; } else\n    if (cmd == \"xu\" || cmd == \"xunmap\") { modes = \"x\"; type = Unmap; } else\n    if (cmd == \"sunm\" || cmd == \"sunmap\") { modes = \"s\"; type = Unmap; } else\n    if (cmd == \"ou\" || cmd == \"ounmap\") { modes = \"o\"; type = Unmap; } else\n    if (cmd == \"unm!\" || cmd == \"unmap!\") { modes = \"ic\"; type = Unmap; } else\n    if (cmd == \"iu\" || cmd == \"iunmap\") { modes = \"i\"; type = Unmap; } else\n    if (cmd == \"lu\" || cmd == \"lunmap\") { modes = \"l\"; type = Unmap; } else\n    if (cmd == \"cu\" || cmd == \"cunmap\") { modes = \"c\"; type = Unmap; }\n\n    else\n        return false;\n\n    QString args = cmd0.args;\n    bool silent = false;\n    bool unique = false;\n    forever {\n        if (eatString(\"<silent>\", &args)) {\n            silent = true;\n        } else if (eatString(\"<unique>\", &args)) {\n            continue;\n        } else if (eatString(\"<special>\", &args)) {\n            continue;\n        } else if (eatString(\"<buffer>\", &args)) {\n            notImplementedYet();\n            continue;\n        } else if (eatString(\"<script>\", &args)) {\n            notImplementedYet();\n            continue;\n        } else if (eatString(\"<expr>\", &args)) {\n            notImplementedYet();\n            return true;\n        }\n        break;\n    }\n\n    const QString lhs = args.section(QRegularExpression(\"\\\\s+\"), 0, 0);\n    const QString rhs = args.section(QRegularExpression(\"\\\\s+\"), 1);\n    if ((rhs.isNull() && type != Unmap) || (!rhs.isNull() && type == Unmap)) {\n        // FIXME: Dump mappings here.\n        //qDebug() << g.mappings;\n        return true;\n    }\n\n    Inputs key(lhs);\n    //qDebug() << \"MAPPING: \" << modes << lhs << rhs;\n    switch (type) {\n        case Unmap:\n            foreach (char c, modes)\n                MappingsIterator(&g.mappings, c, key).remove();\n            break;\n        case Map: Q_FALLTHROUGH();\n        case Noremap: {\n            Inputs inputs(rhs, type == Noremap, silent);\n            foreach (char c, modes)\n                MappingsIterator(&g.mappings, c).setInputs(key, inputs, unique);\n            break;\n        }\n    }\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExHistoryCommand(const ExCommand &cmd)\n{\n    // :his[tory]\n    if (!cmd.matches(\"his\", \"history\"))\n        return false;\n\n    if (cmd.args.isEmpty()) {\n        QString info;\n        info += \"#  command history\\n\";\n        int i = 0;\n        foreach (const QString &item, g.commandBuffer.historyItems()) {\n            ++i;\n            info += QString(\"%1 %2\\n\").arg(i, -8).arg(item);\n        }\n        q->extraInformationChanged(info);\n    } else {\n        notImplementedYet();\n    }\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExRegisterCommand(const ExCommand &cmd)\n{\n    // :reg[isters] and :di[splay]\n    if (!cmd.matches(\"reg\", \"registers\") && !cmd.matches(\"di\", \"display\"))\n        return false;\n\n    QByteArray regs = cmd.args.toLatin1();\n    if (regs.isEmpty()) {\n        regs = \"\\\"0123456789\";\n        for (auto it = g.registers.cbegin(), end = g.registers.cend(); it != end; ++it) {\n            if (it.key() > '9')\n                regs += char(it.key());\n        }\n    }\n    QString info;\n    info += \"--- Registers ---\\n\";\n    for (char reg : qAsConst(regs)) {\n        QString value = quoteUnprintable(registerContents(reg));\n        info += QString(\"\\\"%1   %2\\n\").arg(reg).arg(value);\n    }\n    q->extraInformationChanged(info);\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExSetCommand(const ExCommand &cmd)\n{\n    // :se[t]\n    if (!cmd.matches(\"se\", \"set\"))\n        return false;\n\n    clearMessage();\n\n    if (cmd.args.contains('=')) {\n        // Non-boolean config to set.\n        int p = cmd.args.indexOf('=');\n        if ( const QString error = s.trySetValue(cmd.args.left(p), cmd.args.mid(p + 1));\n                !error.isEmpty() )\n        {\n            showMessage(MessageError, error);\n        }\n    } else {\n        QString optionName = cmd.args;\n\n        bool toggleOption = optionName.endsWith('!');\n        bool printOption = !toggleOption && optionName.endsWith('?');\n        if (printOption || toggleOption)\n            optionName.chop(1);\n\n        bool negateOption = optionName.startsWith(\"no\");\n        if (negateOption)\n            optionName.remove(0, 2);\n\n        FvBaseAspect *act = s.item(optionName);\n        if (!act) {\n            showMessage(MessageError, Tr::tr(\"Unknown option:\") + ' ' + cmd.args);\n        } else if (act->defaultValue().type() == QVariant::Bool) {\n            bool oldValue = act->value().toBool();\n            if (printOption) {\n                showMessage(MessageInfo, QLatin1String(oldValue ? \"\" : \"no\")\n                            + act->settingsKey().toLower());\n            } else if (toggleOption || negateOption == oldValue) {\n                act->setValue(!oldValue);\n            }\n        } else if (negateOption && !printOption) {\n            showMessage(MessageError, Tr::tr(\"Invalid argument:\") + ' ' + cmd.args);\n        } else if (toggleOption) {\n            showMessage(MessageError, Tr::tr(\"Trailing characters:\") + ' ' + cmd.args);\n        } else {\n            showMessage(MessageInfo, act->settingsKey().toLower() + \"=\"\n                        + act->value().toString());\n        }\n    }\n    updateEditor();\n    updateHighlights();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExNormalCommand(const ExCommand &cmd)\n{\n    // :norm[al]\n    if (!cmd.matches(\"norm\", \"normal\"))\n        return false;\n    //qDebug() << \"REPLAY NORMAL: \" << quoteUnprintable(reNormal.cap(3));\n    replay(cmd.args);\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExYankDeleteCommand(const ExCommand &cmd)\n{\n    // :[range]d[elete] [x] [count]\n    // :[range]y[ank] [x] [count]\n    const bool remove = cmd.matches(\"d\", \"delete\");\n    if (!remove && !cmd.matches(\"y\", \"yank\"))\n        return false;\n\n    // get register from arguments\n    const bool hasRegisterArg = !cmd.args.isEmpty() && !cmd.args.at(0).isDigit();\n    const int r = hasRegisterArg ? cmd.args.at(0).unicode() : m_register;\n\n    // get [count] from arguments\n    Range range = cmd.range;\n    parseRangeCount(cmd.args.mid(hasRegisterArg ? 1 : 0).trimmed(), &range);\n\n    yankText(range, r);\n\n    if (remove) {\n        leaveVisualMode();\n        setPosition(range.beginPos);\n        pushUndoState();\n        setCurrentRange(range);\n        removeText(currentRange());\n    }\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExChangeCommand(const ExCommand &cmd)\n{\n    // :[range]c[hange]\n    if (!cmd.matches(\"c\", \"change\"))\n        return false;\n\n    Range range = cmd.range;\n    range.rangemode = RangeLineModeExclusive;\n    removeText(range);\n    insertAutomaticIndentation(true, cmd.hasBang);\n\n    // FIXME: In Vim same or less number of lines can be inserted and position after insertion is\n    //        beginning of last inserted line.\n    enterInsertMode();\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExMoveCommand(const ExCommand &cmd)\n{\n    // :[range]m[ove] {address}\n    if (!cmd.matches(\"m\", \"move\"))\n        return false;\n\n    QString lineCode = cmd.args;\n\n    const int startLine = blockAt(cmd.range.beginPos).blockNumber();\n    const int endLine = blockAt(cmd.range.endPos).blockNumber();\n    const int lines = endLine - startLine + 1;\n\n    int targetLine = lineCode == \"0\" ? -1 : parseLineAddress(&lineCode);\n    if (targetLine >= startLine && targetLine < endLine) {\n        showMessage(MessageError, Tr::tr(\"Move lines into themselves.\"));\n        return true;\n    }\n\n    CursorPosition lastAnchor = markLessPosition();\n    CursorPosition lastPosition = markGreaterPosition();\n\n    recordJump();\n    setPosition(cmd.range.beginPos);\n    pushUndoState();\n\n    setCurrentRange(cmd.range);\n    QString text = selectText(cmd.range);\n    removeText(currentRange());\n\n    const bool insertAtEnd = targetLine == document()->blockCount();\n    if (targetLine >= startLine)\n        targetLine -= lines;\n    QTextBlock block = document()->findBlockByNumber(insertAtEnd ? targetLine : targetLine + 1);\n    setPosition(block.position());\n    setAnchor();\n\n    if (insertAtEnd) {\n        moveBehindEndOfLine();\n        text.chop(1);\n        insertText(QString(\"\\n\"));\n    }\n    insertText(text);\n\n    if (!insertAtEnd)\n        moveUp(1);\n    if (s.startOfLine.value())\n        moveToFirstNonBlankOnLine();\n\n    if (lastAnchor.line >= startLine && lastAnchor.line <= endLine)\n        lastAnchor.line += targetLine - startLine + 1;\n    if (lastPosition.line >= startLine && lastPosition.line <= endLine)\n        lastPosition.line += targetLine - startLine + 1;\n    setMark('<', lastAnchor);\n    setMark('>', lastPosition);\n\n    if (lines > 2)\n        showMessage(MessageInfo, Tr::tr(\"%n lines moved.\", nullptr, lines));\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExJoinCommand(const ExCommand &cmd)\n{\n    // :[range]j[oin][!] [count]\n    // FIXME: Argument [count] can follow immediately.\n    if (!cmd.matches(\"j\", \"join\"))\n        return false;\n\n    // get [count] from arguments\n    bool ok;\n    int count = cmd.args.toInt(&ok);\n\n    if (ok) {\n        setPosition(cmd.range.endPos);\n    } else {\n        setPosition(cmd.range.beginPos);\n        const int startLine = blockAt(cmd.range.beginPos).blockNumber();\n        const int endLine = blockAt(cmd.range.endPos).blockNumber();\n        count = endLine - startLine + 1;\n    }\n\n    moveToStartOfLine();\n    pushUndoState();\n    joinLines(count, cmd.hasBang);\n\n    moveToFirstNonBlankOnLine();\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExWriteCommand(const ExCommand &cmd)\n{\n    // Note: The cmd.args.isEmpty() case is handled by handleExPluginCommand.\n    // :w, :x, :wq, ...\n    //static QRegularExpression reWrite(\"^[wx]q?a?!?( (.*))?$\");\n    if (cmd.cmd != \"w\" && cmd.cmd != \"x\" && cmd.cmd != \"wq\")\n        return false;\n\n    int beginLine = lineForPosition(cmd.range.beginPos);\n    int endLine = lineForPosition(cmd.range.endPos);\n    const bool noArgs = (beginLine == -1);\n    if (beginLine == -1)\n        beginLine = 0;\n    if (endLine == -1)\n        endLine = linesInDocument();\n    //qDebug() << \"LINES: \" << beginLine << endLine;\n    //QString prefix = cmd.args;\n    const bool forced = cmd.hasBang;\n    //const bool quit = prefix.contains('q') || prefix.contains('x');\n    //const bool quitAll = quit && prefix.contains('a');\n    QString fileName = replaceTildeWithHome(cmd.args);\n    if (fileName.isEmpty())\n        fileName = m_currentFileName;\n    QFile file1(fileName);\n    const bool exists = file1.exists();\n    if (exists && !forced && !noArgs) {\n        showMessage(MessageError, Tr::tr\n            (\"File \\\"%1\\\" exists (add ! to override)\").arg(fileName));\n    } else if (file1.open(QIODevice::ReadWrite)) {\n        // Nobody cared, so act ourselves.\n        file1.close();\n        Range range(firstPositionInLine(beginLine),\n            firstPositionInLine(endLine), RangeLineMode);\n        QString contents = selectText(range);\n        QFile::remove(fileName);\n        QFile file2(fileName);\n        if (file2.open(QIODevice::ReadWrite)) {\n            QTextStream ts(&file2);\n            ts << contents;\n        } else {\n            showMessage(MessageError, Tr::tr\n               (\"Cannot open file \\\"%1\\\" for writing\").arg(fileName));\n        }\n        // Check result by reading back.\n        QFile file3(fileName);\n        if (file3.open(QIODevice::ReadOnly)) {\n            QByteArray ba = file3.readAll();\n            showMessage(MessageInfo, Tr::tr(\"\\\"%1\\\" %2 %3L, %4C written.\")\n                .arg(fileName).arg(exists ? QString(\" \") : Tr::tr(\" [New] \"))\n                .arg(ba.count('\\n')).arg(ba.size()));\n        } else {\n            showMessage(MessageError, Tr::tr\n               (\"Cannot open file \\\"%1\\\" for reading\").arg(fileName));\n        }\n        //if (quitAll)\n        //    passUnknownExCommand(forced ? \"qa!\" : \"qa\");\n        //else if (quit)\n        //    passUnknownExCommand(forced ? \"q!\" : \"q\");\n    } else {\n        showMessage(MessageError, Tr::tr\n            (\"Cannot open file \\\"%1\\\" for reading\").arg(fileName));\n    }\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExReadCommand(const ExCommand &cmd)\n{\n    // :r[ead]\n    if (!cmd.matches(\"r\", \"read\"))\n        return false;\n\n    beginEditBlock();\n\n    moveToStartOfLine();\n    moveDown();\n    int pos = position();\n\n    m_currentFileName = replaceTildeWithHome(cmd.args);\n    QFile file(m_currentFileName);\n    if (!file.open(QIODevice::ReadOnly)) {\n        showMessage(MessageError, Tr::tr\n            (\"Cannot open file \\\"%1\\\" for reading\").arg(m_currentFileName));\n        return true;\n    }\n    QTextStream ts(&file);\n    QString data = ts.readAll();\n    insertText(data);\n\n    setAnchorAndPosition(pos, pos);\n\n    endEditBlock();\n\n    showMessage(MessageInfo, Tr::tr(\"\\\"%1\\\" %2L, %3C\")\n        .arg(m_currentFileName).arg(data.count('\\n')).arg(data.size()));\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExBangCommand(const ExCommand &cmd) // :!\n{\n    if (!cmd.cmd.isEmpty() || !cmd.hasBang)\n        return false;\n\n    bool replaceText = cmd.range.isValid();\n    const QString command = QString(cmd.cmd.mid(1) + ' ' + cmd.args).trimmed();\n    const QString input = replaceText ? selectText(cmd.range) : QString();\n\n    const QString result = getProcessOutput(command, input);\n\n    if (replaceText) {\n        setCurrentRange(cmd.range);\n        int targetPosition = firstPositionInLine(lineForPosition(cmd.range.beginPos));\n        beginEditBlock();\n        removeText(currentRange());\n        insertText(result);\n        setPosition(targetPosition);\n        endEditBlock();\n        leaveVisualMode();\n        //qDebug() << \"FILTER: \" << command;\n        showMessage(MessageInfo, Tr::tr(\"%n lines filtered.\", nullptr,\n            input.count('\\n')));\n    } else if (!result.isEmpty()) {\n        q->extraInformationChanged(result);\n    }\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExShiftCommand(const ExCommand &cmd)\n{\n    // :[range]{<|>}* [count]\n    if (!cmd.cmd.isEmpty() || (!cmd.args.startsWith('<') && !cmd.args.startsWith('>')))\n        return false;\n\n    const QChar c = cmd.args.at(0);\n\n    // get number of repetition\n    int repeat = 1;\n    int i = 1;\n    for (; i < cmd.args.size(); ++i) {\n        const QChar c2 = cmd.args.at(i);\n        if (c2 == c)\n            ++repeat;\n        else if (!c2.isSpace())\n            break;\n    }\n\n    // get [count] from arguments\n    Range range = cmd.range;\n    parseRangeCount(cmd.args.mid(i), &range);\n\n    setCurrentRange(range);\n    if (c == '<')\n        shiftRegionLeft(repeat);\n    else\n        shiftRegionRight(repeat);\n\n    leaveVisualMode();\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExMultiRepeatCommand(const ExCommand &cmd)\n{\n    // :[range]g[lobal]/{pattern}/[cmd]\n    // :[range]g[lobal]!/{pattern}/[cmd]\n    // :[range]v[global]!/{pattern}/[cmd]\n    const bool hasG = cmd.matches(\"g\", \"global\");\n    const bool hasV = cmd.matches(\"v\", \"vglobal\");\n    if (!hasG && !hasV)\n        return false;\n\n    // Force operation on full lines, and full document if only\n    // one line (the current one...) is specified\n    int beginLine = lineForPosition(cmd.range.beginPos);\n    int endLine = lineForPosition(cmd.range.endPos);\n    if (beginLine == endLine) {\n        beginLine = 0;\n        endLine = lineForPosition(lastPositionInDocument());\n    }\n\n    const bool negates = hasV || cmd.hasBang;\n\n    const QChar delim = cmd.args.front();\n    const QString pattern = cmd.args.section(delim, 1, 1);\n    const QRegularExpression re(pattern);\n\n    QString innerCmd = cmd.args.section(delim, 2, 2);\n    if (innerCmd.isEmpty())\n        innerCmd = \"p\";\n\n    QList<QTextCursor> matches;\n\n    for (int line = beginLine; line <= endLine; ++line) {\n        const int pos = firstPositionInLine(line);\n        const Range range(pos, pos, RangeLineMode);\n        const QString lineContents = selectText(range);\n        const QRegularExpressionMatch match = re.match(lineContents);\n        if (match.hasMatch() ^ negates) {\n            QTextCursor tc(document());\n            tc.setPosition(pos);\n            matches.append(tc);\n        }\n    }\n\n    beginEditBlock();\n\n    for (const QTextCursor &tc : qAsConst(matches)) {\n        setPosition(tc.position());\n        handleExCommand(innerCmd);\n    }\n\n    endEditBlock();\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExSortCommand(const ExCommand &cmd)\n{\n    // :[range]sor[t][!] [b][f][i][n][o][r][u][x] [/{pattern}/]\n    // FIXME: Only the ! for reverse is implemented.\n    if (!cmd.matches(\"sor\", \"sort\"))\n        return false;\n\n    // Force operation on full lines, and full document if only\n    // one line (the current one...) is specified\n    int beginLine = lineForPosition(cmd.range.beginPos);\n    int endLine = lineForPosition(cmd.range.endPos);\n    if (beginLine == endLine) {\n        beginLine = 0;\n        endLine = lineForPosition(lastPositionInDocument());\n    }\n    Range range(firstPositionInLine(beginLine),\n                firstPositionInLine(endLine), RangeLineMode);\n\n    QString input = selectText(range);\n    if (input.endsWith('\\n')) // It should always...\n        input.chop(1);\n\n    QStringList lines = input.split('\\n');\n    lines.sort();\n    if (cmd.hasBang)\n        std::reverse(lines.begin(), lines.end());\n    QString res = lines.join('\\n') + '\\n';\n\n    replaceText(range, res);\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExNohlsearchCommand(const ExCommand &cmd)\n{\n    // :noh, :nohl, ..., :nohlsearch\n    if (cmd.cmd.size() < 3 || !QString(\"nohlsearch\").startsWith(cmd.cmd))\n        return false;\n\n    g.highlightsCleared = true;\n    updateHighlights();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExUndoRedoCommand(const ExCommand &cmd)\n{\n    // :undo\n    // :redo\n    bool undo = (cmd.cmd == \"u\" || cmd.cmd == \"un\" || cmd.cmd == \"undo\");\n    if (!undo && cmd.cmd != \"red\" && cmd.cmd != \"redo\")\n        return false;\n\n    undoRedo(undo);\n\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExGotoCommand(const ExCommand &cmd)\n{\n    // :{address}\n    if (!cmd.cmd.isEmpty() || !cmd.args.isEmpty())\n        return false;\n\n    const int beginLine = lineForPosition(cmd.range.endPos);\n    setPosition(firstPositionInLine(beginLine));\n    clearMessage();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExSourceCommand(const ExCommand &cmd)\n{\n    // :source\n    if (cmd.cmd != \"so\" && cmd.cmd != \"source\")\n        return false;\n\n    QString fileName = replaceTildeWithHome(cmd.args);\n    QFile file(fileName);\n    if (!file.open(QIODevice::ReadOnly)) {\n        showMessage(MessageError, Tr::tr(\"Cannot open file %1\").arg(fileName));\n        return true;\n    }\n\n    bool inFunction = false;\n    QByteArray line;\n    while (!file.atEnd() || !line.isEmpty()) {\n        QByteArray nextline = !file.atEnd() ? file.readLine() : QByteArray();\n\n        nextline = nextline.trimmed();\n\n        // remove full line comment. for being precise, check :help comment in vim.\n        if (nextline.startsWith('\"'))\n            continue;\n\n        // multi-line command?\n        if (nextline.startsWith('\\\\')) {\n            line += nextline.mid(1);\n            continue;\n        }\n\n        if (line.startsWith(\"function\")) {\n            //qDebug() << \"IGNORING FUNCTION\" << line;\n            inFunction = true;\n        } else if (inFunction && line.startsWith(\"endfunction\")) {\n            inFunction = false;\n        } else if (!line.isEmpty() && !inFunction) {\n            //qDebug() << \"EXECUTING: \" << line;\n            ExCommand cmd;\n            QString commandLine = QString::fromLocal8Bit(line);\n            while (parseExCommand(&commandLine, &cmd)) {\n                if (!handleExCommandHelper(cmd))\n                    break;\n            }\n        }\n\n        line = nextline;\n    }\n    file.close();\n    return true;\n}\n\nbool FakeVimHandler::Private::handleExEchoCommand(const ExCommand &cmd)\n{\n    // :echo\n    if (cmd.cmd != \"echo\")\n        return false;\n    showMessage(MessageInfo, cmd.args);\n    return true;\n}\n\nvoid FakeVimHandler::Private::handleExCommand(const QString &line0)\n{\n    QString line = line0; // Make sure we have a copy to prevent aliasing.\n\n    if (line.endsWith('%')) {\n        line.chop(1);\n        int percent = line.toInt();\n        setPosition(firstPositionInLine(percent * linesInDocument() / 100));\n        clearMessage();\n        return;\n    }\n\n    //qDebug() << \"CMD: \" << cmd;\n\n    enterCommandMode(g.returnToMode);\n\n    beginLargeEditBlock();\n    ExCommand cmd;\n    QString lastCommand = line;\n    while (parseExCommand(&line, &cmd)) {\n        if (!handleExCommandHelper(cmd)) {\n            showMessage(MessageError, Tr::tr(\"Not an editor command: %1\").arg(lastCommand));\n            break;\n        }\n        lastCommand = line;\n    }\n\n    // if the last command closed the editor, we would crash here (:vs and then :on)\n    if (!(m_textedit || m_plaintextedit))\n        return;\n\n    endEditBlock();\n\n    if (isVisualMode())\n        leaveVisualMode();\n    leaveCurrentMode();\n}\n\nbool FakeVimHandler::Private::handleExCommandHelper(ExCommand &cmd)\n{\n    return handleExPluginCommand(cmd)\n        || handleExGotoCommand(cmd)\n        || handleExBangCommand(cmd)\n        || handleExHistoryCommand(cmd)\n        || handleExRegisterCommand(cmd)\n        || handleExYankDeleteCommand(cmd)\n        || handleExChangeCommand(cmd)\n        || handleExMoveCommand(cmd)\n        || handleExJoinCommand(cmd)\n        || handleExMapCommand(cmd)\n        || handleExMultiRepeatCommand(cmd)\n        || handleExNohlsearchCommand(cmd)\n        || handleExNormalCommand(cmd)\n        || handleExReadCommand(cmd)\n        || handleExUndoRedoCommand(cmd)\n        || handleExSetCommand(cmd)\n        || handleExShiftCommand(cmd)\n        || handleExSortCommand(cmd)\n        || handleExSourceCommand(cmd)\n        || handleExSubstituteCommand(cmd)\n        || handleExTabNextCommand(cmd)\n        || handleExTabPreviousCommand(cmd)\n        || handleExWriteCommand(cmd)\n        || handleExEchoCommand(cmd);\n}\n\nbool FakeVimHandler::Private::handleExPluginCommand(const ExCommand &cmd)\n{\n    bool handled = false;\n    int pos = m_cursor.position();\n    commitCursor();\n    q->handleExCommandRequested(&handled, cmd);\n    //qDebug() << \"HANDLER REQUEST: \" << cmd.cmd << handled;\n    if (handled && (m_textedit || m_plaintextedit)) {\n        pullCursor();\n        if (m_cursor.position() != pos)\n            recordJump(pos);\n    }\n    return handled;\n}\n\nvoid FakeVimHandler::Private::searchBalanced(bool forward, QChar needle, QChar other)\n{\n    int level = 1;\n    int pos = position();\n    const int npos = forward ? lastPositionInDocument() : 0;\n    while (true) {\n        if (forward)\n            ++pos;\n        else\n            --pos;\n        if (pos == npos)\n            return;\n        QChar c = characterAt(pos);\n        if (c == other)\n            ++level;\n        else if (c == needle)\n            --level;\n        if (level == 0) {\n            const int oldLine = cursorLine() - cursorLineOnScreen();\n            // Making this unconditional feels better, but is not \"vim like\".\n            if (oldLine != cursorLine() - cursorLineOnScreen())\n                scrollToLine(cursorLine() - linesOnScreen() / 2);\n            recordJump();\n            setPosition(pos);\n            setTargetColumn();\n            return;\n        }\n    }\n}\n\nQTextCursor FakeVimHandler::Private::search(const SearchData &sd, int startPos, int count,\n    bool showMessages)\n{\n    const QRegularExpression needleExp = vimPatternToQtPattern(sd.needle);\n\n    if (!needleExp.isValid()) {\n        if (showMessages) {\n            QString error = needleExp.errorString();\n            showMessage(MessageError, Tr::tr(\"Invalid regular expression: %1\").arg(error));\n        }\n        if (sd.highlightMatches)\n            highlightMatches(QString());\n        return QTextCursor();\n    }\n\n    int repeat = count;\n    const int pos = startPos + (sd.forward ? 1 : -1);\n\n    QTextCursor tc;\n    if (pos >= 0 && pos < document()->characterCount()) {\n        tc = QTextCursor(document());\n        tc.setPosition(pos);\n        if (sd.forward && afterEndOfLine(document(), pos))\n            tc.movePosition(Right);\n\n        if (!tc.isNull()) {\n            if (sd.forward)\n                searchForward(&tc, needleExp, &repeat);\n            else\n                searchBackward(&tc, needleExp, &repeat);\n        }\n    }\n\n    if (tc.isNull()) {\n        if (s.wrapScan.value()) {\n            tc = QTextCursor(document());\n            tc.movePosition(sd.forward ? StartOfDocument : EndOfDocument);\n            if (sd.forward)\n                searchForward(&tc, needleExp, &repeat);\n            else\n                searchBackward(&tc, needleExp, &repeat);\n            if (tc.isNull()) {\n                if (showMessages) {\n                    showMessage(MessageError,\n                        Tr::tr(\"Pattern not found: %1\").arg(sd.needle));\n                }\n            } else if (showMessages) {\n                QString msg = sd.forward\n                    ? Tr::tr(\"Search hit BOTTOM, continuing at TOP.\")\n                    : Tr::tr(\"Search hit TOP, continuing at BOTTOM.\");\n                showMessage(MessageWarning, msg);\n            }\n        } else if (showMessages) {\n            QString msg = sd.forward\n                ? Tr::tr(\"Search hit BOTTOM without match for: %1\")\n                : Tr::tr(\"Search hit TOP without match for: %1\");\n            showMessage(MessageError, msg.arg(sd.needle));\n        }\n    }\n\n    if (sd.highlightMatches)\n        highlightMatches(needleExp.pattern());\n\n    return tc;\n}\n\nvoid FakeVimHandler::Private::search(const SearchData &sd, bool showMessages)\n{\n    const int oldLine = cursorLine() - cursorLineOnScreen();\n\n    QTextCursor tc = search(sd, m_searchStartPosition, count(), showMessages);\n    if (tc.isNull()) {\n        tc = m_cursor;\n        tc.setPosition(m_searchStartPosition);\n    }\n\n    if (isVisualMode()) {\n        int d = tc.anchor() - tc.position();\n        setPosition(tc.position() + d);\n    } else {\n        // Set Cursor. In contrast to the main editor we have the cursor\n        // position before the anchor position.\n        setAnchorAndPosition(tc.position(), tc.anchor());\n    }\n\n    // Making this unconditional feels better, but is not \"vim like\".\n    if (oldLine != cursorLine() - cursorLineOnScreen())\n        scrollToLine(cursorLine() - linesOnScreen() / 2);\n\n    m_searchCursor = m_cursor;\n\n    setTargetColumn();\n}\n\nbool FakeVimHandler::Private::searchNext(bool forward)\n{\n    SearchData sd;\n    sd.needle = g.lastSearch;\n    sd.forward = forward ? g.lastSearchForward : !g.lastSearchForward;\n    sd.highlightMatches = true;\n    m_searchStartPosition = position();\n    showMessage(MessageCommand, QLatin1Char(g.lastSearchForward ? '/' : '?') + sd.needle);\n    recordJump();\n    search(sd);\n    return finishSearch();\n}\n\nvoid FakeVimHandler::Private::highlightMatches(const QString &needle)\n{\n    g.lastNeedle = needle;\n    g.highlightsCleared = false;\n    updateHighlights();\n}\n\nvoid FakeVimHandler::Private::moveToFirstNonBlankOnLine()\n{\n    g.movetype = MoveLineWise;\n    moveToFirstNonBlankOnLine(&m_cursor);\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToFirstNonBlankOnLine(QTextCursor *tc)\n{\n    tc->setPosition(tc->block().position(), KeepAnchor);\n    moveToNonBlankOnLine(tc);\n}\n\nvoid FakeVimHandler::Private::moveToFirstNonBlankOnLineVisually()\n{\n    moveToStartOfLineVisually();\n    moveToNonBlankOnLine(&m_cursor);\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToNonBlankOnLine(QTextCursor *tc)\n{\n    const QTextBlock block = tc->block();\n    const int maxPos = block.position() + block.length() - 1;\n    int i = tc->position();\n    while (characterAt(i).isSpace() && i < maxPos)\n        ++i;\n    tc->setPosition(i, KeepAnchor);\n}\n\nvoid FakeVimHandler::Private::indentSelectedText(QChar typedChar)\n{\n    beginEditBlock();\n    setTargetColumn();\n    int beginLine = qMin(lineForPosition(position()), lineForPosition(anchor()));\n    int endLine = qMax(lineForPosition(position()), lineForPosition(anchor()));\n\n    Range range(anchor(), position(), g.rangemode);\n    indentText(range, typedChar);\n\n    setPosition(firstPositionInLine(beginLine));\n    handleStartOfLine();\n    setTargetColumn();\n    setDotCommand(\"%1==\", endLine - beginLine + 1);\n    endEditBlock();\n\n    const int lines = endLine - beginLine + 1;\n    if (lines > 2)\n        showMessage(MessageInfo, Tr::tr(\"%n lines indented.\", nullptr, lines));\n}\n\nvoid FakeVimHandler::Private::indentText(const Range &range, QChar typedChar)\n{\n    int beginBlock = blockAt(range.beginPos).blockNumber();\n    int endBlock = blockAt(range.endPos).blockNumber();\n    if (beginBlock > endBlock)\n        std::swap(beginBlock, endBlock);\n\n    // Don't remember current indentation in last text insertion.\n    const QString lastInsertion = m_buffer->lastInsertion;\n    q->indentRegion(beginBlock, endBlock, typedChar);\n    m_buffer->lastInsertion = lastInsertion;\n}\n\nbool FakeVimHandler::Private::isElectricCharacter(QChar c) const\n{\n    bool result = false;\n    q->checkForElectricCharacter(&result, c);\n    return result;\n}\n\nvoid FakeVimHandler::Private::shiftRegionRight(int repeat)\n{\n    int beginLine = lineForPosition(anchor());\n    int endLine = lineForPosition(position());\n    int targetPos = anchor();\n    if (beginLine > endLine) {\n        std::swap(beginLine, endLine);\n        targetPos = position();\n    }\n    if (s.startOfLine.value())\n        targetPos = firstPositionInLine(beginLine);\n\n    const int sw = s.shiftWidth.value();\n    g.movetype = MoveLineWise;\n    beginEditBlock();\n    QTextBlock block = document()->findBlockByLineNumber(beginLine - 1);\n    while (block.isValid() && lineNumber(block) <= endLine) {\n        const Column col = indentation(block.text());\n        QTextCursor tc = m_cursor;\n        tc.setPosition(block.position());\n        if (col.physical > 0)\n            tc.setPosition(tc.position() + col.physical, KeepAnchor);\n        tc.insertText(tabExpand(col.logical + sw * repeat));\n        block = block.next();\n    }\n    endEditBlock();\n\n    setPosition(targetPos);\n    handleStartOfLine();\n\n    const int lines = endLine - beginLine + 1;\n    if (lines > 2) {\n        showMessage(MessageInfo,\n            Tr::tr(\"%n lines %1ed %2 time.\", nullptr, lines)\n            .arg(repeat > 0 ? '>' : '<').arg(qAbs(repeat)));\n    }\n}\n\nvoid FakeVimHandler::Private::shiftRegionLeft(int repeat)\n{\n    shiftRegionRight(-repeat);\n}\n\nvoid FakeVimHandler::Private::moveToTargetColumn()\n{\n    const QTextBlock &bl = block();\n    //Column column = cursorColumn();\n    //int logical = logical\n    const int pos = lastPositionInLine(bl.blockNumber() + 1, false);\n    if (m_targetColumn == -1) {\n        setPosition(pos);\n        return;\n    }\n    const int physical = bl.position() + logicalToPhysicalColumn(m_targetColumn, bl.text());\n    //qDebug() << \"CORRECTING COLUMN FROM: \" << logical << \"TO\" << m_targetColumn;\n    setPosition(qMin(pos, physical));\n}\n\nvoid FakeVimHandler::Private::setTargetColumn()\n{\n    m_targetColumn = logicalCursorColumn();\n    m_visualTargetColumn = m_targetColumn;\n\n    QTextCursor tc = m_cursor;\n    tc.movePosition(StartOfLine);\n    m_targetColumnWrapped = m_cursor.position() - tc.position();\n}\n\n/* if simple is given:\n *  class 0: spaces\n *  class 1: non-spaces\n * else\n *  class 0: spaces\n *  class 1: non-space-or-letter-or-number\n *  class 2: letter-or-number\n */\n\n\nint FakeVimHandler::Private::charClass(QChar c, bool simple) const\n{\n    if (simple)\n        return c.isSpace() ? 0 : 1;\n    // FIXME: This means that only characters < 256 in the\n    // ConfigIsKeyword setting are handled properly.\n    if (c.unicode() < 256) {\n        //int old = (c.isLetterOrNumber() || c.unicode() == '_') ? 2\n        //    :  c.isSpace() ? 0 : 1;\n        //qDebug() << c.unicode() << old << m_charClass[c.unicode()];\n        return m_charClass[c.unicode()];\n    }\n    if (c.isLetterOrNumber() || c == '_')\n        return 2;\n    return c.isSpace() ? 0 : 1;\n}\n\nvoid FakeVimHandler::Private::miniBufferTextEdited(const QString &text, int cursorPos,\n    int anchorPos)\n{\n    if (!isCommandLineMode()) {\n        editor()->setFocus();\n    } else if (text.isEmpty()) {\n        // editing cancelled\n        enterFakeVim();\n        handleDefaultKey(Input(Qt::Key_Escape, Qt::NoModifier, QString()));\n        leaveFakeVim();\n        editor()->setFocus();\n    } else {\n        CommandBuffer &cmdBuf = (g.mode == ExMode) ? g.commandBuffer : g.searchBuffer;\n        int pos = qMax(1, cursorPos);\n        int anchor = anchorPos == -1 ? pos : qMax(1, anchorPos);\n        QString buffer = text;\n        // prepend prompt character if missing\n        if (!buffer.startsWith(cmdBuf.prompt())) {\n            buffer.prepend(cmdBuf.prompt());\n            ++pos;\n            ++anchor;\n        }\n        // update command/search buffer\n        cmdBuf.setContents(buffer.mid(1), pos - 1, anchor - 1);\n        if (pos != cursorPos || anchor != anchorPos || buffer != text)\n            q->commandBufferChanged(buffer, pos, anchor, 0);\n        // update search expression\n        if (g.subsubmode == SearchSubSubMode) {\n            updateFind(false);\n            commitCursor();\n        }\n    }\n}\n\nvoid FakeVimHandler::Private::pullOrCreateBufferData()\n{\n    const QVariant data = document()->property(\"FakeVimSharedData\");\n    if (data.isValid()) {\n        // FakeVimHandler has been already created for this document (e.g. in other split).\n        m_buffer = data.value<BufferDataPtr>();\n    } else {\n        // FakeVimHandler has not been created for this document yet.\n        m_buffer = BufferDataPtr(new BufferData);\n        document()->setProperty(\"FakeVimSharedData\", QVariant::fromValue(m_buffer));\n    }\n\n    if (editor()->hasFocus())\n        m_buffer->currentHandler = this;\n}\n\n// Helper to parse a-z,A-Z,48-57,_\nstatic int someInt(const QString &str)\n{\n    if (str.toInt())\n        return str.toInt();\n    if (!str.isEmpty())\n        return str.at(0).unicode();\n    return 0;\n}\n\nvoid FakeVimHandler::Private::setupCharClass()\n{\n    for (int i = 0; i < 256; ++i) {\n        const QChar c = QLatin1Char(i);\n        m_charClass[i] = c.isSpace() ? 0 : 1;\n    }\n    const QString conf = s.isKeyword.value();\n    for (const QString &part : conf.split(',')) {\n        if (part.contains('-')) {\n            const int from = someInt(part.section('-', 0, 0));\n            const int to = someInt(part.section('-', 1, 1));\n            for (int i = qMax(0, from); i <= qMin(255, to); ++i)\n                m_charClass[i] = 2;\n        } else {\n            m_charClass[qMin(255, someInt(part))] = 2;\n        }\n    }\n}\n\nvoid FakeVimHandler::Private::moveToBoundary(bool simple, bool forward)\n{\n    QTextCursor tc(document());\n    tc.setPosition(position());\n    if (forward ? tc.atBlockEnd() : tc.atBlockStart())\n        return;\n\n    QChar c = characterAt(tc.position() + (forward ? -1 : 1));\n    int lastClass = tc.atStart() ? -1 : charClass(c, simple);\n    QTextCursor::MoveOperation op = forward ? Right : Left;\n    while (true) {\n        c = characterAt(tc.position());\n        int thisClass = charClass(c, simple);\n        if (thisClass != lastClass || (forward ? tc.atBlockEnd() : tc.atBlockStart())) {\n            if (tc != m_cursor)\n                tc.movePosition(forward ? Left : Right);\n            break;\n        }\n        lastClass = thisClass;\n        tc.movePosition(op);\n    }\n    setPosition(tc.position());\n}\n\nvoid FakeVimHandler::Private::moveToNextBoundary(bool end, int count, bool simple, bool forward)\n{\n    int repeat = count;\n    while (repeat > 0 && !(forward ? atDocumentEnd() : atDocumentStart())) {\n        setPosition(position() + (forward ? 1 : -1));\n        moveToBoundary(simple, forward);\n        if (atBoundary(end, simple))\n            --repeat;\n    }\n}\n\nvoid FakeVimHandler::Private::moveToNextBoundaryStart(int count, bool simple, bool forward)\n{\n    moveToNextBoundary(false, count, simple, forward);\n}\n\nvoid FakeVimHandler::Private::moveToNextBoundaryEnd(int count, bool simple, bool forward)\n{\n    moveToNextBoundary(true, count, simple, forward);\n}\n\nvoid FakeVimHandler::Private::moveToBoundaryStart(int count, bool simple, bool forward)\n{\n    moveToNextBoundaryStart(atBoundary(false, simple) ? count - 1 : count, simple, forward);\n}\n\nvoid FakeVimHandler::Private::moveToBoundaryEnd(int count, bool simple, bool forward)\n{\n    moveToNextBoundaryEnd(atBoundary(true, simple) ? count - 1 : count, simple, forward);\n}\n\nvoid FakeVimHandler::Private::moveToNextWord(bool end, int count, bool simple, bool forward, bool emptyLines)\n{\n    int repeat = count;\n    while (repeat > 0 && !(forward ? atDocumentEnd() : atDocumentStart())) {\n        setPosition(position() + (forward ? 1 : -1));\n        moveToBoundary(simple, forward);\n        if (atWordBoundary(end, simple) && (emptyLines || !atEmptyLine()) )\n            --repeat;\n    }\n}\n\nvoid FakeVimHandler::Private::moveToNextWordStart(int count, bool simple, bool forward, bool emptyLines)\n{\n    g.movetype = MoveExclusive;\n    moveToNextWord(false, count, simple, forward, emptyLines);\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToNextWordEnd(int count, bool simple, bool forward, bool emptyLines)\n{\n    g.movetype = MoveInclusive;\n    moveToNextWord(true, count, simple, forward, emptyLines);\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::moveToWordStart(int count, bool simple, bool forward, bool emptyLines)\n{\n    moveToNextWordStart(atWordStart(simple) ? count - 1 : count, simple, forward, emptyLines);\n}\n\nvoid FakeVimHandler::Private::moveToWordEnd(int count, bool simple, bool forward, bool emptyLines)\n{\n    moveToNextWordEnd(atWordEnd(simple) ? count - 1 : count, simple, forward, emptyLines);\n}\n\nbool FakeVimHandler::Private::handleFfTt(const QString &key, bool repeats)\n{\n    int key0 = key.size() == 1 ? key.at(0).unicode() : 0;\n    // g.subsubmode \\in { 'f', 'F', 't', 'T' }\n    bool forward = g.subsubdata.is('f') || g.subsubdata.is('t');\n    bool exclusive =  g.subsubdata.is('t') || g.subsubdata.is('T');\n    int repeat = count();\n    int n = block().position() + (forward ? block().length() : - 1);\n    const int d = forward ? 1 : -1;\n    // FIXME: This also depends on whether 'cpositions' Vim option contains ';'.\n    const int skip = (repeats && repeat == 1 && exclusive) ? d : 0;\n    int pos = position() + d + skip;\n\n    for (; repeat > 0 && (forward ? pos < n : pos > n); pos += d) {\n        if (characterAt(pos).unicode() == key0)\n            --repeat;\n    }\n\n    if (repeat == 0) {\n        setPosition(pos - d - (exclusive ? d : 0));\n        setTargetColumn();\n        return true;\n    }\n\n    return false;\n}\n\nvoid FakeVimHandler::Private::moveToMatchingParanthesis()\n{\n    bool moved = false;\n    bool forward = false;\n\n    const int anc = anchor();\n    QTextCursor tc = m_cursor;\n\n    // If no known parenthesis symbol is under cursor find one on the current line after cursor.\n    static const QString parenthesesChars(\"([{}])\");\n    while (!parenthesesChars.contains(characterAt(tc.position())) && !tc.atBlockEnd())\n        tc.setPosition(tc.position() + 1);\n\n    if (tc.atBlockEnd())\n        tc = m_cursor;\n\n    q->moveToMatchingParenthesis(&moved, &forward, &tc);\n    if (moved) {\n        if (forward)\n            tc.movePosition(Left, KeepAnchor, 1);\n        setAnchorAndPosition(anc, tc.position());\n        setTargetColumn();\n    }\n}\n\nint FakeVimHandler::Private::cursorLineOnScreen() const\n{\n    if (!editor())\n        return 0;\n    const QRect rect = EDITOR(cursorRect(m_cursor));\n    return rect.height() > 0 ? rect.y() / rect.height() : 0;\n}\n\nint FakeVimHandler::Private::linesOnScreen() const\n{\n    if (!editor())\n        return 1;\n    const int h = EDITOR(cursorRect(m_cursor)).height();\n    return h > 0 ? EDITOR(viewport()->height()) / h : 1;\n}\n\nint FakeVimHandler::Private::cursorLine() const\n{\n    return lineForPosition(position()) - 1;\n}\n\nint FakeVimHandler::Private::cursorBlockNumber() const\n{\n    return blockAt(qMin(anchor(), position())).blockNumber();\n}\n\nint FakeVimHandler::Private::physicalCursorColumn() const\n{\n    return position() - block().position();\n}\n\nint FakeVimHandler::Private::physicalToLogicalColumn\n    (const int physical, const QString &line) const\n{\n    const int ts = s.tabStop.value();\n    int p = 0;\n    int logical = 0;\n    while (p < physical) {\n        QChar c = line.at(p);\n        //if (c == ' ')\n        //    ++logical;\n        //else\n        if (c == '\\t')\n            logical += ts - logical % ts;\n        else\n            ++logical;\n            //break;\n        ++p;\n    }\n    return logical;\n}\n\nint FakeVimHandler::Private::logicalToPhysicalColumn\n    (const int logical, const QString &line) const\n{\n    const int ts = s.tabStop.value();\n    int physical = 0;\n    for (int l = 0; l < logical && physical < line.size(); ++physical) {\n        QChar c = line.at(physical);\n        if (c == '\\t')\n            l += ts - l % ts;\n        else\n            ++l;\n    }\n    return physical;\n}\n\nint FakeVimHandler::Private::windowScrollOffset() const\n{\n    return qMin(static_cast<int>(s.scrollOff.value()), linesOnScreen() / 2);\n}\n\nint FakeVimHandler::Private::logicalCursorColumn() const\n{\n    const int physical = physicalCursorColumn();\n    const QString line = block().text();\n    return physicalToLogicalColumn(physical, line);\n}\n\nColumn FakeVimHandler::Private::cursorColumn() const\n{\n    return Column(physicalCursorColumn(), logicalCursorColumn());\n}\n\nint FakeVimHandler::Private::linesInDocument() const\n{\n    if (m_cursor.isNull())\n        return 0;\n    return document()->blockCount();\n}\n\nvoid FakeVimHandler::Private::scrollToLine(int line)\n{\n    // Don't scroll if the line is already at the top.\n    updateFirstVisibleLine();\n    if (line == m_firstVisibleLine)\n        return;\n\n    const QTextCursor tc = m_cursor;\n\n    QTextCursor tc2 = tc;\n    tc2.setPosition(document()->lastBlock().position());\n    EDITOR(setTextCursor(tc2));\n    EDITOR(ensureCursorVisible());\n\n    int offset = 0;\n    const QTextBlock block = document()->findBlockByLineNumber(line);\n    if (block.isValid()) {\n        const int blockLineCount = block.layout()->lineCount();\n        const int lineInBlock = line - block.firstLineNumber();\n        if (0 <= lineInBlock && lineInBlock < blockLineCount) {\n            QTextLine textLine = block.layout()->lineAt(lineInBlock);\n            offset = textLine.textStart();\n        } else {\n//            QTC_CHECK(false);\n        }\n    }\n    tc2.setPosition(block.position() + offset);\n    EDITOR(setTextCursor(tc2));\n    EDITOR(ensureCursorVisible());\n\n    EDITOR(setTextCursor(tc));\n\n    m_firstVisibleLine = line;\n}\n\nvoid FakeVimHandler::Private::updateFirstVisibleLine()\n{\n    const QTextCursor tc = EDITOR(cursorForPosition(QPoint(0,0)));\n    m_firstVisibleLine = lineForPosition(tc.position()) - 1;\n}\n\nint FakeVimHandler::Private::firstVisibleLine() const\n{\n    return m_firstVisibleLine;\n}\n\nint FakeVimHandler::Private::lastVisibleLine() const\n{\n    const int line = m_firstVisibleLine + linesOnScreen();\n    const QTextBlock block = document()->findBlockByLineNumber(line);\n    return block.isValid() ? line : document()->lastBlock().firstLineNumber();\n}\n\nint FakeVimHandler::Private::lineOnTop(int count) const\n{\n    const int scrollOffset = qMax(count - 1, windowScrollOffset());\n    const int line = firstVisibleLine();\n    return line == 0 ? count - 1 : scrollOffset + line;\n}\n\nint FakeVimHandler::Private::lineOnBottom(int count) const\n{\n    const int scrollOffset = qMax(count - 1, windowScrollOffset());\n    const int line = lastVisibleLine();\n    return line >= document()->lastBlock().firstLineNumber() ? line - count + 1\n                                                             : line - scrollOffset - 1;\n}\n\nvoid FakeVimHandler::Private::scrollUp(int count)\n{\n    scrollToLine(cursorLine() - cursorLineOnScreen() - count);\n}\n\nvoid FakeVimHandler::Private::updateScrollOffset()\n{\n    const int line = cursorLine();\n    if (line < lineOnTop())\n        scrollToLine(qMax(0, line - windowScrollOffset()));\n    else if (line > lineOnBottom())\n        scrollToLine(firstVisibleLine() + line - lineOnBottom());\n}\n\nvoid FakeVimHandler::Private::alignViewportToCursor(AlignmentFlag align, int line,\n    bool moveToNonBlank)\n{\n    if (line > 0)\n        setPosition(firstPositionInLine(line));\n    if (moveToNonBlank)\n        moveToFirstNonBlankOnLine();\n\n    if (align == Qt::AlignTop)\n        scrollUp(- cursorLineOnScreen());\n    else if (align == Qt::AlignVCenter)\n        scrollUp(linesOnScreen() / 2 - cursorLineOnScreen());\n    else if (align == Qt::AlignBottom)\n        scrollUp(linesOnScreen() - cursorLineOnScreen() - 1);\n}\n\nint FakeVimHandler::Private::lineToBlockNumber(int line) const\n{\n    return document()->findBlockByLineNumber(line).blockNumber();\n}\n\nvoid FakeVimHandler::Private::setCursorPosition(const CursorPosition &p)\n{\n    const int firstLine = firstVisibleLine();\n    const int firstBlock = lineToBlockNumber(firstLine);\n    const int lastBlock = lineToBlockNumber(firstLine + linesOnScreen() - 2);\n    bool isLineVisible = firstBlock <= p.line && p.line <= lastBlock;\n    setCursorPosition(&m_cursor, p);\n    if (!isLineVisible)\n        alignViewportToCursor(Qt::AlignVCenter);\n}\n\nvoid FakeVimHandler::Private::setCursorPosition(QTextCursor *tc, const CursorPosition &p)\n{\n    const int line = qMin(document()->blockCount() - 1, p.line);\n    QTextBlock block = document()->findBlockByNumber(line);\n    const int column = qMin(p.column, block.length() - 1);\n    tc->setPosition(block.position() + column, KeepAnchor);\n}\n\nint FakeVimHandler::Private::lastPositionInDocument(bool ignoreMode) const\n{\n    return document()->characterCount()\n        - (ignoreMode || isVisualMode() || isInsertMode() ? 1 : 2);\n}\n\nQString FakeVimHandler::Private::selectText(const Range &range) const\n{\n    QString contents;\n    const QString lineEnd = range.rangemode == RangeBlockMode ? QString('\\n') : QString();\n    QTextCursor tc = m_cursor;\n    transformText(range, tc,\n        [&tc, &contents, &lineEnd]() { contents.append(tc.selection().toPlainText() + lineEnd); });\n    return contents;\n}\n\nvoid FakeVimHandler::Private::yankText(const Range &range, int reg)\n{\n    const QString text = selectText(range);\n    setRegister(reg, text, range.rangemode);\n\n    // If register is not specified or \" ...\n    if (m_register == '\"') {\n        // with delete and change commands set register 1 (if text contains more lines) or\n        // small delete register -\n        if (g.submode == DeleteSubMode || g.submode == ChangeSubMode) {\n            if (text.contains('\\n'))\n                setRegister('1', text, range.rangemode);\n            else\n                setRegister('-', text, range.rangemode);\n        } else {\n            // copy to yank register 0 too\n            setRegister('0', text, range.rangemode);\n        }\n    } else if (m_register != '_') {\n        // Always copy to \" register too (except black hole register).\n        setRegister('\"', text, range.rangemode);\n    }\n\n    const int lines = blockAt(range.endPos).blockNumber()\n        - blockAt(range.beginPos).blockNumber() + 1;\n    if (lines > 2)\n        showMessage(MessageInfo, Tr::tr(\"%n lines yanked.\", nullptr, lines));\n}\n\nvoid FakeVimHandler::Private::transformText(\n        const Range &range, QTextCursor &tc, const std::function<void()> &transform) const\n{\n    switch (range.rangemode) {\n        case RangeCharMode: {\n            // This can span multiple lines.\n            tc.setPosition(range.beginPos, MoveAnchor);\n            tc.setPosition(range.endPos, KeepAnchor);\n            transform();\n            tc.setPosition(range.beginPos);\n            break;\n        }\n        case RangeLineMode:\n        case RangeLineModeExclusive: {\n            tc.setPosition(range.beginPos, MoveAnchor);\n            tc.movePosition(StartOfLine, MoveAnchor);\n            tc.setPosition(range.endPos, KeepAnchor);\n            tc.movePosition(EndOfLine, KeepAnchor);\n            if (range.rangemode != RangeLineModeExclusive) {\n                // make sure that complete lines are removed\n                // - also at the beginning and at the end of the document\n                if (tc.atEnd()) {\n                    tc.setPosition(range.beginPos, MoveAnchor);\n                    tc.movePosition(StartOfLine, MoveAnchor);\n                    if (!tc.atStart()) {\n                        // also remove first line if it is the only one\n                        tc.movePosition(Left, MoveAnchor, 1);\n                        tc.movePosition(EndOfLine, MoveAnchor, 1);\n                    }\n                    tc.setPosition(range.endPos, KeepAnchor);\n                    tc.movePosition(EndOfLine, KeepAnchor);\n                } else {\n                    tc.movePosition(Right, KeepAnchor, 1);\n                }\n            }\n            const int posAfter = tc.anchor();\n            transform();\n            tc.setPosition(posAfter);\n            break;\n        }\n        case RangeBlockAndTailMode:\n        case RangeBlockMode: {\n            int beginColumn = columnAt(range.beginPos);\n            int endColumn = columnAt(range.endPos);\n            if (endColumn < beginColumn)\n                std::swap(beginColumn, endColumn);\n            if (range.rangemode == RangeBlockAndTailMode)\n                endColumn = INT_MAX - 1;\n            QTextBlock block = document()->findBlock(range.beginPos);\n            const QTextBlock lastBlock = document()->findBlock(range.endPos);\n            while (block.isValid() && block.position() <= lastBlock.position()) {\n                int bCol = qMin(beginColumn, block.length() - 1);\n                int eCol = qMin(endColumn + 1, block.length() - 1);\n                tc.setPosition(block.position() + bCol, MoveAnchor);\n                tc.setPosition(block.position() + eCol, KeepAnchor);\n                transform();\n                block = block.next();\n            }\n            tc.setPosition(range.beginPos);\n            break;\n        }\n    }\n}\n\nvoid FakeVimHandler::Private::transformText(const Range &range, const Transformation &transform)\n{\n    beginEditBlock();\n    transformText(range, m_cursor,\n        [this, &transform] { m_cursor.insertText(transform(m_cursor.selection().toPlainText())); });\n    endEditBlock();\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::insertText(QTextCursor &tc, const QString &text)\n{\n  if (s.passKeys.value()) {\n      if (tc.hasSelection() && text.isEmpty()) {\n          QKeyEvent event(QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier, QString());\n          passEventToEditor(event, tc);\n      }\n\n      for (QChar c : text) {\n          QKeyEvent event(QEvent::KeyPress, -1, Qt::NoModifier, QString(c));\n          passEventToEditor(event, tc);\n      }\n  } else {\n      tc.insertText(text);\n  }\n}\n\nvoid FakeVimHandler::Private::insertText(const Register &reg)\n{\n    if (reg.rangemode != RangeCharMode) {\n        qWarning() << \"WRONG INSERT MODE: \" << reg.rangemode;\n        return;\n    }\n    setAnchor();\n    m_cursor.insertText(reg.contents);\n    //dump(\"AFTER INSERT\");\n}\n\nvoid FakeVimHandler::Private::removeText(const Range &range)\n{\n    transformText(range, [](const QString &) { return QString(); });\n}\n\nvoid FakeVimHandler::Private::downCase(const Range &range)\n{\n    transformText(range, [](const QString &text) { return text.toLower(); } );\n}\n\nvoid FakeVimHandler::Private::upCase(const Range &range)\n{\n    transformText(range, [](const QString &text) { return text.toUpper(); } );\n}\n\nvoid FakeVimHandler::Private::invertCase(const Range &range)\n{\n    transformText(range,\n        [] (const QString &text) -> QString {\n            QString result = text;\n            for (int i = 0; i < result.length(); ++i) {\n                const QChar c = result[i];\n                result[i] = c.isUpper() ? c.toLower() : c.toUpper();\n            }\n            return result;\n    });\n}\n\nvoid FakeVimHandler::Private::toggleComment(const Range &range)\n{\n    static const QMap<QString, QString> extensionToCommentString {\n        {\"pri\", \"#\"},\n        {\"pro\", \"#\"},\n        {\"h\", \"//\"},\n        {\"hpp\", \"//\"},\n        {\"cpp\", \"//\"},\n    };\n    const QString commentString = extensionToCommentString.value(QFileInfo(m_currentFileName).suffix(), \"//\");\n\n    transformText(range,\n        [&commentString] (const QString &text) -> QString {\n\n        QStringList lines = text.split('\\n');\n\n        const QRegularExpression checkForComment(\"^\\\\s*\"\n                                                 + QRegularExpression::escape(commentString));\n\n        const bool firstLineIsComment\n                = !lines.empty() && lines.front().contains(checkForComment);\n\n        for (auto& line : lines) {\n            if (!line.isEmpty()) {\n                if (firstLineIsComment) {\n                    const bool hasSpaceAfterCommentString = line.contains(\n                        QRegularExpression(checkForComment.pattern() + \"\\\\s\"));\n                    const int sizeToReplace = hasSpaceAfterCommentString ? commentString.size() + 1\n                                                                     : commentString.size();\n                    line.replace(line.indexOf(commentString), sizeToReplace, \"\");\n                } else {\n                    const int indexOfFirstNonSpace = line.indexOf(QRegularExpression(\"[^\\\\s]\"));\n                    line = line.left(indexOfFirstNonSpace) + commentString  + \" \" + line.right(line.size() - indexOfFirstNonSpace);\n                }\n            }\n        }\n\n        return lines.size() == 1 ? lines.front() : lines.join(\"\\n\");\n    });\n}\n\nvoid FakeVimHandler::Private::exchangeRange(const Range &range)\n{\n    if (g.exchangeRange) {\n        pushUndoState(false);\n        beginEditBlock();\n\n        Range leftRange = *g.exchangeRange;\n        Range rightRange = range;\n        if (leftRange.beginPos > rightRange.beginPos)\n            std::swap(leftRange, rightRange);\n\n        // First replace the right range, then left one\n        // If we did it the other way around, we would invalidate the positions\n        // of the right range\n        const QString rightText = selectText(rightRange);\n        replaceText(rightRange, selectText(leftRange));\n        replaceText(leftRange, rightText);\n\n        g.exchangeRange.reset();\n\n        endEditBlock();\n    } else {\n        g.exchangeRange = range;\n    }\n}\n\nvoid FakeVimHandler::Private::replaceWithRegister(const Range &range)\n{\n    replaceText(range, registerContents(m_register));\n}\n\nvoid FakeVimHandler::Private::surroundCurrentRange(const Input &input, const QString &prefix)\n{\n    QString dotCommand;\n    if (isVisualMode())\n        dotCommand = visualDotCommand() + \"S\" + input.asChar();\n\n    const bool wasVisualCharMode = isVisualCharMode();\n    const bool wasVisualLineMode = isVisualLineMode();\n    leaveVisualMode();\n\n    if (dotCommand.isEmpty()) { // i.e. we came from normal mode\n        dotCommand = dotCommandFromSubMode(g.submode)\n                     + QLatin1Char(g.surroundUpperCaseS ? 'S' : 's')\n                     + g.dotCommand + input.asChar();\n    }\n\n    if (wasVisualCharMode)\n        setPosition(position() + 1);\n\n    QString newFront, newBack;\n\n    if (input.is('(') || input.is(')') || input.is('b')) {\n        newFront = '(';\n        newBack = ')';\n    } else if (input.is('{') || input.is('}') || input.is('B')) {\n        newFront = '{';\n        newBack = '}';\n    } else if (input.is('[') || input.is(']')) {\n        newFront = '[';\n        newBack = ']';\n    } else if (input.is('<') || input.is('>') || input.is('t')) {\n        newFront = '<';\n        newBack = '>';\n    } else if (input.is('\"') || input.is('\\'') || input.is('`')) {\n        newFront = input.asChar();\n        newBack = input.asChar();\n    }\n\n    if (g.surroundUpperCaseS || wasVisualLineMode) {\n        // yS and cS add a new line before and after the surrounded text\n        newFront += \"\\n\";\n        if (wasVisualLineMode)\n            newBack += \"\\n\";\n        else\n            newBack = \"\\n\" + newBack;\n    } else if (input.is('(') || input.is('{') || input.is('[')) {\n        // Opening characters add an extra space\n        newFront = newFront + \" \";\n        newBack = \" \" + newBack;\n    }\n\n\n    if (!newFront.isEmpty()) {\n        transformText(currentRange(), [&](QString text) -> QString {\n            if (newFront == QChar())\n                return text.mid(1, text.size() - 2);\n\n            const QString newMiddle = (g.submode == ChangeSurroundingSubMode) ?\n                                          text.mid(1, text.size() - 2) : text;\n\n            return prefix + newFront + newMiddle + newBack;\n        });\n    }\n\n    // yS, cS and VS also indent the surrounded text\n    if (g.surroundUpperCaseS || wasVisualLineMode)\n        replay(\"=a\" + input.asChar());\n\n    // Indenting has changed the dotCommand, so now set it back to the correct one\n    g.dotCommand = dotCommand;\n}\n\nvoid FakeVimHandler::Private::replaceText(const Range &range, const QString &str)\n{\n    transformText(range, [&str](const QString &) { return str; } );\n}\n\nvoid FakeVimHandler::Private::pasteText(bool afterCursor)\n{\n    const QString text = registerContents(m_register);\n    const RangeMode rangeMode = registerRangeMode(m_register);\n\n    beginEditBlock();\n\n    // In visual mode paste text only inside selection.\n    bool pasteAfter = isVisualMode() ? false : afterCursor;\n\n    if (isVisualMode())\n        cutSelectedText(g.submode == ReplaceWithRegisterSubMode ? '-' : '\"');\n\n    switch (rangeMode) {\n        case RangeCharMode: {\n            m_targetColumn = 0;\n            const int pos = position() + 1;\n            if (pasteAfter && rightDist() > 0)\n                moveRight();\n            insertText(text.repeated(count()));\n            if (text.contains('\\n'))\n                setPosition(pos);\n            else\n                moveLeft();\n            break;\n        }\n        case RangeLineMode:\n        case RangeLineModeExclusive: {\n            QTextCursor tc = m_cursor;\n            moveToStartOfLine();\n            m_targetColumn = 0;\n            bool lastLine = false;\n            if (pasteAfter) {\n                lastLine = document()->lastBlock() == this->block();\n                if (lastLine) {\n                    tc.movePosition(EndOfLine, MoveAnchor);\n                    tc.insertBlock();\n                }\n                moveDown();\n            }\n            const int pos = position();\n            if (lastLine)\n                insertText(text.repeated(count()).left(text.size() * count() - 1));\n            else\n                insertText(text.repeated(count()));\n            setPosition(pos);\n            moveToFirstNonBlankOnLine();\n            break;\n        }\n        case RangeBlockAndTailMode:\n        case RangeBlockMode: {\n            const int pos = position();\n            if (pasteAfter && rightDist() > 0)\n                moveRight();\n            QTextCursor tc = m_cursor;\n            const int col = tc.columnNumber();\n            QTextBlock block = tc.block();\n            const QStringList lines = text.split('\\n');\n            for (int i = 0; i < lines.size() - 1; ++i) {\n                if (!block.isValid()) {\n                    tc.movePosition(EndOfDocument);\n                    tc.insertBlock();\n                    block = tc.block();\n                }\n\n                // resize line\n                int length = block.length();\n                int begin = block.position();\n                if (col >= length) {\n                    tc.setPosition(begin + length - 1);\n                    tc.insertText(QString(col - length + 1, ' '));\n                } else {\n                    tc.setPosition(begin + col);\n                }\n\n                // insert text\n                const QString line = lines.at(i).repeated(count());\n                tc.insertText(line);\n\n                // next line\n                block = block.next();\n            }\n            setPosition(pos);\n            if (pasteAfter)\n                moveRight();\n            break;\n        }\n    }\n\n    endEditBlock();\n}\n\nvoid FakeVimHandler::Private::cutSelectedText(int reg)\n{\n    pushUndoState();\n\n    bool visualMode = isVisualMode();\n    leaveVisualMode();\n\n    Range range = currentRange();\n    if (visualMode && g.rangemode == RangeCharMode)\n        ++range.endPos;\n\n    if (!reg)\n        reg = m_register;\n\n    g.submode = DeleteSubMode;\n    yankText(range, reg);\n    removeText(range);\n    g.submode = NoSubMode;\n\n    if (g.rangemode == RangeLineMode)\n        handleStartOfLine();\n    else if (g.rangemode == RangeBlockMode)\n        setPosition(qMin(position(), anchor()));\n}\n\nvoid FakeVimHandler::Private::joinLines(int count, bool preserveSpace)\n{\n    int pos = position();\n    const int blockNumber = m_cursor.blockNumber();\n\n    const QString currentLine = lineContents(blockNumber + 1);\n    const bool startingLineIsComment\n            = currentLine.contains(QRegularExpression(\"^\\\\s*\\\\/\\\\/\")) // Cpp-style\n              || currentLine.contains(QRegularExpression(\"^\\\\s*\\\\/?\\\\*\")) // C-style\n              || currentLine.contains(QRegularExpression(\"^\\\\s*#\")); // Python/Shell-style\n\n    for (int i = qMax(count - 2, 0); i >= 0 && blockNumber < document()->blockCount(); --i) {\n        moveBehindEndOfLine();\n        pos = position();\n        setAnchor();\n        moveRight();\n        if (preserveSpace) {\n            removeText(currentRange());\n        } else {\n            while (characterAtCursor() == ' ' || characterAtCursor() == '\\t')\n                moveRight();\n\n            // If the line we started from is a comment, remove the comment string from the next line\n            if (startingLineIsComment && s.formatOptions.value().contains('f')) {\n                if (characterAtCursor() == '/' && characterAt(position() + 1) == '/')\n                    moveRight(2);\n                else if (characterAtCursor() == '*' || characterAtCursor() == '#')\n                    moveRight(1);\n\n                if (characterAtCursor() == ' ')\n                    moveRight();\n            }\n\n            m_cursor.insertText(QString(' '));\n        }\n    }\n    setPosition(pos);\n}\n\nvoid FakeVimHandler::Private::insertNewLine()\n{\n    if (m_buffer->editBlockLevel <= 1 && s.passKeys.value()) {\n        QKeyEvent event(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, \"\\n\");\n        if (passEventToEditor(event, m_cursor))\n            return;\n    }\n\n    insertText(QString(\"\\n\"));\n    insertAutomaticIndentation(true);\n}\n\nbool FakeVimHandler::Private::handleInsertInEditor(const Input &input)\n{\n    if (m_buffer->editBlockLevel > 0 || !s.passKeys.value())\n        return false;\n\n    joinPreviousEditBlock();\n\n    QKeyEvent event(QEvent::KeyPress, input.key(), input.modifiers(), input.text());\n    setAnchor();\n    if (!passEventToEditor(event, m_cursor))\n        return !m_textedit && !m_plaintextedit; // Mark event as handled if it has destroyed editor.\n\n    endEditBlock();\n\n    setTargetColumn();\n\n    return true;\n}\n\nbool FakeVimHandler::Private::passEventToEditor(QEvent &event, QTextCursor &tc)\n{\n    removeEventFilter();\n    q->requestDisableBlockSelection();\n\n    setThinCursor();\n    EDITOR(setTextCursor(tc));\n\n    bool accepted = QApplication::sendEvent(editor(), &event);\n    if (!m_textedit && !m_plaintextedit)\n        return false;\n\n    if (accepted)\n        tc = editorCursor();\n\n    return accepted;\n}\n\nQString FakeVimHandler::Private::lineContents(int line) const\n{\n    return document()->findBlockByLineNumber(line - 1).text();\n}\n\nQString FakeVimHandler::Private::textAt(int from, int to) const\n{\n    QTextCursor tc(document());\n    tc.setPosition(from);\n    tc.setPosition(to, KeepAnchor);\n    return tc.selectedText().replace(ParagraphSeparator, '\\n');\n}\n\nvoid FakeVimHandler::Private::setLineContents(int line, const QString &contents)\n{\n    QTextBlock block = document()->findBlockByLineNumber(line - 1);\n    QTextCursor tc = m_cursor;\n    const int begin = block.position();\n    const int len = block.length();\n    tc.setPosition(begin);\n    tc.setPosition(begin + len - 1, KeepAnchor);\n    tc.insertText(contents);\n}\n\nint FakeVimHandler::Private::blockBoundary(const QString &left,\n    const QString &right, bool closing, int count) const\n{\n    const QString &begin = closing ? left : right;\n    const QString &end = closing ? right : left;\n\n    // shift cursor if it is already on opening/closing string\n    QTextCursor tc1 = m_cursor;\n    int pos = tc1.position();\n    int max = document()->characterCount();\n    int sz = left.size();\n    int from = qMax(pos - sz + 1, 0);\n    int to = qMin(pos + sz, max);\n    tc1.setPosition(from);\n    tc1.setPosition(to, KeepAnchor);\n    int i = tc1.selectedText().indexOf(left);\n    if (i != -1) {\n        // - on opening string:\n        tc1.setPosition(from + i + sz);\n    } else {\n        sz = right.size();\n        from = qMax(pos - sz + 1, 0);\n        to = qMin(pos + sz, max);\n        tc1.setPosition(from);\n        tc1.setPosition(to, KeepAnchor);\n        i = tc1.selectedText().indexOf(right);\n        if (i != -1) {\n            // - on closing string:\n            tc1.setPosition(from + i);\n        } else {\n            tc1 = m_cursor;\n        }\n    }\n\n    QTextCursor tc2 = tc1;\n    QTextDocument::FindFlags flags(closing ? 0 : QTextDocument::FindBackward);\n    int level = 0;\n    int counter = 0;\n    while (true) {\n        tc2 = document()->find(end, tc2, flags);\n        if (tc2.isNull())\n            return -1;\n        if (!tc1.isNull())\n            tc1 = document()->find(begin, tc1, flags);\n\n        while (!tc1.isNull() && (closing ? (tc1 < tc2) : (tc2 < tc1))) {\n            ++level;\n            tc1 = document()->find(begin, tc1, flags);\n        }\n\n        while (level > 0\n               && (tc1.isNull() || (closing ? (tc2 < tc1) : (tc1 < tc2)))) {\n            --level;\n            tc2 = document()->find(end, tc2, flags);\n            if (tc2.isNull())\n                return -1;\n        }\n\n        if (level == 0\n            && (tc1.isNull() || (closing ? (tc2 < tc1) : (tc1 < tc2)))) {\n            ++counter;\n            if (counter >= count)\n                break;\n        }\n    }\n\n    return tc2.position() - end.size();\n}\n\nint FakeVimHandler::Private::lineNumber(const QTextBlock &block) const\n{\n    if (block.isVisible())\n        return block.firstLineNumber() + 1;\n\n    // Folded block has line number of the nearest previous visible line.\n    QTextBlock block2 = block;\n    while (block2.isValid() && !block2.isVisible())\n        block2 = block2.previous();\n    return block2.firstLineNumber() + 1;\n}\n\nint FakeVimHandler::Private::columnAt(int pos) const\n{\n    return pos - blockAt(pos).position();\n}\n\nint FakeVimHandler::Private::blockNumberAt(int pos) const\n{\n    return blockAt(pos).blockNumber();\n}\n\nQTextBlock FakeVimHandler::Private::blockAt(int pos) const\n{\n    return document()->findBlock(pos);\n}\n\nQTextBlock FakeVimHandler::Private::nextLine(const QTextBlock &block) const\n{\n    return blockAt(block.position() + block.length());\n}\n\nQTextBlock FakeVimHandler::Private::previousLine(const QTextBlock &block) const\n{\n    return blockAt(block.position() - 1);\n}\n\nint FakeVimHandler::Private::firstPositionInLine(int line, bool onlyVisibleLines) const\n{\n    QTextBlock block = onlyVisibleLines ? document()->findBlockByLineNumber(line - 1)\n        : document()->findBlockByNumber(line - 1);\n    return block.position();\n}\n\nint FakeVimHandler::Private::lastPositionInLine(int line, bool onlyVisibleLines) const\n{\n    QTextBlock block;\n    if (onlyVisibleLines) {\n        block = document()->findBlockByLineNumber(line - 1);\n        // respect folds and wrapped lines\n        do {\n            block = nextLine(block);\n        } while (block.isValid() && !block.isVisible());\n        if (block.isValid()) {\n            if (line > 0)\n                block = block.previous();\n        } else {\n            block = document()->lastBlock();\n        }\n    } else {\n        block = document()->findBlockByNumber(line - 1);\n    }\n\n    const int position = block.position() + block.length() - 1;\n    if (block.length() > 1 && !isVisualMode() && !isInsertMode())\n        return position - 1;\n    return position;\n}\n\nint FakeVimHandler::Private::lineForPosition(int pos) const\n{\n    const QTextBlock block = blockAt(pos);\n    if (!block.isValid())\n        return 0;\n    const int positionInBlock = pos - block.position();\n    const int lineNumberInBlock = block.layout()->lineForTextPosition(positionInBlock).lineNumber();\n    return block.firstLineNumber() + lineNumberInBlock + 1;\n}\n\nvoid FakeVimHandler::Private::toggleVisualMode(VisualMode visualMode)\n{\n    if (visualMode == g.visualMode) {\n        leaveVisualMode();\n    } else {\n        m_positionPastEnd = false;\n        m_anchorPastEnd = false;\n        g.visualMode = visualMode;\n        m_buffer->lastVisualMode = visualMode;\n    }\n}\n\nvoid FakeVimHandler::Private::leaveVisualMode()\n{\n    if (!isVisualMode())\n        return;\n\n    if (isVisualLineMode()) {\n        g.rangemode = RangeLineMode;\n        g.movetype = MoveLineWise;\n    } else if (isVisualCharMode()) {\n        g.rangemode = RangeCharMode;\n        g.movetype = MoveInclusive;\n    } else if (isVisualBlockMode()) {\n        g.rangemode = m_visualTargetColumn == -1 ? RangeBlockAndTailMode : RangeBlockMode;\n        g.movetype = MoveInclusive;\n    }\n\n    g.visualMode = NoVisualMode;\n}\n\nvoid FakeVimHandler::Private::saveLastVisualMode()\n{\n    if (isVisualMode() && g.mode == CommandMode && g.submode == NoSubMode) {\n        setMark('<', markLessPosition());\n        setMark('>', markGreaterPosition());\n        m_buffer->lastVisualModeInverted = anchor() > position();\n        m_buffer->lastVisualMode = g.visualMode;\n    }\n}\n\nQWidget *FakeVimHandler::Private::editor() const\n{\n    return m_textedit\n        ? static_cast<QWidget *>(m_textedit)\n        : static_cast<QWidget *>(m_plaintextedit);\n}\n\nvoid FakeVimHandler::Private::joinPreviousEditBlock()\n{\n    UNDO_DEBUG(\"JOIN\");\n    if (m_buffer->breakEditBlock) {\n        beginEditBlock();\n        QTextCursor tc(m_cursor);\n        tc.setPosition(tc.position());\n        tc.beginEditBlock();\n        tc.insertText(\"X\");\n        tc.deletePreviousChar();\n        tc.endEditBlock();\n        m_buffer->breakEditBlock = false;\n    } else {\n        if (m_buffer->editBlockLevel == 0 && !m_buffer->undo.empty())\n            m_buffer->undoState = m_buffer->undo.pop();\n        beginEditBlock();\n    }\n}\n\nvoid FakeVimHandler::Private::beginEditBlock(bool largeEditBlock)\n{\n    UNDO_DEBUG(\"BEGIN EDIT BLOCK\" << m_buffer->editBlockLevel + 1);\n    if (!largeEditBlock && !m_buffer->undoState.isValid())\n        pushUndoState(false);\n    if (m_buffer->editBlockLevel == 0)\n        m_buffer->breakEditBlock = true;\n    ++m_buffer->editBlockLevel;\n}\n\nvoid FakeVimHandler::Private::endEditBlock()\n{\n    UNDO_DEBUG(\"END EDIT BLOCK\" << m_buffer->editBlockLevel);\n    if (m_buffer->editBlockLevel <= 0) {\n        qWarning(\"beginEditBlock() not called before endEditBlock()!\");\n        return;\n    }\n    --m_buffer->editBlockLevel;\n    if (m_buffer->editBlockLevel == 0 && m_buffer->undoState.isValid()) {\n        m_buffer->undo.push(m_buffer->undoState);\n        m_buffer->undoState = State();\n    }\n    if (m_buffer->editBlockLevel == 0)\n        m_buffer->breakEditBlock = false;\n}\n\nvoid FakeVimHandler::Private::onContentsChanged(int position, int charsRemoved, int charsAdded)\n{\n    // Record inserted and deleted text in insert mode.\n    if (isInsertMode() && (charsAdded > 0 || charsRemoved > 0) && canModifyBufferData()) {\n        BufferData::InsertState &insertState = m_buffer->insertState;\n        const int oldPosition = insertState.pos2;\n        if (!isInsertStateValid()) {\n            insertState.pos1 = oldPosition;\n            g.dotCommand = \"i\";\n            resetCount();\n        }\n        int indentation = 0;\n        bool changedAtEnd = false;\n        // Ignore changes outside inserted text (e.g. renaming other occurrences of a variable).\n        if (position + charsRemoved >= insertState.pos1 && position <= insertState.pos2) {\n            if (charsRemoved > 0) {\n                // Assume that in a manual edit operation a text can be removed only\n                // in front of cursor (<DELETE>) or behind it (<BACKSPACE>).\n\n                // If the recorded amount of backspace/delete keys doesn't correspond with\n                // number of removed characters, assume that the document has been changed\n                // externally and invalidate current insert state.\n\n                const bool wholeDocumentChanged =\n                        charsRemoved > 1\n                        && charsAdded > 0\n                        && charsAdded + 1 == document()->characterCount();\n\n                if (position < insertState.pos1) {\n                    // <BACKSPACE>\n                    const int backspaceCount = insertState.pos1 - position;\n                    const QString inserted = textAt(position, position + charsAdded);\n                    const QString unified = inserted.startsWith('\\n') ? inserted.mid(1) : inserted;\n                    changedAtEnd = unified.startsWith(insertState.textBeforeCursor);\n\n                    int indentNew = 0;\n                    for (int i = 0, end = unified.size(); i < end; ++i) {\n                        if (unified.at(i) != ' ')\n                            break;\n                        ++indentNew;\n                    }\n                    int indentOld = 0;\n                    for (int i = 0, end = insertState.textBeforeCursor.size(); i < end; ++i) {\n                        if (insertState.textBeforeCursor.at(i) != ' ')\n                            break;\n                        --indentOld;\n                    }\n                    indentation = indentNew + indentOld;\n\n                    if ((backspaceCount != charsRemoved && indentation == 0 && !changedAtEnd)\n                            || (oldPosition == charsRemoved && wholeDocumentChanged)) {\n                        invalidateInsertState();\n                    } else {\n                        const QString removed = insertState.textBeforeCursor.right(\n                                    qMax(backspaceCount, charsRemoved));\n                        if (indentation != 0 || changedAtEnd) {\n                            // automatic indent by electric chars / skipping of automatic inserted\n                            insertState.pos1 = position + backspaceCount + indentation;\n                            insertState.pos2 = position + charsAdded;\n                        } else if ( !inserted.endsWith(removed) ) {\n                            insertState.backspaces += backspaceCount;\n                            insertState.pos1 = position;\n                            insertState.pos2 = qMax(position, insertState.pos2 - backspaceCount);\n                        } // Ignore backspaces if same text was just inserted.\n                    }\n                } else if (position + charsRemoved > insertState.pos2) {\n                    // <DELETE>\n                    const int deleteCount = position + charsRemoved - insertState.pos2;\n                    if (deleteCount != charsRemoved || (oldPosition == 0 && wholeDocumentChanged))\n                        invalidateInsertState();\n                    else\n                        insertState.deletes += deleteCount;\n                }\n            } else if (charsAdded > 0 && insertState.insertingSpaces) {\n                for (int i = position; i < position + charsAdded; ++i) {\n                    const QChar c = characterAt(i);\n                    if (c.unicode() == ' ' || c.unicode() == '\\t')\n                        insertState.spaces.insert(i);\n                }\n            }\n\n            const int newPosition = position + charsAdded;\n            if (indentation == 0 && !changedAtEnd) // (un)indented has pos2 set correctly already\n                insertState.pos2 = qMax(insertState.pos2 + charsAdded - charsRemoved, newPosition);\n            insertState.textBeforeCursor = textAt(block().position(), newPosition);\n        }\n    }\n\n    if (!m_highlighted.isEmpty())\n        q->highlightMatches(m_highlighted);\n}\n\nvoid FakeVimHandler::Private::onCursorPositionChanged()\n{\n    if (!m_inFakeVim) {\n        m_cursorNeedsUpdate = true;\n\n        // Selecting text with mouse disables the thick cursor so it's more obvious\n        // that extra character under cursor is not selected when moving text around or\n        // making operations on text outside FakeVim mode.\n        setThinCursor(g.mode == InsertMode || editorCursor().hasSelection());\n    }\n}\n\nvoid FakeVimHandler::Private::onUndoCommandAdded()\n{\n    if (!canModifyBufferData())\n        return;\n\n    // Undo commands removed?\n    UNDO_DEBUG(\"Undo added\" << \"previous: REV\" << m_buffer->lastRevision);\n    if (m_buffer->lastRevision >= revision()) {\n        UNDO_DEBUG(\"UNDO REMOVED!\");\n        const int removed = m_buffer->lastRevision - revision();\n        for (int i = m_buffer->undo.size() - 1; i >= 0; --i) {\n            if ((m_buffer->undo[i].revision -= removed) < 0) {\n                m_buffer->undo.remove(0, i + 1);\n                break;\n            }\n        }\n    }\n\n    m_buffer->redo.clear();\n    // External change while FakeVim disabled.\n    if (m_buffer->editBlockLevel == 0 && !m_buffer->undo.isEmpty() && !isInsertMode())\n        m_buffer->undo.push(State());\n}\n\nvoid FakeVimHandler::Private::onInputTimeout()\n{\n    enterFakeVim();\n    EventResult result = handleKey(Input());\n    leaveFakeVim(result);\n}\n\nvoid FakeVimHandler::Private::onFixCursorTimeout()\n{\n    if (editor())\n        fixExternalCursorPosition(editor()->hasFocus() && !isCommandLineMode());\n}\n\nchar FakeVimHandler::Private::currentModeCode() const\n{\n    if (g.mode == ExMode)\n        return 'c';\n    else if (isVisualMode())\n        return 'v';\n    else if (isOperatorPending())\n        return 'o';\n    else if (g.mode == CommandMode)\n        return 'n';\n    else if (g.submode != NoSubMode)\n        return ' ';\n    else\n        return 'i';\n}\n\nvoid FakeVimHandler::Private::undoRedo(bool undo)\n{\n    UNDO_DEBUG((undo ? \"UNDO\" : \"REDO\"));\n\n    // FIXME: That's only an approximaxtion. The real solution might\n    // be to store marks and old userData with QTextBlock setUserData\n    // and retrieve them afterward.\n    QStack<State> &stack = undo ? m_buffer->undo : m_buffer->redo;\n    QStack<State> &stack2 = undo ? m_buffer->redo : m_buffer->undo;\n\n    State state = m_buffer->undoState.isValid() ? m_buffer->undoState\n                                        : !stack.empty() ? stack.pop() : State();\n\n    CursorPosition lastPos(m_cursor);\n    if (undo ? !document()->isUndoAvailable() : !document()->isRedoAvailable()) {\n        const QString msg = undo ? Tr::tr(\"Already at oldest change.\")\n            : Tr::tr(\"Already at newest change.\");\n        showMessage(MessageInfo, msg);\n        UNDO_DEBUG(msg);\n        return;\n    }\n    clearMessage();\n\n    ++m_buffer->editBlockLevel;\n\n    // Do undo/redo [count] times to reach previous revision.\n    const int previousRevision = revision();\n    if (undo) {\n        do {\n            EDITOR(undo());\n        } while (document()->isUndoAvailable() && state.revision >= 0 && state.revision < revision());\n    } else {\n        do {\n            EDITOR(redo());\n        } while (document()->isRedoAvailable() && state.revision > revision());\n    }\n\n    --m_buffer->editBlockLevel;\n\n    if (state.isValid()) {\n        Marks marks = m_buffer->marks;\n        marks.swap(state.marks);\n        updateMarks(marks);\n        m_buffer->lastVisualMode = state.lastVisualMode;\n        m_buffer->lastVisualModeInverted = state.lastVisualModeInverted;\n        setMark('.', state.position);\n        setMark('\\'', lastPos);\n        setMark('`', lastPos);\n        setCursorPosition(state.position);\n        setAnchor();\n        state.revision = previousRevision;\n    } else {\n        updateFirstVisibleLine();\n        pullCursor();\n    }\n    stack2.push(state);\n\n    setTargetColumn();\n    if (atEndOfLine())\n        moveLeft();\n\n    UNDO_DEBUG((undo ? \"UNDONE\" : \"REDONE\"));\n}\n\nvoid FakeVimHandler::Private::undo()\n{\n    undoRedo(true);\n}\n\nvoid FakeVimHandler::Private::redo()\n{\n    undoRedo(false);\n}\n\nvoid FakeVimHandler::Private::updateCursorShape()\n{\n    setThinCursor(\n        g.mode == InsertMode\n        || isVisualLineMode()\n        || isVisualBlockMode()\n        || isCommandLineMode()\n        || !editor()->hasFocus());\n}\n\nvoid FakeVimHandler::Private::setThinCursor(bool enable)\n{\n    EDITOR(setOverwriteMode(!enable));\n}\n\nbool FakeVimHandler::Private::hasThinCursor() const\n{\n    return !EDITOR(overwriteMode());\n}\n\nvoid FakeVimHandler::Private::enterReplaceMode()\n{\n    enterInsertOrReplaceMode(ReplaceMode);\n}\n\nvoid FakeVimHandler::Private::enterInsertMode()\n{\n    enterInsertOrReplaceMode(InsertMode);\n}\n\nvoid FakeVimHandler::Private::enterInsertOrReplaceMode(Mode mode)\n{\n    if (mode != InsertMode && mode != ReplaceMode) {\n        qWarning(\"Unexpected mode\");\n        return;\n    }\n    if (g.mode == mode)\n        return;\n\n    g.mode = mode;\n\n    if (g.returnToMode == mode) {\n        // Returning to insert mode after <C-O>.\n        clearCurrentMode();\n        moveToTargetColumn();\n        invalidateInsertState();\n    } else {\n        // Entering insert mode from command mode.\n        if (mode == InsertMode) {\n            // m_targetColumn shouldn't be -1 (end of line).\n            if (m_targetColumn == -1)\n                setTargetColumn();\n        }\n\n        g.submode = NoSubMode;\n        g.subsubmode = NoSubSubMode;\n        g.returnToMode = mode;\n        clearLastInsertion();\n    }\n}\n\nvoid FakeVimHandler::Private::enterVisualInsertMode(QChar command)\n{\n    if (isVisualBlockMode()) {\n        bool append = command == 'A';\n        bool change = command == 's' || command == 'c';\n\n        leaveVisualMode();\n\n        const CursorPosition lastAnchor = markLessPosition();\n        const CursorPosition lastPosition = markGreaterPosition();\n        CursorPosition pos(lastAnchor.line,\n            append ? qMax(lastPosition.column, lastAnchor.column) + 1\n                   : qMin(lastPosition.column, lastAnchor.column));\n\n        if (append) {\n            m_visualBlockInsert = m_visualTargetColumn == -1 ? AppendToEndOfLineBlockInsertMode\n                                                             : AppendBlockInsertMode;\n        } else if (change) {\n            m_visualBlockInsert = ChangeBlockInsertMode;\n            beginEditBlock();\n            cutSelectedText();\n            endEditBlock();\n        } else {\n            m_visualBlockInsert = InsertBlockInsertMode;\n        }\n\n        setCursorPosition(pos);\n        if (m_visualBlockInsert == AppendToEndOfLineBlockInsertMode)\n            moveBehindEndOfLine();\n    } else {\n        m_visualBlockInsert = NoneBlockInsertMode;\n        leaveVisualMode();\n        if (command == 'I') {\n            if (lineForPosition(anchor()) <= lineForPosition(position())) {\n                setPosition(qMin(anchor(), position()));\n                moveToStartOfLine();\n            }\n        } else if (command == 'A') {\n            if (lineForPosition(anchor()) <= lineForPosition(position())) {\n                setPosition(position());\n                moveRight(qMin(rightDist(), 1));\n            } else {\n                setPosition(anchor());\n                moveToStartOfLine();\n            }\n        }\n    }\n\n    setAnchor();\n    if (m_visualBlockInsert != ChangeBlockInsertMode)\n        breakEditBlock();\n    enterInsertMode();\n}\n\nvoid FakeVimHandler::Private::enterCommandMode(Mode returnToMode)\n{\n    if (g.isRecording && isCommandLineMode())\n        record(Input(Key_Escape, NoModifier));\n\n    if (isNoVisualMode()) {\n        if (atEndOfLine()) {\n            m_cursor.movePosition(Left, KeepAnchor);\n            if (m_targetColumn != -1)\n                setTargetColumn();\n        }\n        setAnchor();\n    }\n\n    g.mode = CommandMode;\n    clearCurrentMode();\n    g.returnToMode = returnToMode;\n    m_positionPastEnd = false;\n    m_anchorPastEnd = false;\n}\n\nvoid FakeVimHandler::Private::enterExMode(const QString &contents)\n{\n    g.currentMessage.clear();\n    g.commandBuffer.clear();\n    if (isVisualMode())\n        g.commandBuffer.setContents(QString(\"'<,'>\") + contents, contents.size() + 5);\n    else\n        g.commandBuffer.setContents(contents, contents.size());\n    g.mode = ExMode;\n    g.submode = NoSubMode;\n    g.subsubmode = NoSubSubMode;\n    unfocus();\n}\n\nvoid FakeVimHandler::Private::recordJump(int position)\n{\n    CursorPosition pos = position >= 0 ? CursorPosition(document(), position)\n                                       : CursorPosition(m_cursor);\n    setMark('\\'', pos);\n    setMark('`', pos);\n    if (m_buffer->jumpListUndo.isEmpty() || m_buffer->jumpListUndo.top() != pos)\n        m_buffer->jumpListUndo.push(pos);\n    m_buffer->jumpListRedo.clear();\n    UNDO_DEBUG(\"jumps: \" << m_buffer->jumpListUndo);\n}\n\nvoid FakeVimHandler::Private::jump(int distance)\n{\n    QStack<CursorPosition> &from = (distance > 0) ? m_buffer->jumpListRedo : m_buffer->jumpListUndo;\n    QStack<CursorPosition> &to   = (distance > 0) ? m_buffer->jumpListUndo : m_buffer->jumpListRedo;\n    int len = qMin(qAbs(distance), from.size());\n    CursorPosition m(m_cursor);\n    setMark('\\'', m);\n    setMark('`', m);\n    for (int i = 0; i < len; ++i) {\n        to.push(m);\n        setCursorPosition(from.top());\n        from.pop();\n    }\n    setTargetColumn();\n}\n\nColumn FakeVimHandler::Private::indentation(const QString &line) const\n{\n    int ts = s.tabStop.value();\n    int physical = 0;\n    int logical = 0;\n    int n = line.size();\n    while (physical < n) {\n        QChar c = line.at(physical);\n        if (c == ' ')\n            ++logical;\n        else if (c == '\\t')\n            logical += ts - logical % ts;\n        else\n            break;\n        ++physical;\n    }\n    return Column(physical, logical);\n}\n\nQString FakeVimHandler::Private::tabExpand(int n) const\n{\n    int ts = s.tabStop.value();\n    if (s.expandTab.value() || ts < 1)\n        return QString(n, ' ');\n    return QString(n / ts, '\\t')\n         + QString(n % ts, ' ');\n}\n\nvoid FakeVimHandler::Private::insertAutomaticIndentation(bool goingDown, bool forceAutoIndent)\n{\n    if (!forceAutoIndent && !s.autoIndent.value() && !s.smartIndent.value())\n        return;\n\n    if (s.smartIndent.value()) {\n        QTextBlock bl = block();\n        Range range(bl.position(), bl.position());\n        indentText(range, '\\n');\n    } else {\n        QTextBlock bl = goingDown ? block().previous() : block().next();\n        QString text = bl.text();\n        int pos = 0;\n        int n = text.size();\n        while (pos < n && text.at(pos).isSpace())\n            ++pos;\n        text.truncate(pos);\n        // FIXME: handle 'smartindent' and 'cindent'\n        insertText(text);\n    }\n}\n\nvoid FakeVimHandler::Private::handleStartOfLine()\n{\n    if (s.startOfLine.value())\n        moveToFirstNonBlankOnLine();\n}\n\nvoid FakeVimHandler::Private::replay(const QString &command, int repeat)\n{\n    if (repeat <= 0)\n        return;\n\n    //qDebug() << \"REPLAY: \" << quoteUnprintable(command);\n    clearCurrentMode();\n    const Inputs inputs(command);\n    for (int i = 0; i < repeat; ++i) {\n        for (const Input &in : inputs) {\n            if (handleDefaultKey(in) != EventHandled)\n                return;\n        }\n    }\n}\n\nQString FakeVimHandler::Private::visualDotCommand() const\n{\n    QTextCursor start(m_cursor);\n    QTextCursor end(start);\n    end.setPosition(end.anchor());\n\n    QString command;\n\n    if (isVisualCharMode())\n        command = \"v\";\n    else if (isVisualLineMode())\n        command = \"V\";\n    else if (isVisualBlockMode())\n        command = \"<c-v>\";\n    else\n        return QString();\n\n    const int down = qAbs(start.blockNumber() - end.blockNumber());\n    if (down != 0)\n        command.append(QString(\"%1j\").arg(down));\n\n    const int right = start.positionInBlock() - end.positionInBlock();\n    if (right != 0) {\n        command.append(QString::number(qAbs(right)));\n        command.append(QLatin1Char(right < 0 && isVisualBlockMode() ? 'h' : 'l'));\n    }\n\n    return command;\n}\n\nvoid FakeVimHandler::Private::selectTextObject(bool simple, bool inner)\n{\n    const int position1 = this->position();\n    const int anchor1 = this->anchor();\n    bool setupAnchor = (position1 == anchor1);\n    bool forward = anchor1 <= position1;\n    const int repeat = count();\n\n    // set anchor if not already set\n    if (setupAnchor) {\n        // Select nothing with 'inner' on empty line.\n        if (inner && atEmptyLine() && repeat == 1) {\n            g.movetype = MoveExclusive;\n            return;\n        }\n        moveToBoundaryStart(1, simple, false);\n        setAnchor();\n    } else if (forward) {\n        moveToNextCharacter();\n    } else {\n        moveToPreviousCharacter();\n    }\n\n    if (inner) {\n        moveToBoundaryEnd(repeat, simple);\n    } else {\n        const int direction = forward ? 1 : -1;\n        for (int i = 0; i < repeat; ++i) {\n            // select leading spaces\n            bool leadingSpace = characterAtCursor().isSpace();\n            if (leadingSpace) {\n                if (forward)\n                    moveToNextBoundaryStart(1, simple);\n                else\n                    moveToNextBoundaryEnd(1, simple, false);\n            }\n\n            // select word\n            if (forward)\n                moveToWordEnd(1, simple);\n            else\n                moveToWordStart(1, simple, false);\n\n            // select trailing spaces if no leading space\n            QChar afterCursor = characterAt(position() + direction);\n            if (!leadingSpace && afterCursor.isSpace() && afterCursor != ParagraphSeparator\n                && !atBlockStart()) {\n                if (forward)\n                    moveToNextBoundaryEnd(1, simple);\n                else\n                    moveToNextBoundaryStart(1, simple, false);\n            }\n\n            // if there are no trailing spaces in selection select all leading spaces\n            // after previous character\n            if (setupAnchor && (!characterAtCursor().isSpace() || atBlockEnd())) {\n                int min = block().position();\n                int pos = anchor();\n                while (pos >= min && characterAt(--pos).isSpace()) {}\n                if (pos >= min)\n                    setAnchorAndPosition(pos + 1, position());\n            }\n\n            if (i + 1 < repeat) {\n                if (forward)\n                    moveToNextCharacter();\n                else\n                    moveToPreviousCharacter();\n            }\n        }\n    }\n\n    if (inner) {\n        g.movetype = MoveInclusive;\n    } else {\n        g.movetype = MoveExclusive;\n        if (isNoVisualMode())\n            moveToNextCharacter();\n        else if (isVisualLineMode())\n            g.visualMode = VisualCharMode;\n    }\n\n    setTargetColumn();\n}\n\nvoid FakeVimHandler::Private::selectWordTextObject(bool inner)\n{\n    selectTextObject(false, inner);\n}\n\nvoid FakeVimHandler::Private::selectWORDTextObject(bool inner)\n{\n    selectTextObject(true, inner);\n}\n\nvoid FakeVimHandler::Private::selectSentenceTextObject(bool inner)\n{\n    Q_UNUSED(inner)\n}\n\nvoid FakeVimHandler::Private::selectParagraphTextObject(bool inner)\n{\n    const QTextCursor oldCursor = m_cursor;\n    const VisualMode oldVisualMode = g.visualMode;\n\n    const int anchorBlock = blockNumberAt(anchor());\n    const int positionBlock = blockNumberAt(position());\n    const bool setupAnchor = anchorBlock == positionBlock;\n    int repeat = count();\n\n    // If anchor and position are in the same block,\n    // start line selection at beginning of current paragraph.\n    if (setupAnchor) {\n        moveToParagraphStartOrEnd(-1);\n        setAnchor();\n\n        if (!isVisualLineMode() && isVisualMode())\n            toggleVisualMode(VisualLineMode);\n    }\n\n    const bool forward = anchor() <= position();\n    const int d = forward ? 1 : -1;\n\n    bool startsAtParagraph = !atEmptyLine(position());\n\n    moveToParagraphStartOrEnd(d);\n\n    // If selection already changed, decrease count.\n    if ((setupAnchor && g.submode != NoSubMode)\n        || oldVisualMode != g.visualMode\n        || m_cursor != oldCursor)\n    {\n        --repeat;\n        if (!inner) {\n            moveDown(d);\n            moveToParagraphStartOrEnd(d);\n            startsAtParagraph = !startsAtParagraph;\n        }\n    }\n\n    if (repeat > 0) {\n        bool isCountEven = repeat % 2 == 0;\n        bool endsOnParagraph =\n                inner ? isCountEven == startsAtParagraph : startsAtParagraph;\n\n        if (inner) {\n            repeat = repeat / 2;\n            if (!isCountEven || endsOnParagraph)\n                ++repeat;\n        } else {\n            if (endsOnParagraph)\n                ++repeat;\n        }\n\n        if (!moveToNextParagraph(d * repeat)) {\n            m_cursor = oldCursor;\n            g.visualMode = oldVisualMode;\n            return;\n        }\n\n        if (endsOnParagraph && atEmptyLine())\n            moveUp(d);\n        else\n            moveToParagraphStartOrEnd(d);\n    }\n\n    if (!inner && setupAnchor && !atEmptyLine() && !atEmptyLine(anchor())) {\n        // If position cannot select empty lines, try to select them with anchor.\n        setAnchorAndPosition(position(), anchor());\n        moveToNextParagraph(-d);\n        moveToParagraphStartOrEnd(-d);\n        setAnchorAndPosition(position(), anchor());\n    }\n\n    recordJump(oldCursor.position());\n    setTargetColumn();\n    g.movetype = MoveLineWise;\n}\n\nbool FakeVimHandler::Private::selectBlockTextObject(bool inner,\n    QChar left, QChar right)\n{\n    int p1 = blockBoundary(left, right, false, count());\n    if (p1 == -1)\n        return false;\n\n    int p2 = blockBoundary(left, right, true, count());\n    if (p2 == -1)\n        return false;\n\n    g.movetype = MoveExclusive;\n\n    if (inner) {\n        p1 += 1;\n        bool moveStart = characterAt(p1) == ParagraphSeparator;\n        bool moveEnd = isFirstNonBlankOnLine(p2);\n        if (moveStart)\n            ++p1;\n        if (moveEnd)\n            p2 = blockAt(p2).position() - 1;\n        if (moveStart && moveEnd)\n            g.movetype = MoveLineWise;\n    } else {\n        p2 += 1;\n    }\n\n    if (isVisualMode())\n        --p2;\n\n    setAnchorAndPosition(p1, p2);\n\n    return true;\n}\n\nbool FakeVimHandler::Private::changeNumberTextObject(int count)\n{\n    const QTextBlock block = this->block();\n    const QString lineText = block.text();\n    const int posMin = m_cursor.positionInBlock() + 1;\n\n    // find first decimal, hexadecimal or octal number under or after cursor position\n    QRegularExpression re(\"(0[xX])(0*[0-9a-fA-F]+)|(0)(0*[0-7]+)(?=\\\\D|$)|(\\\\d+)\");\n    QRegularExpressionMatch match;\n    QRegularExpressionMatchIterator it = re.globalMatch(lineText);\n    while (true) {\n        if (!it.hasNext())\n            return false;\n        match = it.next();\n        if (match.capturedEnd() >= posMin)\n            break;\n    }\n    int pos = match.capturedStart();\n    int len = match.capturedLength();\n    QString prefix = match.captured(1) + match.captured(3);\n    bool hex = prefix.length() >= 2 && (prefix[1].toLower() == 'x');\n    bool octal = !hex && !prefix.isEmpty();\n    const QString num = hex ? match.captured(2) : octal ? match.captured(4) : match.captured(5);\n\n    // parse value\n    bool ok;\n    int base = hex ? 16 : octal ? 8 : 10;\n    qlonglong value = 0;  // decimal value\n    qlonglong uvalue = 0; // hexadecimal or octal value (only unsigned)\n    if (hex || octal)\n        uvalue = num.toULongLong(&ok, base);\n    else\n        value = num.toLongLong(&ok, base);\n    if (!ok) {\n        qWarning() << \"Cannot parse number:\" << num << \"base:\" << base;\n        return false;\n    }\n\n    // negative decimal number\n    if (!octal && !hex && pos > 0 && lineText[pos - 1] == '-') {\n        value = -value;\n        --pos;\n        ++len;\n    }\n\n    // result to string\n    QString repl;\n    if (hex || octal)\n        repl = QString::number(uvalue + count, base);\n    else\n        repl = QString::number(value + count, base);\n\n    // convert hexadecimal number to upper-case if last letter was upper-case\n    if (hex) {\n        const int lastLetter = num.lastIndexOf(QRegularExpression(\"[a-fA-F]\"));\n        if (lastLetter != -1 && num[lastLetter].isUpper())\n            repl = repl.toUpper();\n    }\n\n    // preserve leading zeroes\n    if ((octal || hex) && repl.size() < num.size())\n        prefix.append(QString(\"0\").repeated(num.size() - repl.size()));\n    repl.prepend(prefix);\n\n    pos += block.position();\n    pushUndoState();\n    setAnchorAndPosition(pos, pos + len);\n    replaceText(currentRange(), repl);\n    setPosition(pos + repl.size() - 1);\n\n    return true;\n}\n\nbool FakeVimHandler::Private::selectQuotedStringTextObject(bool inner,\n    const QString &quote)\n{\n    QTextCursor tc = m_cursor;\n    int sz = quote.size();\n\n    QTextCursor tc1;\n    QTextCursor tc2(document());\n    while (tc2 <= tc) {\n        tc1 = document()->find(quote, tc2);\n        if (tc1.isNull())\n            return false;\n        tc2 = document()->find(quote, tc1);\n        if (tc2.isNull())\n            return false;\n    }\n\n    int p1 = tc1.position();\n    int p2 = tc2.position();\n    if (inner) {\n        p2 = qMax(p1, p2 - sz);\n        if (characterAt(p1) == ParagraphSeparator)\n            ++p1;\n    } else {\n        p1 -= sz;\n        p2 -= sz - 1;\n    }\n\n    if (isVisualMode())\n        --p2;\n\n    setAnchorAndPosition(p1, p2);\n    g.movetype = MoveExclusive;\n\n    return true;\n}\n\nbool FakeVimHandler::Private::selectArgumentTextObject(bool inner)\n{\n    // We are just interested whether we're currently inside angled brackets,\n    // but selectBlockTextObject also moves the cursor, so set it back to\n    // its original position afterwards\n    QTextCursor prevCursor = m_cursor;\n    const bool insideTemplateParameter = selectBlockTextObject(true, '<', '>');\n    m_cursor = prevCursor;\n\n    int openAngleBracketCount = insideTemplateParameter ? 1 : 0;\n\n    QTextCursor tcStart(m_cursor);\n    while (true) {\n        if (tcStart.atStart())\n            return true;\n\n        const QChar currentChar = characterAt(tcStart.position());\n\n        if (openAngleBracketCount == 0\n                && (currentChar == '(' || currentChar == ','))\n            break;\n\n        if (currentChar == '<')\n            openAngleBracketCount--;\n        else if (currentChar == '>')\n            openAngleBracketCount++;\n\n        tcStart.setPosition(tcStart.position() - 1);\n    }\n\n    QTextCursor tcEnd(m_cursor);\n    openAngleBracketCount = insideTemplateParameter ? 1 : 0;\n    int openParanthesisCount = 0;\n\n    while (true) {\n        if (tcEnd.atEnd()) {\n            return true;\n        }\n\n        const QChar currentChar = characterAt(tcEnd.position());\n        if (openAngleBracketCount == 0\n                && openParanthesisCount == 0\n                && (currentChar == ')' || currentChar == ','))\n            break;\n\n        if (currentChar == '<')\n            openAngleBracketCount++;\n        else if (currentChar == '>')\n            openAngleBracketCount--;\n        else if (currentChar == '(')\n            openParanthesisCount++;\n        else if (currentChar == ')')\n            openParanthesisCount--;\n\n\n        tcEnd.setPosition(tcEnd.position() + 1);\n    }\n\n\n    if (!inner && characterAt(tcEnd.position()) == ',' && characterAt(tcStart.position()) == '(') {\n        tcEnd.setPosition(tcEnd.position() + 1);\n        if (characterAt(tcEnd.position()) == ' ')\n            tcEnd.setPosition(tcEnd.position() + 1);\n    }\n\n    // Never include the opening parenthesis\n    if (characterAt(tcStart.position()) == '(') {\n        tcStart.setPosition(tcStart.position() + 1);\n    } else if (inner) {\n        tcStart.setPosition(tcStart.position() + 1);\n        if (characterAt(tcStart.position()) == ' ')\n            tcStart.setPosition(tcStart.position() + 1);\n    }\n\n    if (isVisualMode())\n        tcEnd.setPosition(tcEnd.position() - 1);\n\n    g.movetype = MoveExclusive;\n\n    setAnchorAndPosition(tcStart.position(), tcEnd.position());\n    return true;\n}\n\nMark FakeVimHandler::Private::mark(QChar code) const\n{\n    if (isVisualMode()) {\n        if (code == '<')\n            return CursorPosition(document(), qMin(anchor(), position()));\n        if (code == '>')\n            return CursorPosition(document(), qMax(anchor(), position()));\n    }\n\n    if (code.isUpper())\n        return g.marks.value(code);\n\n    return m_buffer->marks.value(code);\n}\n\nvoid FakeVimHandler::Private::setMark(QChar code, CursorPosition position)\n{\n    if (code.isUpper())\n        g.marks[code] = Mark(position, m_currentFileName);\n    else\n        m_buffer->marks[code] = Mark(position);\n}\n\nbool FakeVimHandler::Private::jumpToMark(QChar mark, bool backTickMode)\n{\n    Mark m = this->mark(mark);\n    if (!m.isValid()) {\n        showMessage(MessageError, msgMarkNotSet(mark));\n        return false;\n    }\n    if (!m.isLocal(m_currentFileName)) {\n        q->requestJumpToGlobalMark(mark, backTickMode, m.fileName());\n        return false;\n    }\n\n    if ((mark == '\\'' || mark == '`') && !m_buffer->jumpListUndo.isEmpty())\n        m_buffer->jumpListUndo.pop();\n    recordJump();\n    setCursorPosition(m.position(document()));\n    if (!backTickMode)\n        moveToFirstNonBlankOnLine();\n    if (g.submode == NoSubMode)\n        setAnchor();\n    setTargetColumn();\n\n    return true;\n}\n\nvoid FakeVimHandler::Private::updateMarks(const Marks &newMarks)\n{\n    for (auto it = newMarks.cbegin(), end = newMarks.cend(); it != end; ++it)\n        m_buffer->marks[it.key()] = it.value();\n}\n\nRangeMode FakeVimHandler::Private::registerRangeMode(int reg) const\n{\n    bool isClipboard;\n    bool isSelection;\n    getRegisterType(&reg, &isClipboard, &isSelection);\n\n    if (isClipboard || isSelection) {\n        QClipboard *clipboard = QApplication::clipboard();\n        QClipboard::Mode mode = isClipboard ? QClipboard::Clipboard : QClipboard::Selection;\n\n        // Use range mode from Vim's clipboard data if available.\n        const QMimeData *data = clipboard->mimeData(mode);\n        if (data && data->hasFormat(vimMimeText)) {\n            QByteArray bytes = data->data(vimMimeText);\n            if (bytes.length() > 0)\n                return static_cast<RangeMode>(bytes.at(0));\n        }\n\n        // If register content is clipboard:\n        //  - return RangeLineMode if text ends with new line char,\n        //  - return RangeCharMode otherwise.\n        QString text = clipboard->text(mode);\n        return (text.endsWith('\\n') || text.endsWith('\\r')) ? RangeLineMode : RangeCharMode;\n    }\n\n    return g.registers[reg].rangemode;\n}\n\nvoid FakeVimHandler::Private::setRegister(int reg, const QString &contents, RangeMode mode)\n{\n    bool copyToClipboard;\n    bool copyToSelection;\n    bool append;\n    getRegisterType(&reg, &copyToClipboard, &copyToSelection, &append);\n\n    QString contents2 = contents;\n    if ((mode == RangeLineMode || mode == RangeLineModeExclusive)\n            && !contents2.endsWith('\\n'))\n    {\n        contents2.append('\\n');\n    }\n\n    if (copyToClipboard || copyToSelection) {\n        if (copyToClipboard)\n            setClipboardData(contents2, mode, QClipboard::Clipboard);\n        if (copyToSelection)\n            setClipboardData(contents2, mode, QClipboard::Selection);\n    } else {\n        if (append)\n            g.registers[reg].contents.append(contents2);\n        else\n            g.registers[reg].contents = contents2;\n        g.registers[reg].rangemode = mode;\n    }\n}\n\nQString FakeVimHandler::Private::registerContents(int reg) const\n{\n    bool copyFromClipboard;\n    bool copyFromSelection;\n    getRegisterType(&reg, &copyFromClipboard, &copyFromSelection);\n\n    if (copyFromClipboard || copyFromSelection) {\n        QClipboard *clipboard = QApplication::clipboard();\n        if (copyFromClipboard)\n            return clipboard->text(QClipboard::Clipboard);\n        if (copyFromSelection)\n            return clipboard->text(QClipboard::Selection);\n    }\n\n    return g.registers[reg].contents;\n}\n\nvoid FakeVimHandler::Private::getRegisterType(int *reg, bool *isClipboard, bool *isSelection, bool *append) const\n{\n    bool clipboard = false;\n    bool selection = false;\n\n    // If register is uppercase, append content to lower case register on yank/delete.\n    const QChar c(*reg);\n    if (append != nullptr)\n        *append = c.isUpper();\n    if (c.isUpper())\n        *reg = c.toLower().unicode();\n\n    if (c == '\"') {\n        QStringList list = s.clipboard.value().split(',');\n        clipboard = list.contains(\"unnamedplus\");\n        selection = list.contains(\"unnamed\");\n    } else if (c == '+') {\n        clipboard = true;\n    } else if (c == '*') {\n        selection = true;\n    }\n\n    // selection (primary) is clipboard on systems without selection support\n    if (selection && !QApplication::clipboard()->supportsSelection()) {\n        clipboard = true;\n        selection = false;\n    }\n\n    if (isClipboard != nullptr)\n        *isClipboard = clipboard;\n    if (isSelection != nullptr)\n        *isSelection = selection;\n}\n\n///////////////////////////////////////////////////////////////////////\n//\n// FakeVimHandler\n//\n///////////////////////////////////////////////////////////////////////\n\nFakeVimHandler::FakeVimHandler(QWidget *widget, QObject *parent)\n    : QObject(parent), d(new Private(this, widget))\n{}\n\nFakeVimHandler::~FakeVimHandler()\n{\n    delete d;\n}\n\n// gracefully handle that the parent editor is deleted\nvoid FakeVimHandler::disconnectFromEditor()\n{\n    d->m_textedit = nullptr;\n    d->m_plaintextedit = nullptr;\n}\n\nvoid FakeVimHandler::updateGlobalMarksFilenames(const QString &oldFileName, const QString &newFileName)\n{\n    for (Mark &mark : Private::g.marks) {\n        if (mark.fileName() == oldFileName)\n            mark.setFileName(newFileName);\n    }\n}\n\nbool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)\n{\n#ifndef FAKEVIM_STANDALONE\n    if (!fakeVimSettings()->useFakeVim.value())\n        return QObject::eventFilter(ob, ev);\n#endif\n\n    if (ev->type() == QEvent::Shortcut) {\n        d->passShortcuts(false);\n        return false;\n    }\n\n    if (ev->type() == QEvent::KeyPress &&\n        (ob == d->editor()\n         || (Private::g.mode == ExMode || Private::g.subsubmode == SearchSubSubMode))) {\n        auto kev = static_cast<QKeyEvent *>(ev);\n        KEY_DEBUG(\"KEYPRESS\" << kev->key() << kev->text() << QChar(kev->key()));\n        EventResult res = d->handleEvent(kev);\n        //if (Private::g.mode == InsertMode)\n        //    completionRequested();\n        // returning false core the app see it\n        //KEY_DEBUG(\"HANDLED CODE:\" << res);\n        //return res != EventPassedToCore;\n        //return true;\n        return res == EventHandled || res == EventCancelled;\n    }\n\n    if (ev->type() == QEvent::ShortcutOverride && (ob == d->editor()\n         || (Private::g.mode == ExMode || Private::g.subsubmode == SearchSubSubMode))) {\n        auto kev = static_cast<QKeyEvent *>(ev);\n        if (d->wantsOverride(kev)) {\n            KEY_DEBUG(\"OVERRIDING SHORTCUT\" << kev->key());\n            ev->accept(); // accepting means \"don't run the shortcuts\"\n            return true;\n        }\n        KEY_DEBUG(\"NO SHORTCUT OVERRIDE\" << kev->key());\n        return true;\n    }\n\n    if (ev->type() == QEvent::FocusOut && ob == d->editor()) {\n        d->unfocus();\n        return false;\n    }\n\n    if (ev->type() == QEvent::FocusIn && ob == d->editor())\n        d->focus();\n\n    return QObject::eventFilter(ob, ev);\n}\n\nvoid FakeVimHandler::installEventFilter()\n{\n    d->installEventFilter();\n}\n\nvoid FakeVimHandler::setupWidget()\n{\n    d->setupWidget();\n}\n\nvoid FakeVimHandler::restoreWidget(int tabSize)\n{\n    d->restoreWidget(tabSize);\n}\n\nvoid FakeVimHandler::handleCommand(const QString &cmd)\n{\n    d->enterFakeVim();\n    d->handleCommand(cmd);\n    d->leaveFakeVim();\n}\n\nvoid FakeVimHandler::handleReplay(const QString &keys)\n{\n    d->enterFakeVim();\n    d->replay(keys);\n    d->leaveFakeVim();\n}\n\nvoid FakeVimHandler::handleInput(const QString &keys)\n{\n    const Inputs inputs(keys);\n    d->enterFakeVim();\n    for (const Input &input : inputs)\n        d->handleKey(input);\n    d->leaveFakeVim();\n}\n\nvoid FakeVimHandler::enterCommandMode()\n{\n    d->enterCommandMode();\n}\n\nvoid FakeVimHandler::setCurrentFileName(const QString &fileName)\n{\n    d->m_currentFileName = fileName;\n}\n\nQString FakeVimHandler::currentFileName() const\n{\n    return d->m_currentFileName;\n}\n\nvoid FakeVimHandler::showMessage(MessageLevel level, const QString &msg)\n{\n    d->showMessage(level, msg);\n}\n\nQWidget *FakeVimHandler::widget()\n{\n    return d->editor();\n}\n\n// Test only\nint FakeVimHandler::physicalIndentation(const QString &line) const\n{\n    Column ind = d->indentation(line);\n    return ind.physical;\n}\n\nint FakeVimHandler::logicalIndentation(const QString &line) const\n{\n    Column ind = d->indentation(line);\n    return ind.logical;\n}\n\nQString FakeVimHandler::tabExpand(int n) const\n{\n    return d->tabExpand(n);\n}\n\nvoid FakeVimHandler::miniBufferTextEdited(const QString &text, int cursorPos, int anchorPos)\n{\n    d->miniBufferTextEdited(text, cursorPos, anchorPos);\n}\n\nvoid FakeVimHandler::setTextCursorPosition(int position)\n{\n    int pos = qMax(0, qMin(position, d->lastPositionInDocument()));\n    if (d->isVisualMode())\n        d->setPosition(pos);\n    else\n        d->setAnchorAndPosition(pos, pos);\n    d->setTargetColumn();\n\n    if (!d->m_inFakeVim)\n        d->commitCursor();\n}\n\nQTextCursor FakeVimHandler::textCursor() const\n{\n    return d->m_cursor;\n}\n\nvoid FakeVimHandler::setTextCursor(const QTextCursor &cursor)\n{\n    d->m_cursor = cursor;\n}\n\nbool FakeVimHandler::jumpToLocalMark(QChar mark, bool backTickMode)\n{\n    return d->jumpToMark(mark, backTickMode);\n}\n\n} // namespace Internal\n} // namespace FakeVim\n\nQ_DECLARE_METATYPE(FakeVim::Internal::FakeVimHandler::Private::BufferDataPtr)\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/fakevimhandler.h",
    "content": "// Copyright (C) 2016 The Qt Company Ltd.\n// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0\n\n#pragma once\n\n#define FAKEVIM_STANDALONE\n\n#ifdef FAKEVIM_STANDALONE\n#   include \"private/fakevim_export.h\"\n#endif\n\n#include <QObject>\n#include <QTextEdit>\n\n#include <functional>\n#include <vector>\n\nnamespace FakeVim {\nnamespace Internal {\n\nenum RangeMode\n{\n    // Reordering first three enum items here will break\n    // compatibility with clipboard format stored by Vim.\n    RangeCharMode,         // v\n    RangeLineMode,         // V\n    RangeBlockMode,        // Ctrl-v\n    RangeLineModeExclusive,\n    RangeBlockAndTailMode // Ctrl-v for D and X\n};\n\nstruct FAKEVIM_EXPORT Range\n{\n    Range() = default;\n    Range(int b, int e, RangeMode m = RangeCharMode);\n    QString toString() const;\n    bool isValid() const;\n\n    int beginPos = -1;\n    int endPos = -1;\n    RangeMode rangemode = RangeCharMode;\n};\n\nstruct FAKEVIM_EXPORT ExCommand\n{\n    ExCommand() = default;\n    ExCommand(const QString &cmd, const QString &args = QString(),\n        const Range &range = Range());\n\n    bool matches(const QString &min, const QString &full) const;\n\n    QString cmd;\n    bool hasBang = false;\n    QString args;\n    Range range;\n    int count = 1;\n};\n\n// message levels sorted by severity\nenum MessageLevel\n{\n    MessageMode,    // show current mode (format \"-- %1 --\")\n    MessageCommand, // show last Ex command or search\n    MessageInfo,    // result of a command\n    MessageWarning, // warning\n    MessageError,   // error\n    MessageShowCmd  // partial command\n};\n\ntemplate <typename Type>\nclass Signal\n{\npublic:\n    using Callable = std::function<Type>;\n\n    void connect(const Callable &callable) { m_callables.push_back(callable); }\n\n    template <typename ...Args>\n    void operator()(Args ...args) const\n    {\n        for (const Callable &callable : m_callables)\n            callable(args...);\n   }\n\nprivate:\n    std::vector<Callable> m_callables;\n};\n\nclass FAKEVIM_EXPORT FakeVimHandler : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit FakeVimHandler(QWidget *widget, QObject *parent = nullptr);\n    ~FakeVimHandler() override;\n\n    QWidget *widget();\n\n    // call before widget is deleted\n    void disconnectFromEditor();\n\n    static void updateGlobalMarksFilenames(const QString &oldFileName, const QString &newFileName);\n\npublic:\n    void setCurrentFileName(const QString &fileName);\n    QString currentFileName() const;\n\n    void showMessage(MessageLevel level, const QString &msg);\n\n    // This executes an \"ex\" style command taking context\n    // information from the current widget.\n    void handleCommand(const QString &cmd);\n    void handleReplay(const QString &keys);\n    void handleInput(const QString &keys);\n    void enterCommandMode();\n\n    void installEventFilter();\n\n    // Convenience\n    void setupWidget();\n    void restoreWidget(int tabSize);\n\n    // Test only\n    int physicalIndentation(const QString &line) const;\n    int logicalIndentation(const QString &line) const;\n    QString tabExpand(int n) const;\n\n    void miniBufferTextEdited(const QString &text, int cursorPos, int anchorPos);\n\n    // Set text cursor position. Keeps anchor if in visual mode.\n    void setTextCursorPosition(int position);\n\n    QTextCursor textCursor() const;\n    void setTextCursor(const QTextCursor &cursor);\n\n    bool jumpToLocalMark(QChar mark, bool backTickMode);\n\n    bool eventFilter(QObject *ob, QEvent *ev) override;\n\n    Signal<void(const QString &msg, int cursorPos, int anchorPos, int messageLevel)> commandBufferChanged;\n    Signal<void(const QString &msg)> statusDataChanged;\n    Signal<void(const QString &msg)> extraInformationChanged;\n    Signal<void(const QList<QTextEdit::ExtraSelection> &selection)> selectionChanged;\n    Signal<void(const QString &needle)>  highlightMatches;\n    Signal<void(bool *moved, bool *forward, QTextCursor *cursor)> moveToMatchingParenthesis;\n    Signal<void(bool *result, QChar c)> checkForElectricCharacter;\n    Signal<void(int beginLine, int endLine, QChar typedChar)> indentRegion;\n    Signal<void(const QString &needle, bool forward)> simpleCompletionRequested;\n    Signal<void(const QString &key, int count)> windowCommandRequested;\n    Signal<void(bool reverse)> findRequested;\n    Signal<void(bool reverse)> findNextRequested;\n    Signal<void(bool *handled, const ExCommand &cmd)> handleExCommandRequested;\n    Signal<void()> requestDisableBlockSelection;\n    Signal<void(const QTextCursor &cursor)> requestSetBlockSelection;\n    Signal<void(QTextCursor *cursor)> requestBlockSelection;\n    Signal<void(bool *on)> requestHasBlockSelection;\n    Signal<void(int depth)> foldToggle;\n    Signal<void(bool fold)> foldAll;\n    Signal<void(int depth, bool dofold)> fold;\n    Signal<void(int count, bool current)> foldGoTo;\n    Signal<void(QChar mark, bool backTickMode, const QString &fileName)> requestJumpToLocalMark;\n    Signal<void(QChar mark, bool backTickMode, const QString &fileName)> requestJumpToGlobalMark;\n    Signal<void()> completionRequested;\n    Signal<void()> tabPreviousRequested;\n    Signal<void()> tabNextRequested;\n\npublic:\n    class Private;\n\nprivate:\n    Private *d;\n};\n\n} // namespace Internal\n} // namespace FakeVim\n\nQ_DECLARE_METATYPE(FakeVim::Internal::ExCommand)\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/fakevimtr.h",
    "content": "// Copyright (C) 2016 The Qt Company Ltd.\n// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0\n\n#pragma once\n\n#include <QCoreApplication>\n\nnamespace FakeVim {\n\nstruct Tr\n{\n    Q_DECLARE_TR_FUNCTIONS(FakeVim)\n};\n\n} // namespace FakeVim\n"
  },
  {
    "path": "plugins/itemfakevim/fakevim/private/fakevim_export.h",
    "content": "#pragma once\n#define FAKEVIM_EXPORT\n"
  },
  {
    "path": "plugins/itemfakevim/itemfakevim.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemfakevim.h\"\n#include \"ui_itemfakevimsettings.h\"\n\n#include \"fakevim/fakevimhandler.h\"\n\nusing namespace FakeVim::Internal;\n\n#include <QIcon>\n#include <QLabel>\n#include <QDialogButtonBox>\n#include <QLineEdit>\n#include <QMessageBox>\n#include <QMetaMethod>\n#include <QKeyEvent>\n#include <QPaintEvent>\n#include <QPainter>\n#include <QRegularExpression>\n#include <QStatusBar>\n#include <QTextBlock>\n#include <QTextEdit>\n#include <QPlainTextEdit>\n#include <QPushButton>\n#include <QAbstractTextDocumentLayout>\n#include <QScrollBar>\n#include <QSettings>\n#include <QStyle>\n#include <QStyleHints>\n#include <QVariantMap>\n#include <QtPlugin>\n\n#define EDITOR(s) (m_textEdit ? m_textEdit->s : m_plainTextEdit->s)\n\nnamespace {\n\nconst char propertyWrapped[] = \"CopyQ_fakevim_wrapped\";\n\nconst QLatin1String configReallyEnabled(\"really_enable\");\nconst QLatin1String configSourceFile(\"source_file\");\n\n// The same method for rendering document doesn't work for QPlainTextEdit.\n// This is simplified code from Qt source code.\nvoid drawPlainTextDocument(\n        QPlainTextEdit *textEdit,\n        const QAbstractTextDocumentLayout::PaintContext context,\n        QPainter *painter)\n{\n    // WORKAROUND: Access protected members of QPlainTextEdit.\n    class PlainTextEdit final : public QPlainTextEdit {\n    public:\n        static QPointF getContentOffset(QPlainTextEdit *edit) {\n            return (edit->*(&PlainTextEdit::contentOffset))();\n        }\n        static QTextBlock getFirstVisibleBlock(QPlainTextEdit *edit) {\n            return (edit->*(&PlainTextEdit::firstVisibleBlock))();\n        }\n    };\n    QPointF offset = PlainTextEdit::getContentOffset(textEdit);\n    QTextBlock block = PlainTextEdit::getFirstVisibleBlock(textEdit);\n\n    QTextDocument *doc = textEdit->document();\n    const auto documentLayout = doc->documentLayout();\n\n    painter->setBrushOrigin(offset);\n\n    while (block.isValid()) {\n        const QRectF r = documentLayout->blockBoundingRect(block).translated(offset);\n        if (block.isVisible()) {\n            QTextLayout *layout = block.layout();\n\n            QVector<QTextLayout::FormatRange> selections;\n            int blpos = block.position();\n            int bllen = block.length();\n            for (int i = 0; i < context.selections.size(); ++i) {\n                const QAbstractTextDocumentLayout::Selection &range = context.selections.at(i);\n                const int selStart = range.cursor.selectionStart() - blpos;\n                const int selEnd = range.cursor.selectionEnd() - blpos;\n                if (selStart < bllen && selEnd > 0\n                        && selEnd > selStart) {\n                    QTextLayout::FormatRange o;\n                    o.start = selStart;\n                    o.length = selEnd - selStart;\n                    o.format = range.format;\n                    selections.append(o);\n                } else if (!range.cursor.hasSelection() && range.format.hasProperty(QTextFormat::FullWidthSelection)\n                           && block.contains(range.cursor.position())) {\n                    // for full width selections we don't require an actual selection, just\n                    // a position to specify the line. that's more convenience in usage.\n                    QTextLayout::FormatRange o;\n                    QTextLine l = layout->lineForTextPosition(range.cursor.position() - blpos);\n                    o.start = l.textStart();\n                    o.length = l.textLength();\n                    if (o.start + o.length == bllen - 1)\n                        ++o.length; // include newline\n                    o.format = range.format;\n                    selections.append(o);\n                }\n            }\n\n            layout->draw(painter, offset, selections);\n        }\n\n        offset.ry() += r.height();\n        if (offset.y() > context.clip.bottom())\n            break;\n\n        block = block.next();\n    }\n}\n\nclass TextEditWrapper final : public QObject\n{\npublic:\n    explicit TextEditWrapper(QAbstractScrollArea *editor)\n        : QObject(editor)\n        , m_textEditWidget(editor)\n        , m_textEdit(qobject_cast<QTextEdit *>(editor))\n        , m_plainTextEdit(qobject_cast<QPlainTextEdit *>(editor))\n        , m_handler(new FakeVimHandler(editor, nullptr))\n        , m_hasBlockSelection(false)\n    {\n        editor->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);\n\n        if (m_textEdit) {\n            connect( m_textEdit, &QTextEdit::selectionChanged,\n                     this, &TextEditWrapper::onSelectionChanged );\n            connect( m_textEdit, &QTextEdit::cursorPositionChanged,\n                     this, &TextEditWrapper::onSelectionChanged );\n        } else if (m_plainTextEdit) {\n            connect( m_plainTextEdit, &QPlainTextEdit::selectionChanged,\n                     this, &TextEditWrapper::onSelectionChanged );\n            connect( m_plainTextEdit, &QPlainTextEdit::cursorPositionChanged,\n                     this, &TextEditWrapper::onSelectionChanged );\n        }\n\n        setLineWrappingEnabled(true);\n\n        editor->viewport()->installEventFilter(this);\n\n        auto completer = editor->findChild<QObject*>(\"CommandCompleter\");\n        if (completer) {\n            m_completerPopup = completer->property(\"popup\").value<QWidget*>();\n            Q_ASSERT(m_completerPopup);\n            if (m_completerPopup)\n                m_completerPopup->installEventFilter(this);\n        }\n\n        // Let FakeVim handle indentation.\n        m_handler->handleCommand(QLatin1String(\"set nopasskeys\"));\n    }\n\n    ~TextEditWrapper()\n    {\n        m_handler->disconnectFromEditor();\n        m_handler->deleteLater();\n    }\n\n    void install()\n    {\n        m_handler->installEventFilter();\n        m_handler->setupWidget();\n        m_handler->enterCommandMode();\n    }\n\n    bool eventFilter(QObject *obj, QEvent *ev) override\n    {\n        // Handle completion popup.\n        if (obj == m_completerPopup) {\n            if ( ev->type() == QEvent::KeyPress ) {\n                const auto kev = static_cast<QKeyEvent *>(ev);\n                const auto key = kev->key();\n                const auto mods = kev->modifiers();\n                if (mods.testFlag(Qt::ControlModifier)) {\n                    if (key == Qt::Key_N || key == Qt::Key_P) {\n                        const auto key2 = key == Qt::Key_N ? Qt::Key_Down : Qt::Key_Up;\n                        QKeyEvent kev2(QEvent::KeyPress, key2, Qt::NoModifier);\n                        QCoreApplication::sendEvent(obj, &kev2);\n                        return true;\n                    }\n                }\n\n                switch (key) {\n                case Qt::Key_Enter:\n                case Qt::Key_Return:\n                    return false;\n\n                case Qt::Key_Down:\n                case Qt::Key_Up:\n                case Qt::Key_PageDown:\n                case Qt::Key_PageUp:\n                    return false;\n\n                default:\n                    QCoreApplication::sendEvent(m_textEditWidget, ev);\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        if ( ev->type() != QEvent::Paint )\n            return false;\n\n        QWidget *viewport = editor()->viewport();\n\n        QPaintEvent *e = static_cast<QPaintEvent*>(ev);\n\n        const QRect r = e->rect();\n\n        QPainter painter(viewport);\n\n        const QTextCursor tc = EDITOR(textCursor());\n\n        m_context.cursorPosition = -1;\n        m_context.palette = editor()->palette();\n\n        const int h = m_textEdit ? horizontalOffset() : 0;\n        const int v = m_textEdit ? verticalOffset() : 0;\n        m_context.clip = r.translated(h, v);\n\n        painter.save();\n\n        // Draw base and text.\n        painter.translate(-h, -v);\n        paintDocument(&painter);\n\n        // Draw block selection.\n        if ( hasBlockSelection() ) {\n            QRect rect;\n            QTextCursor tc2 = tc;\n            tc2.setPosition(tc.position());\n            rect = EDITOR(cursorRect(tc2));\n            tc2.setPosition(tc.anchor());\n            rect = rect.united( EDITOR(cursorRect(tc2)) );\n\n            m_context.palette.setColor(QPalette::Base, m_context.palette.color(QPalette::Highlight));\n            m_context.palette.setColor(QPalette::Text, m_context.palette.color(QPalette::HighlightedText));\n\n            m_context.clip = rect.translated(h, v);\n\n            paintDocument(&painter);\n        }\n\n        painter.restore();\n\n        // Draw text cursor.\n        QRect rect = EDITOR(cursorRect());\n\n        if (EDITOR(overwriteMode()) || hasBlockSelection() ) {\n            QTextCursor tc2 = tc;\n            tc2.movePosition(QTextCursor::Right);\n            const QRect nextRect = EDITOR(cursorRect(tc2));\n            const int w = nextRect.left() - rect.left();\n            if (w > 3) {\n                rect.setWidth(w);\n            } else {\n                const QFontMetrics fm(editor()->font());\n                rect.setWidth( fm.averageCharWidth() );\n            }\n        } else {\n            rect.setWidth(2);\n            rect.adjust(-1, 0, 0, 0);\n        }\n\n        if ( hasBlockSelection() ) {\n            int from = tc.positionInBlock();\n            int to = tc.anchor() - tc.document()->findBlock(tc.anchor()).position();\n            if (from > to)\n                rect.moveLeft(rect.left() - rect.width());\n        }\n\n        painter.setCompositionMode(QPainter::CompositionMode_Difference);\n        const auto color = editor()->hasFocus() ? Qt::white : Qt::darkGray;\n        painter.fillRect(rect, color);\n\n        if (!hasBlockSelection() && m_cursorRect.width() != rect.width())\n            viewport->update();\n\n        m_cursorRect = rect;\n\n        return true;\n    }\n\n    FakeVimHandler &fakeVimHandler() { return *m_handler; }\n\n    void highlightMatches(const QString &pattern)\n    {\n        QTextCursor cur = EDITOR(textCursor());\n\n        Selection selection;\n        selection.format.setBackground(Qt::yellow);\n        selection.format.setForeground(Qt::black);\n\n        // Highlight matches.\n        QTextDocument *doc = document();\n        QRegularExpression re(pattern);\n        cur = doc->find(re);\n\n        m_searchSelection.clear();\n\n        int a = cur.position();\n        while ( !cur.isNull() ) {\n            if ( cur.hasSelection() ) {\n                selection.cursor = cur;\n                m_searchSelection.append(selection);\n            } else {\n                cur.movePosition(QTextCursor::NextCharacter);\n            }\n            cur = doc->find(re, cur);\n            int b = cur.position();\n            if (a == b) {\n                cur.movePosition(QTextCursor::NextCharacter);\n                cur = doc->find(re, cur);\n                b = cur.position();\n                if (a == b) break;\n            }\n            a = b;\n        }\n\n        updateSelections();\n    }\n\n    void setBlockSelection(bool on)\n    {\n        m_hasBlockSelection = on;\n        m_selection.clear();\n        updateSelections();\n    }\n\n    bool hasBlockSelection() const\n    {\n        return m_hasBlockSelection;\n    }\n\n    void setTextCursor(const QTextCursor &tc)\n    {\n        EDITOR(setTextCursor(tc));\n    }\n\n    QTextCursor textCursor() const\n    {\n        return EDITOR(textCursor());\n    }\n\n    QTextDocument *document() const\n    {\n        return EDITOR(document());\n    }\n\n    QAbstractScrollArea *editor() const { return m_textEditWidget; }\n\n    void setLineWrappingEnabled(bool enable)\n    {\n        if (m_textEdit)\n            m_textEdit->setLineWrapMode(enable ? QTextEdit::WidgetWidth : QTextEdit::NoWrap);\n        else if (m_plainTextEdit)\n            m_plainTextEdit->setLineWrapMode(enable ? QPlainTextEdit::WidgetWidth : QPlainTextEdit::NoWrap);\n    }\n\nprivate:\n    void onSelectionChanged() {\n        m_hasBlockSelection = false;\n        m_selection.clear();\n\n        Selection selection;\n\n        const QPalette pal = editor()->palette();\n        selection.format.setBackground( pal.color(QPalette::Highlight) );\n        selection.format.setForeground( pal.color(QPalette::HighlightedText) );\n        selection.cursor = EDITOR(textCursor());\n        if ( selection.cursor.hasSelection() )\n            m_selection.append(selection);\n\n        updateSelections();\n    }\n\n    int horizontalOffset() const\n    {\n        QScrollBar *hbar = editor()->horizontalScrollBar();\n        return editor()->isRightToLeft() ? (hbar->maximum() - hbar->value()) : hbar->value();\n    }\n\n    int verticalOffset() const\n    {\n        return editor()->verticalScrollBar()->value();\n    }\n\n    void paintDocument(QPainter *painter)\n    {\n        painter->setClipRect(m_context.clip);\n        painter->fillRect(m_context.clip, m_context.palette.base());\n        if (m_textEdit)\n            document()->documentLayout()->draw(painter, m_context);\n        else if (m_plainTextEdit)\n            drawPlainTextDocument(m_plainTextEdit, m_context, painter);\n    }\n\n    void updateSelections()\n    {\n        m_context.selections.clear();\n        m_context.selections.reserve( m_searchSelection.size() + m_selection.size() );\n        m_context.selections << m_searchSelection << m_selection;\n        editor()->viewport()->update();\n    }\n\n    QAbstractScrollArea *m_textEditWidget;\n    QTextEdit *m_textEdit;\n    QPlainTextEdit *m_plainTextEdit;\n    FakeVimHandler *m_handler;\n    QObject *m_completerPopup = nullptr;\n    QRect m_cursorRect;\n\n    bool m_hasBlockSelection;\n\n    using Selection = QAbstractTextDocumentLayout::Selection;\n    using SelectionList = QVector<Selection>;\n    SelectionList m_searchSelection;\n    SelectionList m_selection;\n\n    QAbstractTextDocumentLayout::PaintContext m_context;\n};\n\nclass Proxy final : public QObject\n{\npublic:\n    Proxy(TextEditWrapper *editorWidget, QStatusBar *statusBar, QObject *parent = nullptr)\n      : QObject(parent)\n      , m_editorWidget(editorWidget)\n      , m_statusBar(statusBar)\n      , m_edit(new QLineEdit(statusBar))\n      , m_statusBarMessage(new QLabel(statusBar))\n      , m_statusBarData(new QLabel(statusBar))\n      , m_statusBarIcon(new QLabel(statusBar))\n    {\n        connect(m_edit, &QLineEdit::textEdited, this, &Proxy::cmdLineChanged);\n        connect(m_edit, &QLineEdit::cursorPositionChanged, this, &Proxy::cmdLineChanged);\n        connect(m_edit, &QLineEdit::selectionChanged, this, &Proxy::cmdLineChanged);\n        m_edit->setFrame(false);\n        m_edit->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);\n        m_edit->installEventFilter( &m_editorWidget->fakeVimHandler() );\n\n        m_statusBar->insertWidget(0, m_edit, 4);\n        m_edit->hide();\n        m_statusBar->insertWidget(1, m_statusBarMessage, 1);\n        m_statusBarMessage->show();\n        m_statusBar->addPermanentWidget(m_statusBarData);\n        m_statusBarData->show();\n        m_statusBar->addPermanentWidget(m_statusBarIcon);\n        m_statusBarIcon->show();\n    }\n\n    void changeStatusData(const QString &info)\n    {\n        m_statusBarData->setText(info);\n    }\n\n    void highlightMatches(const QString &pattern)\n    {\n        m_editorWidget->highlightMatches(pattern);\n    }\n\n    void setStatusIcon(QStyle::StandardPixmap standardPixmap)\n    {\n        const auto icon = m_statusBarIcon->style()->standardIcon(standardPixmap);\n        const auto maxHeight = m_statusBarIcon->contentsRect().height();\n        const auto window = m_statusBarIcon->windowHandle();\n\n        auto sizes = icon.availableSizes();\n        std::sort(std::begin(sizes), std::end(sizes), [](const QSize &lhs, const QSize &rhs){\n            return lhs.height() > rhs.height();\n        });\n\n        const auto it = std::lower_bound(\n            sizes.begin(), sizes.end(), maxHeight,\n            [](const QSize &size, int height){\n                return size.height() > height;\n            });\n        const auto size = it == sizes.end() ? icon.actualSize(window, QSize(maxHeight, maxHeight)) : *it;\n        const auto pixmap = icon.pixmap(window, size);\n        m_statusBarIcon->setPixmap(pixmap);\n    }\n\n    void changeStatusMessage(\n        const QString &contents, int cursorPos, int anchorPos, int messageLevel)\n    {\n        if (cursorPos == -1) {\n            if ( m_edit->hasFocus() )\n                m_editorWidget->editor()->setFocus();\n            m_edit->hide();\n            m_statusBarMessage->setText(contents);\n        } else {\n            m_statusBarMessage->clear();\n            {\n                QSignalBlocker blocker(m_edit);\n                m_edit->setText(contents);\n                if (anchorPos != -1 && anchorPos != cursorPos)\n                    m_edit->setSelection(anchorPos, cursorPos - anchorPos);\n                else\n                    m_edit->setCursorPosition(cursorPos);\n            }\n            m_edit->show();\n            m_edit->setFocus();\n        }\n\n        if (messageLevel == MessageWarning)\n            setStatusIcon(QStyle::SP_MessageBoxWarning);\n        else if (messageLevel == MessageError)\n            setStatusIcon(QStyle::SP_MessageBoxCritical);\n        else\n            m_statusBarIcon->clear();\n    }\n\n    void changeExtraInformation(const QString &info)\n    {\n        QMessageBox::information(m_editorWidget->editor(), tr(\"Information\"), info);\n    }\n\n    void handleExCommand(bool *handled, const ExCommand &cmd)\n    {\n        if ( m_edit->hasFocus() )\n            m_editorWidget->editor()->setFocus();\n\n        if (cmd.cmd == \"set\") {\n            QString arg = cmd.args;\n            bool enable = !arg.startsWith(\"no\");\n            if (enable)\n                arg.remove(0, 2);\n            *handled = setOption(arg, enable);\n        } else if ( wantSaveAndQuit(cmd) ) {\n            // :wq\n            saveAndClose();\n            *handled = true;\n        } else if ( wantSave(cmd) ) {\n            save(); // :w\n            *handled = true;\n        } else if ( wantQuit(cmd) ) {\n            if (cmd.hasBang)\n                invalidate(); // :q!\n            else\n                cancel(); // :q\n            *handled = true;\n        } else {\n            *handled = false;\n        }\n    }\n\n    void requestSetBlockSelection(const QTextCursor &cursor)\n    {\n        m_editorWidget->setTextCursor(cursor);\n        m_editorWidget->setBlockSelection(true);\n    }\n\n    void requestDisableBlockSelection()\n    {\n        m_editorWidget->setBlockSelection(false);\n    }\n\n    void requestBlockSelection(QTextCursor *cursor)\n    {\n        *cursor = m_editorWidget->textCursor();\n        m_editorWidget->setBlockSelection(true);\n    }\n\nprivate:\n    void cmdLineChanged()\n    {\n        const int cursorPos = m_edit->cursorPosition();\n        int anchorPos = m_edit->selectionStart();\n        if (anchorPos == cursorPos)\n            anchorPos = cursorPos + m_edit->selectedText().length();\n        edited(m_edit->text(), cursorPos, anchorPos);\n    }\n\n    void edited(const QString &text, int cursorPos, int anchorPos)\n    {\n        m_editorWidget->fakeVimHandler().miniBufferTextEdited(text, cursorPos, anchorPos);\n    }\n\n    bool emitEditorSignal(const char *signal)\n    {\n        const auto editor = m_editorWidget->editor();\n        const QMetaObject *metaObject = editor->metaObject();\n        const int i = metaObject->indexOfSignal(signal);\n        if (i == -1)\n            return false;\n        metaObject->method(i).invoke(editor);\n        return true;\n    }\n\n    void clickDialogButton(QDialogButtonBox::StandardButton standardButton)\n    {\n        const auto window = m_editorWidget->editor()->window();\n        const auto buttonBox = window->findChild<QDialogButtonBox*>();\n        QPushButton *button = buttonBox->button(standardButton);\n        if (button)\n            button->click();\n    }\n\n    void save()\n    {\n        if ( !emitEditorSignal(\"save()\") )\n            clickDialogButton(QDialogButtonBox::Apply);\n    }\n\n    void saveAndClose()\n    {\n        if ( !emitEditorSignal(\"save()\") || !emitEditorSignal(\"cancel()\") )\n            clickDialogButton(QDialogButtonBox::Ok);\n    }\n\n    void cancel()\n    {\n        if ( !emitEditorSignal(\"cancel()\") )\n            clickDialogButton(QDialogButtonBox::Cancel);\n    }\n\n    void invalidate()\n    {\n        if ( !emitEditorSignal(\"invalidate()\") )\n            clickDialogButton(QDialogButtonBox::Cancel);\n    }\n\n    bool wantSaveAndQuit(const ExCommand &cmd)\n    {\n        return cmd.cmd == \"wq\";\n    }\n\n    bool wantSave(const ExCommand &cmd)\n    {\n        return cmd.matches(\"w\", \"write\") || cmd.matches(\"wa\", \"wall\");\n    }\n\n    bool wantQuit(const ExCommand &cmd)\n    {\n        return cmd.matches(\"q\", \"quit\") || cmd.matches(\"qa\", \"qall\");\n    }\n\n    bool setOption(const QString &option, bool enable)\n    {\n        if (option == \"linebreak\" || option == \"lbr\")\n            m_editorWidget->setLineWrappingEnabled(enable);\n        else\n            return false;\n        return true;\n    }\n\n    TextEditWrapper *m_editorWidget;\n    QStatusBar *m_statusBar;\n    QLineEdit *m_edit;\n    QLabel *m_statusBarMessage;\n    QLabel *m_statusBarData;\n    QLabel *m_statusBarIcon;\n};\n\nvoid connectSignals(FakeVimHandler *handler, Proxy *proxy)\n{\n    handler->commandBufferChanged\n            .connect([proxy](const QString &contents, int cursorPos, int anchorPos, int messageLevel) {\n            proxy->changeStatusMessage(contents, cursorPos, anchorPos, messageLevel);\n        }\n    );\n    handler->extraInformationChanged.connect(\n        [proxy](const QString &msg) {\n            proxy->changeExtraInformation(msg);\n        }\n    );\n    handler->statusDataChanged.connect(\n        [proxy](const QString &msg) {\n            proxy->changeStatusData(msg);\n        }\n    );\n    handler->highlightMatches.connect(\n        [proxy](const QString &needle) {\n            proxy->highlightMatches(needle);\n        }\n    );\n    handler->handleExCommandRequested.connect(\n        [proxy](bool *handled, const ExCommand &cmd) {\n            proxy->handleExCommand(handled, cmd);\n        }\n    );\n    handler->requestSetBlockSelection.connect(\n        [proxy](const QTextCursor &cursor) {\n            proxy->requestSetBlockSelection(cursor);\n        }\n    );\n    handler->requestDisableBlockSelection.connect(\n        [proxy]() {\n            proxy->requestDisableBlockSelection();\n        }\n    );\n    handler->requestBlockSelection.connect(\n        [proxy](QTextCursor *cursor) {\n            proxy->requestBlockSelection(cursor);\n        }\n    );\n}\n\nbool installEditor(QAbstractScrollArea *textEdit, const QString &sourceFileName, ItemFakeVimLoader *loader)\n{\n    auto wrapper = new TextEditWrapper(textEdit);\n\n    // Position text cursor at the beginning of text instead of selecting all.\n    wrapper->setTextCursor( QTextCursor(wrapper->document()) );\n\n    QStatusBar *statusBar = new QStatusBar(textEdit);\n    statusBar->setObjectName(\"editor_status_bar\");\n\n    const auto layout = textEdit->parentWidget()->layout();\n    if (layout)\n        layout->addWidget(statusBar);\n    statusBar->setFont(textEdit->font());\n\n    // Connect slots to FakeVimHandler signals.\n    auto proxy = new Proxy(wrapper, statusBar, wrapper);\n    connectSignals( &wrapper->fakeVimHandler(), proxy );\n\n    wrapper->install();\n\n    if (!sourceFileName.isEmpty())\n        wrapper->fakeVimHandler().handleCommand(\"source \" + sourceFileName);\n\n    QObject::connect(loader, &ItemFakeVimLoader::deleteAllWrappers, wrapper, &QObject::deleteLater);\n    QObject::connect(loader, &ItemFakeVimLoader::deleteAllWrappers, statusBar, &QObject::deleteLater);\n    QObject::connect(loader, &ItemFakeVimLoader::deleteAllWrappers, textEdit, [textEdit](){\n        textEdit->setProperty(propertyWrapped, false);\n    });\n\n    return true;\n}\n\ntemplate <typename TextEdit>\nbool installEditor(QObject *obj, const QString &sourceFileName, ItemFakeVimLoader *loader)\n{\n    auto textEdit = qobject_cast<TextEdit *>(obj);\n    return textEdit && !textEdit->isReadOnly() && installEditor(textEdit, sourceFileName, loader);\n}\n\n} // namespace\n\nItemFakeVimLoader::ItemFakeVimLoader()\n{\n}\n\nItemFakeVimLoader::~ItemFakeVimLoader() = default;\n\nQVariant ItemFakeVimLoader::icon() const\n{\n    return QIcon(\":/fakevim/fakevim.png\");\n}\n\nvoid ItemFakeVimLoader::setEnabled(bool enabled)\n{\n    ItemLoaderInterface::setEnabled(enabled);\n    updateCurrentlyEnabledState();\n}\n\nvoid ItemFakeVimLoader::applySettings(QSettings &settings)\n{\n    settings.setValue(configReallyEnabled, ui->checkBoxEnable->isChecked());\n    settings.setValue(configSourceFile, ui->lineEditSourceFileName->text());\n}\n\nvoid ItemFakeVimLoader::loadSettings(const QSettings &settings)\n{\n    m_reallyEnabled = settings.value(configReallyEnabled, false).toBool();\n    m_sourceFileName = settings.value(configSourceFile).toString();\n    updateCurrentlyEnabledState();\n}\n\nQWidget *ItemFakeVimLoader::createSettingsWidget(QWidget *parent)\n{\n    ui.reset(new Ui::ItemFakeVimSettings);\n    QWidget *w = new QWidget(parent);\n    ui->setupUi(w);\n\n    ui->checkBoxEnable->setChecked(m_reallyEnabled);\n    ui->lineEditSourceFileName->setText(m_sourceFileName);\n\n    return w;\n}\n\nbool ItemFakeVimLoader::eventFilter(QObject *watched, QEvent *event)\n{\n    if (event->type() == QEvent::Show)\n        wrapEditWidget(watched);\n\n    return false;\n}\n\nvoid ItemFakeVimLoader::updateCurrentlyEnabledState()\n{\n    if ( qobject_cast<QGuiApplication*>(qApp) == nullptr )\n        return;\n\n    const bool enable = isEnabled() && m_reallyEnabled;\n    if (m_currentlyEnabled == enable)\n        return;\n\n    if (enable) {\n        // WORKAROUND: Disallow blinking text cursor application-wide\n        // (unfortunately, there doesn't seem other way to do this).\n        m_oldCursorFlashTime = qApp->cursorFlashTime();\n        qApp->setCursorFlashTime(0);\n\n        qApp->installEventFilter(this);\n\n        for (auto topLevel : qApp->topLevelWidgets()) {\n            for ( auto textEdit : topLevel->findChildren<QTextEdit*>() )\n                wrapEditWidget(textEdit);\n            for ( auto textEdit : topLevel->findChildren<QPlainTextEdit*>() )\n                wrapEditWidget(textEdit);\n        }\n    } else {\n        emit deleteAllWrappers();\n\n        qApp->removeEventFilter(this);\n\n        qApp->setCursorFlashTime(m_oldCursorFlashTime);\n    }\n\n    m_currentlyEnabled = enable;\n}\n\nvoid ItemFakeVimLoader::wrapEditWidget(QObject *obj)\n{\n    if ( !obj->property(propertyWrapped).toBool()\n         && ( installEditor<QTextEdit>(obj, m_sourceFileName, this)\n              || installEditor<QPlainTextEdit>(obj, m_sourceFileName, this) )\n         )\n    {\n        obj->setProperty(propertyWrapped, true);\n    }\n}\n"
  },
  {
    "path": "plugins/itemfakevim/itemfakevim.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"item/itemwidgetwrapper.h\"\n\nnamespace Ui {\nclass ItemFakeVimSettings;\n}\n\nclass QWidget;\n\nclass ItemFakeVimLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemFakeVimLoader();\n    ~ItemFakeVimLoader();\n\n    QString id() const override { return \"itemfakevim\"; }\n    QString name() const override { return tr(\"FakeVim\"); }\n    QString author() const override\n    { return tr(\"FakeVim plugin is part of Qt Creator\")\n                + \" (Copyright (C) 2016 The Qt Company Ltd.)\"; }\n    QString description() const override { return tr(\"Emulate Vim editor while editing items.\"); }\n    QVariant icon() const override;\n\n    void setEnabled(bool enabled) override;\n\n    void applySettings(QSettings &settings) override;\n\n    void loadSettings(const QSettings &settings) override;\n\n    QWidget *createSettingsWidget(QWidget *parent) override;\n\n    bool eventFilter(QObject *watched, QEvent *event) override;\n\nsignals:\n    void deleteAllWrappers();\n\nprivate:\n    void updateCurrentlyEnabledState();\n\n    void wrapEditWidget(QObject *obj);\n\n    bool m_reallyEnabled = false;\n    bool m_currentlyEnabled = false;\n    QString m_sourceFileName;\n    QScopedPointer<Ui::ItemFakeVimSettings> ui;\n\n    int m_oldCursorFlashTime = -1;\n};\n"
  },
  {
    "path": "plugins/itemfakevim/itemfakevim.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file>fakevim/fakevim.png</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "plugins/itemfakevim/itemfakevimsettings.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemFakeVimSettings</class>\n <widget class=\"QWidget\" name=\"ItemFakeVimSettings\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QCheckBox\" name=\"checkBoxEnable\">\n     <property name=\"text\">\n      <string>Enable FakeVim for Editing Items</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>Path to Configuration File:</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLineEdit\" name=\"lineEditSourceFileName\"/>\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 <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "plugins/itemimage/CMakeLists.txt",
    "content": "set(copyq_plugin_itemimage_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-config>\n    $<TARGET_OBJECTS:copyq-plugin-serialize>\n    ../../src/common/action.cpp\n    ../../src/common/process.cpp\n    ../../src/common/temporaryfile.cpp\n    ../../src/item/itemeditor.cpp\n    )\n\ncopyq_add_plugin(itemimage)\n"
  },
  {
    "path": "plugins/itemimage/itemimage.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemimage.h\"\n#include \"ui_itemimagesettings.h\"\n\n#include \"common/mimetypes.h\"\n#include \"item/itemeditor.h\"\n#include \"gui/pixelratio.h\"\n\n#include <QBuffer>\n#include <QHBoxLayout>\n#include <QModelIndex>\n#include <QMovie>\n#include <QPainter>\n#include <QPixmap>\n#include <QSettings>\n#include <QtPlugin>\n#include <QVariant>\n#include <QVariantMap>\n\nnamespace {\n\nconst QLatin1String configMaxImageWidth(\"max_image_width\");\nconst QLatin1String configMaxImageHeight(\"max_image_height\");\nconst QLatin1String configImageEditor(\"image_editor\");\nconst QLatin1String configSvgEditor(\"svg_editor\");\n\nbool getImageData(\n    const QVariantMap &dataMap, const QString &format, QByteArray *data, QString *mime, QPixmap *pix = nullptr)\n{\n    *data = dataMap.value(format).toByteArray();\n    if (data->isEmpty())\n        return false;\n\n    if (!pix) {\n        *mime = format;\n        return true;\n    }\n\n    if (pix->loadFromData(*data, format.toLatin1())) {\n        *mime = format;\n        return true;\n    }\n\n    return false;\n}\n\nbool getPrefferedImageData(\n    const QVariantMap &dataMap, QByteArray *data, QString *mime, QPixmap *pix = nullptr)\n{\n    return getImageData(dataMap, QStringLiteral(\"image/png\"), data, mime, pix)\n        || getImageData(dataMap, QStringLiteral(\"image/bmp\"), data, mime, pix)\n        || getImageData(dataMap, QStringLiteral(\"image/jpeg\"), data, mime, pix)\n        || getImageData(dataMap, QStringLiteral(\"image/gif\"), data, mime, pix);\n}\n\nbool getFallbackImageData(\n    const QVariantMap &dataMap, QByteArray *data, QString *mime, QPixmap *pix = nullptr)\n{\n    // Fallback to any other supported image format.\n    const QLatin1String prefix(\"image/\");\n    for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it) {\n        if (!it.key().startsWith(prefix))\n            continue;\n\n        if (getImageData(dataMap, it.key(), data, mime, pix))\n            return true;\n    }\n\n    return false;\n}\n\nbool getSvgData(\n    const QVariantMap &dataMap, QByteArray *data, QString *mime, QPixmap *pix = nullptr)\n{\n    return getImageData(dataMap, QStringLiteral(\"image/svg+xml\"), data, mime, pix);\n}\n\nbool getAnimatedImageData(const QVariantMap &dataMap, QByteArray *data, QByteArray *format)\n{\n    for (const auto &movieFormat : QMovie::supportedFormats()) {\n        const QByteArray mime = \"image/\" + movieFormat;\n        if (dataMap.contains(mime)) {\n            *format = movieFormat;\n            *data = dataMap[mime].toByteArray();\n            return true;\n        }\n    }\n\n    return false;\n}\n\nbool getPixmapFromData(const QVariantMap &dataMap, QPixmap *pix)\n{\n    QString mime;\n    QByteArray data;\n    return getPrefferedImageData(dataMap, &data, &mime, pix)\n        || getSvgData(dataMap, &data, &mime, pix)\n        || getFallbackImageData(dataMap, &data, &mime, pix);\n}\n\n} // namespace\n\nItemImage::ItemImage(\n        const QPixmap &pix,\n        const QByteArray &animationData, const QByteArray &animationFormat,\n        QWidget *parent)\n    : QLabel(parent)\n    , ItemWidget(this)\n    , m_pixmap(pix)\n    , m_animationData(animationData)\n    , m_animationFormat(animationFormat)\n    , m_animation(nullptr)\n{\n    setMargin(4);\n    setPixmap(pix);\n}\n\nvoid ItemImage::updateSize(QSize, int)\n{\n    const auto m2 = 2 * margin();\n    const auto ratio = pixelRatio(this);\n    const int w = (m_pixmap.width() + 1) / ratio + m2;\n    const int h = (m_pixmap.height() + 1) / ratio + m2;\n    setFixedSize( QSize(w, h) );\n}\n\nvoid ItemImage::setCurrent(bool current)\n{\n    if (current) {\n        if ( !m_animationData.isEmpty() ) {\n            if (!m_animation) {\n                QBuffer *stream = new QBuffer(&m_animationData, this);\n                m_animation = new QMovie(stream, m_animationFormat, this);\n                m_animation->setScaledSize( m_pixmap.size() );\n            }\n\n            if (m_animation) {\n                setMovie(m_animation);\n                startAnimation();\n                m_animation->start();\n            }\n        }\n    } else {\n        stopAnimation();\n        setPixmap(m_pixmap);\n    }\n}\n\nvoid ItemImage::showEvent(QShowEvent *event)\n{\n    startAnimation();\n    QLabel::showEvent(event);\n}\n\nvoid ItemImage::hideEvent(QHideEvent *event)\n{\n    QLabel::hideEvent(event);\n    stopAnimation();\n}\n\nvoid ItemImage::paintEvent(QPaintEvent *event)\n{\n    // WORKAROUND: Draw current animation frame with correct DPI.\n    if (movie()) {\n        QPainter painter(this);\n        auto pix = m_animation->currentPixmap();\n        pix.setDevicePixelRatio( pixelRatio(this) );\n        const auto m = margin();\n        painter.drawPixmap(m, m, pix);\n    } else {\n        QLabel::paintEvent(event);\n    }\n}\n\nvoid ItemImage::startAnimation()\n{\n    if (movie())\n        movie()->start();\n}\n\nvoid ItemImage::stopAnimation()\n{\n    if (movie())\n        movie()->stop();\n}\n\nItemImageLoader::ItemImageLoader()\n{\n}\n\nItemImageLoader::~ItemImageLoader() = default;\n\nItemWidget *ItemImageLoader::create(const QVariantMap &data, QWidget *parent, bool preview) const\n{\n    if ( data.value(mimeHidden).toBool() )\n        return nullptr;\n\n    QPixmap pix;\n    if ( !getPixmapFromData(data, &pix) )\n        return nullptr;\n\n    pix.setDevicePixelRatio( pixelRatio(parent) );\n\n    // scale pixmap\n    const int w = preview ? 0 : m_maxImageWidth;\n    const int h = preview ? 0 : m_maxImageHeight;\n    if ( w > 0 && pix.width() > w && (h <= 0 || 1.0 * pix.width()/w > 1.0 * pix.height()/h) ) {\n        pix = pix.scaledToWidth(w, Qt::SmoothTransformation);\n    } else if (h > 0 && pix.height() > h) {\n        pix = pix.scaledToHeight(h, Qt::SmoothTransformation);\n    }\n\n    QByteArray animationData;\n    QByteArray animationFormat;\n    getAnimatedImageData(data, &animationData, &animationFormat);\n\n    return new ItemImage(pix, animationData, animationFormat, parent);\n}\n\nQStringList ItemImageLoader::formatsToSave() const\n{\n    return {\n        QLatin1String(\"image/svg+xml\"),\n        QLatin1String(\"image/png\"),\n        QLatin1String(\"image/gif\")\n    };\n}\n\nvoid ItemImageLoader::applySettings(QSettings &settings)\n{\n    settings.setValue(configMaxImageWidth, ui->spinBoxImageWidth->value());\n    settings.setValue(configMaxImageHeight, ui->spinBoxImageHeight->value());\n    settings.setValue(configImageEditor, ui->lineEditImageEditor->text());\n    settings.setValue(configSvgEditor, ui->lineEditSvgEditor->text());\n}\n\nvoid ItemImageLoader::loadSettings(const QSettings &settings)\n{\n    m_maxImageWidth = settings.value(configMaxImageWidth, 320).toInt();\n    m_maxImageHeight = settings.value(configMaxImageHeight, 240).toInt();\n    m_imageEditor = settings.value(configImageEditor).toString();\n    m_svgEditor = settings.value(configSvgEditor).toString();\n}\n\nQWidget *ItemImageLoader::createSettingsWidget(QWidget *parent)\n{\n    ui.reset(new Ui::ItemImageSettings);\n    QWidget *w = new QWidget(parent);\n    ui->setupUi(w);\n    ui->spinBoxImageWidth->setValue(m_maxImageWidth);\n    ui->spinBoxImageHeight->setValue(m_maxImageHeight);\n    ui->lineEditImageEditor->setText(m_imageEditor);\n    ui->lineEditSvgEditor->setText(m_svgEditor);\n    return w;\n}\n\nQObject *ItemImageLoader::createExternalEditor(const QModelIndex &, const QVariantMap &data, QWidget *parent) const\n{\n    QString mime;\n    QByteArray imageData;\n    if ( !m_imageEditor.isEmpty() && getPrefferedImageData(data, &imageData, &mime) )\n        return new ItemEditor(imageData, mime, m_imageEditor, parent);\n\n    if ( !m_svgEditor.isEmpty() && getSvgData(data, &imageData, &mime) )\n        return new ItemEditor(imageData, mime, m_svgEditor, parent);\n\n    return nullptr;\n}\n"
  },
  {
    "path": "plugins/itemimage/itemimage.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/icons.h\"\n#include \"item/itemwidget.h\"\n\n#include <QLabel>\n#include <QPixmap>\n#include <QVariant>\n\n#include <memory>\n\nclass QMovie;\n\nnamespace Ui {\nclass ItemImageSettings;\n}\n\nclass ItemImage final : public QLabel, public ItemWidget\n{\n    Q_OBJECT\n\npublic:\n    ItemImage(\n            const QPixmap &pix,\n            const QByteArray &animationData, const QByteArray &animationFormat,\n            QWidget *parent);\n\n    void updateSize(QSize maximumSize, int idealWidth) override;\n\n    void setCurrent(bool current) override;\n\nprotected:\n    void showEvent(QShowEvent *event) override;\n    void hideEvent(QHideEvent *event) override;\n    void paintEvent(QPaintEvent *event) override;\n\nprivate:\n    void startAnimation();\n    void stopAnimation();\n\n    QPixmap m_pixmap;\n    QByteArray m_animationData;\n    QByteArray m_animationFormat;\n    QMovie *m_animation;\n};\n\nclass ItemImageLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemImageLoader();\n    ~ItemImageLoader();\n\n    ItemWidget *create(const QVariantMap &data, QWidget *parent, bool preview) const override;\n\n    int priority() const override { return 15; }\n\n    QString id() const override { return \"itemimage\"; }\n    QString name() const override { return tr(\"Images\"); }\n    QString author() const override { return QString(); }\n    QString description() const override { return tr(\"Display images.\"); }\n    QVariant icon() const override { return QVariant(IconCamera); }\n\n    QStringList formatsToSave() const override;\n\n    void applySettings(QSettings &settings) override;\n\n    void loadSettings(const QSettings &settings) override;\n\n    QWidget *createSettingsWidget(QWidget *parent) override;\n\n    QObject *createExternalEditor(const QModelIndex &index, const QVariantMap &data, QWidget *parent) const override;\n\nprivate:\n    int m_maxImageWidth = 320;\n    int m_maxImageHeight = 240;\n    QString m_imageEditor;\n    QString m_svgEditor;\n    std::unique_ptr<Ui::ItemImageSettings> ui;\n};\n"
  },
  {
    "path": "plugins/itemimage/itemimagesettings.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemImageSettings</class>\n <widget class=\"QWidget\" name=\"ItemImageSettings\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>327</width>\n    <height>208</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout_2\">\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_7\">\n       <property name=\"text\">\n        <string>Maximum Image &amp;Width:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n       <property name=\"buddy\">\n        <cstring>spinBoxImageWidth</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <item>\n        <widget class=\"QSpinBox\" name=\"spinBoxImageWidth\">\n         <property name=\"toolTip\">\n          <string>Maximum width of image displayed in history (set to zero for original size)</string>\n         </property>\n         <property name=\"maximum\">\n          <number>4096</number>\n         </property>\n        </widget>\n       </item>\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      </layout>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Maximum Image &amp;Height:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n       <property name=\"buddy\">\n        <cstring>spinBoxImageHeight</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\" stretch=\"0,0\">\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <widget class=\"QSpinBox\" name=\"spinBoxImageHeight\">\n         <property name=\"toolTip\">\n          <string>Maximum height of image displayed in history (set to zero for original size)</string>\n         </property>\n         <property name=\"maximum\">\n          <number>4096</number>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"horizontalSpacer_3\">\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      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::AllNonFixedFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>&amp;Image editor command:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>lineEditImageEditor</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"lineEditImageEditor\">\n       <property name=\"toolTip\">\n        <string>Editor command for supported image formats other than SVG.</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>&amp;SVG editor command:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>lineEditSvgEditor</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"lineEditSvgEditor\">\n       <property name=\"toolTip\">\n        <string>Editor command for SVG image format.</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\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 <tabstops>\n  <tabstop>spinBoxImageWidth</tabstop>\n  <tabstop>spinBoxImageHeight</tabstop>\n  <tabstop>lineEditImageEditor</tabstop>\n  <tabstop>lineEditSvgEditor</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "plugins/itemnotes/CMakeLists.txt",
    "content": "set(copyq_plugin_itemnotes_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-iconfont>\n    $<TARGET_OBJECTS:copyq-plugin-iconwidget>\n    $<TARGET_OBJECTS:copyq-plugin-textdata>\n    $<TARGET_OBJECTS:copyq-plugin-wrapper>\n    )\n\ncopyq_add_plugin(itemnotes)\n"
  },
  {
    "path": "plugins/itemnotes/itemnotes.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemnotes.h\"\n#include \"ui_itemnotessettings.h\"\n\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/iconwidget.h\"\n#include \"gui/pixelratio.h\"\n#include \"item/itemfilter.h\"\n\n#include <QBoxLayout>\n#include <QLabel>\n#include <QModelIndex>\n#include <QMouseEvent>\n#include <QPainter>\n#include <QSettings>\n#include <QTextCursor>\n#include <QTextDocument>\n#include <QTextEdit>\n#include <QTimer>\n#include <QToolTip>\n#include <QVariantMap>\n#include <QtPlugin>\n\nnamespace {\n\n// Limit number of characters for performance reasons.\nconst int defaultMaxBytes = 10*1024;\n\nconst int notesIndent = 16;\n\nconst QLatin1String configNotesAtBottom(\"notes_at_bottom\");\nconst QLatin1String configNotesBeside(\"notes_beside\");\nconst QLatin1String configShowTooltip(\"show_tooltip\");\n\nQWidget *createIconWidget(const QByteArray &icon, QWidget *parent)\n{\n    QPixmap p;\n    if (p.loadFromData(icon)) {\n        const auto ratio = pixelRatio(parent);\n        p.setDevicePixelRatio(ratio);\n\n        const int side = ratio * (iconFontSizePixels() + 2);\n        p = p.scaled(side, side, Qt::KeepAspectRatio, Qt::SmoothTransformation);\n        QLabel *label = new QLabel(parent);\n        const auto m = side / 4;\n        label->setFixedSize( p.size() / ratio + QSize(m, m) );\n        label->setAlignment(Qt::AlignCenter);\n        label->setPixmap(p);\n        return label;\n    }\n\n    return new IconWidget(QString::fromUtf8(icon), parent);\n}\n\n} // namespace\n\nItemNotes::ItemNotes(ItemWidget *childItem, const QString &text, const QByteArray &icon,\n                     NotesPosition notesPosition, bool showToolTip)\n    : QWidget( childItem->widget()->parentWidget() )\n    , ItemWidgetWrapper(childItem, this)\n    , m_notes(new QTextEdit(this))\n    , m_icon(nullptr)\n    , m_timerShowToolTip(nullptr)\n    , m_toolTipText()\n{\n    childItem->widget()->setObjectName(\"item_child\");\n    childItem->widget()->setParent(this);\n\n    if (!icon.isEmpty())\n        m_icon = createIconWidget(icon, this);\n\n    QBoxLayout *layout;\n\n    m_notes->setObjectName(\"item_child\");\n    m_notes->setProperty(\"CopyQ_item_type\", \"notes\");\n\n    m_notes->setReadOnly(true);\n    m_notes->setUndoRedoEnabled(false);\n\n    m_notes->setFocusPolicy(Qt::NoFocus);\n    m_notes->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);\n    m_notes->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);\n    m_notes->setFrameStyle(QFrame::NoFrame);\n    m_notes->setContextMenuPolicy(Qt::NoContextMenu);\n\n    m_notes->viewport()->installEventFilter(this);\n\n    m_notes->setPlainText( text.left(defaultMaxBytes) );\n\n    if (notesPosition == NotesBeside)\n        layout = new QHBoxLayout(this);\n    else\n        layout = new QVBoxLayout(this);\n\n    auto labelLayout = new QHBoxLayout;\n    labelLayout->setContentsMargins(notesIndent, 0, 0, 0);\n\n    if (m_icon)\n        labelLayout->addWidget(m_icon, 0, Qt::AlignLeft | Qt::AlignTop);\n\n    labelLayout->addWidget(m_notes, 1, Qt::AlignLeft | Qt::AlignTop);\n\n    if (notesPosition == NotesBelow) {\n        layout->addWidget( childItem->widget() );\n        layout->addLayout(labelLayout);\n    } else {\n        layout->addLayout(labelLayout);\n        layout->addWidget( childItem->widget() );\n    }\n\n    if (showToolTip) {\n        m_timerShowToolTip = new QTimer(this);\n        m_timerShowToolTip->setInterval(250);\n        m_timerShowToolTip->setSingleShot(true);\n        connect( m_timerShowToolTip, &QTimer::timeout,\n                 this, &ItemNotes::showToolTip );\n        m_toolTipText = text;\n    }\n\n    layout->setContentsMargins({});\n    layout->setSpacing(0);\n}\n\nvoid ItemNotes::setCurrent(bool current)\n{\n    ItemWidgetWrapper::setCurrent(current);\n\n    m_isCurrent = current;\n\n    if (m_timerShowToolTip == nullptr)\n        return;\n\n    QToolTip::hideText();\n\n    if (current)\n        m_timerShowToolTip->start();\n    else\n        m_timerShowToolTip->stop();\n}\n\nvoid ItemNotes::updateSize(QSize maximumSize, int idealWidth)\n{\n    setMaximumSize(maximumSize);\n\n    if (m_notes) {\n        const int w = maximumSize.width() - 2 * notesIndent - 8;\n        QTextDocument *doc = m_notes->document();\n        doc->setTextWidth(w);\n        m_notes->setFixedSize(\n                    static_cast<int>(doc->idealWidth()) + 16,\n                    static_cast<int>(doc->size().height()) );\n    }\n\n    ItemWidgetWrapper::updateSize(maximumSize, idealWidth);\n\n    adjustSize();\n    setFixedSize(sizeHint());\n}\n\nvoid ItemNotes::paintEvent(QPaintEvent *event)\n{\n    QWidget::paintEvent(event);\n\n    // Decorate notes.\n    if (m_notes != nullptr) {\n        QPainter p(this);\n\n        QColor c = p.pen().color();\n        c.setAlpha(80);\n        p.setBrush(c);\n        p.setPen(Qt::NoPen);\n        QWidget *w = m_icon ? m_icon : m_notes;\n        const auto height = std::max(w->height(), m_notes->height()) - 8;\n        p.drawRect(w->x() - notesIndent + 4, w->y() + 4,\n                   notesIndent - 4, height);\n    }\n}\n\nbool ItemNotes::eventFilter(QObject *, QEvent *event)\n{\n    if ( event->type() == QEvent::Show && m_timerShowToolTip && m_isCurrent )\n        m_timerShowToolTip->start();\n\n    return ItemWidget::filterMouseEvents(m_notes, event);\n}\n\nvoid ItemNotes::showToolTip()\n{\n    QToolTip::hideText();\n\n    if ( !isVisible() )\n        return;\n\n    QPoint toolTipPosition = QPoint(parentWidget()->contentsRect().width() - 16, height() - 16);\n    toolTipPosition = mapToGlobal(toolTipPosition);\n\n    QToolTip::showText(toolTipPosition, m_toolTipText, this);\n}\n\nItemNotesLoader::ItemNotesLoader()\n{\n}\n\nItemNotesLoader::~ItemNotesLoader() = default;\n\nQStringList ItemNotesLoader::formatsToSave() const\n{\n    return QStringList() << mimeItemNotes << mimeIcon;\n}\n\nvoid ItemNotesLoader::applySettings(QSettings &settings)\n{\n    settings.setValue(configNotesAtBottom, ui->radioButtonBottom->isChecked());\n    settings.setValue(configNotesBeside,  ui->radioButtonBeside->isChecked());\n    settings.setValue(configShowTooltip, ui->checkBoxShowToolTip->isChecked());\n}\n\nvoid ItemNotesLoader::loadSettings(const QSettings &settings)\n{\n    m_notesAtBottom = settings.value(configNotesAtBottom, false).toBool();\n    m_notesBeside = settings.value(configNotesBeside, false).toBool();\n    m_showTooltip = settings.value(configShowTooltip, false).toBool();\n}\n\nQWidget *ItemNotesLoader::createSettingsWidget(QWidget *parent)\n{\n    ui.reset(new Ui::ItemNotesSettings);\n    QWidget *w = new QWidget(parent);\n    ui->setupUi(w);\n\n    if (m_notesAtBottom)\n        ui->radioButtonBottom->setChecked(true);\n    else if (m_notesBeside)\n        ui->radioButtonBeside->setChecked(true);\n    else\n        ui->radioButtonTop->setChecked(true);\n\n    ui->checkBoxShowToolTip->setChecked(m_showTooltip);\n\n    return w;\n}\n\nItemWidget *ItemNotesLoader::transform(ItemWidget *itemWidget, const QVariantMap &data)\n{\n    const auto text = getTextData(data, mimeItemNotes);\n    const QByteArray icon = data.value(mimeIcon).toByteArray();\n    if ( text.isEmpty() && icon.isEmpty() )\n        return nullptr;\n\n    const NotesPosition notesPosition =\n            m_notesAtBottom ? NotesBelow\n          : m_notesBeside ? NotesBeside\n          : NotesAbove;\n\n    itemWidget->setTagged(true);\n    return new ItemNotes(\n        itemWidget, text, icon, notesPosition, m_showTooltip );\n}\n\nbool ItemNotesLoader::matches(const QModelIndex &index, const ItemFilter &filter) const\n{\n    const QString text = index.data(contentType::notes).toString();\n    return filter.matches(text) || filter.matches(accentsRemoved(text));\n}\n"
  },
  {
    "path": "plugins/itemnotes/itemnotes.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/icons.h\"\n#include \"item/itemwidgetwrapper.h\"\n\n#include <QVariant>\n#include <QWidget>\n\nnamespace Ui {\nclass ItemNotesSettings;\n}\n\nclass QTextEdit;\nclass QTimer;\n\nenum NotesPosition {\n    NotesAbove,\n    NotesBelow,\n    NotesBeside,\n};\n\nclass ItemNotes final : public QWidget, public ItemWidgetWrapper\n{\n    Q_OBJECT\n\npublic:\n    ItemNotes(ItemWidget *childItem, const QString &text, const QByteArray &icon,\n              NotesPosition notesPosition, bool showToolTip);\n\n    void setCurrent(bool current) override;\n\nprotected:\n    void updateSize(QSize maximumSize, int idealWidth) override;\n\n    void paintEvent(QPaintEvent *event) override;\n\n    bool eventFilter(QObject *, QEvent *event) override;\n\nprivate:\n    void showToolTip();\n\n    QTextEdit *m_notes;\n    QWidget *m_icon;\n    QTimer *m_timerShowToolTip;\n    QString m_toolTipText;\n    bool m_isCurrent = false;\n};\n\nclass ItemNotesLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemNotesLoader();\n    ~ItemNotesLoader();\n\n    QString id() const override { return \"itemnotes\"; }\n    QString name() const override { return tr(\"Notes\"); }\n    QString author() const override { return QString(); }\n    QString description() const override { return tr(\"Display notes for items.\"); }\n    QVariant icon() const override { return QVariant(IconPenToSquare); }\n\n    QStringList formatsToSave() const override;\n\n    void applySettings(QSettings &settings) override;\n\n    void loadSettings(const QSettings &settings) override;\n\n    QWidget *createSettingsWidget(QWidget *parent) override;\n\n    ItemWidget *transform(ItemWidget *itemWidget, const QVariantMap &data) override;\n\n    bool matches(const QModelIndex &index, const ItemFilter &filter) const override;\n\nprivate:\n    bool m_notesAtBottom = false;\n    bool m_notesBeside = false;\n    bool m_showTooltip = false;\n    std::unique_ptr<Ui::ItemNotesSettings> ui;\n};\n"
  },
  {
    "path": "plugins/itemnotes/itemnotessettings.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemNotesSettings</class>\n <widget class=\"QWidget\" name=\"ItemNotesSettings\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Notes Position</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <widget class=\"QRadioButton\" name=\"radioButtonTop\">\n        <property name=\"text\">\n         <string>Abo&amp;ve Item</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"radioButtonBottom\">\n        <property name=\"text\">\n         <string>Below Ite&amp;m</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QRadioButton\" name=\"radioButtonBeside\">\n        <property name=\"text\">\n         <string>Beside Ite&amp;m</string>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"checkBoxShowToolTip\">\n     <property name=\"text\">\n      <string>Show Too&amp;l Tip</string>\n     </property>\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 <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "plugins/itempinned/CMakeLists.txt",
    "content": "set(copyq_plugin_itempinned_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-wrapper>\n    ../../src/item/itemsaverwrapper.cpp\n    ../../src/common/display.cpp\n    $<TARGET_OBJECTS:copyq-plugin-screen>\n    )\n\ncopyq_add_plugin(itempinned)\n"
  },
  {
    "path": "plugins/itempinned/itempinned.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itempinned.h\"\n\n#include \"common/command.h\"\n#include \"common/contenttype.h\"\n#include \"common/display.h\"\n#include \"gui/fromiconid.h\"\n\n#include <QApplication>\n#include <QBoxLayout>\n#include <QMessageBox>\n#include <QModelIndex>\n#include <QPalette>\n#include <QPainter>\n\n#include <algorithm>\n\nnamespace {\n\nconst QLatin1String mimePinned(\"application/x-copyq-item-pinned\");\n\nbool isPinned(const QModelIndex &index)\n{\n    const auto dataMap = index.data(contentType::data).toMap();\n    return dataMap.contains(mimePinned);\n}\n\nCommand dummyPinCommand()\n{\n    Command c;\n    c.icon = fromIconId(IconThumbtack);\n    c.inMenu = true;\n    return c;\n}\n\nbool containsPinnedItems(const QModelIndexList &indexList)\n{\n    return std::any_of( std::begin(indexList), std::end(indexList), isPinned );\n}\n\n} // namespace\n\nItemPinned::ItemPinned(ItemWidget *childItem)\n    : QWidget( childItem->widget()->parentWidget() )\n    , ItemWidgetWrapper(childItem, this)\n{\n    childItem->widget()->setObjectName(\"item_child\");\n    childItem->widget()->setParent(this);\n\n    QBoxLayout *layout;\n    layout = new QHBoxLayout(this);\n    layout->setContentsMargins(0, 0, 0, 0);\n    layout->addWidget(childItem->widget());\n    layout->setAlignment(Qt::AlignTop | Qt::AlignLeft);\n}\n\nvoid ItemPinned::paintEvent(QPaintEvent *paintEvent)\n{\n    const auto *parent = parentWidget();\n    auto color = parent->palette().color(QPalette::Window);\n    const int lightThreshold = 100;\n    const bool menuBackgrounIsLight = color.lightness() > lightThreshold;\n    color.setHsl(\n                color.hue(),\n                color.saturation(),\n                qMax(0, qMin(255, color.lightness() + (menuBackgrounIsLight ? -200 : 200)))\n                );\n\n    QPainter painter(this);\n    const int border = pointsToPixels(6, this);\n    const QRect rect(width() - border, 0, width(), height());\n    painter.setOpacity(0.15);\n    painter.fillRect(rect, color);\n\n    QWidget::paintEvent(paintEvent);\n}\n\nvoid ItemPinned::updateSize(QSize maximumSize, int idealWidth)\n{\n    setMinimumWidth(idealWidth);\n    setMaximumWidth(maximumSize.width());\n    const int border = pointsToPixels(12, this);\n    const int childItemWidth = idealWidth - border;\n    const auto childItemMaximumSize = QSize(maximumSize.width() - border, maximumSize.height());\n    ItemWidgetWrapper::updateSize(childItemMaximumSize, childItemWidth);\n    adjustSize();\n}\n\nbool ItemPinnedScriptable::isPinned()\n{\n    const auto args = currentArguments();\n    for (const auto &arg : args) {\n        bool ok;\n        const int row = arg.toInt(&ok);\n        if (ok) {\n            const auto result = call(\"read\", {QStringLiteral(\"?\"), row});\n            if ( result.toByteArray().contains(mimePinned.data()) )\n                return true;\n        }\n    }\n\n    return false;\n}\n\nvoid ItemPinnedScriptable::pin()\n{\n    const auto args = currentArguments();\n    if (args.isEmpty()) {\n        pinData();\n    } else {\n        for (const auto &arg : args) {\n            bool ok;\n            const int row = arg.toInt(&ok);\n            if (ok)\n                call(\"change\", {row, mimePinned, QString()});\n        }\n    }\n}\n\nvoid ItemPinnedScriptable::unpin()\n{\n    const auto args = currentArguments();\n    if (args.isEmpty()) {\n        unpinData();\n    } else {\n        for (const auto &arg : args) {\n            bool ok;\n            const int row = arg.toInt(&ok);\n            if (ok)\n                call(\"change\", {row, mimePinned, QVariant()});\n        }\n    }\n}\n\nvoid ItemPinnedScriptable::pinData()\n{\n    call(\"setData\", {mimePinned, QString()});\n}\n\nvoid ItemPinnedScriptable::unpinData()\n{\n    call(\"removeData\", {mimePinned});\n}\n\nQString ItemPinnedScriptable::getMimePinned() const\n{\n    return ::mimePinned;\n}\n\nItemPinnedSaver::ItemPinnedSaver(QAbstractItemModel *model, const ItemSaverPtr &saver)\n    : ItemSaverWrapper(saver)\n    , m_model(model)\n{\n    connect( model, &QAbstractItemModel::rowsInserted,\n             this, &ItemPinnedSaver::onRowsInserted );\n    connect( model, &QAbstractItemModel::rowsRemoved,\n             this, &ItemPinnedSaver::onRowsRemoved );\n    connect( model, &QAbstractItemModel::rowsMoved,\n             this, &ItemPinnedSaver::onRowsMoved );\n    connect( model, &QAbstractItemModel::dataChanged,\n             this, &ItemPinnedSaver::onDataChanged );\n\n    updateLastPinned( 0, m_model->rowCount() );\n}\n\nbool ItemPinnedSaver::canRemoveItems(const QList<QModelIndex> &indexList, QString *error)\n{\n    if ( !containsPinnedItems(indexList) )\n        return ItemSaverWrapper::canRemoveItems(indexList, error);\n\n    if (error) {\n        *error = \"Removing pinned item is not allowed (unpin item first)\";\n        return false;\n    }\n\n    QMessageBox::information(\n                QApplication::activeWindow(),\n                ItemPinnedLoader::tr(\"Cannot Remove Pinned Items\"),\n                ItemPinnedLoader::tr(\"Unpin items first to remove them.\") );\n    return false;\n}\n\nbool ItemPinnedSaver::canDropItem(const QModelIndex &index)\n{\n    return !isPinned(index) && ItemSaverWrapper::canDropItem(index);\n}\n\nbool ItemPinnedSaver::canMoveItems(const QList<QModelIndex> &indexList)\n{\n    return !containsPinnedItems(indexList)\n            && ItemSaverWrapper::canMoveItems(indexList);\n}\n\nvoid ItemPinnedSaver::onRowsInserted(const QModelIndex &, int start, int end)\n{\n    if (!m_model || m_lastPinned < start) {\n        updateLastPinned(start, end);\n        return;\n    }\n\n    disconnect( m_model.data(), &QAbstractItemModel::rowsMoved,\n                this, &ItemPinnedSaver::onRowsMoved );\n\n    // Shift rows below inserted up.\n    const int rowCount = end - start + 1;\n    for (int row = end + 1; row <= m_lastPinned + rowCount; ++row) {\n        const auto index = m_model->index(row, 0);\n        if ( isPinned(index) )\n            moveRow(row, row - rowCount);\n    }\n\n    connect( m_model.data(), &QAbstractItemModel::rowsMoved,\n             this, &ItemPinnedSaver::onRowsMoved );\n}\n\nvoid ItemPinnedSaver::onRowsRemoved(const QModelIndex &, int start, int end)\n{\n    if (!m_model || m_lastPinned < start)\n        return;\n\n    disconnect( m_model.data(), &QAbstractItemModel::rowsMoved,\n                this, &ItemPinnedSaver::onRowsMoved );\n\n    // Shift rows below removed down.\n    const int rowCount = end - start + 1;\n    for (int row = m_lastPinned - rowCount; row >= start; --row) {\n        const auto index = m_model->index(row, 0);\n        if ( isPinned(index) )\n            moveRow(row, row + rowCount + 1);\n    }\n\n    connect( m_model.data(), &QAbstractItemModel::rowsMoved,\n             this, &ItemPinnedSaver::onRowsMoved );\n}\n\nvoid ItemPinnedSaver::onRowsMoved(const QModelIndex &, int start, int end, const QModelIndex &, int destinationRow)\n{\n    if (!m_model)\n        return;\n\n    if ( (m_lastPinned >= start || m_lastPinned >= destinationRow)\n         && (end >= m_lastPinned || destinationRow >= m_lastPinned) )\n    {\n        if (start < destinationRow)\n            updateLastPinned(start, destinationRow + end - start + 1);\n        else\n            updateLastPinned(destinationRow, end);\n    }\n\n    if (destinationRow != 0 || start < destinationRow)\n        return;\n\n    const int rowCount = end - start + 1;\n\n    for (int row = destinationRow; row < destinationRow + rowCount; ++row) {\n        if ( isPinned(m_model->index(row, 0)) )\n            return;\n    }\n\n    disconnect( m_model.data(), &QAbstractItemModel::rowsMoved,\n                this, &ItemPinnedSaver::onRowsMoved );\n\n    // Shift rows below inserted up.\n    for (int row = destinationRow + rowCount; row <= std::min(m_lastPinned, end); ++row) {\n        const auto index = m_model->index(row, 0);\n        if ( isPinned(index) )\n            moveRow(row, row - rowCount);\n    }\n\n    connect( m_model.data(), &QAbstractItemModel::rowsMoved,\n             this, &ItemPinnedSaver::onRowsMoved );\n}\n\nvoid ItemPinnedSaver::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)\n{\n    if ( bottomRight.row() < m_lastPinned )\n        return;\n\n    updateLastPinned( topLeft.row(), bottomRight.row() );\n}\n\nvoid ItemPinnedSaver::moveRow(int from, int to)\n{\n    m_model->moveRow(QModelIndex(), from, QModelIndex(), to);\n}\n\nvoid ItemPinnedSaver::updateLastPinned(int from, int to)\n{\n    for (int row = to; row >= from; --row) {\n        const auto index = m_model->index(row, 0);\n        if ( isPinned(index) ) {\n            m_lastPinned = row;\n            break;\n        }\n    }\n}\n\nItemPinnedLoader::ItemPinnedLoader()\n{\n}\n\nItemPinnedLoader::~ItemPinnedLoader() = default;\n\nQStringList ItemPinnedLoader::formatsToSave() const\n{\n    return QStringList() << mimePinned;\n}\n\nItemWidget *ItemPinnedLoader::transform(ItemWidget *itemWidget, const QVariantMap &data)\n{\n    return data.contains(mimePinned) ? new ItemPinned(itemWidget) : nullptr;\n}\n\nItemSaverPtr ItemPinnedLoader::transformSaver(const ItemSaverPtr &saver, QAbstractItemModel *model)\n{\n    return std::make_shared<ItemPinnedSaver>(model, saver);\n}\n\nItemScriptable *ItemPinnedLoader::scriptableObject()\n{\n    return new ItemPinnedScriptable();\n}\n\nQVector<Command> ItemPinnedLoader::commands() const\n{\n    QVector<Command> commands;\n\n    Command c;\n\n    c = dummyPinCommand();\n    c.internalId = QStringLiteral(\"copyq_pinned_pin\");\n    c.name = tr(\"Pin\");\n    c.input = \"!OUTPUT\";\n    c.output = mimePinned;\n    c.cmd = \"copyq: plugins.itempinned.pin()\";\n    commands.append(c);\n\n    c = dummyPinCommand();\n    c.internalId = QStringLiteral(\"copyq_pinned_unpin\");\n    c.name = tr(\"Unpin\");\n    c.input = mimePinned;\n    c.cmd = \"copyq: plugins.itempinned.unpin()\";\n    commands.append(c);\n\n    return commands;\n}\n"
  },
  {
    "path": "plugins/itempinned/itempinned.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/icons.h\"\n#include \"item/itemwidgetwrapper.h\"\n#include \"item/itemsaverwrapper.h\"\n\n#include <QPointer>\n#include <QVariant>\n#include <QWidget>\n\nclass ItemPinned final : public QWidget, public ItemWidgetWrapper\n{\n    Q_OBJECT\n\npublic:\n    explicit ItemPinned(ItemWidget *childItem);\n\nprotected:\n    void paintEvent(QPaintEvent *paintEvent) override;\n\n    void updateSize(QSize maximumSize, int idealWidth) override;\n};\n\nclass ItemPinnedScriptable final : public ItemScriptable\n{\n    Q_OBJECT\n    Q_PROPERTY(QString mimePinned READ getMimePinned CONSTANT)\n\npublic slots:\n    bool isPinned();\n\n    void pin();\n    void unpin();\n\n    void pinData();\n    void unpinData();\n\n    QString getMimePinned() const;\n};\n\nclass ItemPinnedSaver final : public QObject, public ItemSaverWrapper\n{\n    Q_OBJECT\n\npublic:\n    ItemPinnedSaver(QAbstractItemModel *model, const ItemSaverPtr &saver);\n\n    bool canRemoveItems(const QList<QModelIndex> &indexList, QString *error) override;\n\n    bool canDropItem(const QModelIndex &index) override;\n\n    bool canMoveItems(const QList<QModelIndex> &indexList) override;\n\nprivate:\n    void onRowsInserted(const QModelIndex &parent, int start, int end);\n    void onRowsRemoved(const QModelIndex &parent, int start, int end);\n    void onRowsMoved(const QModelIndex &, int start, int end, const QModelIndex &, int destinationRow);\n    void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);\n\n    void moveRow(int from, int to);\n    void updateLastPinned(int from, int to);\n\n    QPointer<QAbstractItemModel> m_model;\n\n    // Last pinned row in list (improves performance of updates).\n    int m_lastPinned = -1;\n};\n\nclass ItemPinnedLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemPinnedLoader();\n    ~ItemPinnedLoader();\n\n    QString id() const override { return \"itempinned\"; }\n    QString name() const override { return tr(\"Pinned Items\"); }\n    QString author() const override { return QString(); }\n    QString description() const override {\n        return tr(\n            \"<p>Pin items to lock them in current row and avoid deletion (unless unpinned).</p>\"\n            \"<p>Provides shortcuts and scripting functionality.</p>\"\n        );\n    }\n    QVariant icon() const override { return QVariant(IconThumbtack); }\n\n    QStringList formatsToSave() const override;\n\n    ItemWidget *transform(ItemWidget *itemWidget, const QVariantMap &data) override;\n\n    ItemSaverPtr transformSaver(const ItemSaverPtr &saver, QAbstractItemModel *model) override;\n\n    const QObject *signaler() const override { return this; }\n\n    ItemScriptable *scriptableObject() override;\n\n    QVector<Command> commands() const override;\n\nprivate:\n    ItemLoaderPtr m_transformedLoader;\n};\n"
  },
  {
    "path": "plugins/itemsync/CMakeLists.txt",
    "content": "set(copyq_plugin_itemsync_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-config>\n    $<TARGET_OBJECTS:copyq-plugin-geometry>\n    $<TARGET_OBJECTS:copyq-plugin-iconfont>\n    $<TARGET_OBJECTS:copyq-plugin-iconwidget>\n    $<TARGET_OBJECTS:copyq-plugin-screen>\n    $<TARGET_OBJECTS:copyq-plugin-serialize>\n    $<TARGET_OBJECTS:copyq-plugin-wrapper>\n    ../../src/gui/iconselectbutton.cpp\n    ../../src/gui/iconselectdialog.cpp\n    )\n\ncopyq_add_plugin(itemsync)\n"
  },
  {
    "path": "plugins/itemsync/filewatcher.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"filewatcher.h\"\n\n#include \"common/contenttype.h\"\n#include \"item/serialize.h\"\n\n#include <QAbstractItemModel>\n#include <QCryptographicHash>\n#include <QDataStream>\n#include <QDateTime>\n#include <QDebug>\n#include <QDir>\n#include <QElapsedTimer>\n#include <QLoggingCategory>\n#include <QMimeData>\n#include <QRegularExpression>\n#include <QUrl>\n\n#include <array>\n#include <vector>\n\nconstexpr int staleLockTimeMs = 10'000;\n\nconst QLatin1String mimeExtensionMap(COPYQ_MIME_PREFIX_ITEMSYNC \"mime-to-extension-map\");\nconst QLatin1String mimeBaseName(COPYQ_MIME_PREFIX_ITEMSYNC \"basename\");\nconst QLatin1String mimeNoSave(COPYQ_MIME_PREFIX_ITEMSYNC \"no-save\");\nconst QLatin1String mimeSyncPath(COPYQ_MIME_PREFIX_ITEMSYNC \"sync-path\");\nconst QLatin1String mimeNoFormat(COPYQ_MIME_PREFIX_ITEMSYNC \"no-format\");\nconst QLatin1String mimeUnknownFormats(COPYQ_MIME_PREFIX_ITEMSYNC \"unknown-formats\");\nconst QLatin1String mimePrivateSyncPrefix(COPYQ_MIME_PREFIX_ITEMSYNC_PRIVATE);\nconst QLatin1String mimeOldBaseName(COPYQ_MIME_PREFIX_ITEMSYNC_PRIVATE \"old-basename\");\nconst QLatin1String mimeHashPrefix(COPYQ_MIME_PREFIX_ITEMSYNC_PRIVATE \"hash\");\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(fileWatcher)\nQ_LOGGING_CATEGORY(fileWatcher, \"copyq.plugin.itemsync.filewatcher\")\n\nclass FileWatcherLock final {\npublic:\n    explicit FileWatcherLock(FileWatcher *fileWatcher)\n        : m_fileWatcher(fileWatcher)\n    {}\n\n    ~FileWatcherLock() {\n        if (m_locked)\n            m_fileWatcher->unlock();\n    }\n\n    bool lock() {\n        m_locked = m_locked || m_fileWatcher->lock();\n        return m_locked;\n    }\nprivate:\n    FileWatcher *m_fileWatcher;\n    bool m_locked = false;\n};\n\n} // namespace\n\nclass SyncDataFile {\npublic:\n    SyncDataFile() = default;\n\n    explicit SyncDataFile(const QString &path, const QString &format = QString())\n        : m_path(path)\n        , m_format(format)\n    {}\n\n    const QString &path() const { return m_path; }\n    void setPath(const QString &path) { m_path = path; }\n\n    const QString &format() const { return m_format; }\n    void setFormat(const QString &format) { m_format = format; }\n\n    qint64 size() const {\n        QFileInfo f(m_path);\n        return f.size();\n    }\n\n    QString toString() const {\n        if ( m_format.isEmpty() )\n            return m_path;\n\n        return QStringLiteral(\"%1\\n%2\").arg(m_path, m_format);\n    }\n\n    QByteArray readAll() const\n    {\n        QFile f(m_path);\n        if ( !f.open(QIODevice::ReadOnly) )\n            return QByteArray();\n\n        if ( m_format.isEmpty() )\n            return f.readAll();\n\n        QDataStream stream(&f);\n        QVariantMap dataMap;\n        if ( !deserializeData(&stream, &dataMap) ) {\n            qCCritical(fileWatcher)\n                << \"Failed to read file\" << m_path << f.errorString();\n            return QByteArray();\n        }\n\n        return dataMap.value(m_format).toByteArray();\n    }\n\n    bool operator==(const SyncDataFile &other) const {\n        return m_path == other.m_path\n            && m_format == other.m_format;\n    }\n\nprivate:\n    QString m_path;\n    QString m_format;\n};\nQ_DECLARE_METATYPE(SyncDataFile)\n\nQDataStream &operator<<(QDataStream &out, SyncDataFile value)\n{\n    return out << value.path() << value.format();\n}\n\nQDataStream &operator>>(QDataStream &in, SyncDataFile &value)\n{\n    QString path;\n    QString format;\n    in >> path >> format;\n    value.setPath(path);\n    value.setFormat(format);\n    return in;\n}\n\nvoid registerSyncDataFileConverter()\n{\n    QMetaType::registerConverter(&SyncDataFile::readAll);\n    QMetaType::registerConverter(&SyncDataFile::toString);\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    qRegisterMetaTypeStreamOperators<SyncDataFile>(\"SyncDataFile\");\n#else\n    qRegisterMetaType<SyncDataFile>(\"SyncDataFile\");\n#endif\n}\n\nstruct Ext {\n    Ext() : extension(), format() {}\n\n    Ext(const QString &extension, const QString &format)\n        : extension(extension)\n        , format(format)\n    {}\n\n    QString extension;\n    QString format;\n};\n\nusing Exts = std::vector<Ext>;\n\nstruct BaseNameExtensions {\n    explicit BaseNameExtensions(const QString &baseName = QString(),\n                                const Exts &exts = Exts())\n        : baseName(baseName)\n        , exts(exts)\n    {}\n    QString baseName;\n    Exts exts;\n};\n\nnamespace {\n\nconst QLatin1String dataFileSuffix(\"_copyq.dat\");\nconst QLatin1String noteFileSuffix(\"_note.txt\");\n\nconst int defaultUpdateFocusItemsIntervalMs = 10000;\nconst int batchItemUpdateIntervalMs = 100;\n\nconst qint64 sizeLimit = 50'000'000;\n\nFileFormat getFormatSettingsFromFileName(const QString &fileName,\n                                         const QList<FileFormat> &formatSettings,\n                                         QString *foundExt = nullptr)\n{\n    for (const auto &format : formatSettings) {\n        for ( const auto &ext : format.extensions ) {\n            if ( fileName.endsWith(ext) ) {\n                if (foundExt)\n                    *foundExt = ext;\n                return format;\n            }\n        }\n    }\n\n    return FileFormat();\n}\n\nvoid getBaseNameAndExtension(const QString &fileName, QString *baseName, QString *ext,\n                             const QList<FileFormat> &formatSettings)\n{\n    ext->clear();\n\n    const FileFormat fileFormat = getFormatSettingsFromFileName(fileName, formatSettings, ext);\n\n    if ( !fileFormat.isValid() ) {\n        const int i = fileName.lastIndexOf('.');\n        if (i != -1)\n            *ext = fileName.mid(i);\n    }\n\n    *baseName = fileName.left( fileName.size() - ext->size() );\n\n    if ( baseName->endsWith('.') ) {\n        baseName->chop(1);\n        ext->prepend('.');\n    }\n}\n\nusing ExtensionsAndFormats = std::array<Ext, 14>;\nconst ExtensionsAndFormats &fileExtensionsAndFormats()\n{\n    static const ExtensionsAndFormats exts = {\n        Ext(noteFileSuffix, mimeItemNotes),\n        Ext(\".txt\", mimeText),\n        Ext(\".html\", mimeHtml),\n        Ext(\".uri\", mimeUriList),\n        Ext(\".png\", \"image/png\"),\n        Ext(\"_inkscape.svg\", \"image/x-inkscape-svg-compressed\"),\n        Ext(\".svg\", \"image/svg+xml\"),\n        Ext(\".bmp\", \"image/bmp\"),\n        Ext(\".gif\", \"image/gif\"),\n        Ext(\".jpg\", \"image/jpeg\"),\n        Ext(\".ico\", \"image/x-icon\"),\n        Ext(\".webp\", \"image/webp\"),\n        Ext(\".xml\", \"application/xml\"),\n        Ext(\".xml\", \"text/xml\"),\n    };\n\n    return exts;\n}\n\nQString findByFormat(const QString &format, const QList<FileFormat> &formatSettings)\n{\n    // Find in default extensions.\n    for (const auto &ext : fileExtensionsAndFormats()) {\n        if (ext.format == format)\n            return ext.extension;\n    }\n\n    // Find in user defined extensions.\n    for (const auto &fileFormat : formatSettings) {\n        if ( !fileFormat.extensions.isEmpty() && fileFormat.itemMime != \"-\"\n             && format == fileFormat.itemMime )\n        {\n            return fileFormat.extensions.first();\n        }\n    }\n\n    return QString();\n}\n\nExt findByExtension(const QString &fileName, const QList<FileFormat> &formatSettings)\n{\n    // Is internal data format?\n    if ( fileName.endsWith(dataFileSuffix) )\n        return Ext(dataFileSuffix, mimeUnknownFormats);\n\n    // Avoid conflicting notes with text.\n    if ( fileName.endsWith(noteFileSuffix) )\n        return Ext(noteFileSuffix, mimeItemNotes);\n\n    // Find in user defined formats.\n    bool hasUserFormat = false;\n    for (const auto &format : formatSettings) {\n        for (const auto &ext : format.extensions) {\n            if ( fileName.endsWith(ext) ) {\n                if ( format.itemMime.isEmpty() )\n                    hasUserFormat = true;\n                else\n                    return Ext(ext, format.itemMime);\n            }\n        }\n    }\n\n    // Find in default formats.\n    for (const auto &ext : fileExtensionsAndFormats()) {\n        if ( fileName.endsWith(ext.extension) )\n            return ext;\n    }\n\n    return hasUserFormat ? Ext(QString(), mimeNoFormat) : Ext();\n}\n\nbool saveItemFile(const QString &filePath, const QByteArray &bytes,\n                  QStringList *existingFiles, bool hashChanged = true)\n{\n    if ( !existingFiles->removeOne(filePath) || hashChanged ) {\n        QFile f(filePath);\n        if ( !f.open(QIODevice::WriteOnly) || f.write(bytes) == -1 ) {\n            qCCritical(fileWatcher)\n                << \"Failed to save item file:\" << f.errorString();\n            return false;\n        }\n    }\n\n    return true;\n}\n\nbool canUseFile(const QFileInfo &info)\n{\n    return !info.fileName().startsWith(QLatin1Char('.'));\n}\n\nbool getBaseNameExtension(const QString &filePath, const QList<FileFormat> &formatSettings,\n                          QString *baseName, Ext *ext, const QDir &parentDir)\n{\n    QFileInfo info(filePath);\n    if ( !canUseFile(info) )\n        return false;\n\n    *ext = findByExtension(filePath, formatSettings);\n    if ( ext->format.isEmpty() || ext->format == QLatin1String(\"-\") )\n        return false;\n\n    const QString fileName = parentDir.relativeFilePath(info.absoluteFilePath());\n    *baseName = fileName.left( fileName.size() - ext->extension.size() );\n\n    return true;\n}\n\nBaseNameExtensionsList listFiles(\n    const QStringList &files,\n    const QList<FileFormat> &formatSettings,\n    const int maxItemCount,\n    const QDir &parentDir)\n{\n    BaseNameExtensionsList fileList;\n    QMap<QString, int> fileMap;\n\n    for (const auto &filePath : files) {\n        QString baseName;\n        Ext ext;\n        if ( getBaseNameExtension(filePath, formatSettings, &baseName, &ext, parentDir) ) {\n            int i = fileMap.value(baseName, -1);\n            if (i == -1) {\n                i = fileList.size();\n                if (i >= maxItemCount)\n                    break;\n                fileList.append( BaseNameExtensions(baseName, {ext}) );\n                fileMap.insert(baseName, i);\n            } else {\n                fileList[i].exts.push_back(ext);\n            }\n        }\n    }\n\n    return fileList;\n}\n\n/// Sorts own files (copyq_*) first by creation date newer first and other\n/// files by name alphabetically. More nested files are later.\nbool isBaseNameLessThan(const QString &lhsBaseName, const QString &rhsBaseName)\n{\n    const int lhsNesting = lhsBaseName.count('/');\n    const int rhsNesting = rhsBaseName.count('/');\n    if (lhsNesting != rhsNesting)\n        return lhsNesting < rhsNesting;\n\n    const bool isLhsOwn = FileWatcher::isOwnBaseName(lhsBaseName);\n    const bool isRhsOwn = FileWatcher::isOwnBaseName(rhsBaseName);\n    if (isLhsOwn && isRhsOwn)\n        return lhsBaseName > rhsBaseName;\n    if (isLhsOwn)\n        return true;\n    if (isRhsOwn)\n        return false;\n    return lhsBaseName < rhsBaseName;\n}\n\nQStringList listFiles(const QDir &dir)\n{\n    QList<QDir> dirs{dir};\n    QSet<QString> visitedDirs;\n    QStringList result;\n    while (!dirs.isEmpty()) {\n        const QDir subDir = dirs.takeFirst();\n        const QFileInfoList infos = subDir.entryInfoList(\n            QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot\n            | QDir::Readable | QDir::Writable);\n        for (const QFileInfo &info : infos) {\n            if ( !canUseFile(info) )\n                continue;\n\n            if ( info.isDir() ) {\n                // Avoid visiting same directory, in case of symlinks.\n                const QString canonicalPath = info.canonicalFilePath();\n                if ( visitedDirs.contains(canonicalPath) )\n                    continue;\n                visitedDirs.insert(canonicalPath);\n\n                dirs.append( QDir(info.absoluteFilePath()) );\n            } else {\n                result.append(info.absoluteFilePath());\n            }\n        }\n    }\n    std::sort(std::begin(result), std::end(result), [&](const QString &lhs, const QString &rhs){\n        const QString lhsBaseName = dir.relativeFilePath(lhs);\n        const QString rhsBaseName = dir.relativeFilePath(rhs);\n        return isBaseNameLessThan(lhsBaseName, rhsBaseName);\n    });\n    return result;\n}\n\n/// Return true only if no file name in @a fileNames starts with @a baseName.\nbool isUniqueBaseName(const QString &baseName, const QDir &dir,\n                      const QSet<QString> &baseNames = {})\n{\n    if ( baseNames.contains(baseName) )\n        return false;\n\n    const QFileInfo info(dir.absoluteFilePath(baseName));\n    const QString pattern = info.fileName() + QLatin1Char('*');\n    QDir parentDir = info.dir();\n    parentDir.setNameFilters({pattern});\n    return parentDir.isEmpty();\n}\n\nvoid moveFormatFiles(const QString &oldPath, const QString &newPath,\n                     const QVariantMap &mimeToExtension)\n{\n    for (const auto &extValue : mimeToExtension) {\n        const QString ext = extValue.toString();\n        QFile::rename(oldPath + ext, newPath + ext);\n    }\n}\n\nvoid copyFormatFiles(const QString &oldPath, const QString &newPath,\n                     const QVariantMap &mimeToExtension)\n{\n    for (const auto &extValue : mimeToExtension) {\n        const QString ext = extValue.toString();\n        QFile::copy(oldPath + ext, newPath + ext);\n    }\n}\n\nvoid removeFormatFiles(const QString &path, const QVariantMap &mimeToExtension)\n{\n    for (const auto &extValue : mimeToExtension)\n        QFile::remove(path + extValue.toString());\n}\n\nint variantTypeId(const QVariant &value)\n{\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    return value.userType();\n#else\n    return value.typeId();\n#endif\n}\n\nvoid rebaseSyncDataFilePaths(QVariantMap *itemData, const QVariantMap &mimeToExtension, const QString &oldBasePath, const QString &newBasePath)\n{\n    const QString dataExt = mimeToExtension.value(mimeUnknownFormats).toString();\n    const int syncDataFileType = qMetaTypeId<SyncDataFile>();\n    for (auto it = itemData->begin(); it != itemData->end(); ++it) {\n        if (variantTypeId(it.value()) != syncDataFileType)\n            continue;\n\n        SyncDataFile syncDataFile = it.value().value<SyncDataFile>();\n        QString newPath;\n        if ( !oldBasePath.isEmpty() && syncDataFile.path().startsWith(oldBasePath) ) {\n            const QString suffix = syncDataFile.path().mid(oldBasePath.size());\n            newPath = newBasePath + suffix;\n        } else {\n            const QString ext = syncDataFile.format().isEmpty()\n                ? mimeToExtension.value(it.key()).toString()\n                : dataExt;\n            if (ext.isEmpty())\n                continue;\n            newPath = newBasePath + ext;\n        }\n\n        syncDataFile.setPath(newPath);\n        it.value() = QVariant::fromValue(syncDataFile);\n    }\n}\n\nbool renameToUnique(\n        const QDir &dir, const QSet<QString> &baseNames, QString *name,\n        const QList<FileFormat> &formatSettings)\n{\n    if ( name->isEmpty() ) {\n        const auto dateFormat = QStringLiteral(\"yyyyMMddhhmmsszzz\");\n        const auto dateTime = QDateTime::currentDateTimeUtc();\n        const auto now = dateTime.toString(dateFormat);\n        *name = QStringLiteral(\"copyq_%1\").arg(now);\n    } else {\n        // Replace/remove unsafe characters.\n        name->replace( QRegularExpression(QLatin1String(R\"(/|\\\\|^\\.)\")),\n                       QLatin1String(\"_\") );\n        name->remove( QRegularExpression(QLatin1String(R\"(\\n|\\r)\")) );\n    }\n\n    if ( isUniqueBaseName(*name, dir, baseNames) )\n        return true;\n\n    QString ext;\n    QString baseName;\n    getBaseNameAndExtension(*name, &baseName, &ext, formatSettings);\n\n    int i = 0;\n    int fieldWidth = 4;\n\n    QRegularExpression re(QStringLiteral(R\"(\\d{1,4}$)\"));\n    const auto m = re.match(baseName);\n    if (m.hasMatch()) {\n        const QString num = m.captured();\n        i = num.toInt();\n        fieldWidth = num.size();\n        baseName = baseName.mid( 0, baseName.size() - fieldWidth );\n    } else {\n        baseName.append('-');\n    }\n\n    for (int counter = 0; counter < 99999; ++counter) {\n        *name = baseName + QStringLiteral(\"%1\").arg(++i, fieldWidth, 10, QLatin1Char('0')) + ext;\n        if ( isUniqueBaseName(*name, dir, baseNames) )\n            return true;\n    }\n\n    qCCritical(fileWatcher)\n        << \"Failed to find unique base name with prefix:\" << baseName;\n    return false;\n}\n\nQString findLastOwnBaseName(QAbstractItemModel *model, int fromRow) {\n    for (int row = fromRow; row < model->rowCount(); ++row) {\n        const QModelIndex index = model->index(row, 0);\n        const QString baseName = FileWatcher::getBaseName(index);\n        if ( FileWatcher::isOwnBaseName(baseName) )\n            return baseName;\n    }\n    return {};\n}\n\n} // namespace\n\nQString FileWatcher::getBaseName(const QModelIndex &index)\n{\n    return getBaseName( index.data(contentType::data).toMap() );\n}\n\nQString FileWatcher::getBaseName(const QVariantMap &data)\n{\n    return data.value(mimeBaseName).toString();\n}\n\nbool FileWatcher::isOwnBaseName(const QString &baseName)\n{\n    return baseName.startsWith(QLatin1String(\"copyq_\"));\n}\n\nvoid FileWatcher::removeFilesForRemovedIndex(const QString &tabPath, const QModelIndex &index)\n{\n    const QAbstractItemModel *model = index.model();\n    if (!model)\n        return;\n\n    const QString baseName = FileWatcher::getBaseName(index);\n    if ( baseName.isEmpty() )\n        return;\n\n    // Check if item is still present in list (drag'n'drop).\n    bool remove = true;\n    for (int i = 0; i < model->rowCount(); ++i) {\n        const QModelIndex index2 = model->index(i, 0);\n        if ( index2 != index && baseName == FileWatcher::getBaseName(index2) ) {\n            remove = false;\n            break;\n        }\n    }\n    if (!remove)\n        return;\n\n    const QVariantMap itemData = index.data(contentType::data).toMap();\n    const QVariantMap mimeToExtension = itemData.value(mimeExtensionMap).toMap();\n    if ( mimeToExtension.isEmpty() )\n        QFile::remove(tabPath + '/' + baseName);\n    else\n        removeFormatFiles(tabPath + '/' + baseName, mimeToExtension);\n}\n\nHash FileWatcher::calculateHash(const QByteArray &bytes)\n{\n    return QCryptographicHash::hash(bytes, QCryptographicHash::Sha1);\n}\n\nFileWatcher::FileWatcher(\n        const QString &path,\n        const QStringList &paths,\n        QAbstractItemModel *model,\n        int maxItems,\n        const QList<FileFormat> &formatSettings,\n        int itemDataThreshold,\n        QObject *parent)\n    : QObject(parent)\n    , m_model(model)\n    , m_formatSettings(formatSettings)\n    , m_dir(path)\n    , m_valid(true)\n    , m_maxItems(maxItems)\n    , m_itemDataThreshold(itemDataThreshold)\n    , m_lock(path + QLatin1String(\"/.copyq_lock\"))\n{\n    m_updateTimer.setSingleShot(true);\n    m_moveTimer.setSingleShot(true);\n\n    m_lock.setStaleLockTime(staleLockTimeMs);\n\n    bool ok;\n    const int interval = qEnvironmentVariableIntValue(\"COPYQ_SYNC_UPDATE_INTERVAL_MS\", &ok);\n    m_interval = ok && interval > 0 ? interval : defaultUpdateFocusItemsIntervalMs;\n\n    connect( &m_updateTimer, &QTimer::timeout,\n             this, &FileWatcher::updateItems );\n    connect( &m_moveTimer, &QTimer::timeout,\n             this, &FileWatcher::updateMovedRows );\n\n    connect( m_model, &QAbstractItemModel::rowsInserted,\n             this, &FileWatcher::onRowsInserted );\n    connect( m_model, &QAbstractItemModel::rowsAboutToBeRemoved,\n             this, &FileWatcher::onRowsRemoved );\n    connect( model, &QAbstractItemModel::rowsMoved,\n             this, &FileWatcher::onRowsMoved );\n    connect( m_model, &QAbstractItemModel::dataChanged,\n             this, &FileWatcher::onDataChanged );\n\n    if (model->rowCount() > 0)\n        saveItems(0, model->rowCount() - 1, UpdateType::Inserted);\n\n    prependItemsFromFiles( QDir(path), listFiles(paths, m_formatSettings, m_maxItems, m_dir) );\n}\n\nbool FileWatcher::lock()\n{\n    if ( !m_valid )\n        return false;\n\n    m_dir.refresh();\n\n    // Create path if doesn't exist.\n    if ( !m_dir.mkpath(QStringLiteral(\".\")) ) {\n        qCCritical(fileWatcher)\n            << tr(\"Failed to create synchronization directory \\\"%1\\\"!\").arg(path());\n        return false;\n    }\n\n    if ( !m_lock.lock() ) {\n        qCCritical(fileWatcher) << \"Failed to create lock file in\"\n            << path() << \"error code:\" << m_lock.error();\n        return false;\n    }\n\n    m_valid = false;\n    return true;\n}\n\nvoid FileWatcher::unlock()\n{\n    m_lock.unlock();\n    m_valid = true;\n}\n\nQVariantMap FileWatcher::itemDataFromFiles(const QDir &dir, const BaseNameExtensions &baseNameWithExts)\n{\n    QVariantMap dataMap;\n    QVariantMap mimeToExtension;\n\n    updateDataAndWatchFile(dir, baseNameWithExts, &dataMap, &mimeToExtension);\n\n    if ( !mimeToExtension.isEmpty() ) {\n        const QString baseName = dir.relativeFilePath(baseNameWithExts.baseName);\n        dataMap.insert(mimeBaseName, baseName);\n        dataMap.insert(mimeOldBaseName, baseName);\n        dataMap.insert(mimeExtensionMap, mimeToExtension);\n    }\n\n    return dataMap;\n}\n\nvoid FileWatcher::prependItemsFromFiles(const QDir &dir, const BaseNameExtensionsList &fileList)\n{\n    QVector<QVariantMap> items;\n    items.reserve(fileList.size());\n\n    for (auto it = fileList.rbegin(); it != fileList.rend(); ++it) {\n        const QVariantMap item = itemDataFromFiles(dir, *it);\n        if ( !item.isEmpty() )\n            items.append(item);\n    }\n\n    createItems(items, 0);\n}\n\nvoid FileWatcher::insertItemsFromFiles(const QDir &dir, const BaseNameExtensionsList &fileList)\n{\n    if ( fileList.isEmpty() )\n        return;\n\n    QVector<QVariantMap> items;\n    items.reserve(fileList.size());\n    for (const auto &baseNameWithExts : fileList) {\n        const QVariantMap item = itemDataFromFiles(dir, baseNameWithExts);\n        // Skip if the associated file was just removed.\n        if ( !item.isEmpty() )\n            items.append(item);\n    }\n\n    int row = 0;\n    int i = 0;\n    for (; i < items.size(); ++i) {\n        const QVariantMap &item = items[i];\n        const QString &newBaseName = getBaseName(item);\n        for ( ; row < m_model->rowCount(); ++row ) {\n            const QString rowBaseName = getBaseName( m_model->index(row, 0) );\n            if ( isBaseNameLessThan(newBaseName, rowBaseName) )\n                break;\n        }\n\n        if ( row >= m_model->rowCount() )\n            break;\n\n        createItems({item}, row);\n        ++row;\n    }\n\n    // Append rest of the items.\n    if ( i < items.size() ) {\n        const int space = m_maxItems - m_model->rowCount();\n        if (space <= 0)\n            return;\n\n        items.erase(items.begin(), items.begin() + i);\n        if ( space < items.size() )\n            items.erase(items.begin(), items.begin() + space);\n        createItems( items, m_model->rowCount() );\n    }\n\n    // TODO: Remove excessive items, but not pinned.\n    // This must be done elsewhere using QTimer 0.\n}\n\nvoid FileWatcher::updateItems()\n{\n    FileWatcherLock lock(this);\n    if ( !lock.lock() ) {\n        m_updateTimer.start(m_interval);\n        return;\n    }\n\n    QElapsedTimer t;\n    t.start();\n\n    m_lastUpdateTimeMs = QDateTime::currentMSecsSinceEpoch();\n\n    if ( m_batchIndexData.isEmpty() ) {\n        const QStringList files = listFiles(m_dir);\n        m_fileList = listFiles(files, m_formatSettings, m_maxItems, m_dir);\n        m_batchIndexData.reserve(m_model->rowCount());\n        for (int row = 0; row < m_model->rowCount(); ++row) {\n            const QModelIndex index = m_model->index(row, 0);\n            if ( !oldBaseName(index).isEmpty() )\n                m_batchIndexData.append(index);\n        }\n\n        m_lastBatchIndex = -1;\n        if ( t.elapsed() > 100 )\n            qCInfo(fileWatcher) << \"Files listed in\" << t.elapsed() << \"ms\";\n    }\n\n    for ( int i = m_lastBatchIndex + 1; i < m_batchIndexData.size(); ++i ) {\n        const QPersistentModelIndex &index = m_batchIndexData[i];\n        if ( !index.isValid() )\n            continue;\n        const QString baseName = oldBaseName(index);\n        if ( baseName.isEmpty() )\n            continue;\n\n        const auto it = std::find_if(\n            std::begin(m_fileList), std::end(m_fileList),\n            [&](const BaseNameExtensions &baseNameExtensions) {\n                return baseNameExtensions.baseName == baseName;\n            });\n\n        QVariantMap dataMap;\n        QVariantMap mimeToExtension;\n\n        if ( it != m_fileList.cend() ) {\n            updateDataAndWatchFile(m_dir, *it, &dataMap, &mimeToExtension);\n            m_fileList.erase(it);\n        }\n\n        if ( mimeToExtension.isEmpty() ) {\n            m_model->removeRow(index.row());\n        } else {\n            dataMap.insert(mimeBaseName, baseName);\n            dataMap.insert(mimeExtensionMap, mimeToExtension);\n            updateIndexData(index, &dataMap);\n        }\n\n        if ( t.elapsed() > 20 ) {\n            m_lastBatchIndex = i;\n            m_updateTimer.start(batchItemUpdateIntervalMs);\n            return;\n        }\n    }\n\n    t.restart();\n\n    insertItemsFromFiles(m_dir, m_fileList);\n\n    if ( t.elapsed() > 100 )\n        qCInfo(fileWatcher) << \"Items created in\" << t.elapsed() << \"ms\";\n\n    m_fileList.clear();\n    m_batchIndexData.clear();\n\n    if (m_updatesEnabled)\n        m_updateTimer.start(m_interval);\n}\n\nvoid FileWatcher::updateItemsIfNeeded()\n{\n    const auto time = QDateTime::currentMSecsSinceEpoch();\n    if (time < m_lastUpdateTimeMs + m_interval)\n        return;\n\n    updateItems();\n}\n\nvoid FileWatcher::setUpdatesEnabled(bool enabled)\n{\n    m_updatesEnabled = enabled;\n    if (enabled)\n        updateItems();\n    else if ( m_batchIndexData.isEmpty() )\n        m_updateTimer.stop();\n}\n\nvoid FileWatcher::onRowsInserted(const QModelIndex &, int first, int last)\n{\n    if (first < m_moveEnd)\n        m_moveEnd += last - first + 1;\n\n    saveItems(first, last, UpdateType::Inserted);\n}\n\nvoid FileWatcher::onDataChanged(const QModelIndex &a, const QModelIndex &b)\n{\n    saveItems(a.row(), b.row(), UpdateType::Changed);\n}\n\nvoid FileWatcher::onRowsRemoved(const QModelIndex &, int first, int last)\n{\n    if (first < m_moveEnd)\n        m_moveEnd -= std::min(m_moveEnd, last) - first + 1;\n\n    const bool wasFull = m_maxItems >= m_model->rowCount();\n\n    for ( const auto &index : indexList(first, last) ) {\n        if ( !index.isValid() )\n            continue;\n\n        const QString baseName = oldBaseName(index);\n        if ( isOwnBaseName(baseName) )\n            removeFilesForRemovedIndex(path(), index);\n    }\n\n    // If the tab is no longer full, try to add new files.\n    if (wasFull)\n        m_updateTimer.start(0);\n}\n\nvoid FileWatcher::onRowsMoved(const QModelIndex &, int start, int end, const QModelIndex &, int destinationRow)\n{\n    // Update copyq_* base names for moved rows and all rows above so that file\n    // are ordered the same way as the rows.\n    //\n    // The update is postponed and batched since it may need to go through a\n    // lot of items.\n    if (destinationRow < start) {\n        const int count = end - start + 1;\n        m_moveEnd = std::max(m_moveEnd, destinationRow + count - 1);\n    } else if (destinationRow > end) {\n        m_moveEnd = std::max(m_moveEnd, destinationRow - 1);\n    } else {\n        m_moveEnd = std::max(m_moveEnd, end);\n    }\n    m_moveTimer.start(0);\n}\n\nvoid FileWatcher::updateMovedRows()\n{\n    FileWatcherLock lock(this);\n    if ( !lock.lock() ) {\n        m_moveTimer.start(0);\n        return;\n    }\n\n    QString baseName = findLastOwnBaseName(m_model, m_moveEnd + 1);\n    QSet<QString> baseNames;\n\n    const int batchStart = std::max(0, m_moveEnd - 100);\n    const auto indexList = this->indexList(batchStart, m_moveEnd);\n\n    for (const auto &index : indexList) {\n        const QString currentBaseName = FileWatcher::getBaseName(index);\n\n        // Skip renaming non-owned items\n        if ( !currentBaseName.isEmpty() && !isOwnBaseName(currentBaseName) )\n            continue;\n\n        // Skip already sorted\n        if ( isBaseNameLessThan(currentBaseName, baseName) ) {\n            baseName = currentBaseName;\n            continue;\n        }\n\n        if ( !renameToUnique(m_dir, baseNames, &baseName, m_formatSettings) )\n            return;\n\n        baseNames.insert(baseName);\n        const QVariantMap data = {{mimeBaseName, baseName}};\n        m_model->setData(index, data, contentType::updateData);\n    }\n\n    if ( !renameMoveCopy(m_dir, indexList, UpdateType::Changed) )\n        return;\n\n    m_moveEnd = batchStart - 1;\n    if (0 <= m_moveEnd)\n        m_moveTimer.start(batchItemUpdateIntervalMs);\n    else\n        m_moveEnd = -1;\n}\n\nQString FileWatcher::oldBaseName(const QModelIndex &index) const\n{\n    return index.data(contentType::data).toMap().value(mimeOldBaseName).toString();\n}\n\nvoid FileWatcher::createItems(const QVector<QVariantMap> &items, int targetRow)\n{\n    if ( items.isEmpty() )\n        return;\n\n    const int row = qMax( 0, qMin(targetRow, m_model->rowCount()) );\n    if ( !m_model->insertRows(row, items.size()) )\n        return;\n\n    // Find index if it was moved after inserted.\n    const int rows = m_model->rowCount();\n    auto it = std::begin(items);\n    for ( int i = 0; i < rows; ++i ) {\n        const int row2 = (row + i) % rows;\n        auto index = m_model->index(row2, 0);\n        if ( getBaseName(index).isEmpty() ) {\n            QVariantMap data = *it;\n            updateIndexData(index, &data);\n            ++it;\n            if (it == std::end(items))\n                break;\n        }\n    }\n}\n\nvoid FileWatcher::updateIndexData(const QModelIndex &index, QVariantMap *itemData)\n{\n    const QString baseName = getBaseName(*itemData);\n    if ( baseName.isEmpty() ) {\n        m_model->setData(index, *itemData, contentType::data);\n        return;\n    }\n\n    itemData->insert(mimeOldBaseName, baseName);\n\n    const QVariantMap mimeToExtension = itemData->value(mimeExtensionMap).toMap();\n    for ( auto it = mimeToExtension.begin(); it != mimeToExtension.end(); ++it ) {\n        if ( !it.key().startsWith(COPYQ_MIME_PREFIX_ITEMSYNC) && !it.key().startsWith(COPYQ_MIME_PRIVATE_PREFIX) ) {\n            const QString ext = it.value().toString();\n            const Hash hash = calculateHash(itemData->value(it.key()).toByteArray());\n            const QString mime = mimeHashPrefix + ext;\n            itemData->insert(mime, hash);\n        }\n    }\n    m_model->setData(index, *itemData, contentType::data);\n}\n\nQList<QPersistentModelIndex> FileWatcher::indexList(int first, int last)\n{\n    QList<QPersistentModelIndex> indexList;\n    indexList.reserve(last - first + 1);\n\n    // List items in reverse order so the most recent file is created for the\n    // top item.\n    for (int i = last; i >= first; --i)\n        indexList.append( m_model->index(i, 0) );\n\n    return indexList;\n}\n\nvoid FileWatcher::saveItems(int first, int last, UpdateType updateType)\n{\n    FileWatcherLock lock(this);\n    if ( !lock.lock() )\n        return;\n\n    if ( !m_batchIndexData.isEmpty() )\n        m_batchIndexData.clear();\n\n    const auto indexList = this->indexList(first, last);\n\n    if ( !renameMoveCopy(m_dir, indexList, updateType) )\n        return;\n\n    QStringList existingFiles = listFiles(m_dir);\n\n    for (const auto &index : indexList) {\n        if ( !index.isValid() )\n            continue;\n\n        const QString baseName = getBaseName(index);\n        const QString filePath = m_dir.absoluteFilePath(baseName);\n        QVariantMap itemData = index.data(contentType::data).toMap();\n        QVariantMap oldMimeToExtension = itemData.value(mimeExtensionMap).toMap();\n        QVariantMap mimeToExtension;\n        QVariantMap dataMapUnknown;\n\n        const QVariantMap noSaveData = itemData.value(mimeNoSave).toMap();\n\n        QMutableMapIterator<QString, QVariant> it(itemData);\n        while (it.hasNext()) {\n            const auto item = it.next();\n            const QString &format = item.key();\n            if ( format.startsWith(COPYQ_MIME_PREFIX_ITEMSYNC) || format.startsWith(COPYQ_MIME_PRIVATE_PREFIX) )\n                continue; // skip internal data\n\n            const QByteArray bytes = it.value().toByteArray();\n            const Hash hash = calculateHash(bytes);\n\n            if ( noSaveData.contains(format) && noSaveData[format].toByteArray() == hash ) {\n                it.remove();\n                continue;\n            }\n\n            bool hasFile = oldMimeToExtension.contains(format);\n            const QString ext = hasFile ? oldMimeToExtension[format].toString()\n                                        : findByFormat(format, m_formatSettings);\n\n            if ( !hasFile && ext.isEmpty() ) {\n                dataMapUnknown.insert(format, bytes);\n            } else {\n                mimeToExtension.insert(format, ext);\n                const Hash oldHash = index.data(contentType::data).toMap().value(mimeHashPrefix + ext).toByteArray();\n                if ( !saveItemFile(filePath + ext, bytes, &existingFiles, hash != oldHash) )\n                    return;\n            }\n        }\n\n        for ( auto it = oldMimeToExtension.constBegin();\n              it != oldMimeToExtension.constEnd(); ++it )\n        {\n            if ( it.key().startsWith(mimeNoFormat) )\n                mimeToExtension.insert( it.key(), it.value() );\n        }\n\n        if ( mimeToExtension.isEmpty() || !dataMapUnknown.isEmpty() ) {\n            mimeToExtension.insert(mimeUnknownFormats, dataFileSuffix);\n            QByteArray data = serializeData(dataMapUnknown);\n            if ( !saveItemFile(filePath + dataFileSuffix, data, &existingFiles) )\n                return;\n        }\n\n        if ( !noSaveData.isEmpty() || mimeToExtension != oldMimeToExtension ) {\n            itemData.remove(mimeNoSave);\n\n            for ( auto format = mimeToExtension.keyBegin(); format != mimeToExtension.keyEnd(); ++format )\n                oldMimeToExtension.remove(*format);\n\n            itemData.insert(mimeExtensionMap, mimeToExtension);\n            updateIndexData(index, &itemData);\n\n            // Remove files of removed formats.\n            removeFormatFiles(filePath, oldMimeToExtension);\n        }\n    }\n}\n\nbool FileWatcher::renameMoveCopy(\n    const QDir &dir, const QList<QPersistentModelIndex> &indexList, UpdateType updateType)\n{\n    if ( indexList.isEmpty() )\n        return false;\n\n    QSet<QString> baseNames;\n    QString baseName = findLastOwnBaseName(m_model, indexList.first().row() + 1);\n\n    for (const auto &index : indexList) {\n        if ( !index.isValid() )\n            continue;\n\n        QString olderBaseName = oldBaseName(index);\n        const QString oldBaseName = getBaseName(index);\n        if (updateType == UpdateType::Changed && olderBaseName.isEmpty())\n            olderBaseName = oldBaseName;\n\n        if ( !oldBaseName.isEmpty() )\n            baseName = oldBaseName;\n\n        const bool newItem = updateType != UpdateType::Changed && olderBaseName.isEmpty();\n        bool itemRenamed = olderBaseName != baseName;\n        if ( newItem || itemRenamed ) {\n            if ( !renameToUnique(dir, baseNames, &baseName, m_formatSettings) )\n                return false;\n            itemRenamed = olderBaseName != baseName;\n            baseNames.insert(baseName);\n        }\n\n        QVariantMap itemData = index.data(contentType::data).toMap();\n        const QString syncPath = itemData.value(mimeSyncPath).toString();\n        const bool copyFilesFromOtherTab = !syncPath.isEmpty() && syncPath != path();\n\n        if (copyFilesFromOtherTab || itemRenamed) {\n            const QVariantMap mimeToExtension = itemData.value(mimeExtensionMap).toMap();\n            const QString newBasePath = m_dir.absoluteFilePath(baseName);\n\n            QString oldBasePath;\n            if ( !syncPath.isEmpty() ) {\n                oldBasePath = syncPath + '/' + oldBaseName;\n                copyFormatFiles(oldBasePath, newBasePath, mimeToExtension);\n            } else if ( !olderBaseName.isEmpty() ) {\n                oldBasePath = m_dir.absoluteFilePath(olderBaseName);\n                moveFormatFiles(oldBasePath, newBasePath, mimeToExtension);\n            }\n\n            rebaseSyncDataFilePaths(&itemData, mimeToExtension, oldBasePath, newBasePath);\n            itemData.remove(mimeSyncPath);\n            itemData.insert(mimeBaseName, baseName);\n            updateIndexData(index, &itemData);\n\n            if ( oldBaseName.isEmpty() && itemData.contains(mimeUriList) ) {\n                if ( copyFilesFromUriList(itemData[mimeUriList].toByteArray(), index.row(), baseNames) )\n                     m_model->removeRow(index.row());\n            }\n        }\n    }\n\n    return true;\n}\n\nvoid FileWatcher::updateDataAndWatchFile(const QDir &dir, const BaseNameExtensions &baseNameWithExts,\n                            QVariantMap *dataMap, QVariantMap *mimeToExtension)\n{\n    const QString basePath = dir.absoluteFilePath(baseNameWithExts.baseName);\n\n    for (const auto &ext : baseNameWithExts.exts) {\n        if ( ext.format.isEmpty() )\n            continue;\n\n        const QString fileName = basePath + ext.extension;\n\n        const QString path = dir.absoluteFilePath(fileName);\n        QFile f(path);\n        if ( !f.open(QIODevice::ReadOnly) )\n            continue;\n\n        if ( ext.extension == dataFileSuffix ) {\n            QDataStream stream(&f);\n            QVariantMap dataMap2;\n            if ( deserializeData(&stream, &dataMap2) ) {\n                for (auto it = dataMap2.constBegin(); it != dataMap2.constEnd(); ++it) {\n                    const QVariant &value = it.value();\n                    const qint64 size = value.type() == QVariant::ByteArray\n                        ? value.toByteArray().size()\n                        : value.value<SyncDataFile>().size();\n                    if (m_itemDataThreshold >= 0 && size > m_itemDataThreshold) {\n                        const QVariant syncDataFile = QVariant::fromValue(SyncDataFile(path, it.key()));\n                        dataMap->insert(it.key(), syncDataFile);\n                    } else {\n                        dataMap->insert(it.key(), value);\n                    }\n                }\n\n                mimeToExtension->insert(mimeUnknownFormats, dataFileSuffix);\n            }\n        } else if ( f.size() > sizeLimit || ext.format.startsWith(mimeNoFormat)\n                    || dataMap->contains(ext.format) )\n        {\n            mimeToExtension->insert(mimeNoFormat + ext.extension, ext.extension);\n        } else if ( m_itemDataThreshold >= 0 && f.size() > m_itemDataThreshold ) {\n            const QVariant value = QVariant::fromValue(SyncDataFile(path));\n            dataMap->insert(ext.format, value);\n            mimeToExtension->insert(ext.format, ext.extension);\n        } else {\n            dataMap->insert(ext.format, f.readAll());\n            mimeToExtension->insert(ext.format, ext.extension);\n        }\n    }\n}\n\nbool FileWatcher::copyFilesFromUriList(const QByteArray &uriData, int targetRow, const QSet<QString> &baseNames)\n{\n    QMimeData tmpData;\n    tmpData.setData(mimeUriList, uriData);\n\n    QVector<QVariantMap> items;\n\n    for ( const auto &url : tmpData.urls() ) {\n        if ( !url.isLocalFile() )\n            continue;\n\n        QFile f(url.toLocalFile());\n\n        if ( !f.exists() )\n            continue;\n\n        QString extName;\n        QString baseName;\n        getBaseNameAndExtension( QFileInfo(f).fileName(), &baseName, &extName,\n                                 m_formatSettings );\n\n        if ( !renameToUnique(m_dir, baseNames, &baseName, m_formatSettings) )\n            continue;\n\n        const QString targetFilePath = m_dir.absoluteFilePath(baseName + extName);\n        f.copy(targetFilePath);\n        Ext ext;\n        if ( getBaseNameExtension(targetFilePath, m_formatSettings, &baseName, &ext, m_dir) ) {\n            BaseNameExtensions baseNameExts(baseName, {ext});\n            const QVariantMap item = itemDataFromFiles(m_dir, baseNameExts);\n            items.append(item);\n            if (items.size() >= m_maxItems)\n                break;\n        }\n    }\n\n    createItems(items, targetRow);\n    return !items.isEmpty();\n}\n"
  },
  {
    "path": "plugins/itemsync/filewatcher.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/mimetypes.h\"\n\n#include <QDir>\n#include <QLockFile>\n#include <QObject>\n#include <QPersistentModelIndex>\n#include <QSet>\n#include <QStringList>\n#include <QTimer>\n#include <QVector>\n\nclass QAbstractItemModel;\n\nstruct Ext;\nstruct BaseNameExtensions;\n\n#define COPYQ_MIME_PREFIX_ITEMSYNC COPYQ_MIME_PREFIX \"itemsync-\"\n#define COPYQ_MIME_PREFIX_ITEMSYNC_PRIVATE COPYQ_MIME_PRIVATE_PREFIX \"itemsync-\"\nextern const QLatin1String mimeExtensionMap;\nextern const QLatin1String mimeBaseName;\nextern const QLatin1String mimeNoSave;\nextern const QLatin1String mimeSyncPath;\nextern const QLatin1String mimeNoFormat;\nextern const QLatin1String mimeUnknownFormats;\n\nextern const QLatin1String mimePrivateSyncPrefix;\nextern const QLatin1String mimeOldBaseName;\nextern const QLatin1String mimeHashPrefix;\n\nenum class UpdateType {\n    Inserted,\n    Changed,\n};\n\nstruct FileFormat {\n    bool isValid() const { return !extensions.isEmpty(); }\n    QStringList extensions;\n    QString itemMime;\n    QString icon;\n};\n\nusing BaseNameExtensionsList = QList<BaseNameExtensions>;\n\nusing Hash = QByteArray;\n\nclass SyncDataFile;\nQDataStream &operator<<(QDataStream &out, SyncDataFile value);\nQDataStream &operator>>(QDataStream &in, SyncDataFile &value);\nvoid registerSyncDataFileConverter();\n\nclass FileWatcher final : public QObject {\npublic:\n    static QString getBaseName(const QModelIndex &index);\n\n    static QString getBaseName(const QVariantMap &data);\n\n    /**\n     * Return true only if base name is empty or it matches the internal format.\n     */\n    static bool isOwnBaseName(const QString &baseName);\n\n    static void removeFilesForRemovedIndex(const QString &tabPath, const QModelIndex &index);\n\n    static Hash calculateHash(const QByteArray &bytes);\n\n    FileWatcher(\n        const QString &path,\n        const QStringList &paths,\n        QAbstractItemModel *model,\n        int maxItems,\n        const QList<FileFormat> &formatSettings,\n        int itemDataThreshold,\n        QObject *parent = nullptr\n    );\n\n    QString path() const { return m_dir.absolutePath(); }\n\n    bool isValid() const { return m_valid; }\n\n    bool lock();\n\n    void unlock();\n\n    QVariantMap itemDataFromFiles(const QDir &dir, const BaseNameExtensions &baseNameWithExts);\n\n    void prependItemsFromFiles(const QDir &dir, const BaseNameExtensionsList &fileList);\n    void insertItemsFromFiles(const QDir &dir, const BaseNameExtensionsList &fileList);\n\n    /**\n     * Check for new files.\n     */\n    void updateItems();\n\n    void updateItemsIfNeeded();\n\n    void setUpdatesEnabled(bool enabled);\n\nprivate:\n    void onRowsInserted(const QModelIndex &, int first, int last);\n\n    void onDataChanged(const QModelIndex &a, const QModelIndex &b);\n\n    void onRowsRemoved(const QModelIndex &, int first, int last);\n\n    void onRowsMoved(const QModelIndex &, int start, int end, const QModelIndex &, int destinationRow);\n\n    QString oldBaseName(const QModelIndex &index) const;\n\n    void createItems(const QVector<QVariantMap> &dataMaps, int targetRow);\n\n    void updateIndexData(const QModelIndex &index, QVariantMap *itemData);\n\n    QList<QPersistentModelIndex> indexList(int first, int last);\n\n    void saveItems(int first, int last, UpdateType updateType);\n\n    bool renameMoveCopy(\n        const QDir &dir, const QList<QPersistentModelIndex> &indexList, UpdateType updateType);\n\n    void updateDataAndWatchFile(\n            const QDir &dir, const BaseNameExtensions &baseNameWithExts,\n            QVariantMap *dataMap, QVariantMap *mimeToExtension);\n\n    bool copyFilesFromUriList(const QByteArray &uriData, int targetRow, const QSet<QString> &baseNames);\n\n    void updateMovedRows();\n\n    QAbstractItemModel *m_model;\n    QTimer m_updateTimer;\n    QTimer m_moveTimer;\n    int m_moveEnd = -1;\n    int m_interval = 0;\n    const QList<FileFormat> &m_formatSettings;\n    QDir m_dir;\n    bool m_valid;\n    int m_maxItems;\n    bool m_updatesEnabled = false;\n    qint64 m_lastUpdateTimeMs = 0;\n\n    QList<QPersistentModelIndex> m_batchIndexData;\n    BaseNameExtensionsList m_fileList;\n    int m_lastBatchIndex = -1;\n    int m_itemDataThreshold = -1;\n\n    QLockFile m_lock;\n};\n"
  },
  {
    "path": "plugins/itemsync/itemsync.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemsync.h\"\n#include \"ui_itemsyncsettings.h\"\n\n#include \"filewatcher.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/regexp.h\"\n#include \"gui/iconselectbutton.h\"\n#include \"gui/icons.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/iconwidget.h\"\n#include \"gui/fromiconid.h\"\n#include \"item/itemfilter.h\"\n\n#include <QBoxLayout>\n#include <QDebug>\n#include <QDir>\n#include <QFile>\n#include <QFileDialog>\n#include <QLabel>\n#include <QLoggingCategory>\n#include <QMessageBox>\n#include <QMouseEvent>\n#include <QPushButton>\n#include <QSettings>\n#include <QTextEdit>\n#include <QTimer>\n#include <QtPlugin>\n#include <QUrl>\n#include <QVariantMap>\n\n#include <memory>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(plugin)\nQ_LOGGING_CATEGORY(plugin, \"copyq.plugin.itemsync\")\n\nnamespace syncTabsTableColumns {\nenum {\n    tabName,\n    path,\n    browse\n};\n}\n\nnamespace formatSettingsTableColumns {\nenum {\n    formats,\n    itemMime,\n    icon\n};\n}\n\nconst int currentVersion = 1;\nconst QLatin1String dataFileHeader(\"CopyQ_itemsync_tab\");\n\nconst QLatin1String configVersion(\"copyq_itemsync_version\");\nconst QLatin1String configSyncTabs(\"sync_tabs\");\nconst QLatin1String configFormatSettings(\"format_settings\");\n\nconst QLatin1String tabConfigSavedFiles(\"saved_files\");\n\nbool readConfigHeader(QDataStream *stream)\n{\n    QString header;\n    *stream >> header;\n    return header == dataFileHeader;\n}\n\nbool readConfig(QIODevice *file, QVariantMap *config)\n{\n    QDataStream stream(file);\n    stream.setVersion(QDataStream::Qt_4_7);\n\n    if ( !readConfigHeader(&stream) )\n        return false;\n\n    stream >> *config;\n\n    return stream.status() == QDataStream::Ok\n            && config->value(configVersion, 0).toInt() == currentVersion;\n}\n\nvoid writeConfiguration(QIODevice *file, const QStringList &savedFiles)\n{\n    QVariantMap config;\n    config.insert(configVersion, currentVersion);\n    config.insert(tabConfigSavedFiles, savedFiles);\n\n    QDataStream stream(file);\n    stream.setVersion(QDataStream::Qt_4_7);\n    stream << QString(dataFileHeader);\n    stream << config;\n}\n\nQString iconFromId(int id)\n{\n    return id != -1 ? fromIconId(id) : QString();\n}\n\nQPushButton *createBrowseButton()\n{\n    std::unique_ptr<QPushButton> button(new QPushButton);\n    button->setFont( iconFont() );\n    button->setText( iconFromId(IconFolderOpen) );\n    button->setToolTip( ItemSyncLoader::tr(\"Browse...\",\n                                           \"Button text for opening file dialog to select synchronization directory\") );\n    return button.release();\n}\n\nbool hasVideoExtension(const QString &ext)\n{\n    return ext == \"avi\"\n            || ext == \"mkv\"\n            || ext == \"mp4\"\n            || ext == \"mpg\"\n            || ext == \"mpeg\"\n            || ext == \"ogv\"\n            || ext == \"flv\";\n}\n\nbool hasAudioExtension(const QString &ext)\n{\n    return ext == \"mp3\"\n            || ext == \"wav\"\n            || ext == \"ogg\"\n            || ext == \"m4a\";\n}\n\nbool hasImageExtension(const QString &ext)\n{\n    return ext == \"png\"\n            || ext == \"jpg\"\n            || ext == \"gif\"\n            || ext == \"bmp\"\n            || ext == \"svg\"\n            || ext == \"tga\"\n            || ext == \"tiff\"\n            || ext == \"psd\"\n            || ext == \"xcf\"\n            || ext == \"ico\"\n            || ext == \"pbm\"\n            || ext == \"ppm\"\n            || ext == \"eps\"\n            || ext == \"pcx\"\n            || ext == \"jpx\"\n            || ext == \"jp2\";\n}\n\nbool hasArchiveExtension(const QString &ext)\n{\n    static const auto re = anchoredRegExp(\"r\\\\d\\\\d\");\n    return ext == \"zip\"\n            || ext == \"7z\"\n            || ext == \"tar\"\n            || ext == \"rar\"\n            || ext.contains(re)\n            || ext == \"arj\";\n}\n\nbool hasTextExtension(const QString &ext)\n{\n    return ext == \"txt\"\n            || ext == \"log\"\n            || ext == \"xml\"\n            || ext == \"html\"\n            || ext == \"htm\"\n            || ext == \"pdf\"\n            || ext == \"doc\"\n            || ext == \"docx\"\n            || ext == \"odt\"\n            || ext == \"xls\"\n            || ext == \"rtf\"\n            || ext == \"csv\"\n            || ext == \"ppt\";\n}\n\nint iconFromBaseNameExtensionHelper(const QString &baseName)\n{\n    const int i = baseName.lastIndexOf('.');\n    if (i != -1)  {\n        const QString ext = baseName.mid(i + 1);\n        if ( hasVideoExtension(ext) )\n            return IconFileVideo;\n        if ( hasAudioExtension(ext) )\n            return IconFileAudio;\n        if ( hasImageExtension(ext) )\n            return IconFileImage;\n        if ( hasArchiveExtension(ext) )\n            return IconFileZipper;\n        if ( hasTextExtension(ext) )\n            return IconFileLines;\n    }\n\n    return -1;\n}\n\nint iconFromMimeHelper(const QString &format)\n{\n    if ( format.startsWith(\"video/\") )\n        return IconCirclePlay;\n    if ( format.startsWith(\"audio/\") )\n        return IconVolumeHigh;\n    if ( format.startsWith(\"image/\") )\n        return IconCamera;\n    if ( format.startsWith(\"text/\") )\n        return IconFileLines;\n    return -1;\n}\n\nQString iconFromUserExtension(const QStringList &fileNames, const QList<FileFormat> &formatSettings)\n{\n    for ( const auto &format : formatSettings ) {\n        if ( format.icon.isEmpty() )\n            continue;\n\n        for (const auto &ext : format.extensions) {\n            for (const auto &fileName : fileNames) {\n                if ( fileName.endsWith(ext) )\n                    return format.icon;\n            }\n        }\n    }\n\n    return QString();\n}\n\nQString iconFromMime(const QString &format)\n{\n    return iconFromId(iconFromMimeHelper(format));\n}\n\nQString iconForItem(const QVariantMap &dataMap, const QString &baseName, const QList<FileFormat> &formatSettings)\n{\n    const QVariantMap mimeToExtension = dataMap.value(mimeExtensionMap).toMap();\n\n    QStringList fileNames;\n    for (auto it = mimeToExtension.constBegin(); it != mimeToExtension.constEnd(); ++it) {\n        // Don't change icon for notes.\n        if (it.key() != mimeItemNotes)\n            fileNames.append( baseName + it.value().toString() );\n    }\n\n    // Try to get user icon from file extension.\n    const QString icon = iconFromUserExtension(fileNames, formatSettings);\n    if ( !icon.isEmpty() )\n        return icon;\n\n    // Try to get default icon from MIME type.\n    for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it) {\n        const auto &format = it.key();\n        const auto mimeIcon = iconFromMime(format);\n        if ( !mimeIcon.isEmpty() )\n            return mimeIcon;\n    }\n\n    // Try to get default icon from file extension.\n    for (const auto &fileName : fileNames) {\n        const int id = iconFromBaseNameExtensionHelper(fileName);\n        if (id != -1)\n            return iconFromId(id);\n    }\n\n    // Return icon for unknown files.\n    return iconFromId(IconFile);\n}\n\n/**\n * Return true only if the item was created by CopyQ\n * (i.e. has no file assigned or the file name matches internal format).\n */\nbool isOwnFile(const QString &baseName)\n{\n    return baseName.isEmpty() || FileWatcher::isOwnBaseName(baseName);\n}\n\nbool isOwnItem(const QModelIndex &index)\n{\n    const QString baseName = FileWatcher::getBaseName(index);\n    return baseName.isEmpty() || FileWatcher::isOwnBaseName(baseName);\n}\n\nbool containsItemsWithNotOwnedFiles(const QList<QModelIndex> &indexList)\n{\n    return !std::all_of( std::begin(indexList), std::end(indexList), isOwnItem );\n}\n\nvoid fixUserExtensions(QStringList *exts)\n{\n    for (int i = 0; i < exts->size(); ++i) {\n        QString &ext = (*exts)[i];\n        if ( !ext.startsWith('.') )\n            ext.prepend('.');\n        // Use \"_user.dat\" instead of \"*.dat\" to avoid collisions with extension \"_copy.dat\"\n        // internally used to store data of unknown MIME type.\n        if ( ext.endsWith(\".dat\", Qt::CaseInsensitive) )\n            ext.insert(ext.size() - 4, \"_user\");\n        // Remove invalid extensions containing path separator.\n        if ( ext.contains('/') )\n            exts->removeAt(i--);\n    }\n}\n\nvoid fixUserMimeType(QString *mimeType)\n{\n    // Don't allow user to override internal formats.\n    if ( mimeType->startsWith(COPYQ_MIME_PREFIX_ITEMSYNC) )\n        mimeType->clear();\n}\n\nvoid setNormalStretchFixedColumns(QTableWidget *table, int normalColumn, int stretchColumn, int fixedColumn)\n{\n    QHeaderView *header = table->horizontalHeader();\n    header->setSectionResizeMode(stretchColumn, QHeaderView::Stretch);\n    header->setSectionResizeMode(fixedColumn, QHeaderView::Fixed);\n    header->resizeSection(fixedColumn, table->rowHeight(0));\n    table->resizeColumnToContents(normalColumn);\n}\n\nbool hasOnlyInternalData(const QVariantMap &data)\n{\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        const auto &format = it.key();\n        if ( !format.startsWith(COPYQ_MIME_PREFIX) )\n            return false;\n    }\n    return true;\n}\n\n} // namespace\n\nItemSync::ItemSync(const QString &label, const QString &icon, ItemWidget *childItem)\n    : QWidget( childItem->widget()->parentWidget() )\n    , ItemWidgetWrapper(childItem, this)\n    , m_label( new QTextEdit(this) )\n    , m_icon( new IconWidget(icon, this) )\n{\n    auto layout = new QVBoxLayout(this);\n    layout->setContentsMargins(0, 0, 0, 0);\n    layout->setSpacing(0);\n    layout->setSizeConstraint(QLayout::SetMinimumSize);\n\n    auto labelLayout = new QHBoxLayout;\n    connect( layout, &QVBoxLayout::destroyed,\n             labelLayout, &QHBoxLayout::deleteLater );\n    labelLayout->setContentsMargins(0, 0, 0, 0);\n    labelLayout->setSpacing(0);\n\n    labelLayout->addWidget(m_icon);\n    labelLayout->addWidget(m_label);\n    labelLayout->addStretch();\n\n    layout->addLayout(labelLayout);\n\n    QWidget *w = childItem->widget();\n    layout->addWidget(w);\n    w->setObjectName(\"item_child\");\n    w->setParent(this);\n\n    m_label->setObjectName(\"item_child\");\n\n    m_label->document()->setDefaultFont(font());\n\n    QTextOption option = m_label->document()->defaultTextOption();\n    option.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);\n    m_label->document()->setDefaultTextOption(option);\n\n    m_label->setReadOnly(true);\n    m_label->setUndoRedoEnabled(false);\n\n    m_label->setFocusPolicy(Qt::NoFocus);\n    m_label->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);\n    m_label->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);\n    m_label->setFrameStyle(QFrame::NoFrame);\n    m_label->setContextMenuPolicy(Qt::NoContextMenu);\n\n    m_label->viewport()->installEventFilter(this);\n\n    m_label->setPlainText(label);\n}\n\nvoid ItemSync::updateSize(QSize maximumSize, int idealWidth)\n{\n    setMaximumSize(maximumSize);\n\n    const int w = idealWidth - m_icon->width() - 8;\n    QTextDocument *doc = m_label->document();\n    doc->setTextWidth(w);\n    m_label->setFixedSize( w, static_cast<int>(doc->size().height()) );\n\n    ItemWidgetWrapper::updateSize(maximumSize, idealWidth);\n\n    adjustSize();\n    setFixedSize(sizeHint());\n}\n\nbool ItemSync::eventFilter(QObject *, QEvent *event)\n{\n    return ItemWidget::filterMouseEvents(m_label, event);\n}\n\nItemSyncSaver::ItemSyncSaver(const QString &tabPath, FileWatcher *watcher)\n    : m_tabPath(tabPath)\n    , m_watcher(watcher)\n{\n    if (m_watcher)\n        m_watcher->setParent(this);\n}\n\nbool ItemSyncSaver::saveItems(const QString &tabName, const QAbstractItemModel &model, QIODevice *file)\n{\n    // Don't save items if path is empty.\n    if (!m_watcher) {\n        writeConfiguration(file, QStringList());\n        return true;\n    }\n\n    const QString path = m_watcher->path();\n    QStringList savedFiles;\n\n    if ( !m_watcher->isValid() ) {\n        qCCritical(plugin) << tr(\"Failed to synchronize tab \\\"%1\\\" with directory \\\"%2\\\"!\")\n             .arg(tabName, path);\n        return false;\n    }\n\n    QDir dir(path);\n\n    for (int row = 0; row < model.rowCount(); ++row) {\n        const QModelIndex index = model.index(row, 0);\n        const QVariantMap itemData = index.data(contentType::data).toMap();\n        const QVariantMap mimeToExtension = itemData.value(mimeExtensionMap).toMap();\n        const QString baseName = FileWatcher::getBaseName(index);\n        const QString filePath = dir.absoluteFilePath(baseName);\n\n        for (const auto &ext : mimeToExtension)\n            savedFiles.prepend( filePath + ext.toString() );\n    }\n\n    writeConfiguration(file, savedFiles);\n\n    return true;\n}\n\nbool ItemSyncSaver::canRemoveItems(const QList<QModelIndex> &indexList, QString *error)\n{\n    if ( !containsItemsWithNotOwnedFiles(indexList) )\n        return true;\n\n    if (error) {\n        *error = \"Removing synchronized items with assigned files from script is not allowed (remove the files instead)\";\n        return false;\n    }\n\n    return QMessageBox::question(\n                QApplication::activeWindow(), tr(\"Remove Items?\"),\n                tr(\"Do you really want to <strong>remove items and associated files</strong>?\"),\n                QMessageBox::No | QMessageBox::Yes,\n                QMessageBox::Yes ) == QMessageBox::Yes;\n}\n\nvoid ItemSyncSaver::itemsRemovedByUser(const QList<QPersistentModelIndex> &indexList)\n{\n    if ( m_tabPath.isEmpty() )\n        return;\n\n    // Remove unneeded files (remaining records in the hash map).\n    for (const auto &index : indexList)\n        FileWatcher::removeFilesForRemovedIndex(m_tabPath, index);\n}\n\nQVariantMap ItemSyncSaver::copyItem(const QAbstractItemModel &, const QVariantMap &itemData)\n{\n    if (m_watcher)\n        m_watcher->updateItemsIfNeeded();\n\n    QVariantMap copiedItemData;\n    for (auto it = itemData.begin(); it != itemData.constEnd(); ++it) {\n        const auto &format = it.key();\n        if ( !format.startsWith(mimePrivateSyncPrefix) )\n            copiedItemData[format] = it.value();\n    }\n\n    copiedItemData.insert(mimeSyncPath, m_tabPath);\n\n    // Add text/uri-list if no data are present.\n    if ( hasOnlyInternalData(copiedItemData) ) {\n        QByteArray uriData;\n\n        const QVariantMap mimeToExtension = itemData.value(mimeExtensionMap).toMap();\n        const QString basePath = m_tabPath + '/' + itemData.value(mimeBaseName).toString();\n\n        for (const auto &extension : mimeToExtension) {\n            const QString filePath = basePath + extension.toString();\n\n            if ( !uriData.isEmpty() )\n                uriData.append(\"\\n\");\n            uriData.append( QUrl::fromLocalFile(filePath).toEncoded() );\n        }\n\n        QVariantMap noSaveData;\n        noSaveData.insert(mimeUriList, FileWatcher::calculateHash(uriData));\n        copiedItemData.insert(mimeUriList, uriData);\n        copiedItemData.insert(mimeNoSave, noSaveData);\n    }\n\n    return copiedItemData;\n}\n\nvoid ItemSyncSaver::setFocus(bool focus)\n{\n    if (m_watcher)\n        m_watcher->setUpdatesEnabled(focus);\n}\n\nQString ItemSyncScriptable::getMimeBaseName() const\n{\n    return mimeBaseName;\n}\n\nQString ItemSyncScriptable::selectedTabPath()\n{\n    const auto tab = call(\"selectedTab\", {}).toString();\n    return m_tabPaths.value(tab).toString();\n}\n\nItemSyncLoader::ItemSyncLoader()\n{\n    registerSyncDataFileConverter();\n}\n\nItemSyncLoader::~ItemSyncLoader() = default;\n\nvoid ItemSyncLoader::applySettings(QSettings &settings)\n{\n    // Apply settings from tab sync path table.\n    QTableWidget *t = ui->tableWidgetSyncTabs;\n    QStringList tabPaths;\n    m_tabPaths.clear();\n    for (int row = 0; row < t->rowCount(); ++row) {\n        const QString tabName = t->item(row, syncTabsTableColumns::tabName)->text();\n        if ( !tabName.isEmpty() ) {\n            const QString tabPath = t->item(row, syncTabsTableColumns::path)->text();\n            tabPaths << tabName << tabPath;\n            m_tabPaths.insert(tabName, tabPath);\n        }\n    }\n\n    // Apply settings from file format table.\n    t = ui->tableWidgetFormatSettings;\n    QVariantList formatSettings;\n    m_formatSettings.clear();\n    for (int row = 0; row < t->rowCount(); ++row) {\n        FileFormat fileFormat;\n        fileFormat.extensions = t->item(row, formatSettingsTableColumns::formats)->text()\n                .split( QRegularExpression(\"[,;\\\\s]\"), Qt::SkipEmptyParts );\n        fileFormat.itemMime = t->item(row, formatSettingsTableColumns::itemMime)->text();\n        if ( fileFormat.extensions.isEmpty() && fileFormat.itemMime.isEmpty() )\n            continue;\n        fileFormat.icon = t->cellWidget(row, formatSettingsTableColumns::icon)\n                ->property(\"currentIcon\").toString();\n\n        QVariantMap format;\n        format[\"formats\"] = fileFormat.extensions;\n        format[\"itemMime\"] = fileFormat.itemMime;\n        format[\"icon\"] = fileFormat.icon;\n        formatSettings.append(format);\n\n        fixUserExtensions(&fileFormat.extensions);\n        fixUserMimeType(&fileFormat.itemMime);\n        m_formatSettings.append(fileFormat);\n    }\n\n    settings.setValue(configSyncTabs, tabPaths);\n    settings.setValue(configFormatSettings, formatSettings);\n}\n\nvoid ItemSyncLoader::loadSettings(const QSettings &settings)\n{\n    m_tabPaths.clear();\n    m_tabPathsSaved.clear();\n    const QStringList tabPaths = settings.value(configSyncTabs).toStringList();\n    for (int i = 0; i < tabPaths.size(); i += 2) {\n        const QString &name = tabPaths[i];\n        const QString &path = tabPaths.value(i + 1);\n        m_tabPaths.insert(name, path);\n        m_tabPathsSaved.append(name);\n        m_tabPathsSaved.append(path);\n    }\n\n    m_formatSettings.clear();\n    const QVariantList formatSettings = settings.value(configFormatSettings).toList();\n    for (const auto &formatSetting : formatSettings) {\n        QVariantMap format = formatSetting.toMap();\n        FileFormat fileFormat;\n        fileFormat.extensions = format.value(\"formats\").toStringList();\n        fileFormat.itemMime = format.value(\"itemMime\").toString();\n        fileFormat.icon = format.value(\"icon\").toString();\n        fixUserExtensions(&fileFormat.extensions);\n        fixUserMimeType(&fileFormat.itemMime);\n        m_formatSettings.append(fileFormat);\n    }\n\n    const QSettings settingsTopLevel(settings.fileName(), settings.format());\n    m_itemDataThreshold = settingsTopLevel.value(\n        QStringLiteral(\"Options/\") + Config::item_data_threshold::name(),\n        Config::item_data_threshold::defaultValue()\n    ).toInt();\n}\n\nQWidget *ItemSyncLoader::createSettingsWidget(QWidget *parent)\n{\n    ui.reset(new Ui::ItemSyncSettings);\n    QWidget *w = new QWidget(parent);\n    ui->setupUi(w);\n\n    // Init tab sync path table.\n    QTableWidget *t = ui->tableWidgetSyncTabs;\n    for (int row = 0, i = 0; i < m_tabPathsSaved.size() + 20; ++row, i += 2) {\n        t->insertRow(row);\n        t->setItem( row, syncTabsTableColumns::tabName, new QTableWidgetItem(m_tabPathsSaved.value(i)) );\n        t->setItem( row, syncTabsTableColumns::path, new QTableWidgetItem(m_tabPathsSaved.value(i + 1)) );\n\n        QPushButton *button = createBrowseButton();\n        t->setCellWidget(row, syncTabsTableColumns::browse, button);\n        connect( button, &QAbstractButton::clicked,\n                 this, &ItemSyncLoader::onBrowseButtonClicked );\n    }\n    setNormalStretchFixedColumns(t, syncTabsTableColumns::tabName, syncTabsTableColumns::path,\n                                 syncTabsTableColumns::browse);\n\n    // Init file format table.\n    t = ui->tableWidgetFormatSettings;\n    for (int row = 0; row < m_formatSettings.size() + 10; ++row) {\n        const FileFormat format = m_formatSettings.value(row);\n        const QString formats = format.extensions.join(\", \");\n        t->insertRow(row);\n        t->setItem( row, formatSettingsTableColumns::formats, new QTableWidgetItem(formats) );\n        t->setItem( row, formatSettingsTableColumns::itemMime, new QTableWidgetItem(format.itemMime) );\n\n        auto button = new IconSelectButton();\n        button->setCurrentIcon(format.icon);\n        t->setCellWidget(row, formatSettingsTableColumns::icon, button);\n    }\n    setNormalStretchFixedColumns(t, formatSettingsTableColumns::formats,\n                                 formatSettingsTableColumns::itemMime,\n                                 formatSettingsTableColumns::icon);\n\n    return w;\n}\n\nbool ItemSyncLoader::canLoadItems(QIODevice *file) const\n{\n    QDataStream stream(file);\n    stream.setVersion(QDataStream::Qt_4_7);\n    return readConfigHeader(&stream);\n}\n\nbool ItemSyncLoader::canSaveItems(const QString &tabName) const\n{\n    return m_tabPaths.contains(tabName);\n}\n\nItemSaverPtr ItemSyncLoader::loadItems(const QString &tabName, QAbstractItemModel *model, QIODevice *file, int maxItems)\n{\n    QVariantMap config;\n    if ( !readConfig(file, &config) )\n        return nullptr;\n\n    const QStringList files = config.value(tabConfigSavedFiles).toStringList();\n    return loadItems(tabName, model, files, maxItems);\n}\n\nItemSaverPtr ItemSyncLoader::initializeTab(const QString &tabName, QAbstractItemModel *model, int maxItems)\n{\n    return loadItems(tabName, model, QStringList(), maxItems);\n}\n\nItemWidget *ItemSyncLoader::transform(ItemWidget *itemWidget, const QVariantMap &data)\n{\n    const auto baseName = FileWatcher::getBaseName(data);\n    if ( isOwnFile(baseName) )\n        return nullptr;\n\n    itemWidget->setTagged(true);\n    const auto icon = iconForItem(data, baseName, m_formatSettings);\n    return new ItemSync(baseName, icon, itemWidget);\n}\n\nbool ItemSyncLoader::matches(const QModelIndex &index, const ItemFilter &filter) const\n{\n    const QVariantMap dataMap = index.data(contentType::data).toMap();\n    const QString text = dataMap.value(mimeBaseName).toString();\n    return filter.matches(text);\n}\n\nItemScriptable *ItemSyncLoader::scriptableObject()\n{\n    QVariantMap tabPaths;\n    for (auto it = m_tabPaths.constBegin(); it != m_tabPaths.constEnd(); ++it)\n        tabPaths.insert( it.key(), it.value() );\n    return new ItemSyncScriptable(tabPaths);\n}\n\nvoid ItemSyncLoader::onBrowseButtonClicked()\n{\n    QObject *button = sender();\n    if (button == nullptr)\n        return;\n\n    QTableWidget *t = ui->tableWidgetSyncTabs;\n\n    int row = 0;\n    for ( ; row < t->rowCount() && t->cellWidget(row, syncTabsTableColumns::browse) != button; ++row ) {}\n    Q_ASSERT( row != t->rowCount() );\n    if ( row == t->rowCount() )\n        return;\n\n    QTableWidgetItem *item = t->item(row, syncTabsTableColumns::path);\n    const QString path =\n            QFileDialog::getExistingDirectory( t, tr(\"Open Directory for Synchronization\"), item->text() );\n    if ( !path.isEmpty() )\n        item->setText(path);\n}\n\nItemSaverPtr ItemSyncLoader::loadItems(const QString &tabName, QAbstractItemModel *model, const QStringList &files, int maxItems)\n{\n    const auto tabPath = m_tabPaths.value(tabName);\n    if ( tabPath.isEmpty() )\n        return std::make_shared<ItemSyncSaver>(tabPath, nullptr);\n\n    QDir dir(tabPath);\n    if ( !dir.mkpath(QStringLiteral(\".\")) ) {\n        emit error( tr(\"Failed to create synchronization directory\"));\n        return nullptr;\n    }\n\n    const QString parent = dir.absolutePath() + '/';\n    const bool canUseFiles = std::all_of( std::cbegin(files), std::cend(files),\n        [&](const QString &file) { return file.startsWith(parent); } );\n    auto *watcher = new FileWatcher(\n        tabPath, canUseFiles ? files : QStringList(),\n        model, maxItems, m_formatSettings, m_itemDataThreshold);\n    return std::make_shared<ItemSyncSaver>(tabPath, watcher);\n}\n"
  },
  {
    "path": "plugins/itemsync/itemsync.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/icons.h\"\n#include \"item/itemwidgetwrapper.h\"\n\n#include <QVariantMap>\n#include <QWidget>\n\n#include <memory>\n\nnamespace Ui {\nclass ItemSyncSettings;\n}\n\nclass QTextEdit;\n\nclass FileWatcher;\nstruct FileFormat;\n\nusing ItemSyncTabPaths = QMap<QString, QString>;\n\nclass ItemSync final : public QWidget, public ItemWidgetWrapper\n{\n    Q_OBJECT\n\npublic:\n    ItemSync(const QString &label, const QString &icon, ItemWidget *childItem = nullptr);\n\nprotected:\n    void updateSize(QSize maximumSize, int idealWidth) override;\n\n    bool eventFilter(QObject *, QEvent *event) override;\n\nprivate:\n    QTextEdit *m_label;\n    QWidget *m_icon;\n};\n\nclass ItemSyncSaver final : public QObject, public ItemSaverInterface\n{\n    Q_OBJECT\n\npublic:\n    ItemSyncSaver(const QString &tabPath, FileWatcher *watcher);\n\n    bool saveItems(const QString &tabName, const QAbstractItemModel &model, QIODevice *file) override;\n\n    bool canRemoveItems(const QList<QModelIndex> &indexList, QString *error) override;\n\n    void itemsRemovedByUser(const QList<QPersistentModelIndex> &indexList) override;\n\n    QVariantMap copyItem(const QAbstractItemModel &model, const QVariantMap &itemData) override;\n\n    void setFocus(bool focus) override;\n\n    void setFileWatcher(FileWatcher *watcher);\n\nprivate:\n    QString m_tabPath;\n    FileWatcher *m_watcher;\n};\n\nclass ItemSyncScriptable final : public ItemScriptable\n{\n    Q_OBJECT\n    Q_PROPERTY(QVariantMap tabPaths READ getTabPaths CONSTANT)\n    Q_PROPERTY(QString mimeBaseName READ getMimeBaseName CONSTANT)\n\npublic:\n    explicit ItemSyncScriptable(const QVariantMap &tabPaths)\n        : m_tabPaths(tabPaths)\n    {\n    }\n\n    QVariantMap getTabPaths() const { return m_tabPaths; }\n\n    QString getMimeBaseName() const;\n\npublic slots:\n    QString selectedTabPath();\n\nprivate:\n    QVariantMap m_tabPaths;\n};\n\n/**\n * Synchronizes selected tab with destination path.\n *\n * For all tabs that have user-set synchronization directory, loads up to maximum number of items\n * from files (tries to use the same files every time tab is loaded).\n *\n * Items contains base name of assigned files (MIME is 'application/x-copyq-itemsync-basename').\n * E.g. files 'example.txt', 'example.html' and 'example_notes.txt' belong to single item with\n * base name 'example' containing text, HTML and notes.\n *\n * If item data are changed it is saved to appropriate files and vice versa.\n *\n * If files is in synchronization directory but is of unknown type, hidden, unreadable or its\n * file name starts with dot (this is hidden file on UNIX so lets make it same everywhere) it\n * won't be added to the list.\n *\n * Unknown file types can be defined in settings so such files are loaded.\n *\n * Item data with unknown MIME type is serialized in '<BASE NAME>_copyq.dat' file.\n */\nclass ItemSyncLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemSyncLoader();\n    ~ItemSyncLoader();\n\n    QString id() const override { return \"itemsync\"; }\n    QString name() const override { return tr(\"Synchronize\"); }\n    QString author() const override { return QString(); }\n    QString description() const override { return tr(\"Synchronize items and notes with a directory on disk.\"); }\n    QVariant icon() const override { return QVariant(IconUpload); }\n\n    void applySettings(QSettings &settings) override;\n\n    void loadSettings(const QSettings &settings) override;\n\n    QWidget *createSettingsWidget(QWidget *parent) override;\n\n    bool canLoadItems(QIODevice *file) const override;\n\n    bool canSaveItems(const QString &tabName) const override;\n\n    ItemSaverPtr loadItems(const QString &tabName, QAbstractItemModel *model, QIODevice *file, int maxItems) override;\n\n    ItemSaverPtr initializeTab(const QString &tabName, QAbstractItemModel *model, int maxItems) override;\n\n    ItemWidget *transform(ItemWidget *itemWidget, const QVariantMap &data) override;\n\n    bool matches(const QModelIndex &index, const ItemFilter &filter) const override;\n\n    const QObject *signaler() const override { return this; }\n\n    ItemScriptable *scriptableObject() override;\n\nsignals:\n    void error(const QString &);\n\nprivate slots:\n    void onBrowseButtonClicked();\n\nprivate:\n    ItemSaverPtr loadItems(const QString &tabName, QAbstractItemModel *model, const QStringList &files, int maxItems);\n\n    std::unique_ptr<Ui::ItemSyncSettings> ui;\n    ItemSyncTabPaths m_tabPaths;\n    QStringList m_tabPathsSaved;\n    QList<FileFormat> m_formatSettings;\n    int m_itemDataThreshold = -1;\n};\n"
  },
  {
    "path": "plugins/itemsync/itemsyncsettings.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemSyncSettings</class>\n <widget class=\"QWidget\" name=\"ItemSyncSettings\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>809</width>\n    <height>676</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QSplitter\" name=\"splitter\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <widget class=\"QWidget\" name=\"verticalLayoutWidget\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox\">\n         <property name=\"title\">\n          <string>Synchronization Tabs and Directories</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n          <property name=\"leftMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>6</number>\n          </property>\n          <item>\n           <widget class=\"QLabel\" name=\"label_4\">\n            <property name=\"text\">\n             <string>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</string>\n            </property>\n            <property name=\"wordWrap\">\n             <bool>true</bool>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <widget class=\"QTableWidget\" name=\"tableWidgetSyncTabs\">\n            <property name=\"alternatingRowColors\">\n             <bool>true</bool>\n            </property>\n            <property name=\"showGrid\">\n             <bool>false</bool>\n            </property>\n            <attribute name=\"verticalHeaderVisible\">\n             <bool>false</bool>\n            </attribute>\n            <column>\n             <property name=\"text\">\n              <string>Tab Name</string>\n             </property>\n            </column>\n            <column>\n             <property name=\"text\">\n              <string>Path</string>\n             </property>\n            </column>\n            <column>\n             <property name=\"text\">\n              <string/>\n             </property>\n            </column>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"verticalLayoutWidget_2\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox_2\">\n         <property name=\"title\">\n          <string>Files to Item Data Formats</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n          <property name=\"leftMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>6</number>\n          </property>\n          <item>\n           <widget class=\"QLabel\" name=\"label_3\">\n            <property name=\"text\">\n             <string>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</string>\n            </property>\n            <property name=\"wordWrap\">\n             <bool>true</bool>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <widget class=\"QTableWidget\" name=\"tableWidgetFormatSettings\">\n            <attribute name=\"verticalHeaderVisible\">\n             <bool>false</bool>\n            </attribute>\n            <column>\n             <property name=\"text\">\n              <string>Extensions</string>\n             </property>\n            </column>\n            <column>\n             <property name=\"text\">\n              <string>Item Media Type</string>\n             </property>\n            </column>\n            <column>\n             <property name=\"text\">\n              <string/>\n             </property>\n            </column>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "plugins/itemtags/CMakeLists.txt",
    "content": "set(copyq_plugin_itemtags_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-config>\n    $<TARGET_OBJECTS:copyq-plugin-geometry>\n    $<TARGET_OBJECTS:copyq-plugin-iconfont>\n    $<TARGET_OBJECTS:copyq-plugin-iconwidget>\n    $<TARGET_OBJECTS:copyq-plugin-screen>\n    $<TARGET_OBJECTS:copyq-plugin-textdata>\n    $<TARGET_OBJECTS:copyq-plugin-wrapper>\n    ../../src/gui/iconselectbutton.cpp\n    ../../src/gui/iconselectdialog.cpp\n    ../../src/item/itemsaverwrapper.cpp\n    )\n\ncopyq_add_plugin(itemtags)\n"
  },
  {
    "path": "plugins/itemtags/itemtags.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemtags.h\"\n#include \"ui_itemtagssettings.h\"\n\n#include \"common/command.h\"\n#include \"common/contenttype.h\"\n#include \"common/regexp.h\"\n#include \"common/textdata.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/iconselectbutton.h\"\n#include \"gui/fromiconid.h\"\n#include \"gui/pixelratio.h\"\n#include \"item/itemfilter.h\"\n\n#include <QBoxLayout>\n#include <QColorDialog>\n#include <QLabel>\n#include <QMessageBox>\n#include <QModelIndex>\n#include <QPainter>\n#include <QPixmap>\n#include <QPushButton>\n#include <QSettings>\n#include <QtPlugin>\n#include <QUrl>\n\n#include <memory>\n\nQ_DECLARE_METATYPE(ItemTags::Tag)\n\nnamespace {\n\nconst QLatin1String mimeTags(\"application/x-copyq-tags\");\n\nconst QLatin1String configTags(\"tags\");\n\nconst char propertyColor[] = \"CopyQ_color\";\n\nnamespace tagsTableColumns {\nenum {\n    name,\n    match,\n    styleSheet,\n    color,\n    icon,\n    lock\n};\n}\n\nclass ElidedLabel final : public QLabel\n{\npublic:\n    explicit ElidedLabel(const QString &text, QWidget *parent = nullptr)\n        : QLabel(text, parent)\n    {\n    }\n\nprotected:\n    void paintEvent(QPaintEvent *) override\n    {\n        QPainter p(this);\n        QFontMetrics fm = fontMetrics();\n        const QString elidedText = fm.elidedText(text(), Qt::ElideMiddle, rect().width());\n        p.drawText(rect(), Qt::AlignCenter, elidedText);\n    }\n};\n\nbool isTagValid(const ItemTags::Tag &tag)\n{\n    return !tag.name.isEmpty()\n            || !tag.icon.isEmpty()\n            || !tag.styleSheet.isEmpty()\n            || !tag.match.isEmpty();\n}\n\nQString serializeColor(const QColor &color)\n{\n    if (color.alpha() == 255)\n        return color.name();\n\n    return QString::fromLatin1(\"rgba(%1,%2,%3,%4)\")\n            .arg(color.red())\n            .arg(color.green())\n            .arg(color.blue())\n            .arg(color.alpha());\n}\n\nQColor deserializeColor(const QString &colorName)\n{\n    if ( colorName.startsWith(\"rgba(\") ) {\n        QStringList list = colorName.mid(5, colorName.indexOf(')') - 5).split(',');\n        int r = list.value(0).toInt();\n        int g = list.value(1).toInt();\n        int b = list.value(2).toInt();\n        int a = list.value(3).toInt();\n\n        return QColor(r, g, b, a);\n    }\n\n    return QColor(colorName);\n}\n\nvoid setColorIcon(QPushButton *button, const QColor &color)\n{\n    QPixmap pix(button->iconSize());\n    pix.fill(color);\n    button->setIcon(pix);\n    button->setProperty(propertyColor, color);\n}\n\nvoid setFixedColumnSize(QTableWidget *table, int logicalIndex)\n{\n    table->horizontalHeader()->setSectionResizeMode(logicalIndex, QHeaderView::Fixed);\n    table->resizeColumnToContents(logicalIndex);\n}\n\nQVariant cellWidgetProperty(QTableWidget *table, int row, int column, const char *property)\n{\n    return table->cellWidget(row, column)->property(property);\n}\n\nQStringList tags(const QVariant &tags)\n{\n    return getTextData( tags.toByteArray() ).split(',', Qt::SkipEmptyParts);\n}\n\nQStringList tags(const QVariantMap &itemData)\n{\n    return tags( itemData.value(mimeTags) );\n}\n\nQString toScriptString(const QString &text)\n{\n    return \"decodeURIComponent('\" + QUrl::toPercentEncoding(text) + \"')\";\n}\n\nQString addTagText()\n{\n    return ItemTagsLoader::tr(\"Add a Tag\");\n}\n\nQString removeTagText()\n{\n    return ItemTagsLoader::tr(\"Remove a Tag\");\n}\n\nCommand dummyTagCommand()\n{\n    Command c;\n    c.icon = fromIconId(IconTag);\n    c.inMenu = true;\n    return c;\n}\n\nvoid addTagCommands(const QString &tagName, const QString &match, QVector<Command> *commands)\n{\n    Command c;\n\n    const QString name = !tagName.isEmpty() ? tagName : match;\n    const QString tagString = toScriptString(name);\n    const QString quotedTag = quoteString(name);\n\n    c = dummyTagCommand();\n    c.internalId = QStringLiteral(\"copyq_tags_tag:\") + name;\n    c.name = ItemTagsLoader::tr(\"Toggle Tag %1\").arg(quotedTag);\n    c.cmd = QStringLiteral(\n        \"copyq: (plugins.itemtags.hasTag(%1) ? plugins.itemtags.untag : plugins.itemtags.tag)(%1)\"\n    ).arg(tagString);\n    commands->append(c);\n}\n\nQString escapeTagField(const QString &field)\n{\n    return QString(field).replace(\"\\\\\", \"\\\\\\\\\").replace(\";;\", \";\\\\;\");\n}\n\nQString unescapeTagField(const QString &field)\n{\n    return QString(field).replace(\";\\\\;\", \";;\").replace(\"\\\\\\\\\", \"\\\\\");\n}\n\nvoid initTagWidget(QWidget *tagWidget, const ItemTags::Tag &tag, const QFont &font)\n{\n    tagWidget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);\n    tagWidget->setStyleSheet(\n                \"* {\"\n                \";background:transparent\"\n                \";color:\" + serializeColor(tag.color) +\n                \";\" + tag.styleSheet +\n                \"}\"\n                \"QLabel {\"\n                \";background:transparent\"\n                \";border:none\"\n                \"}\"\n            );\n\n    auto layout = new QHBoxLayout(tagWidget);\n    const int x = QFontMetrics(font).height() / 6;\n    layout->setContentsMargins(x, 0, x, 0);\n    layout->setSpacing(x * 2);\n\n    if (tag.icon.size() > 1) {\n        QLabel *iconLabel = new QLabel(tagWidget);\n        const QPixmap icon(tag.icon);\n        iconLabel->setPixmap(icon);\n        layout->addWidget(iconLabel);\n    } else if (tag.icon.size() == 1) {\n        QLabel *iconLabel = new QLabel(tagWidget);\n        iconLabel->setFont(iconFont());\n        iconLabel->setText(tag.icon);\n        layout->addWidget(iconLabel);\n    }\n\n    if (!tag.name.isEmpty()) {\n        auto label = new ElidedLabel(tag.name, tagWidget);\n        label->setFont(font);\n        layout->addWidget(label);\n    }\n}\n\nQFont smallerFont(QFont font)\n{\n    if (font.pixelSize() != -1)\n        font.setPixelSize( static_cast<int>(0.75 * font.pixelSize()) );\n    else\n        font.setPointSizeF(0.75 * font.pointSizeF());\n\n    return font;\n}\n\nvoid addTagButtons(QBoxLayout *layout, const ItemTags::Tags &tags)\n{\n    Q_ASSERT(layout->parentWidget());\n\n    layout->addStretch(1);\n\n    const QFont font = smallerFont(layout->parentWidget()->font());\n\n    for (const auto &tag : tags) {\n        if ( tag.name.isEmpty() && tag.icon.isEmpty() )\n            continue;\n\n        QWidget *tagWidget = new QWidget(layout->parentWidget());\n        initTagWidget(tagWidget, tag, font);\n        layout->addWidget(tagWidget);\n    }\n}\n\nItemTags::Tag findMatchingTag(const QString &tagText, const ItemTags::Tags &tags)\n{\n    for (const auto &tag : tags) {\n        if ( tag.match.isEmpty() ) {\n            if (tag.name == tagText)\n                return tag;\n        } else {\n            const auto re = anchoredRegExp(tag.match);\n            if (tagText.contains(re))\n                return tag;\n        }\n    }\n\n    return ItemTags::Tag();\n}\n\nbool isLocked(const QModelIndex &index, const ItemTags::Tags &tags)\n{\n    const auto dataMap = index.data(contentType::data).toMap();\n    const auto itemTags = ::tags(dataMap);\n    return std::any_of(\n        std::begin(itemTags), std::end(itemTags),\n        [&tags](const QString &itemTag){\n            const auto tag = findMatchingTag(itemTag, tags);\n            return tag.lock;\n        });\n}\n\nbool containsLockedItems(const QModelIndexList &indexList, const ItemTags::Tags &tags)\n{\n    return std::any_of(\n        std::begin(indexList), std::end(indexList),\n        [&tags](const QModelIndex &index){\n            return isLocked(index, tags);\n        });\n}\n\nclass TagTableWidgetItem final : public QTableWidgetItem\n{\npublic:\n    enum {\n        TagRole = Qt::UserRole\n    };\n\n    explicit TagTableWidgetItem(const QString &text)\n        : QTableWidgetItem(text)\n    {\n    }\n\n    QVariant data(int role) const override\n    {\n        if (role == Qt::DecorationRole)\n            return m_pixmap;\n\n        return QTableWidgetItem::data(role);\n    }\n\n    void setData(int role, const QVariant &value) override\n    {\n        if (role == TagRole)\n            setTag( value.value<ItemTags::Tag>() );\n\n        QTableWidgetItem::setData(role, value);\n    }\n\nprivate:\n    void setTag(const ItemTags::Tag &tag)\n    {\n        if ( isTagValid(tag) ) {\n            QWidget tagWidget;\n            initTagWidget(&tagWidget, tag, smallerFont(QFont()));\n\n            const auto ratio = pixelRatio(&tagWidget);\n            m_pixmap = QPixmap( tagWidget.sizeHint() * ratio );\n            m_pixmap.setDevicePixelRatio(ratio);\n\n            m_pixmap.fill(Qt::transparent);\n            QPainter painter(&m_pixmap);\n            tagWidget.render(&painter);\n        } else {\n            m_pixmap = QPixmap();\n        }\n    }\n\n    QPixmap m_pixmap;\n};\n\n} // namespace\n\nItemTags::ItemTags(ItemWidget *childItem, const Tags &tags)\n    : QWidget( childItem->widget()->parentWidget() )\n    , ItemWidgetWrapper(childItem, this)\n    , m_tagWidget(new QWidget(childItem->widget()->parentWidget()))\n{\n    QBoxLayout *tagLayout = new QHBoxLayout(m_tagWidget);\n    tagLayout->setContentsMargins({});\n    addTagButtons(tagLayout, tags);\n\n    childItem->widget()->setObjectName(\"item_child\");\n    childItem->widget()->setParent(this);\n\n    QBoxLayout *layout = new QVBoxLayout(this);\n    layout->setContentsMargins({});\n    layout->setSpacing(0);\n\n    layout->addWidget(m_tagWidget, 0);\n    layout->addWidget( childItem->widget(), 1 );\n}\n\nvoid ItemTags::updateSize(QSize maximumSize, int idealWidth)\n{\n    setMaximumSize(maximumSize);\n    m_tagWidget->setFixedWidth(idealWidth);\n    ItemWidgetWrapper::updateSize(maximumSize, idealWidth);\n    adjustSize();\n}\n\nQStringList ItemTagsScriptable::getUserTags() const\n{\n    return m_userTags;\n}\n\nQString ItemTagsScriptable::getMimeTags() const\n{\n    return mimeTags;\n}\n\nQStringList ItemTagsScriptable::tags()\n{\n    const auto args = currentArguments();\n    const auto rows = this->rows(args, 0);\n\n    QStringList allTags;\n    for (int row : rows)\n        allTags << this->tags(row);\n\n    return allTags;\n}\n\nvoid ItemTagsScriptable::tag()\n{\n    const auto args = currentArguments();\n\n    auto tagName = args.value(0).toString();\n    if ( tagName.isEmpty() ) {\n        tagName = askTagName( addTagText(), m_userTags );\n        if ( tagName.isEmpty() )\n            return;\n    }\n\n    if ( args.size() <= 1 ) {\n        const auto dataValueList = call(\"selectedItemsData\", {}).toList();\n\n        QVariantList dataList;\n        dataList.reserve( dataValueList.size() );\n        for (const auto &itemDataValue : dataValueList) {\n            auto itemData = itemDataValue.toMap();\n            auto itemTags = ::tags(itemData);\n            if ( addTag(tagName, &itemTags) )\n                itemData.insert( mimeTags, itemTags.join(\",\") );\n            dataList.append(itemData);\n        }\n\n        call(\"setSelectedItemsData\", {QVariant(dataList)});\n    } else {\n        for ( int row : rows(args, 1) ) {\n            auto itemTags = tags(row);\n            if ( addTag(tagName, &itemTags) )\n                setTags(row, itemTags);\n        }\n    }\n}\n\nvoid ItemTagsScriptable::untag()\n{\n    const auto args = currentArguments();\n    auto tagName = args.value(0).toString();\n\n    if ( args.size() <= 1 ) {\n        const auto dataValueList = call(\"selectedItemsData\", {}).toList();\n\n        if ( tagName.isEmpty() ) {\n            QStringList allTags;\n            for (const auto &itemDataValue : dataValueList) {\n                const auto itemData = itemDataValue.toMap();\n                allTags.append( ::tags(itemData) );\n            }\n\n            tagName = askRemoveTagName(allTags);\n            if ( allTags.isEmpty() )\n                return;\n        }\n\n        QVariantList dataList;\n        dataList.reserve( dataValueList.size() );\n        for (const auto &itemDataValue : dataValueList) {\n            auto itemData = itemDataValue.toMap();\n            auto itemTags = ::tags(itemData);\n            if ( removeTag(tagName, &itemTags) )\n                itemData.insert( mimeTags, itemTags.join(\",\") );\n            dataList.append(itemData);\n        }\n\n        call(\"setSelectedItemsData\", {QVariant(dataList)});\n    } else {\n        const auto rows = this->rows(args, 1);\n\n        if ( tagName.isEmpty() ) {\n            QStringList allTags;\n            for (int row : rows)\n                allTags.append( this->tags(row) );\n\n            tagName = askRemoveTagName(allTags);\n            if ( allTags.isEmpty() )\n                return;\n        }\n\n        for (int row : rows) {\n            auto itemTags = tags(row);\n            if ( removeTag(tagName, &itemTags) )\n                setTags(row, itemTags);\n        }\n    }\n}\n\nvoid ItemTagsScriptable::clearTags()\n{\n    const auto args = currentArguments();\n\n    if ( args.isEmpty() ) {\n        const auto dataValueList = call(\"selectedItemsData\", {}).toList();\n\n        QVariantList dataList;\n        for (const auto &itemDataValue : dataValueList) {\n            auto itemData = itemDataValue.toMap();\n            itemData.remove(mimeTags);\n            dataList.append(itemData);\n        }\n\n        call(\"setSelectedItemsData\", {QVariant(dataList)});\n    } else {\n        const auto rows = this->rows(args, 0);\n        for (int row : rows)\n            setTags(row, QStringList());\n    }\n}\n\nbool ItemTagsScriptable::hasTag()\n{\n    const auto args = currentArguments();\n    const auto tagName = args.value(0).toString();\n\n    if ( args.size() <= 1 ) {\n        const auto dataValueList = call(\"selectedItemsData\", {}).toList();\n        for (const auto &itemDataValue : dataValueList) {\n            const auto itemData = itemDataValue.toMap();\n            const auto itemTags = ::tags(itemData);\n            if ( itemTags.contains(tagName) )\n                return true;\n        }\n        return false;\n    }\n\n    const auto row = args.value(1).toInt();\n    return tags(row).contains(tagName);\n}\n\nQString ItemTagsScriptable::askTagName(const QString &dialogTitle, const QStringList &tags)\n{\n    const auto value = call(\"dialog\", {\".title\", dialogTitle, dialogTitle, tags});\n    return value.toString();\n}\n\nQString ItemTagsScriptable::askRemoveTagName(const QStringList &tags)\n{\n    if ( tags.isEmpty() )\n        return QString();\n\n    if ( tags.size() == 1 )\n        return tags.first();\n\n    return askTagName( removeTagText(), tags );\n}\n\nQList<int> ItemTagsScriptable::rows(const QVariantList &arguments, int skip)\n{\n    QList<int> rows;\n\n    for (int i = skip; i < arguments.size(); ++i) {\n        bool ok;\n        const auto row = arguments[i].toInt(&ok);\n        if (ok)\n            rows.append(row);\n    }\n\n    return rows;\n}\n\nQStringList ItemTagsScriptable::tags(int row)\n{\n    const auto value = call(\"read\", {mimeTags, row});\n    return ::tags(value);\n}\n\nvoid ItemTagsScriptable::setTags(int row, const QStringList &tags)\n{\n    const auto value = tags.join(\",\");\n    call(\"change\", {row, mimeTags, value});\n}\n\nbool ItemTagsScriptable::addTag(const QString &tagName, QStringList *tags)\n{\n    if ( tags->contains(tagName) )\n        return false;\n\n    tags->append(tagName);\n    tags->sort();\n    return true;\n}\n\nbool ItemTagsScriptable::removeTag(const QString &tagName, QStringList *tags)\n{\n    if ( !tags->contains(tagName) )\n        return false;\n\n    tags->removeOne(tagName);\n    return true;\n}\n\nItemTagsSaver::ItemTagsSaver(const ItemTags::Tags &tags, const ItemSaverPtr &saver)\n    : ItemSaverWrapper(saver)\n    , m_tags(tags)\n{\n}\n\nbool ItemTagsSaver::canRemoveItems(const QList<QModelIndex> &indexList, QString *error)\n{\n    if ( !containsLockedItems(indexList, m_tags) )\n        return ItemSaverWrapper::canRemoveItems(indexList, error);\n\n    if (error) {\n        *error = \"Removing items with locked tags is not allowed (untag items first)\";\n        return false;\n    }\n\n    QMessageBox::information(\n                QApplication::activeWindow(),\n                ItemTagsLoader::tr(\"Cannot Remove Items With a Locked Tag\"),\n                ItemTagsLoader::tr(\"Untag items first to remove them.\") );\n    return false;\n}\n\nbool ItemTagsSaver::canDropItem(const QModelIndex &index)\n{\n    return !isLocked(index, m_tags) && ItemSaverWrapper::canDropItem(index);\n}\n\nbool ItemTagsSaver::canMoveItems(const QList<QModelIndex> &indexList)\n{\n    return !containsLockedItems(indexList, m_tags)\n            && ItemSaverWrapper::canMoveItems(indexList);\n}\n\nItemTagsLoader::ItemTagsLoader()\n    : m_blockDataChange(false)\n{\n}\n\nItemTagsLoader::~ItemTagsLoader() = default;\n\nQStringList ItemTagsLoader::formatsToSave() const\n{\n    return QStringList(mimeTags);\n}\n\nvoid ItemTagsLoader::applySettings(QSettings &settings)\n{\n    QStringList tags;\n\n    for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {\n        const Tag tag = tagFromTable(row);\n        if (isTagValid(tag))\n            tags.append(serializeTag(tag));\n    }\n\n    settings.setValue(configTags, tags);\n}\n\nvoid ItemTagsLoader::loadSettings(const QSettings &settings)\n{\n    m_tags.clear();\n    for (const auto &tagField : settings.value(configTags).toStringList()) {\n        Tag tag = deserializeTag(tagField);\n        if (isTagValid(tag))\n            m_tags.append(tag);\n    }\n}\n\nQWidget *ItemTagsLoader::createSettingsWidget(QWidget *parent)\n{\n    ui.reset(new Ui::ItemTagsSettings);\n    QWidget *w = new QWidget(parent);\n    ui->setupUi(w);\n\n    // Init tag table.\n    for (const auto &tag : m_tags)\n        addTagToSettingsTable(tag);\n    for (int i = 0; i < 10; ++i)\n        addTagToSettingsTable();\n\n    auto header = ui->tableWidget->horizontalHeader();\n    header->setSectionResizeMode(tagsTableColumns::name, QHeaderView::Stretch);\n    header->setSectionResizeMode(tagsTableColumns::styleSheet, QHeaderView::Stretch);\n    header->setSectionResizeMode(tagsTableColumns::match, QHeaderView::Stretch);\n    setFixedColumnSize(ui->tableWidget, tagsTableColumns::color);\n    setFixedColumnSize(ui->tableWidget, tagsTableColumns::icon);\n    setFixedColumnSize(ui->tableWidget, tagsTableColumns::lock);\n\n    connect( ui->tableWidget, &QTableWidget::itemChanged,\n             this, &ItemTagsLoader::onTableWidgetItemChanged );\n\n    return w;\n}\n\nItemWidget *ItemTagsLoader::transform(ItemWidget *itemWidget, const QVariantMap &data)\n{\n    const Tags tags = toTags(::tags(data));\n    if ( tags.isEmpty() )\n        return nullptr;\n\n    itemWidget->setTagged(true);\n    return new ItemTags(itemWidget, tags);\n}\n\nItemSaverPtr ItemTagsLoader::transformSaver(const ItemSaverPtr &saver, QAbstractItemModel *)\n{\n    // Avoid checking for locked items if no locked tags are specified in configuration.\n    const bool hasAnyLocks = std::any_of(\n        std::begin(m_tags), std::end(m_tags),\n        [](const ItemTags::Tag &tag){ return tag.lock; });\n    return hasAnyLocks ? std::make_shared<ItemTagsSaver>(m_tags, saver) : saver;\n}\n\nbool ItemTagsLoader::matches(const QModelIndex &index, const ItemFilter &filter) const\n{\n    const QByteArray tagsData =\n            index.data(contentType::data).toMap().value(mimeTags).toByteArray();\n    const auto tags = getTextData(tagsData);\n    return filter.matches(tags) || filter.matches(accentsRemoved(tags));\n}\n\nItemScriptable *ItemTagsLoader::scriptableObject()\n{\n    return new ItemTagsScriptable(userTags());\n}\n\nQVector<Command> ItemTagsLoader::commands() const\n{\n    QVector<Command> commands;\n\n    if (m_tags.isEmpty()) {\n        addTagCommands(tr(\"Important\", \"Tag name for example command\"), QString(), &commands);\n    } else {\n        const QRegularExpression reCapture(R\"(\\(.*\\))\");\n        const QRegularExpression reGroup(R\"(\\\\\\d)\");\n        for (const auto &tag : m_tags) {\n            if ( reCapture.match(tag.match).hasMatch() && reGroup.match(tag.name).hasMatch() )\n                continue;\n\n            addTagCommands(tag.name, tag.match, &commands);\n        }\n    }\n\n    Command c;\n\n    c = dummyTagCommand();\n    c.internalId = QStringLiteral(\"copyq_tags_tag\");\n    c.name = addTagText();\n    c.cmd = \"copyq: plugins.itemtags.tag()\";\n    commands.append(c);\n\n    c = dummyTagCommand();\n    c.internalId = QStringLiteral(\"copyq_tags_untag\");\n    c.input = mimeTags;\n    c.name = removeTagText();\n    c.cmd = \"copyq: plugins.itemtags.untag()\";\n    commands.append(c);\n\n    c = dummyTagCommand();\n    c.internalId = QStringLiteral(\"copyq_tags_clear\");\n    c.input = mimeTags;\n    c.name = tr(\"Clear all tags\");\n    c.cmd = \"copyq: plugins.itemtags.clearTags()\";\n    commands.append(c);\n\n    return commands;\n}\n\nQStringList ItemTagsLoader::userTags() const\n{\n    QStringList tags;\n    tags.reserve( m_tags.size() );\n\n    for (const auto &tag : m_tags)\n        tags.append(tag.name);\n\n    return tags;\n}\n\nvoid ItemTagsLoader::onColorButtonClicked()\n{\n    QPushButton *button = qobject_cast<QPushButton*>(sender());\n    Q_ASSERT(button);\n\n    const QColor color = button->property(propertyColor).value<QColor>();\n    QColorDialog dialog(button->window());\n    dialog.setOptions(dialog.options() | QColorDialog::ShowAlphaChannel | QColorDialog::DontUseNativeDialog);\n    dialog.setCurrentColor(color);\n\n    if ( dialog.exec() == QDialog::Accepted )\n        setColorIcon( button, dialog.selectedColor() );\n\n    onAllTableWidgetItemsChanged();\n}\n\nvoid ItemTagsLoader::onTableWidgetItemChanged(QTableWidgetItem *item)\n{\n    // Omit calling this recursively.\n    if (m_blockDataChange)\n        return;\n\n    m_blockDataChange = true;\n\n    const int row = item->row();\n    QTableWidgetItem *tagItem = ui->tableWidget->item(row, tagsTableColumns::name);\n    const QVariant value = QVariant::fromValue(tagFromTable(row));\n    tagItem->setData(TagTableWidgetItem::TagRole, value);\n\n    m_blockDataChange = false;\n}\n\nvoid ItemTagsLoader::onAllTableWidgetItemsChanged()\n{\n    for (int row = 0; row < ui->tableWidget->rowCount(); ++row)\n        onTableWidgetItemChanged(ui->tableWidget->item(row, 0));\n}\n\nQString ItemTagsLoader::serializeTag(const ItemTagsLoader::Tag &tag)\n{\n    return escapeTagField(tag.name)\n            + \";;\" + escapeTagField(tag.color)\n            + \";;\" + escapeTagField(tag.icon)\n            + \";;\" + escapeTagField(tag.styleSheet)\n            + \";;\" + escapeTagField(tag.match)\n            + \";;\" + (tag.lock ? \"L\" : \"\");\n}\n\nItemTagsLoader::Tag ItemTagsLoader::deserializeTag(const QString &tagText)\n{\n    QStringList tagFields = tagText.split(\";;\");\n\n    Tag tag;\n    tag.name = unescapeTagField(tagFields.value(0));\n    tag.color = unescapeTagField(tagFields.value(1));\n    tag.icon = unescapeTagField(tagFields.value(2));\n    tag.styleSheet = unescapeTagField(tagFields.value(3));\n    tag.match = unescapeTagField(tagFields.value(4));\n    tag.lock = unescapeTagField(tagFields.value(5)) == QLatin1String(\"L\");\n\n    return tag;\n}\n\nItemTagsLoader::Tags ItemTagsLoader::toTags(const QStringList &tagList)\n{\n    Tags tags;\n\n    for (const auto &tagText : tagList) {\n        QString tagName = tagText.trimmed();\n        Tag tag = findMatchingTag(tagName, m_tags);\n\n        if (isTagValid(tag)) {\n            if (tag.match.isEmpty()) {\n                tag.name = tagName;\n            } else {\n                const QRegularExpression re(tag.match);\n                tag.name = QString(tagName).replace(re, tag.name);\n            }\n        } else {\n            tag.name = tagName;\n\n            // Get default tag style from theme.\n            const QSettings settings;\n            tag.color = settings.value(\"Theme/num_fg\").toString();\n        }\n\n        tags.append(tag);\n    }\n\n    return tags;\n}\n\nvoid ItemTagsLoader::addTagToSettingsTable(const ItemTagsLoader::Tag &tag)\n{\n    QTableWidget *t = ui->tableWidget;\n\n    const int row = t->rowCount();\n\n    t->insertRow(row);\n    t->setItem( row, tagsTableColumns::name, new TagTableWidgetItem(tag.name) );\n    t->setItem( row, tagsTableColumns::match, new QTableWidgetItem(tag.match) );\n    t->setItem( row, tagsTableColumns::styleSheet, new QTableWidgetItem(tag.styleSheet) );\n    t->setItem( row, tagsTableColumns::color, new QTableWidgetItem() );\n    t->setItem( row, tagsTableColumns::icon, new QTableWidgetItem() );\n\n    auto lock = new QTableWidgetItem();\n    lock->setCheckState(tag.lock ? Qt::Checked : Qt::Unchecked);\n    const QString toolTip = t->horizontalHeaderItem(tagsTableColumns::lock)->toolTip();\n    lock->setToolTip(toolTip);\n    t->setItem( row, tagsTableColumns::lock, lock );\n\n    auto colorButton = new QPushButton(t);\n    const QColor color = tag.color.isEmpty()\n            ? QColor::fromRgb(50, 50, 50)\n            : deserializeColor(tag.color);\n    setColorIcon(colorButton, color);\n    t->setCellWidget(row, tagsTableColumns::color, colorButton);\n    connect(colorButton, &QAbstractButton::clicked, this, &ItemTagsLoader::onColorButtonClicked);\n\n    auto iconButton = new IconSelectButton(t);\n    iconButton->setCurrentIcon(tag.icon);\n    t->setCellWidget(row, tagsTableColumns::icon, iconButton);\n    connect(iconButton, &IconSelectButton::currentIconChanged, this, &ItemTagsLoader::onAllTableWidgetItemsChanged);\n\n    onTableWidgetItemChanged(t->item(row, 0));\n}\n\nItemTagsLoader::Tag ItemTagsLoader::tagFromTable(int row)\n{\n    QTableWidget *t = ui->tableWidget;\n\n    Tag tag;\n    tag.name = t->item(row, tagsTableColumns::name)->text();\n    const QColor color =\n            cellWidgetProperty(t, row, tagsTableColumns::color, propertyColor).value<QColor>();\n    tag.color = serializeColor(color);\n    tag.icon = cellWidgetProperty(t, row, tagsTableColumns::icon, \"currentIcon\").toString();\n    tag.styleSheet = t->item(row, tagsTableColumns::styleSheet)->text();\n    tag.match = t->item(row, tagsTableColumns::match)->text();\n    tag.lock = t->item(row, tagsTableColumns::lock)->checkState() == Qt::Checked;\n    return tag;\n}\n"
  },
  {
    "path": "plugins/itemtags/itemtags.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/icons.h\"\n#include \"item/itemwidgetwrapper.h\"\n#include \"item/itemsaverwrapper.h\"\n\n#include <QVariant>\n#include <QVector>\n#include <QWidget>\n\nnamespace Ui {\nclass ItemTagsSettings;\n}\n\nclass QTableWidgetItem;\n\nclass ItemTags final : public QWidget, public ItemWidgetWrapper\n{\n    Q_OBJECT\n\npublic:\n    struct Tag {\n        QString name;\n        QString color;\n        QString icon;\n        QString styleSheet;\n        QString match;\n        bool lock;\n    };\n\n    using Tags = QVector<ItemTags::Tag>;\n\n    ItemTags(ItemWidget *childItem, const Tags &tags);\n\nsignals:\n    void runCommand(const Command &command);\n\nprotected:\n    void updateSize(QSize maximumSize, int idealWidth) override;\n\nprivate:\n    QWidget *m_tagWidget;\n};\n\nclass ItemTagsLoader;\n\nclass ItemTagsScriptable final : public ItemScriptable\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList userTags READ getUserTags CONSTANT)\n    Q_PROPERTY(QString mimeTags READ getMimeTags CONSTANT)\n\npublic:\n    explicit ItemTagsScriptable(const QStringList &userTags)\n        : m_userTags(userTags)\n    {\n    }\n\n    QStringList getUserTags() const;\n\n    QString getMimeTags() const;\n\npublic slots:\n    QStringList tags();\n    void tag();\n    void untag();\n    void clearTags();\n    bool hasTag();\n\nprivate:\n    QString askTagName(const QString &dialogTitle, const QStringList &tags);\n    QString askRemoveTagName(const QStringList &tags);\n    QList<int> rows(const QVariantList &arguments, int skip);\n    QStringList tags(int row);\n    void setTags(int row, const QStringList &tags);\n    bool addTag(const QString &tagName, QStringList *tags);\n    bool removeTag(const QString &tagName, QStringList *tags);\n\n    QStringList m_userTags;\n};\n\nclass ItemTagsSaver final : public ItemSaverWrapper\n{\npublic:\n    ItemTagsSaver(const ItemTags::Tags &tags, const ItemSaverPtr &saver);\n\n    bool canRemoveItems(const QList<QModelIndex> &indexList, QString *error) override;\n\n    bool canDropItem(const QModelIndex &index) override;\n\n    bool canMoveItems(const QList<QModelIndex> &indexList) override;\n\nprivate:\n    ItemTags::Tags m_tags;\n};\n\nclass ItemTagsLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemTagsLoader();\n    ~ItemTagsLoader();\n\n    QString id() const override { return \"itemtags\"; }\n    QString name() const override { return tr(\"Tags\"); }\n    QString author() const override { return QString(); }\n    QString description() const override { return tr(\"Display tags for items.\"); }\n    QVariant icon() const override { return QVariant(IconTag); }\n\n    QStringList formatsToSave() const override;\n\n    void applySettings(QSettings &settings) override;\n\n    void loadSettings(const QSettings &settings) override;\n\n    QWidget *createSettingsWidget(QWidget *parent) override;\n\n    ItemWidget *transform(ItemWidget *itemWidget, const QVariantMap &data) override;\n\n    ItemSaverPtr transformSaver(const ItemSaverPtr &saver, QAbstractItemModel *model) override;\n\n    bool matches(const QModelIndex &index, const ItemFilter &filter) const override;\n\n    const QObject *signaler() const override { return this; }\n\n    ItemScriptable *scriptableObject() override;\n\n    QVector<Command> commands() const override;\n\nprivate:\n    void onColorButtonClicked();\n    void onTableWidgetItemChanged(QTableWidgetItem *item);\n    void onAllTableWidgetItemsChanged();\n\n    QStringList userTags() const;\n\n    using Tag = ItemTags::Tag;\n    using Tags = ItemTags::Tags;\n\n    static QString serializeTag(const Tag &tag);\n    static Tag deserializeTag(const QString &tagText);\n\n    Tags toTags(const QStringList &tagList);\n\n    void addTagToSettingsTable(const Tag &tag = Tag());\n\n    Tag tagFromTable(int row);\n\n    Tags m_tags;\n    std::unique_ptr<Ui::ItemTagsSettings> ui;\n\n    bool m_blockDataChange;\n};\n"
  },
  {
    "path": "plugins/itemtags/itemtagssettings.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemTagsSettings</class>\n <widget class=\"QWidget\" name=\"ItemTagsSettings\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>629</width>\n    <height>369</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label_2\">\n     <property name=\"text\">\n      <string>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</string>\n     </property>\n     <property name=\"openExternalLinks\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QTableWidget\" name=\"tableWidget\">\n     <column>\n      <property name=\"text\">\n       <string>Tag Name</string>\n      </property>\n     </column>\n     <column>\n      <property name=\"text\">\n       <string>Match</string>\n      </property>\n     </column>\n     <column>\n      <property name=\"text\">\n       <string>Style Sheet</string>\n      </property>\n     </column>\n     <column>\n      <property name=\"text\">\n       <string>Color</string>\n      </property>\n     </column>\n     <column>\n      <property name=\"text\">\n       <string>Icon</string>\n      </property>\n     </column>\n     <column>\n      <property name=\"text\">\n       <string>Lock</string>\n      </property>\n      <property name=\"toolTip\">\n       <string>Avoid removing item</string>\n      </property>\n     </column>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "plugins/itemtext/CMakeLists.txt",
    "content": "set(copyq_plugin_itemtext_SOURCES\n    $<TARGET_OBJECTS:copyq-plugin-textdata>\n    )\n\ncopyq_add_plugin(itemtext)\n"
  },
  {
    "path": "plugins/itemtext/itemtext.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemtext.h\"\n#include \"ui_itemtextsettings.h\"\n\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n\n#include <QAbstractTextDocumentLayout>\n#include <QCoreApplication>\n#include <QContextMenuEvent>\n#include <QCursor>\n#include <QMimeData>\n#include <QMouseEvent>\n#include <QScrollBar>\n#include <QSettings>\n#include <QTextBlock>\n#include <QTextCursor>\n#include <QTextDocument>\n#include <QtPlugin>\n\nnamespace {\n\n// Limit number of characters for performance reasons.\nconst int maxCharacters = 100 * 1024;\n\n// Limit line length for performance reasons.\nconst int maxLineLength = 1024;\nconst int maxLineLengthInPreview = 16 * maxLineLength;\n\n// Limit line count for performance reasons.\nconst int maxLineCount = 4 * 1024;\nconst int maxLineCountInPreview = 16 * maxLineCount;\n\nconst QLatin1String optionUseRichText(\"use_rich_text\");\nconst QLatin1String optionMaximumLines(\"max_lines\");\nconst QLatin1String optionMaximumHeight(\"max_height\");\nconst QLatin1String optionDefaultStyleSheet(\"default_style_sheet\");\n\n// Some applications insert \\0 terminator at the end of text data.\n// It needs to be removed because QTextBrowser can render the character.\nvoid removeTrailingNull(QString *text)\n{\n    if ( text->endsWith(QChar(0)) )\n        text->chop(1);\n}\n\nbool getRichText(const QVariantMap &dataMap, QString *text)\n{\n    if ( dataMap.contains(mimeHtml) ) {\n        *text = getTextData(dataMap, mimeHtml);\n        return true;\n    }\n\n    return false;\n}\n\nQString normalizeText(QString text)\n{\n    removeTrailingNull(&text);\n    return text.left(maxCharacters);\n}\n\nvoid insertEllipsis(QTextCursor *tc)\n{\n    tc->insertHtml( \" &nbsp;\"\n                    \"<span style='background:rgba(0,0,0,30);border-radius:4px'>\"\n                    \"&nbsp;&hellip;&nbsp;\"\n                    \"</span>\" );\n}\n\n} // namespace\n\nItemText::ItemText(\n        const QString &text,\n        const QString &richText,\n        const QString &defaultStyleSheet,\n        int maxLines,\n        int lineLength,\n        int maximumHeight,\n        QWidget *parent)\n    : QTextEdit(parent)\n    , ItemWidget(this)\n    , m_textDocument()\n    , m_maximumHeight(maximumHeight)\n{\n    m_textDocument.setDefaultFont(font());\n\n    // Disable slow word wrapping initially.\n    setLineWrapMode(QTextEdit::NoWrap);\n    QTextOption option = m_textDocument.defaultTextOption();\n    option.setWrapMode(QTextOption::NoWrap);\n    m_textDocument.setDefaultTextOption(option);\n    m_textDocument.setDefaultStyleSheet(defaultStyleSheet);\n\n    setReadOnly(true);\n    setUndoRedoEnabled(false);\n\n    setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);\n    setFrameStyle(QFrame::NoFrame);\n\n    if ( !richText.isEmpty() ) {\n        m_textDocument.setHtml(richText);\n        // Use plain text instead if rendering HTML fails or result is empty.\n        m_isRichText = !m_textDocument.isEmpty();\n    }\n\n    if (!m_isRichText)\n        m_textDocument.setPlainText(text);\n\n    if (maxLines > 0) {\n        QTextBlock block = m_textDocument.findBlockByLineNumber(maxLines);\n        if (block.isValid()) {\n            QTextCursor tc(&m_textDocument);\n            tc.setPosition(block.position() - 1);\n            tc.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);\n\n            m_elidedFragment = tc.selection();\n            tc.removeSelectedText();\n\n            m_ellipsisPosition = tc.position();\n            insertEllipsis(&tc);\n        }\n    }\n\n    if (lineLength > 0) {\n        for ( auto block = m_textDocument.begin(); block.isValid(); block = block.next() ) {\n            if ( block.length() > lineLength ) {\n                QTextCursor tc(&m_textDocument);\n                tc.setPosition(block.position() + lineLength);\n                tc.setPosition(block.position() + block.length() - 1, QTextCursor::KeepAnchor);\n                insertEllipsis(&tc);\n            }\n        }\n    }\n\n    connect( this, &QTextEdit::selectionChanged,\n             this, &ItemText::onSelectionChanged );\n}\n\nvoid ItemText::updateSize(QSize maximumSize, int idealWidth)\n{\n    if ( m_textDocument.isEmpty() ) {\n        setFixedSize(0, 0);\n        return;\n    }\n\n    const int scrollBarWidth = verticalScrollBar()->width();\n    setMaximumHeight( maximumSize.height() );\n    setFixedWidth(idealWidth);\n    m_textDocument.setTextWidth(idealWidth - scrollBarWidth);\n\n    const bool noWrap = maximumSize.width() > idealWidth;\n    QTextOption option = m_textDocument.defaultTextOption();\n    const auto wrapMode = noWrap\n            ? QTextOption::NoWrap : QTextOption::WrapAtWordBoundaryOrAnywhere;\n    if (wrapMode != option.wrapMode()) {\n        option.setWrapMode(wrapMode);\n        m_textDocument.setDefaultTextOption(option);\n    }\n    setLineWrapMode(noWrap ? QTextEdit::NoWrap : QTextEdit::WidgetWidth);\n\n    // setDocument() is slow, so postpone this after resized properly\n    if (document() != &m_textDocument)\n        setDocument(&m_textDocument);\n\n    if (m_maximumHeight != -1) {\n        const QSizeF size = m_textDocument.size();\n        const int h = size.height() + 1;\n\n        if (0 < m_maximumHeight && m_maximumHeight < h - 8)\n            setFixedHeight(m_maximumHeight);\n        else\n            setFixedHeight(h);\n    }\n}\n\nbool ItemText::eventFilter(QObject *, QEvent *event)\n{\n    return ItemWidget::filterMouseEvents(this, event);\n}\n\nQMimeData *ItemText::createMimeDataFromSelection() const\n{\n    const auto data = QTextEdit::createMimeDataFromSelection();\n    if (!data)\n        return nullptr;\n\n    // Copy only plain text if rich text is not available.\n    if (!m_isRichText) {\n        const auto text = data->text();\n        data->clear();\n        data->setText(text);\n    }\n\n    const auto owner = qApp->property(\"CopyQ_session_name\").toString();\n    data->setData( mimeOwner, owner.toUtf8() );\n\n    return data;\n}\n\nvoid ItemText::onSelectionChanged()\n{\n    // Expand the ellipsis if selected.\n    if ( m_ellipsisPosition == -1 || textCursor().selectionEnd() <= m_ellipsisPosition )\n        return;\n\n    QTextCursor tc(&m_textDocument);\n    tc.setPosition(m_ellipsisPosition);\n    m_ellipsisPosition = -1;\n    tc.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);\n\n    tc.insertFragment(m_elidedFragment);\n    m_elidedFragment = QTextDocumentFragment();\n}\n\nItemTextLoader::ItemTextLoader()\n{\n}\n\nItemTextLoader::~ItemTextLoader() = default;\n\nItemWidget *ItemTextLoader::create(const QVariantMap &data, QWidget *parent, bool preview) const\n{\n    if ( data.value(mimeHidden).toBool() )\n        return nullptr;\n\n    QString richText;\n    const bool isRichText = m_useRichText && getRichText(data, &richText);\n\n    QString text = getTextData(data);\n    const bool isPlainText = !text.isEmpty();\n\n    if (!isRichText && !isPlainText)\n        return nullptr;\n\n    richText = normalizeText(richText);\n    text = normalizeText(text);\n\n    ItemText *item = nullptr;\n    Qt::TextInteractionFlags interactionFlags(Qt::LinksAccessibleByMouse);\n    // Always limit text size for performance reasons.\n    if (preview) {\n        item = new ItemText(text, richText, m_defaultStyleSheet, maxLineCountInPreview, maxLineLengthInPreview, -1, parent);\n        item->setFocusPolicy(Qt::StrongFocus);\n        interactionFlags = interactionFlags\n                | Qt::TextSelectableByKeyboard\n                | Qt::LinksAccessibleByKeyboard;\n    } else {\n        int maxLines = m_maxLines;\n        if (maxLines <= 0 || maxLines > maxLineCount)\n            maxLines = maxLineCount;\n        item = new ItemText(text, richText, m_defaultStyleSheet, maxLines, maxLineLength, m_maxHeight, parent);\n        item->viewport()->installEventFilter(item);\n        item->setContextMenuPolicy(Qt::NoContextMenu);\n    }\n    item->setTextInteractionFlags(item->textInteractionFlags() | interactionFlags);\n\n    return item;\n}\n\nQStringList ItemTextLoader::formatsToSave() const\n{\n    return m_useRichText\n            ? QStringList{mimeText, mimeTextUtf8, mimeHtml}\n            : QStringList{mimeText, mimeTextUtf8};\n}\n\nvoid ItemTextLoader::applySettings(QSettings &settings)\n{\n    settings.setValue(optionUseRichText, ui->checkBoxUseRichText->isChecked());\n    settings.setValue(optionMaximumLines, ui->spinBoxMaxLines->value());\n    settings.setValue(optionMaximumHeight, ui->spinBoxMaxHeight->value());\n    settings.setValue(optionDefaultStyleSheet, ui->textEditDefaultStyleSheet->toPlainText());\n}\n\nvoid ItemTextLoader::loadSettings(const QSettings &settings)\n{\n    m_useRichText = settings.value(optionUseRichText, true).toBool();\n    m_maxLines = settings.value(optionMaximumLines, maxLineCount).toInt();\n    m_maxHeight = settings.value(optionMaximumHeight).toInt();\n    m_defaultStyleSheet = settings.value(optionDefaultStyleSheet).toString();\n}\n\nQWidget *ItemTextLoader::createSettingsWidget(QWidget *parent)\n{\n    ui.reset(new Ui::ItemTextSettings);\n    QWidget *w = new QWidget(parent);\n    ui->setupUi(w);\n    ui->checkBoxUseRichText->setChecked(m_useRichText);\n    ui->spinBoxMaxLines->setValue(m_maxLines);\n    ui->spinBoxMaxHeight->setValue(m_maxHeight);\n    ui->textEditDefaultStyleSheet->setPlainText(m_defaultStyleSheet);\n    return w;\n}\n"
  },
  {
    "path": "plugins/itemtext/itemtext.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/icons.h\"\n#include \"item/itemwidget.h\"\n\n#include <QTextDocument>\n#include <QTextDocumentFragment>\n#include <QTextEdit>\n\n#include <memory>\n\nnamespace Ui {\nclass ItemTextSettings;\n}\n\nclass ItemText final : public QTextEdit, public ItemWidget\n{\n    Q_OBJECT\n\npublic:\n    ItemText(\n        const QString &text,\n        const QString &richText,\n        const QString &defaultStyleSheet,\n        int maxLines,\n        int lineLength,\n        int maximumHeight,\n        QWidget *parent);\n\nprotected:\n    void updateSize(QSize maximumSize, int idealWidth) override;\n\n    bool eventFilter(QObject *, QEvent *event) override;\n\n    QMimeData *createMimeDataFromSelection() const override;\n\nprivate:\n    void onSelectionChanged();\n\n    QTextDocument m_textDocument;\n    QTextDocumentFragment m_elidedFragment;\n    int m_ellipsisPosition = -1;\n    int m_maximumHeight;\n    bool m_isRichText = false;\n};\n\nclass ItemTextLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    ItemTextLoader();\n    ~ItemTextLoader();\n\n    ItemWidget *create(const QVariantMap &data, QWidget *parent, bool preview) const override;\n\n    QString id() const override { return \"itemtext\"; }\n    QString name() const override { return tr(\"Text\"); }\n    QString author() const override { return QString(); }\n    QString description() const override { return tr(\"Display plain text and simple HTML items.\"); }\n    QVariant icon() const override { return QVariant(IconFont); }\n\n    QStringList formatsToSave() const override;\n\n    void applySettings(QSettings &settings) override;\n\n    void loadSettings(const QSettings &settings) override;\n\n    QWidget *createSettingsWidget(QWidget *parent) override;\n\nprivate:\n    bool m_useRichText = true;\n    int m_maxLines = 0;\n    int m_maxHeight = 0;\n    QString m_defaultStyleSheet;\n    std::unique_ptr<Ui::ItemTextSettings> ui;\n};\n"
  },
  {
    "path": "plugins/itemtext/itemtextsettings.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemTextSettings</class>\n <widget class=\"QWidget\" name=\"ItemTextSettings\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>403</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QCheckBox\" name=\"checkBoxUseRichText\">\n     <property name=\"text\">\n      <string>Save and display HTML and rich text</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Maximum number of lines to display (0 to show all):</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>spinBoxMaxLines</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QSpinBox\" name=\"spinBoxMaxLines\">\n       <property name=\"maximum\">\n        <number>1000</number>\n       </property>\n      </widget>\n     </item>\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    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Maximum height in pixels (0 for no limit):</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>spinBoxMaxHeight</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QSpinBox\" name=\"spinBoxMaxHeight\">\n       <property name=\"maximum\">\n        <number>2000</number>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\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    </layout>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label_3\">\n     <property name=\"text\">\n      <string>Default style sheet:</string>\n     </property>\n     <property name=\"buddy\">\n      <cstring>textEditDefaultStyleSheet</cstring>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QPlainTextEdit\" name=\"textEditDefaultStyleSheet\">\n     <property name=\"placeholderText\">\n      <string notr=\"true\">a { color: blue }</string>\n     </property>\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 <tabstops>\n  <tabstop>checkBoxUseRichText</tabstop>\n  <tabstop>spinBoxMaxLines</tabstop>\n  <tabstop>spinBoxMaxHeight</tabstop>\n  <tabstop>textEditDefaultStyleSheet</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[tool.codespell]\nskip = [\n    '*.css',\n    '*.svg',\n    './build/',\n    './plugins/itemfakevim/fakevim',\n    './shared/com.github.hluk.copyq.desktop.in',\n    './shared/gpl-3.0.rtf',\n    './src/gui/icon_list.h',\n    './src/platform/x11/systemclipboard/wlr-data-control-unstable-v1.xml',\n    './translations',\n    '.codespellrc',\n    '.git',\n]\nignore-words-list = [\n    'onTop',\n    'DoubleClick',\n    'INE',\n]\nignore-regex = '''\n^Comment\\[.*\n|^GenericName\\[.*\n|\\S+&(amp;)?\\S+'''\n"
  },
  {
    "path": "qxt/AUTHORS",
    "content": "== main developers ==\n\nArvid Picciani\t<aep@libqxt.org>\nAdam Higerd     <ahigerd@libqxt.org>\nJ-P Nurmi       <jpnurmi@libqxt.org>\nBenjamin Zeller <zbenjamin@libqxt.org>\n\n== contributors ==\n\nGabriel Assis Bezerra\nScott Aron Bloom\nLawrence Holtsclaw\nMarcin Jakubowski\nDominique Leducq\nMarcus Lindblom\nKonstantin Molchanov\nThomas Mueller\nBjørn Erik Nilsen\nKaleb Pederson\nMatthew Schnee\nAndré Somers\nAlex Unden\nChris Vickery\nBenjamin Wohlwend\n\nthanks everyone not named for all the patches, bug reports,\nbeta tests, and the free beer :-)\n"
  },
  {
    "path": "qxt/COPYING",
    "content": "/****************************************************************************\n** Copyright (c) 2006 - 2011, the LibQxt project.\n** See the Qxt AUTHORS file for a list of authors and copyright holders.\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without\n** modification, are permitted provided that the following conditions are met:\n**     * Redistributions of source code must retain the above copyright\n**       notice, this list of conditions and the following disclaimer.\n**     * Redistributions in binary form must reproduce the above copyright\n**       notice, this list of conditions and the following disclaimer in the\n**       documentation and/or other materials provided with the distribution.\n**     * Neither the name of the LibQxt project nor the\n**       names of its contributors may be used to endorse or promote products\n**       derived from this software without specific prior written permission.\n**\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n** <http://libqxt.org>  <foundation@libqxt.org>\n*****************************************************************************/\n"
  },
  {
    "path": "qxt/qxtglobalshortcut.cpp",
    "content": "#include \"qxtglobalshortcut.h\"\n/****************************************************************************\n** Copyright (c) 2006 - 2011, the LibQxt project.\n** See the Qxt AUTHORS file for a list of authors and copyright holders.\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without\n** modification, are permitted provided that the following conditions are met:\n**     * Redistributions of source code must retain the above copyright\n**       notice, this list of conditions and the following disclaimer.\n**     * Redistributions in binary form must reproduce the above copyright\n**       notice, this list of conditions and the following disclaimer in the\n**       documentation and/or other materials provided with the distribution.\n**     * Neither the name of the LibQxt project nor the\n**       names of its contributors may be used to endorse or promote products\n**       derived from this software without specific prior written permission.\n**\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n** <http://libqxt.org>  <foundation@libqxt.org>\n*****************************************************************************/\n\n#include \"qxtglobalshortcut_p.h\"\n\n#include <QAbstractEventDispatcher>\n#include <QApplication>\n#include <QMessageBox>\n\nnamespace {\n\nint referenceCounter = 0;\n\nQHash<QPair<quint32, quint32>, QxtGlobalShortcut*> shortcuts;\n\n} // namespace\n\nQxtGlobalShortcutPrivate::QxtGlobalShortcutPrivate(QxtGlobalShortcut *q)\n    : enabled(true)\n    , key(Qt::Key(0))\n    , mods(Qt::NoModifier)\n    , nativeKey(0)\n    , nativeMods(0)\n    , registered(false)\n    , q_ptr(q)\n{\n    init();\n}\n\nQxtGlobalShortcutPrivate::~QxtGlobalShortcutPrivate()\n{\n    unsetShortcut();\n    destroy();\n}\n\nvoid QxtGlobalShortcutPrivate::initFallback()\n{\n    if (referenceCounter == 0) {\n        QAbstractEventDispatcher::instance()->installNativeEventFilter(this);\n    }\n    ++referenceCounter;\n}\n\nvoid QxtGlobalShortcutPrivate::destroyFallback()\n{\n    --referenceCounter;\n    if (referenceCounter == 0) {\n        QAbstractEventDispatcher *ed = QAbstractEventDispatcher::instance();\n        if (ed != nullptr) {\n            ed->removeNativeEventFilter(this);\n        }\n    }\n}\n\nvoid QxtGlobalShortcutPrivate::setKeySequence(const QKeySequence& shortcut)\n{\n    const Qt::KeyboardModifiers allMods =\n            Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier | Qt::KeypadModifier;\n    const auto xkeyCode = static_cast<uint>( shortcut.isEmpty() ? 0 : shortcut[0] );\n    // WORKAROUND: Qt has convert some keys to upper case which\n    //             breaks some shortcuts on some keyboard layouts.\n    const uint keyCode = QChar::toLower(xkeyCode & ~allMods);\n\n    key = Qt::Key(keyCode);\n    mods = Qt::KeyboardModifiers(xkeyCode & allMods);\n}\n\nbool QxtGlobalShortcutPrivate::setShortcutFallback(const QKeySequence& shortcut)\n{\n    unsetShortcut();\n    setKeySequence(shortcut);\n    nativeKey = nativeKeycode(key, mods);\n    nativeMods = nativeModifiers(mods);\n\n    registered = registerShortcut(nativeKey, nativeMods);\n    if (registered)\n        shortcuts.insert(qMakePair(nativeKey, nativeMods), q_ptr);\n\n    return registered;\n}\n\nbool QxtGlobalShortcutPrivate::unsetShortcutFallback()\n{\n    if (registered\n            && shortcuts.value(qMakePair(nativeKey, nativeMods)) == q_ptr\n            && unregisterShortcut(nativeKey, nativeMods))\n    {\n        shortcuts.remove(qMakePair(nativeKey, nativeMods));\n        registered = false;\n        return true;\n    }\n\n    return false;\n}\n\nvoid QxtGlobalShortcutPrivate::activateShortcut(quint32 nativeKey, quint32 nativeMods)\n{\n    QxtGlobalShortcut* shortcut = shortcuts.value(qMakePair(nativeKey, nativeMods));\n    if (shortcut && shortcut->isEnabled())\n        emit shortcut->activated(shortcut);\n}\n\n/*!\n    \\class QxtGlobalShortcut\n    \\brief The QxtGlobalShortcut class provides a global shortcut aka \"hotkey\".\n\n    A global shortcut triggers even if the application is not active. This\n    makes it easy to implement applications that react to certain shortcuts\n    still if some other application is active or if the application is for\n    example minimized to the system tray.\n\n    Example usage:\n    \\code\n    QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(window);\n    connect(shortcut, SIGNAL(activated()), window, SLOT(toggleVisibility()));\n    shortcut->setShortcut(QKeySequence(\"Ctrl+Shift+F12\"));\n    \\endcode\n */\n\n/*!\n    \\fn QxtGlobalShortcut::activated()\n\n    This signal is emitted when the user types the shortcut's key sequence.\n\n    \\sa shortcut\n */\n\n/*!\n    Constructs a new QxtGlobalShortcut with \\a parent.\n */\nQxtGlobalShortcut::QxtGlobalShortcut(QObject* parent)\n    : QObject(parent)\n    , d_ptr(new QxtGlobalShortcutPrivate(this))\n{\n}\n\n/*!\n    Constructs a new QxtGlobalShortcut with \\a shortcut and \\a parent.\n */\nQxtGlobalShortcut::QxtGlobalShortcut(\n    const QKeySequence& shortcut, const QString &name, QObject* parent)\n    : QxtGlobalShortcut(parent)\n{\n    setShortcut(shortcut);\n    setName(name);\n}\n\n/*!\n    Destructs the QxtGlobalShortcut.\n */\nQxtGlobalShortcut::~QxtGlobalShortcut()\n{\n    delete d_ptr;\n}\n\n/*!\n    \\property QxtGlobalShortcut::shortcut\n    \\brief the shortcut key sequence\n\n    Notice that corresponding key press and release events are not\n    delivered for registered global shortcuts even if they are disabled.\n    Also, comma separated key sequences are not supported.\n    Only the first part is used:\n\n    \\code\n    qxtShortcut->setShortcut(QKeySequence(\"Ctrl+Alt+A,Ctrl+Alt+B\"));\n    Q_ASSERT(qxtShortcut->shortcut() == QKeySequence(\"Ctrl+Alt+A\"));\n    \\endcode\n\n    \\sa setShortcut()\n */\nQKeySequence QxtGlobalShortcut::shortcut() const\n{\n    return QKeySequence( static_cast<int>(d_ptr->key | d_ptr->mods) );\n}\n\n/*!\n    \\property QxtGlobalShortcut::shortcut\n    \\brief sets the shortcut key sequence\n\n    \\sa shortcut()\n */\nbool QxtGlobalShortcut::setShortcut(const QKeySequence& shortcut)\n{\n    return d_ptr->setShortcut(shortcut);\n}\n\nQString QxtGlobalShortcut::name() const\n{\n    return d_ptr->name;\n}\n\nvoid QxtGlobalShortcut::setName(const QString& name)\n{\n    d_ptr->name = name;\n}\n\n/*!\n    \\property QxtGlobalShortcut::enabled\n    \\brief whether the shortcut is enabled\n\n    A disabled shortcut does not get activated.\n\n    The default value is \\c true.\n\n    \\sa setEnabled(), setDisabled()\n */\nbool QxtGlobalShortcut::isEnabled() const\n{\n    return d_ptr->enabled;\n}\n\n/*!\n    \\property QxtGlobalShortcut::valid\n    \\brief whether the shortcut was successfully set up\n */\nbool QxtGlobalShortcut::isValid() const\n{\n    return d_ptr->registered;\n}\n\n/*!\n    Activates the shortcut if enabled.\n\n    \\sa activated()\n */\nvoid QxtGlobalShortcut::activate()\n{\n    if (d_ptr->enabled)\n        emit activated(this);\n}\n\n/*!\n    Notifies the user that changing global shortcuts requires application restart.\n\n    This needed on some platforms like Wayland, because global shortcuts cannot\n    be rebound again.\n\n    This shows a message box for the first found top level window. If no\n    visible window is found, nothing is shown. This avoids showing a message\n    box when application is exiting.\n */\nvoid QxtGlobalShortcut::notifyRestartNeeded()\n{\n    const QWidgetList topLevelWidgets = QApplication::topLevelWidgets();\n    QWidget *parentWindow = nullptr;\n    for (QWidget *widget : topLevelWidgets) {\n        if (widget->isVisible()) {\n            parentWindow = widget;\n            break;\n        }\n    }\n    if (parentWindow == nullptr)\n        return;\n    QMessageBox::information(\n        parentWindow,\n        tr(\"Restart Required\"),\n        tr(\"Changing global shortcuts requires application restart.\")\n    );\n}\n\n/*!\n    Sets the shortcut \\a enabled.\n\n    \\sa enabled\n */\nvoid QxtGlobalShortcut::setEnabled(bool enabled)\n{\n    d_ptr->enabled = enabled;\n}\n\n/*!\n    Sets the shortcut \\a disabled.\n\n    \\sa enabled\n */\nvoid QxtGlobalShortcut::setDisabled(bool disabled)\n{\n    d_ptr->enabled = !disabled;\n}\n"
  },
  {
    "path": "qxt/qxtglobalshortcut.h",
    "content": "/****************************************************************************\n** Copyright (c) 2006 - 2011, the LibQxt project.\n** See the Qxt AUTHORS file for a list of authors and copyright holders.\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without\n** modification, are permitted provided that the following conditions are met:\n**     * Redistributions of source code must retain the above copyright\n**       notice, this list of conditions and the following disclaimer.\n**     * Redistributions in binary form must reproduce the above copyright\n**       notice, this list of conditions and the following disclaimer in the\n**       documentation and/or other materials provided with the distribution.\n**     * Neither the name of the LibQxt project nor the\n**       names of its contributors may be used to endorse or promote products\n**       derived from this software without specific prior written permission.\n**\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n** <http://libqxt.org>  <foundation@libqxt.org>\n*****************************************************************************/\n#pragma once\n\n#include <QObject>\n#include <QKeySequence>\n\nclass QxtGlobalShortcutPrivate;\n\nclass QxtGlobalShortcut final : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)\n    Q_PROPERTY(QString name READ name WRITE setName)\n    Q_PROPERTY(bool valid READ isValid CONSTANT)\n    Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut)\n\npublic:\n    explicit QxtGlobalShortcut(QObject* parent = nullptr);\n    explicit QxtGlobalShortcut(const QKeySequence& shortcut, const QString &name = {}, QObject* parent = nullptr);\n    ~QxtGlobalShortcut();\n\n    QKeySequence shortcut() const;\n    bool setShortcut(const QKeySequence& shortcut);\n\n    QString name() const;\n    void setName(const QString& name);\n\n    bool isEnabled() const;\n\n    bool isValid() const;\n\n    void activate();\n\n    static void notifyRestartNeeded();\n\npublic Q_SLOTS:\n    void setEnabled(bool enabled = true);\n    void setDisabled(bool disabled = true);\n\nQ_SIGNALS:\n    void activated(QxtGlobalShortcut *self);\n\nprivate:\n    friend class QxtGlobalShortcutPrivate;\n    QxtGlobalShortcutPrivate *d_ptr;\n};\n"
  },
  {
    "path": "qxt/qxtglobalshortcut_mac.cpp",
    "content": "#include <Carbon/Carbon.h>\n/****************************************************************************\n** Copyright (c) 2006 - 2011, the LibQxt project.\n** See the Qxt AUTHORS file for a list of authors and copyright holders.\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without\n** modification, are permitted provided that the following conditions are met:\n**     * Redistributions of source code must retain the above copyright\n**       notice, this list of conditions and the following disclaimer.\n**     * Redistributions in binary form must reproduce the above copyright\n**       notice, this list of conditions and the following disclaimer in the\n**       documentation and/or other materials provided with the distribution.\n**     * Neither the name of the LibQxt project nor the\n**       names of its contributors may be used to endorse or promote products\n**       derived from this software without specific prior written permission.\n**\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n** <http://libqxt.org>  <foundation@libqxt.org>\n*****************************************************************************/\n\n#include \"qxtglobalshortcut_p.h\"\n#include <QMap>\n#include <QHash>\n#include <QtDebug>\n#include <QApplication>\n\nusing Identifier = QPair<uint, uint>;\nstatic QMap<quint32, EventHotKeyRef> keyRefs;\nstatic QHash<Identifier, quint32> keyIDs;\nstatic quint32 hotKeySerial = 0;\nstatic bool qxt_mac_handler_installed = false;\n\nOSStatus qxt_mac_handle_hot_key(EventHandlerCallRef nextHandler, EventRef event, void* data)\n{\n    Q_UNUSED(nextHandler)\n    Q_UNUSED(data)\n    if (GetEventClass(event) == kEventClassKeyboard && GetEventKind(event) == kEventHotKeyPressed)\n    {\n        EventHotKeyID keyID;\n        GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID, nullptr, sizeof(keyID), nullptr, &keyID);\n        Identifier id = keyIDs.key(keyID.id);\n        QxtGlobalShortcutPrivate::activateShortcut(id.second, id.first);\n    }\n    return noErr;\n}\n\nvoid QxtGlobalShortcutPrivate::init()\n{\n}\n\nvoid QxtGlobalShortcutPrivate::destroy()\n{\n}\n\nbool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut)\n{\n    return setShortcutFallback(shortcut);\n}\n\nbool QxtGlobalShortcutPrivate::unsetShortcut()\n{\n    return unsetShortcutFallback();\n}\n\nquint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers)\n{\n    quint32 native = 0;\n    if (modifiers & Qt::ShiftModifier)\n        native |= shiftKey;\n    if (modifiers & Qt::ControlModifier)\n        native |= cmdKey;\n    if (modifiers & Qt::AltModifier)\n        native |= optionKey;\n    if (modifiers & Qt::MetaModifier)\n        native |= controlKey;\n    if (modifiers & Qt::KeypadModifier)\n        native |= kEventKeyModifierNumLockMask;\n    return native;\n}\n\n// This is only here to get it to compile on OSX\nbool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType,\n    void * message, NativeEventResult * result)\n{\n    Q_UNUSED(result)\n    Q_UNUSED(message)\n    Q_UNUSED(eventType)\n\n    return false;\n}\n\nquint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key, Qt::KeyboardModifiers)\n{\n    UTF16Char ch;\n    // Constants found in NSEvent.h from AppKit.framework\n    switch (key)\n    {\n    case Qt::Key_Return:\n        return kVK_Return;\n    case Qt::Key_Enter:\n        return kVK_ANSI_KeypadEnter;\n    case Qt::Key_Tab:\n        return kVK_Tab;\n    case Qt::Key_Space:\n        return kVK_Space;\n    case Qt::Key_Backspace:\n        return kVK_Delete;\n    case Qt::Key_Control:\n        return kVK_Command;\n    case Qt::Key_Shift:\n        return kVK_Shift;\n    case Qt::Key_CapsLock:\n        return kVK_CapsLock;\n    case Qt::Key_Option:\n        return kVK_Option;\n    case Qt::Key_Meta:\n        return kVK_Control;\n    case Qt::Key_F17:\n        return kVK_F17;\n    case Qt::Key_VolumeUp:\n        return kVK_VolumeUp;\n    case Qt::Key_VolumeDown:\n        return kVK_VolumeDown;\n    case Qt::Key_F18:\n        return kVK_F18;\n    case Qt::Key_F19:\n        return kVK_F19;\n    case Qt::Key_F20:\n        return kVK_F20;\n    case Qt::Key_F5:\n        return kVK_F5;\n    case Qt::Key_F6:\n        return kVK_F6;\n    case Qt::Key_F7:\n        return kVK_F7;\n    case Qt::Key_F3:\n        return kVK_F3;\n    case Qt::Key_F8:\n        return kVK_F8;\n    case Qt::Key_F9:\n        return kVK_F9;\n    case Qt::Key_F11:\n        return kVK_F11;\n    case Qt::Key_F13:\n        return kVK_F13;\n    case Qt::Key_F16:\n        return kVK_F16;\n    case Qt::Key_F14:\n        return kVK_F14;\n    case Qt::Key_F10:\n        return kVK_F10;\n    case Qt::Key_F12:\n        return kVK_F12;\n    case Qt::Key_F15:\n        return kVK_F15;\n    case Qt::Key_Help:\n        return kVK_Help;\n    case Qt::Key_Home:\n        return kVK_Home;\n    case Qt::Key_PageUp:\n        return kVK_PageUp;\n    case Qt::Key_Delete:\n        return kVK_ForwardDelete;\n    case Qt::Key_F4:\n        return kVK_F4;\n    case Qt::Key_End:\n        return kVK_End;\n    case Qt::Key_F2:\n        return kVK_F2;\n    case Qt::Key_PageDown:\n        return kVK_PageDown;\n    case Qt::Key_F1:\n        return kVK_F1;\n    case Qt::Key_Left:\n        return kVK_LeftArrow;\n    case Qt::Key_Right:\n        return kVK_RightArrow;\n    case Qt::Key_Down:\n        return kVK_DownArrow;\n    case Qt::Key_Up:\n        return kVK_UpArrow;\n    default:\n        ;\n    }\n\n    if (key == Qt::Key_Escape)\tch = 27;\n    else if (key == Qt::Key_Return) ch = 13;\n    else if (key == Qt::Key_Enter) ch = 3;\n    else if (key == Qt::Key_Tab) ch = 9;\n    else ch = key;\n\n    CFDataRef currentLayoutData;\n    TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();\n\n    if (currentKeyboard == nullptr)\n        return 0;\n\n    currentLayoutData = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);\n    CFRelease(currentKeyboard);\n    if (currentLayoutData == nullptr){//Japanese or Chinese always return null\n        currentKeyboard = TISCopyCurrentKeyboardLayoutInputSource();\n        currentLayoutData = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);\n        if(!currentLayoutData)\n            return 0;\n    }\n\n    UCKeyboardLayout* header = (UCKeyboardLayout*)CFDataGetBytePtr(currentLayoutData);\n    UCKeyboardTypeHeader* table = header->keyboardTypeList;\n\n    uint8_t *data = (uint8_t*)header;\n    // God, would a little documentation for this shit kill you...\n    for (quint32 i=0; i < header->keyboardTypeCount; i++)\n    {\n        UCKeyStateRecordsIndex* stateRec = 0;\n        if (table[i].keyStateRecordsIndexOffset != 0)\n        {\n            stateRec = reinterpret_cast<UCKeyStateRecordsIndex*>(data + table[i].keyStateRecordsIndexOffset);\n            if (stateRec->keyStateRecordsIndexFormat != kUCKeyStateRecordsIndexFormat) stateRec = 0;\n        }\n\n        UCKeyToCharTableIndex* charTable = reinterpret_cast<UCKeyToCharTableIndex*>(data + table[i].keyToCharTableIndexOffset);\n        if (charTable->keyToCharTableIndexFormat != kUCKeyToCharTableIndexFormat) continue;\n\n        for (quint32 j=0; j < charTable->keyToCharTableCount; j++)\n        {\n            UCKeyOutput* keyToChar = reinterpret_cast<UCKeyOutput*>(data + charTable->keyToCharTableOffsets[j]);\n            for (quint32 k=0; k < charTable->keyToCharTableSize; k++)\n            {\n                if (keyToChar[k] & kUCKeyOutputTestForIndexMask)\n                {\n                    long idx = keyToChar[k] & kUCKeyOutputGetIndexMask;\n                    if (stateRec && idx < stateRec->keyStateRecordCount)\n                    {\n                        UCKeyStateRecord* rec = reinterpret_cast<UCKeyStateRecord*>(data + stateRec->keyStateRecordOffsets[idx]);\n                        if (rec->stateZeroCharData == ch) return k;\n                    }\n                }\n                else if (!(keyToChar[k] & kUCKeyOutputSequenceIndexMask) && keyToChar[k] < 0xFFFE)\n                {\n                    if (keyToChar[k] == ch) return k;\n                }\n            } // for k\n        } // for j\n    } // for i\n\n    // The code above fails to translate keys like semicolon with Qt 5.7.1.\n    // Last resort is to try mapping the rest of the keys directly.\n    switch (key)\n    {\n    case Qt::Key_A:\n        return kVK_ANSI_A;\n    case Qt::Key_S:\n        return kVK_ANSI_S;\n    case Qt::Key_D:\n        return kVK_ANSI_D;\n    case Qt::Key_F:\n        return kVK_ANSI_F;\n    case Qt::Key_H:\n        return kVK_ANSI_H;\n    case Qt::Key_G:\n        return kVK_ANSI_G;\n    case Qt::Key_Z:\n        return kVK_ANSI_Z;\n    case Qt::Key_X:\n        return kVK_ANSI_X;\n    case Qt::Key_C:\n        return kVK_ANSI_C;\n    case Qt::Key_V:\n        return kVK_ANSI_V;\n    case Qt::Key_B:\n        return kVK_ANSI_B;\n    case Qt::Key_Q:\n        return kVK_ANSI_Q;\n    case Qt::Key_W:\n        return kVK_ANSI_W;\n    case Qt::Key_E:\n        return kVK_ANSI_E;\n    case Qt::Key_R:\n        return kVK_ANSI_R;\n    case Qt::Key_Y:\n        return kVK_ANSI_Y;\n    case Qt::Key_T:\n        return kVK_ANSI_T;\n    case Qt::Key_1:\n        return kVK_ANSI_1;\n    case Qt::Key_2:\n        return kVK_ANSI_2;\n    case Qt::Key_3:\n        return kVK_ANSI_3;\n    case Qt::Key_4:\n        return kVK_ANSI_4;\n    case Qt::Key_6:\n        return kVK_ANSI_6;\n    case Qt::Key_5:\n        return kVK_ANSI_5;\n    case Qt::Key_Equal:\n        return kVK_ANSI_Equal;\n    case Qt::Key_9:\n        return kVK_ANSI_9;\n    case Qt::Key_7:\n        return kVK_ANSI_7;\n    case Qt::Key_Minus:\n        return kVK_ANSI_Minus;\n    case Qt::Key_8:\n        return kVK_ANSI_8;\n    case Qt::Key_0:\n        return kVK_ANSI_0;\n    case Qt::Key_BracketRight:\n        return kVK_ANSI_RightBracket;\n    case Qt::Key_O:\n        return kVK_ANSI_O;\n    case Qt::Key_U:\n        return kVK_ANSI_U;\n    case Qt::Key_BracketLeft:\n        return kVK_ANSI_LeftBracket;\n    case Qt::Key_I:\n        return kVK_ANSI_I;\n    case Qt::Key_P:\n        return kVK_ANSI_P;\n    case Qt::Key_L:\n        return kVK_ANSI_L;\n    case Qt::Key_J:\n        return kVK_ANSI_J;\n    case Qt::Key_QuoteDbl:\n        return kVK_ANSI_Quote;\n    case Qt::Key_K:\n        return kVK_ANSI_K;\n    case Qt::Key_Semicolon:\n        return kVK_ANSI_Semicolon;\n    case Qt::Key_Backslash:\n        return kVK_ANSI_Backslash;\n    case Qt::Key_Comma:\n        return kVK_ANSI_Comma;\n    case Qt::Key_Slash:\n        return kVK_ANSI_Slash;\n    case Qt::Key_N:\n        return kVK_ANSI_N;\n    case Qt::Key_M:\n        return kVK_ANSI_M;\n    case Qt::Key_Period:\n        return kVK_ANSI_Period;\n    case Qt::Key_Dead_Grave:\n        return kVK_ANSI_Grave;\n    case Qt::Key_Asterisk:\n        return kVK_ANSI_KeypadMultiply;\n    case Qt::Key_Plus:\n        return kVK_ANSI_KeypadPlus;\n    case Qt::Key_Clear:\n        return kVK_ANSI_KeypadClear;\n    case Qt::Key_Escape:\n        return kVK_Escape;\n    default:\n        ;\n    }\n\n    return 0;\n}\n\nbool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods)\n{\n    if (!qxt_mac_handler_installed)\n    {\n        EventTypeSpec t;\n        t.eventClass = kEventClassKeyboard;\n        t.eventKind = kEventHotKeyPressed;\n        InstallApplicationEventHandler(&qxt_mac_handle_hot_key, 1, &t, nullptr, nullptr);\n    }\n\n    EventHotKeyID keyID;\n    keyID.signature = 'cute';\n    keyID.id = ++hotKeySerial;\n\n    EventHotKeyRef ref = 0;\n    bool rv = !RegisterEventHotKey(nativeKey, nativeMods, keyID, GetApplicationEventTarget(), 0, &ref);\n    if (rv)\n    {\n        keyIDs.insert(Identifier(nativeMods, nativeKey), keyID.id);\n        keyRefs.insert(keyID.id, ref);\n    }\n    return rv;\n}\n\nbool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods)\n{\n    Identifier id(nativeMods, nativeKey);\n    if (!keyIDs.contains(id)) return false;\n\n    EventHotKeyRef ref = keyRefs.take(keyIDs[id]);\n    keyIDs.remove(id);\n    return !UnregisterEventHotKey(ref);\n}\n"
  },
  {
    "path": "qxt/qxtglobalshortcut_p.h",
    "content": "/****************************************************************************\r\n** Copyright (c) 2006 - 2011, the LibQxt project.\r\n** See the Qxt AUTHORS file for a list of authors and copyright holders.\r\n** All rights reserved.\r\n**\r\n** Redistribution and use in source and binary forms, with or without\r\n** modification, are permitted provided that the following conditions are met:\r\n**     * Redistributions of source code must retain the above copyright\r\n**       notice, this list of conditions and the following disclaimer.\r\n**     * Redistributions in binary form must reproduce the above copyright\r\n**       notice, this list of conditions and the following disclaimer in the\r\n**       documentation and/or other materials provided with the distribution.\r\n**     * Neither the name of the LibQxt project nor the\r\n**       names of its contributors may be used to endorse or promote products\r\n**       derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\r\n** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\n** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n**\r\n** <http://libqxt.org>  <foundation@libqxt.org>\r\n*****************************************************************************/\r\n#pragma once\r\n\r\n#include <QAbstractEventDispatcher>\r\n#include <QHash>\r\n\r\nclass QKeySequence;\r\nclass QxtGlobalShortcut;\r\n\r\n#include <QAbstractNativeEventFilter>\r\n\r\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\r\nusing NativeEventResult = qintptr;\r\n#else\r\nusing NativeEventResult = long;\r\n#endif\r\n\r\nclass QxtGlobalShortcutPrivate\r\n    : public QAbstractNativeEventFilter\r\n{\r\npublic:\r\n    explicit QxtGlobalShortcutPrivate(QxtGlobalShortcut *q);\r\n    ~QxtGlobalShortcutPrivate();\r\n\r\n    bool enabled;\r\n    Qt::Key key;\r\n    Qt::KeyboardModifiers mods;\r\n    quint32 nativeKey;\r\n    quint32 nativeMods;\r\n    bool registered;\r\n    QString name;\r\n\r\n    void init();\r\n    void destroy();\r\n    bool setShortcut(const QKeySequence& shortcut);\r\n    bool unsetShortcut();\r\n\r\n    bool nativeEventFilter(\r\n        const QByteArray &eventType, void *message, NativeEventResult *result) override;\r\n\r\n    static void activateShortcut(quint32 nativeKey, quint32 nativeMods);\r\n\r\nprivate:\r\n    void initFallback();\r\n    void destroyFallback();\r\n    void setKeySequence(const QKeySequence& shortcut);\r\n    bool setShortcutFallback(const QKeySequence& shortcut);\r\n    bool unsetShortcutFallback();\r\n\r\n    QxtGlobalShortcut *q_ptr;\r\n\r\n    static quint32 nativeKeycode(Qt::Key keycode, Qt::KeyboardModifiers mods);\r\n    static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers);\r\n\r\n    static bool registerShortcut(quint32 nativeKey, quint32 nativeMods);\r\n    static bool unregisterShortcut(quint32 nativeKey, quint32 nativeMods);\r\n};\r\n"
  },
  {
    "path": "qxt/qxtglobalshortcut_win.cpp",
    "content": "#include \"qxtglobalshortcut_p.h\"\n/****************************************************************************\n** Copyright (c) 2006 - 2011, the LibQxt project.\n** See the Qxt AUTHORS file for a list of authors and copyright holders.\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without\n** modification, are permitted provided that the following conditions are met:\n**     * Redistributions of source code must retain the above copyright\n**       notice, this list of conditions and the following disclaimer.\n**     * Redistributions in binary form must reproduce the above copyright\n**       notice, this list of conditions and the following disclaimer in the\n**       documentation and/or other materials provided with the distribution.\n**     * Neither the name of the LibQxt project nor the\n**       names of its contributors may be used to endorse or promote products\n**       derived from this software without specific prior written permission.\n**\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n** <http://libqxt.org>  <foundation@libqxt.org>\n*****************************************************************************/\n\n#include <qt_windows.h>\n\nvoid QxtGlobalShortcutPrivate::init()\n{\n    initFallback();\n}\n\nvoid QxtGlobalShortcutPrivate::destroy()\n{\n    destroyFallback();\n}\n\nbool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut)\n{\n    return setShortcutFallback(shortcut);\n}\n\nbool QxtGlobalShortcutPrivate::unsetShortcut()\n{\n    return unsetShortcutFallback();\n}\n\nbool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType,\n    void * message, NativeEventResult * result)\n{\n    Q_UNUSED(eventType)\n    Q_UNUSED(result)\n    MSG* msg = static_cast<MSG*>(message);\n    if (msg->message == WM_HOTKEY)\n    {\n        const quint32 keycode = HIWORD(msg->lParam);\n        const quint32 modifiers = LOWORD(msg->lParam);\n        activateShortcut(keycode, modifiers);\n    }\n    return false;\n}\n\nquint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers)\n{\n    // MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN\n    quint32 native = 0;\n    if (modifiers & Qt::ShiftModifier)\n        native |= MOD_SHIFT;\n    if (modifiers & Qt::ControlModifier)\n        native |= MOD_CONTROL;\n    if (modifiers & Qt::AltModifier)\n        native |= MOD_ALT;\n    if (modifiers & Qt::MetaModifier)\n        native |= MOD_WIN;\n    // TODO: resolve these?\n    //if (modifiers & Qt::KeypadModifier)\n    //if (modifiers & Qt::GroupSwitchModifier)\n    return native;\n}\n\nquint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key, Qt::KeyboardModifiers)\n{\n    // Here is list of keys that presumably work on most keyboard layouts.\n    // Default branch is for keys that can change with keyboard layout.\n    switch (key)\n    {\n    case Qt::Key_Escape:\n        return VK_ESCAPE;\n    case Qt::Key_Tab:\n    case Qt::Key_Backtab:\n        return VK_TAB;\n    case Qt::Key_Backspace:\n        return VK_BACK;\n    case Qt::Key_Return:\n    case Qt::Key_Enter:\n        return VK_RETURN;\n    case Qt::Key_Insert:\n        return VK_INSERT;\n    case Qt::Key_Delete:\n        return VK_DELETE;\n    case Qt::Key_Pause:\n        return VK_PAUSE;\n    case Qt::Key_Print:\n        return VK_PRINT;\n    case Qt::Key_Clear:\n        return VK_CLEAR;\n    case Qt::Key_Home:\n        return VK_HOME;\n    case Qt::Key_End:\n        return VK_END;\n    case Qt::Key_Left:\n        return VK_LEFT;\n    case Qt::Key_Up:\n        return VK_UP;\n    case Qt::Key_Right:\n        return VK_RIGHT;\n    case Qt::Key_Down:\n        return VK_DOWN;\n    case Qt::Key_PageUp:\n        return VK_PRIOR;\n    case Qt::Key_PageDown:\n        return VK_NEXT;\n    case Qt::Key_F1:\n        return VK_F1;\n    case Qt::Key_F2:\n        return VK_F2;\n    case Qt::Key_F3:\n        return VK_F3;\n    case Qt::Key_F4:\n        return VK_F4;\n    case Qt::Key_F5:\n        return VK_F5;\n    case Qt::Key_F6:\n        return VK_F6;\n    case Qt::Key_F7:\n        return VK_F7;\n    case Qt::Key_F8:\n        return VK_F8;\n    case Qt::Key_F9:\n        return VK_F9;\n    case Qt::Key_F10:\n        return VK_F10;\n    case Qt::Key_F11:\n        return VK_F11;\n    case Qt::Key_F12:\n        return VK_F12;\n    case Qt::Key_F13:\n        return VK_F13;\n    case Qt::Key_F14:\n        return VK_F14;\n    case Qt::Key_F15:\n        return VK_F15;\n    case Qt::Key_F16:\n        return VK_F16;\n    case Qt::Key_F17:\n        return VK_F17;\n    case Qt::Key_F18:\n        return VK_F18;\n    case Qt::Key_F19:\n        return VK_F19;\n    case Qt::Key_F20:\n        return VK_F20;\n    case Qt::Key_F21:\n        return VK_F21;\n    case Qt::Key_F22:\n        return VK_F22;\n    case Qt::Key_F23:\n        return VK_F23;\n    case Qt::Key_F24:\n        return VK_F24;\n    case Qt::Key_Space:\n        return VK_SPACE;\n    case Qt::Key_Asterisk:\n        return VK_MULTIPLY;\n    case Qt::Key_Plus:\n        return VK_ADD;\n    case Qt::Key_Minus:\n        return VK_SUBTRACT;\n    case Qt::Key_Slash:\n        return VK_DIVIDE;\n    case Qt::Key_MediaNext:\n        return VK_MEDIA_NEXT_TRACK;\n    case Qt::Key_MediaPrevious:\n        return VK_MEDIA_PREV_TRACK;\n    case Qt::Key_MediaPlay:\n        return VK_MEDIA_PLAY_PAUSE;\n    case Qt::Key_MediaStop:\n        return VK_MEDIA_STOP;\n        // couldn't find those in VK_*\n        //case Qt::Key_MediaLast:\n        //case Qt::Key_MediaRecord:\n    case Qt::Key_VolumeDown:\n        return VK_VOLUME_DOWN;\n    case Qt::Key_VolumeUp:\n        return VK_VOLUME_UP;\n    case Qt::Key_VolumeMute:\n        return VK_VOLUME_MUTE;\n\n    default:\n        // Try to get virtual key from current keyboard layout or US.\n        const HKL layout = GetKeyboardLayout(0);\n        int vk = VkKeyScanEx(key, layout);\n        if (vk == -1) {\n            const HKL layoutUs = GetKeyboardLayout(0x409);\n            vk = VkKeyScanEx(key, layoutUs);\n        }\n        return vk == -1 ? 0 : vk;\n    }\n}\n\nbool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods)\n{\n    return RegisterHotKey(0, nativeMods ^ nativeKey, nativeMods, nativeKey);\n}\n\nbool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods)\n{\n    return UnregisterHotKey(0, nativeMods ^ nativeKey);\n}\n"
  },
  {
    "path": "qxt/qxtglobalshortcut_x11.cpp",
    "content": "#include \"qxtglobalshortcut_p.h\"\n/****************************************************************************\n** Copyright (c) 2006 - 2011, the LibQxt project.\n** See the Qxt AUTHORS file for a list of authors and copyright holders.\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without\n** modification, are permitted provided that the following conditions are met:\n**     * Redistributions of source code must retain the above copyright\n**       notice, this list of conditions and the following disclaimer.\n**     * Redistributions in binary form must reproduce the above copyright\n**       notice, this list of conditions and the following disclaimer in the\n**       documentation and/or other materials provided with the distribution.\n**     * Neither the name of the LibQxt project nor the\n**       names of its contributors may be used to endorse or promote products\n**       derived from this software without specific prior written permission.\n**\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n** <http://libqxt.org>  <foundation@libqxt.org>\n*****************************************************************************/\n\n#include \"qxtglobalshortcut.h\"\n\n#include \"platform/x11/x11info.h\"\n\n#include <QApplication>\n#include <QDBusInterface>\n#include <QDBusMetaType>\n#include <QDBusObjectPath>\n#include <QLoggingCategory>\n#include <QPointer>\n#include <QRandomGenerator>\n#include <QRegularExpression>\n#include <QTimer>\n#include <QVector>\n#include <QWidget>\n#include <X11/keysym.h>\n#include <X11/Xlib.h>\n\n#include <xcb/xcb.h>\n\n#include \"xcbkeyboard.h\"\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(qxtCategory)\nQ_LOGGING_CATEGORY(qxtCategory, \"copyq.globalshortcut\")\n\nbool usePortal()\n{\n    const bool usePortalFromEnv = qgetenv(\"COPYQ_USE_PORTAL\") == \"1\";\n    return usePortalFromEnv || !X11Info::isPlatformX11();\n}\n\n} // namespace\n\nclass GlobalShortcutsPortal : public QObject\n{\n    Q_OBJECT\npublic:\n    using PortalShortcut = QPair<QString, QVariantMap>;\n    using PortalShortcuts = QList<PortalShortcut>;\n\n    virtual ~GlobalShortcutsPortal()\n    {\n        disconnectPortal();\n    }\n\n    static GlobalShortcutsPortal *instance()\n    {\n        static GlobalShortcutsPortal portal;\n        return &portal;\n    }\n\n    bool isValid() const\n    {\n        return !m_objPathCreateSession.path().isEmpty();\n    }\n\n    void addShortcut(QxtGlobalShortcut *shortcut)\n    {\n        m_shortcuts.removeAll(nullptr);\n        if ( !m_shortcuts.contains(shortcut) ) {\n            m_shortcuts.append(shortcut);\n            m_timerBind.start();\n        }\n    }\n\n    void removeShortcut(QxtGlobalShortcut *shortcut)\n    {\n        m_shortcuts.removeAll(nullptr);\n        if ( m_shortcuts.contains(shortcut) ) {\n            m_shortcuts.removeAll(shortcut);\n            m_timerBind.start();\n        }\n    }\n\nprivate:\n    static QString normalizeShortcutString(const QString &shortcut)\n    {\n        return shortcut.toUpper().replace(\"SUPER\", \"LOGO\").replace(\"META\", \"LOGO\");\n    }\n\n    QString handleToken()\n    {\n        return QStringLiteral(\"%1_%2\")\n            .arg(m_portalToken)\n            .arg(QRandomGenerator::global()->generate());\n    }\n\n    QDBusObjectPath initPortalGlobalShortcuts()\n    {\n        qDBusRegisterMetaType<PortalShortcut>();\n        qDBusRegisterMetaType<PortalShortcuts>();\n\n        QDBusMessage message = m_globalShortcutInterface.call(\n            QStringLiteral(\"CreateSession\"),\n            QMap<QString, QVariant>{\n                {QStringLiteral(\"handle_token\"), handleToken()},\n                {QStringLiteral(\"session_handle_token\"), m_portalToken}\n            }\n        );\n\n        if (message.type() == QDBusMessage::ErrorMessage) {\n            qCWarning(qxtCategory)\n                << \"Failed to create portal global shortcuts session:\"\n                << message.errorMessage();\n            return {};\n        }\n\n        return message.arguments().first().value<QDBusObjectPath>();\n    }\n\n    void connectPortal()\n    {\n        m_objPathCreateSession = initPortalGlobalShortcuts();\n        if (!m_objPathCreateSession.path().isEmpty()) {\n            QDBusConnection::sessionBus().connect(\n                QStringLiteral(\"org.freedesktop.portal.Desktop\"),\n                m_objPathCreateSession.path(),\n                QStringLiteral(\"org.freedesktop.portal.Request\"),\n                QStringLiteral(\"Response\"),\n                this,\n                SLOT(onPortalSessionCreated(uint,QVariantMap))\n            );\n        }\n    }\n\n    void disconnectPortal()\n    {\n        if (!m_objPathCreateSession.path().isEmpty()) {\n            QDBusConnection::sessionBus().disconnect(\n                QStringLiteral(\"org.freedesktop.portal.Desktop\"),\n                m_objPathCreateSession.path(),\n                QStringLiteral(\"org.freedesktop.portal.Request\"),\n                QStringLiteral(\"Response\"),\n                this,\n                SLOT(onPortalSessionCreated(uint,QVariantMap))\n            );\n        }\n\n        if (!m_objPathListShortcuts.path().isEmpty()) {\n            QDBusConnection::sessionBus().disconnect(\n                QStringLiteral(\"org.freedesktop.portal.Desktop\"),\n                m_objPathListShortcuts.path(),\n                QStringLiteral(\"org.freedesktop.portal.Request\"),\n                QStringLiteral(\"Response\"),\n                this,\n                SLOT(onListShortcuts(uint,QVariantMap))\n            );\n        }\n\n        if (!m_objPathGlobalShortcuts.path().isEmpty()) {\n            QDBusConnection::sessionBus().disconnect(\n                QStringLiteral(\"org.freedesktop.portal.Desktop\"),\n                QStringLiteral(\"/org/freedesktop/portal/desktop\"),\n                QStringLiteral(\"org.freedesktop.portal.GlobalShortcuts\"),\n                QStringLiteral(\"Activated\"),\n                this,\n                SLOT(onPortalGlobalShortcutActivated(QDBusObjectPath,QString,qulonglong,QVariantMap))\n            );\n        }\n    }\n\n    void bindPortalGlobalShortcuts()\n    {\n        const QString descriptionPrefix = QCoreApplication::applicationName()\n            .replace(QStringLiteral(\"copyq\"), QStringLiteral(\"CopyQ\"));\n        PortalShortcuts shortcuts;\n        m_shortcuts.removeAll(nullptr);\n        for (const auto &shortcut : m_shortcuts) {\n            if (!shortcut->isEnabled())\n                continue;\n            const QString name = shortcut->name();\n            const QString description = QStringLiteral(\"%1 - %2\")\n                .arg(descriptionPrefix, name);\n            const QString preferredTrigger = shortcut->shortcut()\n                .toString(QKeySequence::PortableText)\n                .toUpper()\n                .replace(\"SUPER\", \"LOGO\")\n                .replace(\"META\", \"LOGO\");\n            // WORKAROUND: Include the shortcut in ID so it can be overridden.\n            // Works at least in KDE.\n            const QString shortcutId = QStringLiteral(\"%1||%2\").arg(preferredTrigger, name);\n            shortcuts.append({shortcutId, {\n                {QStringLiteral(\"description\"), description},\n                {QStringLiteral(\"preferred_trigger\"), preferredTrigger},\n            }});\n        }\n\n        std::sort(shortcuts.begin(), shortcuts.end(), [](const auto &a, const auto &b) {\n            return a.first < b.first;\n        });\n\n        if (shortcuts.isEmpty() || shortcuts == m_boundShortcuts)\n            return;\n\n        // Shortcuts can be bound only once per session.\n        // Notify user to restart the app.\n        if (m_bound) {\n            qCDebug(qxtCategory) << \"Can bind portal global shortcuts only once per session\";\n            if (m_notifyRestart) {\n                m_notifyRestart = false;\n                QxtGlobalShortcut::notifyRestartNeeded();\n            }\n            return;\n        }\n\n        // WORKAROUND: Reset old shortcuts if they are not available anymore.\n        // There is no API to unbind old shortcuts.\n        // This works in KDE: Changing ID to some unused value and keeping the\n        // description allows to override the old shortcut.\n        for (const auto &oldShortcut : m_boundShortcuts) {\n            auto it = std::find_if(shortcuts.begin(), shortcuts.end(),\n                [&oldShortcut](const auto &s) { return s.first == oldShortcut.first; });\n            if (it == shortcuts.cend()) {\n                const QString shortcutId = QStringLiteral(\"OBSOLETE||%1\").arg(oldShortcut.first);\n                shortcuts.append({shortcutId, {\n                    {QStringLiteral(\"description\"), oldShortcut.second.value(QStringLiteral(\"description\"))},\n                    {QStringLiteral(\"preferred_trigger\"), QString()},\n                }});\n            }\n        }\n\n        qCDebug(qxtCategory) << \"Binding portal global shortcuts:\" << shortcuts;\n\n        const QDBusMessage message = m_globalShortcutInterface.call(\n            QStringLiteral(\"BindShortcuts\"),\n            m_objPathGlobalShortcuts,\n            QVariant::fromValue(shortcuts),\n            QString(),\n            QMap<QString, QVariant>{\n                {QStringLiteral(\"handle_token\"), handleToken()},\n            }\n        );\n\n        if (message.type() == QDBusMessage::ErrorMessage) {\n            qCWarning(qxtCategory) << \"Failed to bind portal global shortcuts:\"\n                << message.errorMessage();\n        }\n\n        m_boundShortcuts = shortcuts;\n        m_bound = true;\n    }\n\n    GlobalShortcutsPortal()\n        : m_globalShortcutInterface(\n            QStringLiteral(\"org.freedesktop.portal.Desktop\"),\n            QStringLiteral(\"/org/freedesktop/portal/desktop\"),\n            QStringLiteral(\"org.freedesktop.portal.GlobalShortcuts\")\n        )\n        , m_portalToken(\n            // Use only valid token name characters.\n            QCoreApplication::applicationName().replace(\n                QRegularExpression(QStringLiteral(\"[^A-Za-z0-9_]+\")), QStringLiteral(\"_\"))\n        )\n    {\n        m_timerBind.setSingleShot(true);\n        m_timerBind.setInterval(0);\n        connectPortal();\n    }\n\n    void listShortcuts()\n    {\n        const QDBusMessage message = m_globalShortcutInterface.call(\n            QStringLiteral(\"ListShortcuts\"),\n            m_objPathGlobalShortcuts,\n            QMap<QString, QVariant>{\n                {QStringLiteral(\"handle_token\"), handleToken()},\n            }\n        );\n\n        if (message.type() == QDBusMessage::ErrorMessage) {\n            qCWarning(qxtCategory) << \"Failed to list portal global shortcuts:\"\n                << message.errorMessage();\n            return;\n        }\n\n        m_objPathListShortcuts = message.arguments().first().value<QDBusObjectPath>();\n\n        QDBusConnection::sessionBus().connect(\n            QStringLiteral(\"org.freedesktop.portal.Desktop\"),\n            m_objPathListShortcuts.path(),\n            QStringLiteral(\"org.freedesktop.portal.Request\"),\n            QStringLiteral(\"Response\"),\n            this,\n            SLOT(onListShortcuts(uint,QVariantMap))\n        );\n    }\n\nprivate slots:\n    void onListShortcuts(uint responseCode, const QVariantMap& results)\n    {\n        if (responseCode != 0) {\n            qCWarning(qxtCategory) << \"Failed to list portal global shortcuts:\"\n                << responseCode << results;\n            return;\n        }\n\n        const auto arg = results.value(QStringLiteral(\"shortcuts\")).value<QDBusArgument>();\n        arg >> m_boundShortcuts;\n        const auto it = std::remove_if(m_boundShortcuts.begin(), m_boundShortcuts.end(),\n            [](const auto &shortcut) {\n                return shortcut.second.value(QStringLiteral(\"trigger_description\")).toString().isEmpty();\n            });\n        m_boundShortcuts.erase(it, m_boundShortcuts.end());\n        for (auto &shortcut : m_boundShortcuts) {\n            const auto trigger = shortcut.second.take(QStringLiteral(\"trigger_description\")).toString();\n            shortcut.second[QStringLiteral(\"preferred_trigger\")] = normalizeShortcutString(trigger);\n        }\n        std::sort(m_boundShortcuts.begin(), m_boundShortcuts.end(), [](const auto &a, const auto &b) {\n            return a.first < b.first;\n        });\n        qCDebug(qxtCategory) << \"Previously registered shortcuts:\" << m_boundShortcuts;\n\n        connect(\n            &m_timerBind, &QTimer::timeout,\n            this, &GlobalShortcutsPortal::bindPortalGlobalShortcuts);\n\n        QDBusConnection::sessionBus().connect(\n            QStringLiteral(\"org.freedesktop.portal.Desktop\"),\n            QStringLiteral(\"/org/freedesktop/portal/desktop\"),\n            QStringLiteral(\"org.freedesktop.portal.GlobalShortcuts\"),\n            QStringLiteral(\"Activated\"),\n            this,\n            SLOT(onPortalGlobalShortcutActivated(QDBusObjectPath,QString,qulonglong,QVariantMap))\n        );\n\n        m_timerBind.start();\n    }\n\n    void onPortalSessionCreated(uint responseCode, const QVariantMap& results)\n    {\n        if (responseCode != 0) {\n            qCWarning(qxtCategory) << \"Failed to create portal global shortcuts session:\"\n                << responseCode << results;\n            return;\n        }\n\n        m_objPathGlobalShortcuts = QDBusObjectPath(\n            results.value(QStringLiteral(\"session_handle\")).value<QString>());\n        if (m_objPathGlobalShortcuts.path().isEmpty()) {\n            qCWarning(qxtCategory) << \"Failed to get portal global shortcuts session path:\" << results;\n            return;\n        }\n\n        qCDebug(qxtCategory) << \"Portal global shortcut session:\"\n            << m_objPathGlobalShortcuts.path();\n\n        disconnectPortal();\n\n        listShortcuts();\n    }\n\n    void onPortalGlobalShortcutActivated(\n        const QDBusObjectPath &,\n        const QString &shortcutId,\n        qulonglong ,\n        const QVariantMap &)\n    {\n        const QString shortcutName = shortcutId.section(\"||\", 1, 1);\n        for (const auto &shortcut : m_shortcuts) {\n            if (shortcut && shortcut->name() == shortcutName) {\n                qCDebug(qxtCategory) << \"Portal global shortcut activated:\" << shortcutId;\n                shortcut->activate();\n                return;\n            }\n        }\n        qCWarning(qxtCategory) << \"Portal global shortcut failed to activate:\" << shortcutName;\n    }\n\nprivate:\n    bool m_bound = false;\n    PortalShortcuts m_boundShortcuts;\n    bool m_notifyRestart = true;\n    QDBusInterface m_globalShortcutInterface;\n    QString m_portalToken;\n    QDBusObjectPath m_objPathCreateSession;\n    QDBusObjectPath m_objPathListShortcuts;\n    QDBusObjectPath m_objPathGlobalShortcuts;\n    QTimer m_timerBind;\n    QList<QPointer<QxtGlobalShortcut>> m_shortcuts;\n};\n\nnamespace {\n\n/**\n * Creates first invisible application window\n * so X11 key press events can be received.\n *\n * This is used for Cinnamon and KDE.\n */\nvoid createFirstWindow()\n{\n    static QWidget *w = nullptr;\n    if (!w) {\n        // Try hard so the window is not visible.\n\n        // Tool tips won't show in taskbar.\n        w = new QWidget(nullptr, Qt::ToolTip);\n        w->setWindowTitle(QStringLiteral(\"Dummy\"));\n        w->setWindowRole(QStringLiteral(\"dummy\"));\n\n        // Move out of screen (if it's not possible to show the window minimized).\n        w->resize(1, 1);\n        w->move(-100000, -100000);\n\n        // Show and hide quickly.\n        w->showMinimized();\n        w->hide();\n    }\n}\n\nQVector<quint32> maskModifiers()\n{\n    return QVector<quint32>() << 0 << Mod2Mask << LockMask << (Mod2Mask | LockMask);\n}\n\nusing X11ErrorHandler = int (*)(Display* display, XErrorEvent* event);\n\nclass QxtX11ErrorHandler final {\npublic:\n    static bool error;\n\n    static int qxtX11ErrorHandler(Display* display, XErrorEvent *event)\n    {\n        Q_UNUSED(display)\n        switch (event->error_code)\n        {\n            case BadAccess:\n            case BadValue:\n            case BadWindow:\n                if (event->request_code == 33 /* X_GrabKey */ ||\n                        event->request_code == 34 /* X_UngrabKey */)\n                {\n                    error = true;\n                    //TODO:\n                    //char errstr[256];\n                    //XGetErrorText(dpy, err->error_code, errstr, 256);\n                }\n        }\n        return 0;\n    }\n\n    QxtX11ErrorHandler()\n        : m_previousErrorHandler(nullptr)\n    {\n        error = false;\n        m_previousErrorHandler = XSetErrorHandler(qxtX11ErrorHandler);\n    }\n\n    ~QxtX11ErrorHandler()\n    {\n        XSetErrorHandler(m_previousErrorHandler);\n    }\n\nprivate:\n    X11ErrorHandler m_previousErrorHandler;\n};\n\nbool QxtX11ErrorHandler::error = false;\n\nclass QxtX11Data final {\npublic:\n    QxtX11Data()\n        : m_display(nullptr)\n    {\n        if ( !usePortal() ) {\n            createFirstWindow();\n            m_display = X11Info::display();\n        }\n    }\n\n    bool isValid()\n    {\n        return X11Info::isPlatformX11() && m_display != nullptr;\n    }\n\n    Display *display()\n    {\n        Q_ASSERT(isValid());\n        return m_display;\n    }\n\n    Window rootWindow()\n    {\n        return DefaultRootWindow(display());\n    }\n\n    bool grabKey(quint32 keycode, quint32 modifiers, Window window)\n    {\n        QxtX11ErrorHandler errorHandler;\n\n        for (const auto maskMods : maskModifiers()) {\n            XGrabKey(display(), static_cast<int>(keycode), modifiers | maskMods, window, True,\n                     GrabModeAsync, GrabModeAsync);\n            if (errorHandler.error)\n                break;\n        }\n\n        if (errorHandler.error) {\n            ungrabKey(keycode, modifiers, window);\n            return false;\n        }\n\n        return true;\n    }\n\n    bool ungrabKey(quint32 keycode, quint32 modifiers, Window window)\n    {\n        QxtX11ErrorHandler errorHandler;\n\n        for (const auto maskMods : maskModifiers()) {\n            XUngrabKey(display(), static_cast<int>(keycode), modifiers | maskMods, window);\n        }\n\n        return !errorHandler.error;\n    }\n\nprivate:\n    Display *m_display;\n};\n\nKeySym qtKeyToXKeySym(Qt::Key key, Qt::KeyboardModifiers mods)\n{\n    int i = 0;\n\n    if ( mods.testFlag(Qt::KeypadModifier) ) {\n        switch (key) {\n        case Qt::Key_0: return XK_KP_Insert;\n        case Qt::Key_1: return XK_KP_End;\n        case Qt::Key_2: return XK_KP_Down;\n        case Qt::Key_3: return XK_KP_Page_Down;\n        case Qt::Key_4: return XK_KP_Left;\n        case Qt::Key_5: return XK_KP_Begin;\n        case Qt::Key_6: return XK_KP_Right;\n        case Qt::Key_7: return XK_KP_Home;\n        case Qt::Key_8: return XK_KP_Up;\n        case Qt::Key_9: return XK_KP_Page_Up;\n        default: break;\n        }\n\n        for (; KeyTbl[i] != 0; i += 2) {\n            if (KeyTbl[i] == XK_Num_Lock)\n                break;\n        }\n    } else {\n        const auto keySym = XStringToKeysym(QKeySequence(key).toString().toLatin1().data());\n        if (keySym != NoSymbol)\n            return keySym;\n    }\n\n    for (; KeyTbl[i] != 0; i += 2) {\n        if (KeyTbl[i + 1] == key)\n            return KeyTbl[i];\n    }\n\n    return static_cast<ushort>(key);\n}\n\n} // namespace\n\nbool QxtGlobalShortcutPrivate::nativeEventFilter(\n    const QByteArray &eventType, void *message, NativeEventResult *result)\n{\n    Q_UNUSED(result)\n\n    xcb_key_press_event_t *kev = nullptr;\n    if (eventType == \"xcb_generic_event_t\") {\n        xcb_generic_event_t* ev = static_cast<xcb_generic_event_t *>(message);\n        if ((ev->response_type & 127) == XCB_KEY_PRESS)\n            kev = static_cast<xcb_key_press_event_t *>(message);\n    }\n\n    if (kev != nullptr) {\n        unsigned int keycode = kev->detail;\n        unsigned int keystate = 0;\n        if(kev->state & XCB_MOD_MASK_1)\n            keystate |= Mod1Mask;\n        if(kev->state & XCB_MOD_MASK_CONTROL)\n            keystate |= ControlMask;\n        if(kev->state & XCB_MOD_MASK_4)\n            keystate |= Mod4Mask;\n        if(kev->state & XCB_MOD_MASK_SHIFT)\n            keystate |= ShiftMask;\n        activateShortcut(keycode,\n            // Mod1Mask == Alt, Mod4Mask == Meta\n            keystate & (ShiftMask | ControlMask | Mod1Mask | Mod4Mask));\n    }\n    return false;\n}\n\nvoid QxtGlobalShortcutPrivate::init()\n{\n    if ( !usePortal() )\n        initFallback();\n}\n\nvoid QxtGlobalShortcutPrivate::destroy()\n{\n    if ( !usePortal() )\n        destroyFallback();\n}\n\nbool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut)\n{\n    if ( !usePortal() )\n        return setShortcutFallback(shortcut);\n\n    auto portal = GlobalShortcutsPortal::instance();\n    if (!portal->isValid())\n        return false;\n\n    setKeySequence(shortcut);\n    portal->addShortcut(q_ptr);\n    registered = true;\n    return true;\n}\n\nbool QxtGlobalShortcutPrivate::unsetShortcut()\n{\n    if ( !usePortal() )\n        return unsetShortcutFallback();\n\n    auto portal = GlobalShortcutsPortal::instance();\n    portal->removeShortcut(q_ptr);\n    registered = false;\n    return true;\n}\n\nquint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers)\n{\n    if ( usePortal() )\n        return 0;\n\n    // ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask\n    quint32 native = 0;\n    if (modifiers & Qt::ShiftModifier)\n        native |= ShiftMask;\n    if (modifiers & Qt::ControlModifier)\n        native |= ControlMask;\n    if (modifiers & Qt::AltModifier)\n        native |= Mod1Mask;\n    if (modifiers & Qt::MetaModifier)\n        native |= Mod4Mask;\n\n    // TODO: resolve these?\n    //if (modifiers & Qt::MetaModifier)\n    //if (modifiers & Qt::KeypadModifier)\n    //if (modifiers & Qt::GroupSwitchModifier)\n    return native;\n}\n\nquint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key, Qt::KeyboardModifiers mods)\n{\n    QxtX11Data x11;\n    if (!x11.isValid())\n        return 0;\n\n    const KeySym keysym = qtKeyToXKeySym(key, mods);\n    return XKeysymToKeycode(x11.display(), keysym);\n}\n\nbool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods)\n{\n    QxtX11Data x11;\n    return x11.isValid() && x11.grabKey(nativeKey, nativeMods, x11.rootWindow());\n}\n\nbool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods)\n{\n    QxtX11Data x11;\n    return x11.isValid() && x11.ungrabKey(nativeKey, nativeMods, x11.rootWindow());\n}\n\n#include \"qxtglobalshortcut_x11.moc\"\n"
  },
  {
    "path": "qxt/xcbkeyboard.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2016 The Qt Company Ltd.\n** Contact: https://www.qt.io/licensing/\n**\n** This file is part of the plugins of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see https://www.qt.io/terms-conditions. For further\n** information use the contact form at https://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or (at your option) the GNU General\n** Public license version 3 or any later version approved by the KDE Free\n** Qt Foundation. The licenses are as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3\n** included in the packaging of this file. Please review the following\n** information to ensure the GNU General Public License requirements will\n** be met: https://www.gnu.org/licenses/gpl-2.0.html and\n** https://www.gnu.org/licenses/gpl-3.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n#pragma once\n\n// Following definitions and table are taken from\n// \"qt5/qtbase/src/plugins/platforms/xcb/qxcbkeyboard.cpp\".\n\n#include <Qt>\n#include <X11/keysym.h>\n\n#ifndef XK_ISO_Left_Tab\n#define XK_ISO_Left_Tab         0xFE20\n#endif\n\n#ifndef XK_dead_hook\n#define XK_dead_hook            0xFE61\n#endif\n\n#ifndef XK_dead_horn\n#define XK_dead_horn            0xFE62\n#endif\n\n#ifndef XK_Codeinput\n#define XK_Codeinput            0xFF37\n#endif\n\n#ifndef XK_Kanji_Bangou\n#define XK_Kanji_Bangou         0xFF37 /* same as codeinput */\n#endif\n\n// Fix old X libraries\n#ifndef XK_KP_Home\n#define XK_KP_Home              0xFF95\n#endif\n#ifndef XK_KP_Left\n#define XK_KP_Left              0xFF96\n#endif\n#ifndef XK_KP_Up\n#define XK_KP_Up                0xFF97\n#endif\n#ifndef XK_KP_Right\n#define XK_KP_Right             0xFF98\n#endif\n#ifndef XK_KP_Down\n#define XK_KP_Down              0xFF99\n#endif\n#ifndef XK_KP_Prior\n#define XK_KP_Prior             0xFF9A\n#endif\n#ifndef XK_KP_Next\n#define XK_KP_Next              0xFF9B\n#endif\n#ifndef XK_KP_End\n#define XK_KP_End               0xFF9C\n#endif\n#ifndef XK_KP_Insert\n#define XK_KP_Insert            0xFF9E\n#endif\n#ifndef XK_KP_Delete\n#define XK_KP_Delete            0xFF9F\n#endif\n\n// the next lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special\n// multimedia keys. They are included here as not every system has them.\n#define XF86XK_MonBrightnessUp     0x1008FF02\n#define XF86XK_MonBrightnessDown   0x1008FF03\n#define XF86XK_KbdLightOnOff       0x1008FF04\n#define XF86XK_KbdBrightnessUp     0x1008FF05\n#define XF86XK_KbdBrightnessDown   0x1008FF06\n#define XF86XK_Standby             0x1008FF10\n#define XF86XK_AudioLowerVolume    0x1008FF11\n#define XF86XK_AudioMute           0x1008FF12\n#define XF86XK_AudioRaiseVolume    0x1008FF13\n#define XF86XK_AudioPlay           0x1008FF14\n#define XF86XK_AudioStop           0x1008FF15\n#define XF86XK_AudioPrev           0x1008FF16\n#define XF86XK_AudioNext           0x1008FF17\n#define XF86XK_HomePage            0x1008FF18\n#define XF86XK_Mail                0x1008FF19\n#define XF86XK_Start               0x1008FF1A\n#define XF86XK_Search              0x1008FF1B\n#define XF86XK_AudioRecord         0x1008FF1C\n#define XF86XK_Calculator          0x1008FF1D\n#define XF86XK_Memo                0x1008FF1E\n#define XF86XK_ToDoList            0x1008FF1F\n#define XF86XK_Calendar            0x1008FF20\n#define XF86XK_PowerDown           0x1008FF21\n#define XF86XK_ContrastAdjust      0x1008FF22\n#define XF86XK_Back                0x1008FF26\n#define XF86XK_Forward             0x1008FF27\n#define XF86XK_Stop                0x1008FF28\n#define XF86XK_Refresh             0x1008FF29\n#define XF86XK_PowerOff            0x1008FF2A\n#define XF86XK_WakeUp              0x1008FF2B\n#define XF86XK_Eject               0x1008FF2C\n#define XF86XK_ScreenSaver         0x1008FF2D\n#define XF86XK_WWW                 0x1008FF2E\n#define XF86XK_Sleep               0x1008FF2F\n#define XF86XK_Favorites           0x1008FF30\n#define XF86XK_AudioPause          0x1008FF31\n#define XF86XK_AudioMedia          0x1008FF32\n#define XF86XK_MyComputer          0x1008FF33\n#define XF86XK_LightBulb           0x1008FF35\n#define XF86XK_Shop                0x1008FF36\n#define XF86XK_History             0x1008FF37\n#define XF86XK_OpenURL             0x1008FF38\n#define XF86XK_AddFavorite         0x1008FF39\n#define XF86XK_HotLinks            0x1008FF3A\n#define XF86XK_BrightnessAdjust    0x1008FF3B\n#define XF86XK_Finance             0x1008FF3C\n#define XF86XK_Community           0x1008FF3D\n#define XF86XK_AudioRewind         0x1008FF3E\n#define XF86XK_BackForward         0x1008FF3F\n#define XF86XK_Launch0             0x1008FF40\n#define XF86XK_Launch1             0x1008FF41\n#define XF86XK_Launch2             0x1008FF42\n#define XF86XK_Launch3             0x1008FF43\n#define XF86XK_Launch4             0x1008FF44\n#define XF86XK_Launch5             0x1008FF45\n#define XF86XK_Launch6             0x1008FF46\n#define XF86XK_Launch7             0x1008FF47\n#define XF86XK_Launch8             0x1008FF48\n#define XF86XK_Launch9             0x1008FF49\n#define XF86XK_LaunchA             0x1008FF4A\n#define XF86XK_LaunchB             0x1008FF4B\n#define XF86XK_LaunchC             0x1008FF4C\n#define XF86XK_LaunchD             0x1008FF4D\n#define XF86XK_LaunchE             0x1008FF4E\n#define XF86XK_LaunchF             0x1008FF4F\n#define XF86XK_ApplicationLeft     0x1008FF50\n#define XF86XK_ApplicationRight    0x1008FF51\n#define XF86XK_Book                0x1008FF52\n#define XF86XK_CD                  0x1008FF53\n#define XF86XK_Calculater          0x1008FF54\n#define XF86XK_Clear               0x1008FF55\n#define XF86XK_ClearGrab           0x1008FE21\n#define XF86XK_Close               0x1008FF56\n#define XF86XK_Copy                0x1008FF57\n#define XF86XK_Cut                 0x1008FF58\n#define XF86XK_Display             0x1008FF59\n#define XF86XK_DOS                 0x1008FF5A\n#define XF86XK_Documents           0x1008FF5B\n#define XF86XK_Excel               0x1008FF5C\n#define XF86XK_Explorer            0x1008FF5D\n#define XF86XK_Game                0x1008FF5E\n#define XF86XK_Go                  0x1008FF5F\n#define XF86XK_iTouch              0x1008FF60\n#define XF86XK_LogOff              0x1008FF61\n#define XF86XK_Market              0x1008FF62\n#define XF86XK_Meeting             0x1008FF63\n#define XF86XK_MenuKB              0x1008FF65\n#define XF86XK_MenuPB              0x1008FF66\n#define XF86XK_MySites             0x1008FF67\n#define XF86XK_New                 0x1008FF68\n#define XF86XK_News                0x1008FF69\n#define XF86XK_OfficeHome          0x1008FF6A\n#define XF86XK_Open                0x1008FF6B\n#define XF86XK_Option              0x1008FF6C\n#define XF86XK_Paste               0x1008FF6D\n#define XF86XK_Phone               0x1008FF6E\n#define XF86XK_Reply               0x1008FF72\n#define XF86XK_Reload              0x1008FF73\n#define XF86XK_RotateWindows       0x1008FF74\n#define XF86XK_RotationPB          0x1008FF75\n#define XF86XK_RotationKB          0x1008FF76\n#define XF86XK_Save                0x1008FF77\n#define XF86XK_Send                0x1008FF7B\n#define XF86XK_Spell               0x1008FF7C\n#define XF86XK_SplitScreen         0x1008FF7D\n#define XF86XK_Support             0x1008FF7E\n#define XF86XK_TaskPane            0x1008FF7F\n#define XF86XK_Terminal            0x1008FF80\n#define XF86XK_Tools               0x1008FF81\n#define XF86XK_Travel              0x1008FF82\n#define XF86XK_Video               0x1008FF87\n#define XF86XK_Word                0x1008FF89\n#define XF86XK_Xfer                0x1008FF8A\n#define XF86XK_ZoomIn              0x1008FF8B\n#define XF86XK_ZoomOut             0x1008FF8C\n#define XF86XK_Away                0x1008FF8D\n#define XF86XK_Messenger           0x1008FF8E\n#define XF86XK_WebCam              0x1008FF8F\n#define XF86XK_MailForward         0x1008FF90\n#define XF86XK_Pictures            0x1008FF91\n#define XF86XK_Music               0x1008FF92\n#define XF86XK_Battery             0x1008FF93\n#define XF86XK_Bluetooth           0x1008FF94\n#define XF86XK_WLAN                0x1008FF95\n#define XF86XK_UWB                 0x1008FF96\n#define XF86XK_AudioForward        0x1008FF97\n#define XF86XK_AudioRepeat         0x1008FF98\n#define XF86XK_AudioRandomPlay     0x1008FF99\n#define XF86XK_Subtitle            0x1008FF9A\n#define XF86XK_AudioCycleTrack     0x1008FF9B\n#define XF86XK_Time                0x1008FF9F\n#define XF86XK_Select              0x1008FFA0\n#define XF86XK_View                0x1008FFA1\n#define XF86XK_TopMenu             0x1008FFA2\n#define XF86XK_Red                 0x1008FFA3\n#define XF86XK_Green               0x1008FFA4\n#define XF86XK_Yellow              0x1008FFA5\n#define XF86XK_Blue                0x1008FFA6\n#define XF86XK_Suspend             0x1008FFA7\n#define XF86XK_Hibernate           0x1008FFA8\n#define XF86XK_TouchpadToggle      0x1008FFA9\n#define XF86XK_TouchpadOn          0x1008FFB0\n#define XF86XK_TouchpadOff         0x1008FFB1\n#define XF86XK_AudioMicMute        0x1008FFB2\n\n\n// end of XF86keysyms.h\n\n// keyboard mapping table\nstatic const unsigned int KeyTbl[] = {\n\n    // misc keys\n\n    XK_Escape,                  Qt::Key_Escape,\n    XK_Tab,                     Qt::Key_Tab,\n    XK_ISO_Left_Tab,            Qt::Key_Backtab,\n    XK_BackSpace,               Qt::Key_Backspace,\n    XK_Return,                  Qt::Key_Return,\n    XK_Insert,                  Qt::Key_Insert,\n    XK_Delete,                  Qt::Key_Delete,\n    XK_Clear,                   Qt::Key_Delete,\n    XK_Pause,                   Qt::Key_Pause,\n    XK_Print,                   Qt::Key_Print,\n    0x1005FF60,                 Qt::Key_SysReq,         // hardcoded Sun SysReq\n    0x1007ff00,                 Qt::Key_SysReq,         // hardcoded X386 SysReq\n\n    // cursor movement\n\n    XK_Home,                    Qt::Key_Home,\n    XK_End,                     Qt::Key_End,\n    XK_Left,                    Qt::Key_Left,\n    XK_Up,                      Qt::Key_Up,\n    XK_Right,                   Qt::Key_Right,\n    XK_Down,                    Qt::Key_Down,\n    XK_Prior,                   Qt::Key_PageUp,\n    XK_Next,                    Qt::Key_PageDown,\n\n    // modifiers\n\n    XK_Shift_L,                 Qt::Key_Shift,\n    XK_Shift_R,                 Qt::Key_Shift,\n    XK_Shift_Lock,              Qt::Key_Shift,\n    XK_Control_L,               Qt::Key_Control,\n    XK_Control_R,               Qt::Key_Control,\n    XK_Meta_L,                  Qt::Key_Meta,\n    XK_Meta_R,                  Qt::Key_Meta,\n    XK_Alt_L,                   Qt::Key_Alt,\n    XK_Alt_R,                   Qt::Key_Alt,\n    XK_Caps_Lock,               Qt::Key_CapsLock,\n    XK_Num_Lock,                Qt::Key_NumLock,\n    XK_Scroll_Lock,             Qt::Key_ScrollLock,\n    XK_Super_L,                 Qt::Key_Super_L,\n    XK_Super_R,                 Qt::Key_Super_R,\n    XK_Menu,                    Qt::Key_Menu,\n    XK_Hyper_L,                 Qt::Key_Hyper_L,\n    XK_Hyper_R,                 Qt::Key_Hyper_R,\n    XK_Help,                    Qt::Key_Help,\n    0x1000FF74,                 Qt::Key_Backtab,        // hardcoded HP backtab\n    0x1005FF10,                 Qt::Key_F11,            // hardcoded Sun F36 (labeled F11)\n    0x1005FF11,                 Qt::Key_F12,            // hardcoded Sun F37 (labeled F12)\n\n    // numeric and function keypad keys\n\n    XK_KP_Space,                Qt::Key_Space,\n    XK_KP_Tab,                  Qt::Key_Tab,\n    XK_KP_Enter,                Qt::Key_Enter,\n    //XK_KP_F1,                 Qt::Key_F1,\n    //XK_KP_F2,                 Qt::Key_F2,\n    //XK_KP_F3,                 Qt::Key_F3,\n    //XK_KP_F4,                 Qt::Key_F4,\n    XK_KP_Home,                 Qt::Key_Home,\n    XK_KP_Left,                 Qt::Key_Left,\n    XK_KP_Up,                   Qt::Key_Up,\n    XK_KP_Right,                Qt::Key_Right,\n    XK_KP_Down,                 Qt::Key_Down,\n    XK_KP_Prior,                Qt::Key_PageUp,\n    XK_KP_Next,                 Qt::Key_PageDown,\n    XK_KP_End,                  Qt::Key_End,\n    XK_KP_Begin,                Qt::Key_Clear,\n    XK_KP_Insert,               Qt::Key_Insert,\n    XK_KP_Delete,               Qt::Key_Delete,\n    XK_KP_Equal,                Qt::Key_Equal,\n    XK_KP_Multiply,             Qt::Key_Asterisk,\n    XK_KP_Add,                  Qt::Key_Plus,\n    XK_KP_Separator,            Qt::Key_Comma,\n    XK_KP_Subtract,             Qt::Key_Minus,\n    XK_KP_Decimal,              Qt::Key_Period,\n    XK_KP_Divide,               Qt::Key_Slash,\n\n    // International input method support keys\n\n    // International & multi-key character composition\n    XK_ISO_Level3_Shift,        Qt::Key_AltGr,\n    XK_Multi_key,               Qt::Key_Multi_key,\n    XK_Codeinput,               Qt::Key_Codeinput,\n    XK_SingleCandidate,         Qt::Key_SingleCandidate,\n    XK_MultipleCandidate,       Qt::Key_MultipleCandidate,\n    XK_PreviousCandidate,       Qt::Key_PreviousCandidate,\n\n    // Misc Functions\n    XK_Mode_switch,             Qt::Key_Mode_switch,\n    XK_script_switch,           Qt::Key_Mode_switch,\n\n    // Japanese keyboard support\n    XK_Kanji,                   Qt::Key_Kanji,\n    XK_Muhenkan,                Qt::Key_Muhenkan,\n    //XK_Henkan_Mode,           Qt::Key_Henkan_Mode,\n    XK_Henkan_Mode,             Qt::Key_Henkan,\n    XK_Henkan,                  Qt::Key_Henkan,\n    XK_Romaji,                  Qt::Key_Romaji,\n    XK_Hiragana,                Qt::Key_Hiragana,\n    XK_Katakana,                Qt::Key_Katakana,\n    XK_Hiragana_Katakana,       Qt::Key_Hiragana_Katakana,\n    XK_Zenkaku,                 Qt::Key_Zenkaku,\n    XK_Hankaku,                 Qt::Key_Hankaku,\n    XK_Zenkaku_Hankaku,         Qt::Key_Zenkaku_Hankaku,\n    XK_Touroku,                 Qt::Key_Touroku,\n    XK_Massyo,                  Qt::Key_Massyo,\n    XK_Kana_Lock,               Qt::Key_Kana_Lock,\n    XK_Kana_Shift,              Qt::Key_Kana_Shift,\n    XK_Eisu_Shift,              Qt::Key_Eisu_Shift,\n    XK_Eisu_toggle,             Qt::Key_Eisu_toggle,\n    //XK_Kanji_Bangou,          Qt::Key_Kanji_Bangou,\n    //XK_Zen_Koho,              Qt::Key_Zen_Koho,\n    //XK_Mae_Koho,              Qt::Key_Mae_Koho,\n    XK_Kanji_Bangou,            Qt::Key_Codeinput,\n    XK_Zen_Koho,                Qt::Key_MultipleCandidate,\n    XK_Mae_Koho,                Qt::Key_PreviousCandidate,\n\n#ifdef XK_KOREAN\n    // Korean keyboard support\n    XK_Hangul,                  Qt::Key_Hangul,\n    XK_Hangul_Start,            Qt::Key_Hangul_Start,\n    XK_Hangul_End,              Qt::Key_Hangul_End,\n    XK_Hangul_Hanja,            Qt::Key_Hangul_Hanja,\n    XK_Hangul_Jamo,             Qt::Key_Hangul_Jamo,\n    XK_Hangul_Romaja,           Qt::Key_Hangul_Romaja,\n    //XK_Hangul_Codeinput,      Qt::Key_Hangul_Codeinput,\n    XK_Hangul_Codeinput,        Qt::Key_Codeinput,\n    XK_Hangul_Jeonja,           Qt::Key_Hangul_Jeonja,\n    XK_Hangul_Banja,            Qt::Key_Hangul_Banja,\n    XK_Hangul_PreHanja,         Qt::Key_Hangul_PreHanja,\n    XK_Hangul_PostHanja,        Qt::Key_Hangul_PostHanja,\n    //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,\n    //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,\n    //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,\n    XK_Hangul_SingleCandidate,  Qt::Key_SingleCandidate,\n    XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,\n    XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,\n    XK_Hangul_Special,          Qt::Key_Hangul_Special,\n    //XK_Hangul_switch,         Qt::Key_Hangul_switch,\n    XK_Hangul_switch,           Qt::Key_Mode_switch,\n#endif  // XK_KOREAN\n\n    // dead keys\n    XK_dead_grave,              Qt::Key_Dead_Grave,\n    XK_dead_acute,              Qt::Key_Dead_Acute,\n    XK_dead_circumflex,         Qt::Key_Dead_Circumflex,\n    XK_dead_tilde,              Qt::Key_Dead_Tilde,\n    XK_dead_macron,             Qt::Key_Dead_Macron,\n    XK_dead_breve,              Qt::Key_Dead_Breve,\n    XK_dead_abovedot,           Qt::Key_Dead_Abovedot,\n    XK_dead_diaeresis,          Qt::Key_Dead_Diaeresis,\n    XK_dead_abovering,          Qt::Key_Dead_Abovering,\n    XK_dead_doubleacute,        Qt::Key_Dead_Doubleacute,\n    XK_dead_caron,              Qt::Key_Dead_Caron,\n    XK_dead_cedilla,            Qt::Key_Dead_Cedilla,\n    XK_dead_ogonek,             Qt::Key_Dead_Ogonek,\n    XK_dead_iota,               Qt::Key_Dead_Iota,\n    XK_dead_voiced_sound,       Qt::Key_Dead_Voiced_Sound,\n    XK_dead_semivoiced_sound,   Qt::Key_Dead_Semivoiced_Sound,\n    XK_dead_belowdot,           Qt::Key_Dead_Belowdot,\n    XK_dead_hook,               Qt::Key_Dead_Hook,\n    XK_dead_horn,               Qt::Key_Dead_Horn,\n\n    // Special keys from X.org - This include multimedia keys,\n        // wireless/bluetooth/uwb keys, special launcher keys, etc.\n    XF86XK_Back,                Qt::Key_Back,\n    XF86XK_Forward,             Qt::Key_Forward,\n    XF86XK_Stop,                Qt::Key_Stop,\n    XF86XK_Refresh,             Qt::Key_Refresh,\n    XF86XK_Favorites,           Qt::Key_Favorites,\n    XF86XK_AudioMedia,          Qt::Key_LaunchMedia,\n    XF86XK_OpenURL,             Qt::Key_OpenUrl,\n    XF86XK_HomePage,            Qt::Key_HomePage,\n    XF86XK_Search,              Qt::Key_Search,\n    XF86XK_AudioLowerVolume,    Qt::Key_VolumeDown,\n    XF86XK_AudioMute,           Qt::Key_VolumeMute,\n    XF86XK_AudioRaiseVolume,    Qt::Key_VolumeUp,\n    XF86XK_AudioPlay,           Qt::Key_MediaPlay,\n    XF86XK_AudioStop,           Qt::Key_MediaStop,\n    XF86XK_AudioPrev,           Qt::Key_MediaPrevious,\n    XF86XK_AudioNext,           Qt::Key_MediaNext,\n    XF86XK_AudioRecord,         Qt::Key_MediaRecord,\n    XF86XK_AudioPause,          Qt::Key_MediaPause,\n    XF86XK_Mail,                Qt::Key_LaunchMail,\n    XF86XK_MyComputer,          Qt::Key_Launch0,  // ### Qt 6: remap properly\n    XF86XK_Calculator,          Qt::Key_Launch1,\n    XF86XK_Memo,                Qt::Key_Memo,\n    XF86XK_ToDoList,            Qt::Key_ToDoList,\n    XF86XK_Calendar,            Qt::Key_Calendar,\n    XF86XK_PowerDown,           Qt::Key_PowerDown,\n    XF86XK_ContrastAdjust,      Qt::Key_ContrastAdjust,\n    XF86XK_Standby,             Qt::Key_Standby,\n    XF86XK_MonBrightnessUp,     Qt::Key_MonBrightnessUp,\n    XF86XK_MonBrightnessDown,   Qt::Key_MonBrightnessDown,\n    XF86XK_KbdLightOnOff,       Qt::Key_KeyboardLightOnOff,\n    XF86XK_KbdBrightnessUp,     Qt::Key_KeyboardBrightnessUp,\n    XF86XK_KbdBrightnessDown,   Qt::Key_KeyboardBrightnessDown,\n    XF86XK_PowerOff,            Qt::Key_PowerOff,\n    XF86XK_WakeUp,              Qt::Key_WakeUp,\n    XF86XK_Eject,               Qt::Key_Eject,\n    XF86XK_ScreenSaver,         Qt::Key_ScreenSaver,\n    XF86XK_WWW,                 Qt::Key_WWW,\n    XF86XK_Sleep,               Qt::Key_Sleep,\n    XF86XK_LightBulb,           Qt::Key_LightBulb,\n    XF86XK_Shop,                Qt::Key_Shop,\n    XF86XK_History,             Qt::Key_History,\n    XF86XK_AddFavorite,         Qt::Key_AddFavorite,\n    XF86XK_HotLinks,            Qt::Key_HotLinks,\n    XF86XK_BrightnessAdjust,    Qt::Key_BrightnessAdjust,\n    XF86XK_Finance,             Qt::Key_Finance,\n    XF86XK_Community,           Qt::Key_Community,\n    XF86XK_AudioRewind,         Qt::Key_AudioRewind,\n    XF86XK_BackForward,         Qt::Key_BackForward,\n    XF86XK_ApplicationLeft,     Qt::Key_ApplicationLeft,\n    XF86XK_ApplicationRight,    Qt::Key_ApplicationRight,\n    XF86XK_Book,                Qt::Key_Book,\n    XF86XK_CD,                  Qt::Key_CD,\n    XF86XK_Calculater,          Qt::Key_Calculator,\n    XF86XK_Clear,               Qt::Key_Clear,\n    XF86XK_ClearGrab,           Qt::Key_ClearGrab,\n    XF86XK_Close,               Qt::Key_Close,\n    XF86XK_Copy,                Qt::Key_Copy,\n    XF86XK_Cut,                 Qt::Key_Cut,\n    XF86XK_Display,             Qt::Key_Display,\n    XF86XK_DOS,                 Qt::Key_DOS,\n    XF86XK_Documents,           Qt::Key_Documents,\n    XF86XK_Excel,               Qt::Key_Excel,\n    XF86XK_Explorer,            Qt::Key_Explorer,\n    XF86XK_Game,                Qt::Key_Game,\n    XF86XK_Go,                  Qt::Key_Go,\n    XF86XK_iTouch,              Qt::Key_iTouch,\n    XF86XK_LogOff,              Qt::Key_LogOff,\n    XF86XK_Market,              Qt::Key_Market,\n    XF86XK_Meeting,             Qt::Key_Meeting,\n    XF86XK_MenuKB,              Qt::Key_MenuKB,\n    XF86XK_MenuPB,              Qt::Key_MenuPB,\n    XF86XK_MySites,             Qt::Key_MySites,\n    XF86XK_New,                 Qt::Key_New,\n    XF86XK_News,                Qt::Key_News,\n    XF86XK_OfficeHome,          Qt::Key_OfficeHome,\n    XF86XK_Open,                Qt::Key_Open,\n    XF86XK_Option,              Qt::Key_Option,\n    XF86XK_Paste,               Qt::Key_Paste,\n    XF86XK_Phone,               Qt::Key_Phone,\n    XF86XK_Reply,               Qt::Key_Reply,\n    XF86XK_Reload,              Qt::Key_Reload,\n    XF86XK_RotateWindows,       Qt::Key_RotateWindows,\n    XF86XK_RotationPB,          Qt::Key_RotationPB,\n    XF86XK_RotationKB,          Qt::Key_RotationKB,\n    XF86XK_Save,                Qt::Key_Save,\n    XF86XK_Send,                Qt::Key_Send,\n    XF86XK_Spell,               Qt::Key_Spell,\n    XF86XK_SplitScreen,         Qt::Key_SplitScreen,\n    XF86XK_Support,             Qt::Key_Support,\n    XF86XK_TaskPane,            Qt::Key_TaskPane,\n    XF86XK_Terminal,            Qt::Key_Terminal,\n    XF86XK_Tools,               Qt::Key_Tools,\n    XF86XK_Travel,              Qt::Key_Travel,\n    XF86XK_Video,               Qt::Key_Video,\n    XF86XK_Word,                Qt::Key_Word,\n    XF86XK_Xfer,                Qt::Key_Xfer,\n    XF86XK_ZoomIn,              Qt::Key_ZoomIn,\n    XF86XK_ZoomOut,             Qt::Key_ZoomOut,\n    XF86XK_Away,                Qt::Key_Away,\n    XF86XK_Messenger,           Qt::Key_Messenger,\n    XF86XK_WebCam,              Qt::Key_WebCam,\n    XF86XK_MailForward,         Qt::Key_MailForward,\n    XF86XK_Pictures,            Qt::Key_Pictures,\n    XF86XK_Music,               Qt::Key_Music,\n    XF86XK_Battery,             Qt::Key_Battery,\n    XF86XK_Bluetooth,           Qt::Key_Bluetooth,\n    XF86XK_WLAN,                Qt::Key_WLAN,\n    XF86XK_UWB,                 Qt::Key_UWB,\n    XF86XK_AudioForward,        Qt::Key_AudioForward,\n    XF86XK_AudioRepeat,         Qt::Key_AudioRepeat,\n    XF86XK_AudioRandomPlay,     Qt::Key_AudioRandomPlay,\n    XF86XK_Subtitle,            Qt::Key_Subtitle,\n    XF86XK_AudioCycleTrack,     Qt::Key_AudioCycleTrack,\n    XF86XK_Time,                Qt::Key_Time,\n    XF86XK_Select,              Qt::Key_Select,\n    XF86XK_View,                Qt::Key_View,\n    XF86XK_TopMenu,             Qt::Key_TopMenu,\n    XF86XK_Red,                 Qt::Key_Red,\n    XF86XK_Green,               Qt::Key_Green,\n    XF86XK_Yellow,              Qt::Key_Yellow,\n    XF86XK_Blue,                Qt::Key_Blue,\n    XF86XK_Bluetooth,           Qt::Key_Bluetooth,\n    XF86XK_Suspend,             Qt::Key_Suspend,\n    XF86XK_Hibernate,           Qt::Key_Hibernate,\n    XF86XK_TouchpadToggle,      Qt::Key_TouchpadToggle,\n    XF86XK_TouchpadOn,          Qt::Key_TouchpadOn,\n    XF86XK_TouchpadOff,         Qt::Key_TouchpadOff,\n    XF86XK_AudioMicMute,        Qt::Key_MicMute,\n    XF86XK_Launch0,             Qt::Key_Launch2, // ### Qt 6: remap properly\n    XF86XK_Launch1,             Qt::Key_Launch3,\n    XF86XK_Launch2,             Qt::Key_Launch4,\n    XF86XK_Launch3,             Qt::Key_Launch5,\n    XF86XK_Launch4,             Qt::Key_Launch6,\n    XF86XK_Launch5,             Qt::Key_Launch7,\n    XF86XK_Launch6,             Qt::Key_Launch8,\n    XF86XK_Launch7,             Qt::Key_Launch9,\n    XF86XK_Launch8,             Qt::Key_LaunchA,\n    XF86XK_Launch9,             Qt::Key_LaunchB,\n    XF86XK_LaunchA,             Qt::Key_LaunchC,\n    XF86XK_LaunchB,             Qt::Key_LaunchD,\n    XF86XK_LaunchC,             Qt::Key_LaunchE,\n    XF86XK_LaunchD,             Qt::Key_LaunchF,\n    XF86XK_LaunchE,             Qt::Key_LaunchG,\n    XF86XK_LaunchF,             Qt::Key_LaunchH,\n\n    0,                          0\n};\n"
  },
  {
    "path": "shared/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${COPYQ_EXECUTABLE_NAME}</string>\n\t<key>CFBundleGetInfoString</key>\n\t<string>${MACOSX_BUNDLE_INFO_STRING}</string>\n\t<key>CFBundleIconFile</key>\n\t<string>${MACOSX_BUNDLE_ICON_FILE}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleLongVersionString</key>\n\t<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>\n\t<key>CFBundleName</key>\n\t<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>\n\t<key>CSResourcesFileMapped</key>\n\t<true/>\n\t<key>NSHumanReadableCopyright</key>\n\t<string></string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSHighResolutionCapable</key>\n\t<string>True</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "shared/com.github.hluk.copyq.desktop.in",
    "content": "[Desktop Entry]\nName=CopyQ\nExec=copyq --start-server show\nIcon=${ICON_NAME}\nGenericName=Clipboard Manager\n# Workaround / fix for issue #1526 that prevents a proper autostart of the tray icon in GNOME\nX-GNOME-Autostart-Delay=3\n# The rest is taken from Klipper application.\nType=Application\nTerminal=false\nX-KDE-autostart-after=panel\nX-KDE-StartupNotify=false\nX-KDE-UniqueApplet=true\nCategories=Qt;KDE;Utility;\nGenericName[af]=Klipbord Program\nGenericName[ar]=أداة الحافظة\nGenericName[ast]=Cartafueyu\nGenericName[be]=Буфер абмену\nGenericName[be@latin]=Pryłada, jakaja absłuhoŭvaje abmienny bufer\nGenericName[bg]=Системен буфер\nGenericName[bn]=ক্লিপবোর্ড টুল\nGenericName[br]=Ostilh ar golver\nGenericName[bs]=Alatka za klipbord\nGenericName[ca]=Eina de porta-retalls\nGenericName[ca@valencia]=Eina de porta-retalls\nGenericName[cs]=Program pro práci se schránkou\nGenericName[csb]=Nôrzãdze tacnika\nGenericName[cy]=Offeryn Gludfwrdd\nGenericName[da]=Udklipsholderværktøj\nGenericName[de]=Verwaltung der Zwischenablage\nGenericName[el]=Εργαλείο πρόχειρου\nGenericName[en_GB]=Clipboard Tool\nGenericName[eo]=Ilo por la poŝo\nGenericName[es]=Portapapeles\nGenericName[et]=Lõikepuhvri haldamine\nGenericName[eu]=Arbela\nGenericName[fa]=ابزار تخته‌یادداشت\nGenericName[fi]=Leikepöytätyökalu\nGenericName[fr]=Presse-papiers\nGenericName[fy]=Klamboerdbehear\nGenericName[ga]=Uirlis Ghearrthaisce\nGenericName[gl]=Utilidade de portarretallos\nGenericName[gu]=ક્લિપ બોર્ડ સાધન\nGenericName[he]=כלי לוח גזירה\nGenericName[hi]=क्लिपबोर्ड औज़ार\nGenericName[hne]=क्लिपबोर्ड औजार\nGenericName[hr]=Alat međuspremnika\nGenericName[hsb]=Zapisnik\nGenericName[hu]=Vágólapkezelő\nGenericName[ia]=Instrumento de  Area de transferentia\nGenericName[id]=Alat Papan Klip\nGenericName[is]=Klippispjaldstól\nGenericName[it]=Strumento per gli appunti\nGenericName[ja]=クリップボードツール\nGenericName[ka]=გაცვლის ბუფერის უტილიტა\nGenericName[kk]=Алмасу буфер құралы\nGenericName[km]=ឧបករណ៍​ក្ដារ​តម្បៀត​ខ្ទាស់\nGenericName[kn]=ಹಿಡಿಕೆ ಕಟ್ಟು (ಕ್ಲಿಪ್ ಬೋರ್ಡ್) ಸಲಕರಣೆ\nGenericName[ko]=클립보드 도구\nGenericName[lt]=Laikinos talpyklės priemonė\nGenericName[lv]=Starpliktuves rīks\nGenericName[mai]=क्लिपबोर्ड अओजार\nGenericName[mk]=Алатка за табла со исечоци\nGenericName[ml]=ക്ലിപ്ബോര്‍ഡ് ഉപകരണം\nGenericName[mr]=क्लिपबोर्ड साधन\nGenericName[ms]=Alat Klipbod\nGenericName[nb]=Utklippstavle\nGenericName[nds]=Warktüüch för de Twischenaflaag\nGenericName[ne]=क्लिपबोर्ड उपकरण\nGenericName[nl]=Klembordbeheer\nGenericName[nn]=Utklippstavle\nGenericName[pa]=ਕਲਿੱਪਬੋਰਡ ਟੂਲ\nGenericName[pl]=Narzędzie schowka\nGenericName[pt]=Ferramenta da Área de Transferência\nGenericName[pt_BR]=Ferramenta da área de transferência\nGenericName[ro]=Utilitar de clipboard\nGenericName[ru]=Монитор буфера обмена\nGenericName[se]=Čuohpusgirjereaidu\nGenericName[si]=ක්ලිප් පුවරු මෙවලම\nGenericName[sk]=Nástroj pre schránku\nGenericName[sl]=Orodje za odložišče\nGenericName[sr]=Алатка за клипборд\nGenericName[sr@ijekavian]=Алатка за клипборд\nGenericName[sr@ijekavianlatin]=Alatka za klipbord\nGenericName[sr@latin]=Alatka za klipbord\nGenericName[sv]=Klippbordsverktyg\nGenericName[ta]=தற்காலிக கருவி\nGenericName[te]=క్లిప్ బోర్డ్ పనిముట్టు\nGenericName[tg]=Утилита для буфера обмена\nGenericName[th]=เครื่องมือคลิปบอร์ด\nGenericName[tr]=Pano Aracı\nGenericName[ug]=چاپلاش تاختىسى قورالى\nGenericName[uk]=Утиліта буфера даних\nGenericName[uz]=Klipbord vositasi\nGenericName[uz@cyrillic]=Клипборд воситаси\nGenericName[vi]=Công cụ bảng nhớ tạm\nGenericName[wa]=Usteye presse-papî\nGenericName[xh]=Isixhobo Sebhodi eqhoboshayo\nGenericName[x-test]=xxClipboard Toolxx\nGenericName[zh_CN]=剪贴板工具\nGenericName[zh_TW]=剪貼簿工具\nComment=A cut & paste history utility\nComment[af]='n Knip & plak geskiedenis program\nComment[ar]=أداة تاريخ القص واللصق\nComment[ast]=Una utilidá de cortar y apegar historial\nComment[be]=Службовая праграма працы з гісторыяй выразання/устаўкі\nComment[be@latin]=Pryłada dla prahladu historyi aperacyjaŭ vycinańnia dy ŭklejvańnia\nComment[bg]=Инструмент за управление на операциите по копиране и поставяне\nComment[bs]=Alatka za istorijat isecanja i naljepljivanja\nComment[ca]=Una utilitat de la història de tallar i enganxar\nComment[ca@valencia]=Una utilitat de la història de tallar i enganxar\nComment[cs]=Nástroj pro historii práce se schránkou\nComment[csb]=Nôrzãdze trzëmôjące historëjã tacnika\nComment[da]=Et værktøj med historik til at klippe ud og indsætte\nComment[de]=Programm zur Verwaltung der Zwischenablage\nComment[el]=Ένα εργαλείο ιστορικού αποκοπής & επικόλλησης\nComment[en_GB]=A cut & paste history utility\nComment[eo]=Ilo por la eltonda kaj alglua historio\nComment[es]=Una utilidad de cortar y pegar historial\nComment[et]=Lõikamiste ja asetamiste ajaloo rakendus\nComment[eu]=Ebaki eta itsasi-ren historian ibiltzeko tresna\nComment[fa]=برنامه سودمند تاریخچه برش و چسباندن\nComment[fi]=Työkalu leikkaamiseen ja liittämiseen\nComment[fr]=Un outil d'historique du copier / coller\nComment[fy]=Klamboerdhistoarje\nComment[ga]=Uirlis staire gearrtha agus greamaithe\nComment[gl]=Un historial de cortar e apegar\nComment[gu]=ઇતિહાસ કાપવા અને મૂકવાનું સાધન\nComment[he]=כלי המשמש לשמירת היסטוריה אודות גזירה והדבקה\nComment[hi]=काटें एवं चिपकाएं इतिहास यूटिलिटी\nComment[hne]=काटव अउ चिपकाव इतिहास यूटिलिटी\nComment[hr]=Alat za izrezivanje i preljepljivanje iz povijesti\nComment[hsb]=Nastroj za wutřihanje a zasunjenje z prjedawšich přikazow\nComment[hu]=Kezelőprogram a vágólaphoz (naplózással)\nComment[ia]=Un utilitate per historia de talia & colla\nComment[id]=Sebuah utilitas riwayat potong & tempel\nComment[is]=Klipp & lím sögutól\nComment[it]=Un programma per la cronologia del copia e incolla\nComment[ja]=カット＆ペースト履歴ユーティリティ\nComment[kk]=Қиып алу және орналастыру журналы\nComment[km]=កាត់ និង​បិទភ្ជាប់​ឧបករណ៍​ប្រើប្រាស់​ប្រវត្តិ\nComment[kn]=ಕತ್ತರಿಸು ಮತ್ತು ಅಂಟಿಸು ಚರಿತ್ರೆ ಸೌಲಭ್ಯ\nComment[ko]=자르고 붙인 기록 도구\nComment[lt]=„Iškirpti ir padėti“ istorijos pagalbinė programa\nComment[lv]=Izgriešanas un ielīmēšanas vēstures rīks\nComment[mai]=काटू आओर साटू इतिहास यूटिलिटी\nComment[mk]=Алатка за историјат на сечење и вметнување\nComment[ml]=മുറിക്കല്‍-പകര്‍ത്തല്‍ നാള്‍വഴിസൂക്ഷിപ്പുസഹായി.\nComment[mr]=कापा व चिकटवा इतिहास उपकार्यक्रम\nComment[nb]=Et verktøy som viser tidligere utklipp\nComment[nds]=Vörgeschicht vun't Knippen un Infögen\nComment[ne]=काट्ने र टाँस्ने इतिहास उपयोगिता\nComment[nl]=Klembordgeschiedenis\nComment[nn]=Eit verktøy som viser eldre utklipp\nComment[pa]=ਇੱਕ ਕੱਟਣ ਅਤੇ ਚੇਪਣ ਅਤੀਤ ਸਹੂਲਤ\nComment[pl]=Narzędzie przechowujące historię schowka\nComment[pt]=Um utilitário de histórico de cópias e colagens\nComment[pt_BR]=Um utilitário com o histórico de recortar e colar\nComment[ro]=Utilitar cu istoria de tăiere și adăugare\nComment[ru]=История буфера обмена\nComment[se]=Reaidu mii čájeha boares čuohppusiid\nComment[si]=කැපීම් හා ඇලවීම් ඉතිහාස මෙවලම\nComment[sk]=Nástroj pre históriu akcií \"Vystrihnúť a vložiť\"\nComment[sl]=Orodje z zgodovino za izreži in prilepi\nComment[sr]=Алатка за историјат исецања и налепљивања\nComment[sr@ijekavian]=Алатка за историјат исецања и налепљивања\nComment[sr@ijekavianlatin]=Alatka za istorijat isecanja i nalepljivanja\nComment[sr@latin]=Alatka za istorijat isecanja i nalepljivanja\nComment[sv]=Ett verktyg med historik för klipp ut och klistra in\nComment[ta]=A cut & paste history utility\nComment[te]=కత్తిరించు & అతికించు చరిత్ర సౌలభ్యం\nComment[tg]=История буфера обмена\nComment[th]=เครื่องมือดูประวัติการตัดและวาง\nComment[tr]=Bir kes & yapıştır geçmişi aracı\nComment[ug]=كەس ۋە چاپلا تارىخىنى باشقۇرۇش قورالى\nComment[uk]=Утиліта журналу буфера даних\nComment[vi]=Công cụ chứa lịch sử các cắt dán\nComment[wa]=Ene ahesse d' istwere di coper/aclacper\nComment[x-test]=xxA cut & paste history utilityxx\nComment[zh_CN]=管理剪切和粘贴历史的工具\nComment[zh_TW]=剪貼紀錄公用程式\n"
  },
  {
    "path": "shared/com.github.hluk.copyq.metainfo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright 2024 Lukáš Holeček <hluk@email.cz> -->\n<component type=\"desktop-application\">\n    <id>com.github.hluk.copyq.desktop</id>\n    <metadata_license>CC0-1.0</metadata_license>\n    <project_license>GPL-3.0+</project_license>\n\n    <name>CopyQ</name>\n    <summary>Advanced clipboard manager</summary>\n\n    <description>\n        <p>\n            CopyQ is advanced clipboard manager with editing and scripting features.\n        </p>\n        <p>\n            CopyQ monitors system clipboard and saves its content in customized tabs.\n            Saved clipboard can be later copied and pasted directly into any application.\n        </p>\n    </description>\n\n    <url type=\"homepage\">https://hluk.github.io/CopyQ/</url>\n    <url type=\"bugtracker\">https://github.com/hluk/CopyQ/issues</url>\n    <url type=\"help\">https://copyq.readthedocs.io</url>\n    <url type=\"faq\">https://copyq.readthedocs.io/en/latest/faq.html</url>\n    <url type=\"donation\">https://liberapay.com/CopyQ/</url>\n    <url type=\"translate\">https://hosted.weblate.org/engage/copyq/</url>\n    <url type=\"vcs-browser\">https://github.com/hluk/CopyQ</url>\n\n    <releases>\n        <release version=\"13.0.0\" date=\"2025-10-22\" />\n        <release version=\"12.0.1\" date=\"2025-09-30\" />\n        <release version=\"12.0.0\" date=\"2025-09-29\" />\n        <release version=\"11.0.0\" date=\"2025-08-22\" />\n        <release version=\"10.0.0\" date=\"2025-04-04\" />\n        <release version=\"9.1.0\" date=\"2024-10-20\" />\n        <release version=\"9.0.0\" date=\"2024-06-22\" />\n        <release version=\"8.0.0\" date=\"2024-03-14\" />\n        <release version=\"7.1.0\" date=\"2023-09-03\" />\n        <release version=\"7.0.0\" date=\"2023-04-02\" />\n        <release version=\"6.4.0\" date=\"2023-01-19\" />\n        <release version=\"6.3.2\" date=\"2022-09-26\" />\n        <release version=\"6.3.1\" date=\"2022-09-25\" />\n        <release version=\"6.3.0\" date=\"2022-09-18\" />\n        <release version=\"6.2.0\" date=\"2022-07-06\" />\n        <release version=\"6.1.0\" date=\"2022-03-05\" />\n        <release version=\"6.0.1\" date=\"2022-01-02\" />\n        <release version=\"6.0.0\" date=\"2022-01-01\" />\n        <release version=\"5.0.0\" date=\"2021-09-30\" />\n        <release version=\"4.1.0\" date=\"2021-04-23\" />\n        <release version=\"4.0.0\" date=\"2021-04-11\" />\n        <release version=\"3.13.0\" date=\"2020-10-16\" />\n        <release version=\"3.12.0\" date=\"2020-07-12\" />\n        <release version=\"3.11.1\" date=\"2020-05-08\" />\n        <release version=\"3.11.0\" date=\"2020-05-01\" />\n        <release version=\"3.10.0\" date=\"2020-02-02\" />\n        <release version=\"3.9.3\" date=\"2019-11-16\" />\n        <release version=\"3.9.2\" date=\"2019-08-25\" />\n        <release version=\"3.9.1\" date=\"2019-08-18\" />\n        <release version=\"3.9.0\" date=\"2019-06-27\" />\n        <release version=\"3.8.0\" date=\"2019-04-10\" />\n        <release version=\"3.7.3\" date=\"2019-02-02\" />\n        <release version=\"3.7.2\" date=\"2018-12-31\" />\n        <release version=\"3.7.1\" date=\"2018-11-18\" />\n        <release version=\"3.7.0\" date=\"2018-11-04\" />\n        <release version=\"3.6.1\" date=\"2018-09-25\" />\n        <release version=\"3.6.0\" date=\"2018-09-23\" />\n        <release version=\"3.5.0\" date=\"2018-06-17\" />\n        <release version=\"3.4.0\" date=\"2018-04-29\" />\n        <release version=\"3.3.1\" date=\"2018-04-06\" />\n        <release version=\"3.3.0\" date=\"2018-03-17\" />\n        <release version=\"3.2.0\" date=\"2018-02-18\" />\n    </releases>\n\n    <screenshots>\n        <screenshot type=\"default\">\n            <image>https://hluk.github.io/CopyQ/images/application.png</image>\n            <caption>The main application window with tab tree and items</caption>\n        </screenshot>\n    </screenshots>\n\n    <categories>\n        <category>Utility</category>\n    </categories>\n\n    <kudos>\n        <kudo>HiDpiIcon</kudo>\n        <kudo>ModernToolkit</kudo>\n    </kudos>\n\n    <keywords>\n      <keyword>clipboard</keyword>\n      <keyword>clipboard-manager</keyword>\n      <keyword>clipboard-history</keyword>\n      <keyword>notes</keyword>\n      <keyword>copy-and-paste</keyword>\n    </keywords>\n\n    <update_contact>hluk_AT_email.cz</update_contact>\n    <developer id=\"com.github.hluk\">\n        <name>Lukas Holecek</name>\n    </developer>\n\n    <content_rating type=\"oars-1.1\" />\n\n    <launchable type=\"desktop-id\">com.github.hluk.copyq.desktop</launchable>\n\n    <branding>\n        <color type=\"primary\" scheme_preference=\"light\">#91e9b2</color>\n        <color type=\"primary\" scheme_preference=\"dark\">#36724d</color>\n    </branding>\n</component>\n"
  },
  {
    "path": "shared/copyq-completion",
    "content": "# shellcheck shell=bash\n\n_copyq_commands=(\n    show hide toggle menu exit disable enable clipboard selection paste copy\n    count select next previous add insert remove edit separator read write\n    action popup tab removetab renametab exporttab importtab config eval session\n    help\n)\n\n_copyq_list_sessions() {\n    ss -l -x | sed -nE 's#.*/\\.copyq-?(\\S*)_s .*#\\1#p'\n}\n\n_copyq_complete_words() {\n    while read -r item; do\n        COMPREPLY+=(\"$item\")\n    done < <(compgen -W \"$1\" -- \"${COMP_WORDS[$COMP_CWORD]}\")\n}\n\n_copyq_complete_lines() {\n    while read -r item; do\n        COMPREPLY+=(\"$item\")\n    done < <(IFS=$'\\n' compgen -W \"$1\" -- \"${COMP_WORDS[$COMP_CWORD]}\")\n}\n\n_copyq_complete_files() {\n    while read -r item; do\n        COMPREPLY+=(\"$item\")\n    done < <(compgen -f -- \"${COMP_WORDS[$COMP_CWORD]}\")\n}\n\n_copyq_completions() {\n    case \"$COMP_CWORD\" in\n        1)\n            case \"${COMP_WORDS[$COMP_CWORD]}\" in\n                --*)\n                    _copyq_complete_words '--session --help'\n                    ;;\n                -*)\n                    _copyq_complete_words '-e -s -h'\n                    ;;\n                *)\n                    _copyq_complete_words \"${_copyq_commands[*]}\"\n                    ;;\n            esac\n            ;;\n        2)\n            case \"${COMP_WORDS[$COMP_CWORD-1]}\" in\n                show)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq tab)\"\n                    ;;\n                clipboard)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq clipboard -- ?)\"\n                    ;;\n                selection)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq selection -- ?)\"\n                    ;;\n                copy)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq clipboardFormatsToSave)\"\n                    ;;\n                read)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq read -- ?)\"\n                    ;;\n                write)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq clipboardFormatsToSave)\"\n                    ;;\n                tab)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq tab)\"\n                    ;;\n                removetab)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq tab)\"\n                    ;;\n                renametab)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq tab)\"\n                    ;;\n                exporttab)\n                    _copyq_complete_files\n                    ;;\n                importtab)\n                    _copyq_complete_files\n                    ;;\n                config)\n                    pidof copyq &>/dev/null || return\n                    _copyq_complete_lines \"$(copyq config | grep '^[^ ]')\"\n                    ;;\n                session|-s|--session)\n                    _copyq_complete_lines \"$(_copyq_list_sessions)\"\n                    ;;\n                help|-h|--help)\n                    _copyq_complete_words \"${_copyq_commands[*]}\"\n                    ;;\n            esac\n            ;;\n    esac\n}\n\ncomplete -o filenames -F _copyq_completions copyq\n"
  },
  {
    "path": "shared/copyq.1",
    "content": ".TH CopyQ 1\n.SH NAME\nCopyQ \\- Clipboard Manager with Advanced Features\n\n\n.SH SYNOPSIS\n.B copyq\n[\\fBCOMMAND\\fR]\n\n\n.SH DESCRIPTION\n.B CopyQ\nis advanced clipboard manager with editing and scripting features. It monitors system clipboard and saves its content in customized tabs. Saved clipboard can be later copied and pasted directly into any application.\n\n\n.SH COMMANDS\nStarts server if no command is specified.\n\n.TP\n.BR show \" [\\fINAME\\fR]\"\nShow main window and optionally open tab with given name.\n.TP\n.B hide\nHide main window.\n.TP\n.B toggle\nShow or hide main window.\n.TP\n.B menu\nOpen context menu.\n.TP\n.B exit\nExit server.\n.TP\n.BR disable \", \" enable\nDisable or enable clipboard content storing.\n\n.sp\n.TP\n.BR clipboard \" [\\fIMIME\\fR]\"\nPrint clipboard content.\n.TP\n.BR selection \" [\\fIMIME\\fR]\"\nPrint X11 selection content.\n.TP\n.B paste\nPaste clipboard to current window (may not work with some applications).\n.TP\n.BR copy \" \\fITEXT\\fR\"\nSet clipboard text.\n.TP\n.BR copy \" \\fIMIME\\fR \\fIDATA\\fR [\\fIMIME\\fR \\fIDATA\\fR]...\"\nSet clipboard content.\n\n.sp\n.TP\n.B count\nPrint amount of items in current tab.\n.TP\n.BR select \" [\\fIROW=0\\fR]\"\nCopy item in the row to clipboard.\n.TP\n.B next\nCopy next item from current tab to clipboard.\n.TP\n.B previous\nCopy previous item from current tab to clipboard.\n.TP\n.BR add \" \\fITEXT\\fR...\"\nAdd text into clipboard.\n.TP\n.BR insert \" \\fIROW\\fR \\fITEXT\\fR\"\nInsert text into given row.\n.TP\n.BR remove \" [\\fIROWS=0\\fR...]\"\nRemove items in given rows.\n.TP\n.BR edit \" [\\fIROW=-1\\fR...]\"\nEdit items or edit new one.\nValue -1 is for current text in clipboard.\n\n.sp\n.TP\n.BR separator \" \\fISEPARATOR\\fR\"\nSet separator for items on output.\n.TP\n.BR read \" [\\fIMIME\\fR|\\fIROW\\fR]...\"\nPrint raw data of clipboard or item in row.\n.TP\n.BR write \" [\\fIROW=0\\fR] \\fIMIME\\fR \\fIDATA\\fR [\\fIMIME\\fR \\fIDATA\\fR]...\"\nWrite raw data to given row.\n\n.sp\n.TP\n.BR action \" [\\fIROWS=0.\\fR..]\"\nShow action dialog.\n.TP\n.BR action \" [\\fIROWS=0\\fR...] [\\fIPROGRAM\\fR [\\fISEPARATOR=\\[rs]n\\fR]]\"\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.\n.TP\n.BR popup \" \\fITITLE\\fR \\fIMESSAGE\\fR [\\fITIME=8000\\fR]\"\nShow tray popup message for TIME milliseconds.\n\n.sp\n.TP\n.B tab\nList available tab names.\n.TP\n.BR tab \" \\fINAME\\fR [\\fICOMMAND\\fR]\"\nRun command on tab with given name.\nTab is created if it doesn't exist.\nDefault is the first tab.\n.TP\n.BR removetab \" \\fINAME\\fR\"\nRemove tab.\n.TP\n.BR renametab \" \\fINAME\\fR \\fINEW_NAME\\fR\"\nRename tab.\n\n.sp\n.TP\n.BR exporttab \" \\fIFILE_NAME\\fR\"\nExport items to file.\n.TP\n.BR importtab \" \\fIFILE_NAME\\fR\"\nImport items from file.\n\n.sp\n.TP\n.B config\nList all options.\n.TP\n.BR config \" \\fIOPTION\\fR\"\nGet option value.\n.TP\n.BR config \" \\fIOPTION\\fR \\fIVALUE\\fR\"\nSet option value.\n\n.sp\n.TP\n.BR eval \", \" \\-e \" [\\fISCRIPT\\fR] [\\fIARGUMENTS\\fR]...\"\nEvaluate ECMAScript program.\nArguments are accessible using with \"arguments[0..N]\".\n.TP\n.BR session \", \" \\-s \", \" \\-\\-session \" \\fISESSION\\fR\"\nStarts or connects to application instance with given session name.\n.TP\n.BR help \", \" \\-h \", \" \\-\\-help \" [\\fICOMMAND\\fR]...\"\nPrint help for COMMAND or all commands.\n\n\n.SH NOTES\nUse \\fBdash argument\\fR (\\fB\\-\\fR) to read data from standard input.\n.sp\nUse \\fBdouble-dash argument\\fR (\\fB\\-\\-\\fR) to read all following arguments without expanding escape sequences (i.e. \\\\n, \\\\t and others).\n.sp\nUse \\fB?\\fR for MIME to print available MIME types (default is \"text/plain\").\n\n\n.SH EXAMPLES\n.TP\nInsert some texts to the history:\ncopyq add \"first item\" \"second item\" \"third item\"\n\n.TP\nPrint content of the first three items:\ncopyq read 0 1 2\ncopyq separator \",\" read 0 1 2\n\n.TP\nShow current clipboard content:\ncopyq clipboard\ncopyq clipboard text/html\ncopyq clipboard \\\\? # lists formats in clipboard\n\n.TP\nCopy text to the clipboard:\ncopyq copy \"Some Text\"\n\n.TP\nLoad file content into clipboard:\ncopyq copy - < file.txt\ncopyq copy text/html < index.html\ncopyq copy image/jpeg - < image.jpg\n\n.TP\nCreate an image items:\ncopyq write image/gif - < image.gif\ncopyq write image/svg - < image.svg\n\n\n.SH SEE ALSO\n.B https://copyq.readthedocs.io/\n\n\n.SH AUTHOR\nThe maintainer of CopyQ is Lukas Holecek <hluk@email.cz>. A comprehensive list of authors and contributors is available in the AUTHORS file.\n\nThis manual page was written by GengYu Rao (zouyoo@outlook.com), for the Debian project (and may be used by others).\n"
  },
  {
    "path": "shared/copyq.iss",
    "content": "﻿; 1. Open this file with Inno Setup with Unicode support and preprocessor.\n; 2. Change \"#defines\" below (or see below how to use COPYQ_INNO_SETUP environment variable).\n; 3. Compile \"setup.exe\".\n\n; Path for output installation file\n#define Output                   \".\"\n#define MyAppName                \"CopyQ\"\n#define MyAppNameMin             \"copyq\"\n#define MyAppCopyright           \"Lukas Holecek\"\n#define MyAppCopyrightStartYear  \"2009\"\n#define MyAppCopyrightEndYear    GetDateTimeString('yyyy','','')\n\n[Setup]\nAppId={{9DF1F443-EA0B-4C75-A4D3-767A7783228E}\nAppName={#MyAppName}\nAppVersion={#AppVersion}\nAppVerName={#MyAppName} {#AppVersion}\n\nAppCopyright={#MyAppCopyright} {#MyAppCopyrightStartYear}-{#MyAppCopyrightEndYear}\nAppPublisher={#MyAppCopyright}\n\nAppPublisherURL=http://hluk.github.io/CopyQ/\nAppSupportURL=http://hluk.github.io/CopyQ/\nAppUpdatesURL=http://hluk.github.io/CopyQ/\n\nVersionInfoDescription={#MyAppName} installer\nVersionInfoProductName={#MyAppName} {#AppVersion}\nVersionInfoVersion={#AppVersion}\n\nUninstallDisplayName={#MyAppName} {#AppVersion}\nUninstallDisplayIcon={app}\\copyq.exe\n\nWizardStyle=Modern\nUsePreviousLanguage=no\n\nDefaultDirName={autopf}\\{#MyAppName}\nDefaultGroupName={#MyAppName}\n\nArchitecturesAllowed=x64\nArchitecturesInstallIn64BitMode=x64\n\nAllowNoIcons=yes\nLicenseFile={#Source}\\shared\\gpl-3.0.rtf\nOutputDir={#Output}\nPrivilegesRequiredOverridesAllowed=dialog\nOutputBaseFilename={#MyAppNameMin}-{#AppVersion}-setup\nCompression=lzma\nSolidCompression=yes\nSetupIconFile={#Source}\\src\\images\\icon.ico\nWizardImageFile=logo.bmp\nWizardSmallImageFile=logo-small.bmp\nCloseApplications=force\n\n[Languages]\nName: en; MessagesFile: \"compiler:Default.isl\"\nName: cz; MessagesFile: \"compiler:Languages\\Czech.isl\"\nName: de; MessagesFile: \"compiler:Languages\\German.isl\"\nName: es; MessagesFile: \"compiler:Languages\\Spanish.isl\"\nName: it; MessagesFile: \"compiler:Languages\\Italian.isl\"\nName: ko; MessagesFile: \"compiler:Languages\\Korean.isl\"\n\n[CustomMessages]\nen.ProgramFiles=Program Files\nen.Translations=Translations\nen.Plugins=Plugins\nen.PluginText=Text with Highlighting\nen.PluginImages=Images\nen.PluginWeb=Web Pages\nen.PluginNotes=Notes\nen.PluginEncrypted=Encryption\nen.PluginFakeVim=FakeVim Editor\nen.PluginSynchronize=Synchronize Items to Disk\nen.PluginTags=Item Tags\nen.PluginPinned=Pinned Items\n\ncz.ProgramFiles=Soubory programu\ncz.Translations=Překlady\ncz.Plugins=Zásuvné moduly\ncz.PluginText=Text se zvýrazňováním\ncz.PluginImages=Obrázky\ncz.PluginWeb=Webové stránky\ncz.PluginNotes=Poznámky\ncz.PluginEncrypted=Šifrování\ncz.PluginFakeVim=FakeVim editor\ncz.PluginSynchronize=Synchronizace prvků na disk\ncz.PluginTags=Štítky u prvků\ncz.PluginPinned=Připnuté prvky\n\nde.AutoStartProgram=Starte %1 automatisch\n\nes.ProgramFiles=Archivos de programa\nes.Plugins=Complementos\nes.PluginText=Texto resaltado\nes.PluginImages=Imágenes\nes.PluginWeb=Páginas web\n\nit.ProgramFiles=File programma\nit.Translations=Traduzioni\nit.Plugins=Plugin\nit.PluginText=Testo evidenziato\nit.PluginImages=Immagini\nit.PluginWeb=Pagine web\nit.PluginNotes=Note\nit.PluginEncrypted=Criptazione\nit.PluginFakeVim=Editor FakeVim\nit.PluginSynchronize=Sincronizza elementi disco\nit.PluginTags=Etichette elementi\nit.PluginPinned=Elementi bloccati\n\nko.ProgramFiles=Program Files\nko.Translations=번역\nko.Plugins=플러그인\nko.PluginText=강조 표시가 있는 텍스트\nko.PluginImages=이미지\nko.PluginWeb=웹 페이지\nko.PluginNotes=노트\nko.PluginEncrypted=암호화\nko.PluginFakeVim=FakeVim 편집기\nko.PluginSynchronize=항목을 디스크에 동기화\nko.PluginTags=항목 태그\nko.PluginPinned=고정된 항목\n\n[Types]\nName: \"full\"; Description: \"{code:GetFullInstallation}\"\nName: \"compact\"; Description: \"{code:GetCompactInstallation}\"\nName: \"custom\"; Description: \"{code:GetCustomInstallation}\"; Flags: iscustom\n\n[Components]\nName: \"program\"; Description: \"{cm:ProgramFiles}\"; Types: full compact custom; Flags: fixed\nName: \"translations\"; Description: \"{cm:Translations}\"; Types: full compact custom\nName: \"plugins\"; Description: \"{cm:Plugins}\"; Types: full\nName: \"plugins/text\"; Description: \"{cm:PluginText}\"; Types: full\nName: \"plugins/images\"; Description: \"{cm:PluginImages}\"; Types: full\nName: \"plugins/notes\"; Description: \"{cm:PluginNotes}\"; Types: full\nName: \"plugins/encrypted\"; Description: \"{cm:PluginEncrypted}\"; Types: full\nName: \"plugins/fakevim\"; Description: \"{cm:PluginFakeVim}\"; Types: full\nName: \"plugins/synchronize\"; Description: \"{cm:PluginSynchronize}\"; Types: full\nName: \"plugins/tags\"; Description: \"{cm:PluginTags}\"; Types: full\nName: \"plugins/pinned\"; Description: \"{cm:PluginPinned}\"; Types: full\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; Flags: unchecked\nName: \"startup\"; Description: {cm:AutoStartProgram,CopyQ}; Flags: unchecked\n\n[Files]\nSource: \"{#Root}\\copyq.exe\"; DestDir: \"{app}\"; Components: program; Flags: ignoreversion\nSource: \"{#Root}\\snoretoast.exe\"; DestDir: \"{app}\"; Components: program; Flags: ignoreversion skipifsourcedoesntexist\nSource: \"{#Root}\\AUTHORS\"; DestDir: \"{app}\"; Components: program; Flags: ignoreversion\nSource: \"{#Root}\\LICENSE\"; DestDir: \"{app}\"; Components: program; Flags: ignoreversion\nSource: \"{#Root}\\README.md\"; DestDir: \"{app}\"; Components: program; Flags: ignoreversion\nSource: \"{#Root}\\themes\\*\"; DestDir: \"{app}\\themes\"; Components: program; Flags: ignoreversion\nSource: \"{#Root}\\translations\\*.qm\"; DestDir: \"{app}\\translations\"; Components: translations; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itemtext.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/text; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itemimage.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/images; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itemnotes.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/notes; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itemencrypted.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/encrypted; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itemfakevim.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/fakevim; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itemsync.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/synchronize; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itemtags.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/tags; Flags: ignoreversion\nSource: \"{#Root}\\plugins\\*itempinned.dll\"; DestDir: \"{app}\\plugins\"; Components: plugins/pinned; Flags: ignoreversion\n\n; Qt and toolchain\nSource: \"{#Root}\\bearer\\*.dll\"; DestDir: \"{app}\\bearer\"; Components: program; Flags: ignoreversion recursesubdirs createallsubdirs skipifsourcedoesntexist\nSource: \"{#Root}\\imageformats\\*.dll\"; DestDir: \"{app}\\imageformats\"; Components: program; Flags: ignoreversion recursesubdirs createallsubdirs\nSource: \"{#Root}\\platforms\\*.dll\"; DestDir: \"{app}\\platforms\"; Components: program; Flags: ignoreversion recursesubdirs createallsubdirs\nSource: \"{#Root}\\styles\\*.dll\"; DestDir: \"{app}\\styles\"; Components: program; Flags: ignoreversion recursesubdirs createallsubdirs\nSource: \"{#Root}\\tls\\*.dll\"; DestDir: \"{app}\\tls\"; Components: program; Flags: ignoreversion recursesubdirs createallsubdirs\nSource: \"{#Root}\\crypto\\*.dll\"; DestDir: \"{app}\\crypto\"; Components: program; Flags: ignoreversion recursesubdirs createallsubdirs\nSource: \"{#Root}\\*.dll\"; DestDir: \"{app}\"; Components: program; Flags: ignoreversion\n\n[Icons]\nName: \"{group}\\CopyQ\"; Filename: \"{app}\\copyq.exe\"; Parameters: \"--start-server show\"\nName: \"{commondesktop}\\CopyQ\"; Filename: \"{app}\\copyq.exe\"; Tasks: desktopicon\nName: \"{userstartup}\\CopyQ\"; Filename: \"{app}\\copyq.exe\"; Tasks: startup\n\n[Run]\nFilename: \"{app}\\copyq.exe\"; Description: \"{cm:LaunchProgram,CopyQ}\"; Flags: nowait postinstall skipifsilent\n\n[Code]\nfunction GetFullInstallation(Param: string): string;\nbegin\n\tResult := SetupMessage(msgFullInstallation);\nend;\n\nfunction GetCustomInstallation(Param: string): string;\nbegin\n\tResult := SetupMessage(msgCustomInstallation);\nend;\n\nfunction GetCompactInstallation(Param: string): string;\nbegin\n\tResult := SetupMessage(msgCompactInstallation);\nend;\n"
  },
  {
    "path": "shared/flatpak/README.md",
    "content": "This directory contains source files for building CopyQ Flatpak package.\n\n# Build\n\nInstall `flatpak-builder`.\n\nOption `--user` can be omitted.\n\n```bash\nflatpak install --user flathub org.freedesktop.Platform//1.6 org.freedesktop.Sdk//1.6\nflatpak remote-add --user --if-not-exists kdeapps --from https://distribute.kde.org/kdeapps.flatpakrepo\nflatpak install --user flathub org.kde.Platform//5.9\nflatpak install --user flathub org.kde.Sdk//5.9\n```\n\nBuild the app.\n\n```bash\nmkdir copyq repo\nflatpak-builder --ccache --force-clean --repo=repo --subject=\"Build of copyq\" copyq com.github.hluk.copyq.json\n```\n\nInstall the app.\n\n```bash\nflatpak remote-add --user copyq repo --no-gpg-verify\nflatpak install --user --reinstall copyq com.github.hluk.copyq\nflatpak run com.github.hluk.copyq\n```\n"
  },
  {
    "path": "shared/flatpak/com.github.hluk.copyq.json",
    "content": "{\n    \"app-id\": \"com.github.hluk.copyq\",\n    \"runtime\": \"org.kde.Platform\",\n    \"runtime-version\": \"5.9\",\n    \"sdk\": \"org.kde.Sdk\",\n    \"command\": \"copyq\",\n\n    \"finish-args\": [\n        \"--socket=x11\",\n        \"--socket=wayland\",\n        \"--talk-name=org.kde.StatusNotifierWatcher\",\n        \"--share=ipc\",\n        \"--device=dri\"\n    ],\n\n    \"modules\": [\n        {\n            \"name\": \"copyq\",\n            \"buildsystem\": \"cmake-ninja\",\n            \"sources\": [\n                {\n                    \"type\": \"git\",\n                    \"url\": \"https://github.com/hluk/CopyQ.git\",\n                    \"tag\": \"v3.3.0\",\n                    \"commit\": \"bc2795594e4e0f50f2cc040be78855f4adcfa7ea\"\n                }\n            ],\n            \"config-opts\": [\n                \"-DCMAKE_BUILD_TYPE=Release\",\n                \"-DICON_NAME=com.github.hluk.copyq\"\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "shared/gnome-extension/extension.js",
    "content": "import Gio from 'gi://Gio';\nimport GLib from 'gi://GLib';\nimport Meta from 'gi://Meta';\nimport Shell from 'gi://Shell';\nimport {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';\n\nconst SERVICE_NAME = 'com.github.hluk.copyq.GnomeClipboard';\nconst OBJECT_PATH = '/com/github/hluk/copyq/GnomeClipboard';\nconst INTERFACE_NAME = 'com.github.hluk.CopyQ.GnomeClipboard1';\nconst CLIENT_OBJECT_PATH = '/com/github/hluk/copyq/GnomeClipboardClient';\nconst CLIENT_INTERFACE_NAME = 'com.github.hluk.CopyQ.GnomeClipboardClient1';\nconst CLIPBOARD_TYPE_CLIPBOARD = 0;\nconst CLIPBOARD_TYPE_PRIMARY = 1;\nconst CLIPBOARD_TYPE_BOTH = 2;\nconst DEBUG = GLib.getenv('COPYQ_GNOME_EXTENSION_DEBUG') === '1';\n\nconst INTERFACE_XML = `<node>\n  <interface name=\"${INTERFACE_NAME}\">\n    <method name=\"RegisterClipboardClient\">\n      <arg type=\"i\" name=\"clipboardTypes\" direction=\"in\"/>\n    </method>\n    <method name=\"UnregisterClipboardClient\"/>\n    <method name=\"SetClipboardData\">\n      <arg type=\"i\" name=\"clipboardType\" direction=\"in\"/>\n      <arg type=\"s\" name=\"format\" direction=\"in\"/>\n      <arg type=\"v\" name=\"value\" direction=\"in\"/>\n    </method>\n    <method name=\"GetClipboardData\">\n      <arg type=\"i\" name=\"clipboardType\" direction=\"in\"/>\n      <arg type=\"as\" name=\"formats\" direction=\"in\"/>\n      <arg type=\"a{sv}\" name=\"data\" direction=\"out\"/>\n    </method>\n    <method name=\"GetClipboardFormats\">\n      <arg type=\"i\" name=\"clipboardType\" direction=\"in\"/>\n      <arg type=\"as\" name=\"formats\" direction=\"out\"/>\n    </method>\n  </interface>\n</node>`;\n\nfunction debug(message) {\n    if (DEBUG)\n        log(`[copyq-clipboard] ${message}`);\n}\n\nfunction stringToBytes(text) {\n    return new TextEncoder().encode(text);\n}\n\nfunction toBytes(value) {\n    if (value instanceof GLib.Variant) {\n        if (value.is_of_type(new GLib.VariantType('ay')))\n            return value.deepUnpack();\n        return toBytes(value.deepUnpack());\n    }\n    if (value instanceof GLib.Bytes)\n        return value.toArray();\n    if (value instanceof Uint8Array)\n        return value;\n    if (Array.isArray(value))\n        return Uint8Array.from(value);\n    if (typeof value === 'string')\n        return stringToBytes(value);\n    return null;\n}\n\nfunction toDataVariant(value) {\n    const bytes = toBytes(value);\n    return bytes ? new GLib.Variant('ay', bytes) : null;\n}\n\nfunction metaSelectionTypeFromClipboardType(clipboardType) {\n    const enumType = Meta.SelectionType ?? {};\n    const primary = enumType.PRIMARY ?? enumType.SELECTION_PRIMARY ?? 0;\n    const clipboard = enumType.CLIPBOARD ?? enumType.SELECTION_CLIPBOARD ?? 1;\n    return clipboardType === CLIPBOARD_TYPE_PRIMARY ? primary : clipboard;\n}\n\nfunction supportsClipboardType(clipboardTypes, clipboardType) {\n    const types = Number(clipboardTypes);\n    const type = Number(clipboardType);\n    return types === CLIPBOARD_TYPE_BOTH || types === type;\n}\n\nexport default class CopyqClipboardExtension extends Extension {\n    enable() {\n        this._clients = new Map();\n        this._providedDataByType = {\n            [CLIPBOARD_TYPE_CLIPBOARD]: {},\n            [CLIPBOARD_TYPE_PRIMARY]: {},\n        };\n\n        this._setupListener();\n\n        this._dbusConnection = Gio.DBus.session;\n        this._dbusNodeInfo = Gio.DBusNodeInfo.new_for_xml(INTERFACE_XML);\n        this._dbusRegistrationId = this._dbusConnection.register_object(\n            OBJECT_PATH,\n            this._dbusNodeInfo.interfaces[0],\n            this._handleMethodCall.bind(this),\n            null,\n            null\n        );\n        this._dbusNameOwnerId = Gio.bus_own_name_on_connection(\n            this._dbusConnection,\n            SERVICE_NAME,\n            Gio.BusNameOwnerFlags.REPLACE,\n            null,\n            null\n        );\n    }\n\n    disable() {\n        if (this._selectionOwnerChangedId && this.selection) {\n            this.selection.disconnect(this._selectionOwnerChangedId);\n            this._selectionOwnerChangedId = 0;\n        }\n\n        if (this._dbusRegistrationId) {\n            this._dbusConnection.unregister_object(this._dbusRegistrationId);\n            this._dbusRegistrationId = 0;\n        }\n        if (this._dbusNameOwnerId) {\n            Gio.bus_unown_name(this._dbusNameOwnerId);\n            this._dbusNameOwnerId = 0;\n        }\n\n        this._clients?.clear();\n        this._clients = null;\n        this._providedDataByType = null;\n        this.selection = null;\n        this._dbusConnection = null;\n        this._dbusNodeInfo = null;\n    }\n\n    _setupListener() {\n        try {\n            const metaDisplay = Shell.Global.get().get_display();\n            const selection = metaDisplay?.get_selection?.();\n            if (!selection) {\n                debug('Failed to set up owner-changed listener: selection unavailable');\n                return;\n            }\n            debug('Setting up Shell selection owner-changed listener');\n            this._setupSelectionTracking(selection);\n        } catch (error) {\n            debug(`Failed to set up owner-changed listener: ${error}`);\n        }\n    }\n\n    _setupSelectionTracking(selection) {\n        this.selection = selection;\n        this._selectionOwnerChangedId = selection.connect('owner-changed',\n            (_selection, selectionType, _selectionSource) => {\n                this._onSelectionChange(selectionType);\n            });\n    }\n\n    _clipboardTypeFromSelectionType(selectionType) {\n        const enumType = Meta.SelectionType ?? {};\n        const primary = enumType.PRIMARY ?? enumType.SELECTION_PRIMARY ?? 0;\n        const clipboard = enumType.CLIPBOARD ?? enumType.SELECTION_CLIPBOARD ?? 1;\n        const value = Number(selectionType);\n        const text = String(selectionType).toLowerCase();\n        if (value === primary || text.includes('primary'))\n            return CLIPBOARD_TYPE_PRIMARY;\n        if (value === clipboard || text.includes('clipboard'))\n            return CLIPBOARD_TYPE_CLIPBOARD;\n        return CLIPBOARD_TYPE_CLIPBOARD;\n    }\n\n    _onSelectionChange(selectionType) {\n        const clipboardType = this._clipboardTypeFromSelectionType(selectionType);\n        debug(`Selection owner changed: selectionType=${selectionType}, clipboardType=${clipboardType}`);\n        this._notifyClients(clipboardType);\n    }\n\n    _handleMethodCall(_connection, sender, _objectPath, _interfaceName, methodName, parameters, invocation) {\n        if (methodName === 'RegisterClipboardClient') {\n            const [clipboardTypes] = parameters.deepUnpack();\n            const types = Number(clipboardTypes);\n            this._clients.set(sender, types);\n            debug(`Registered client ${sender} with clipboardTypes=${types}`);\n            invocation.return_value(null);\n            return;\n        }\n\n        if (methodName === 'UnregisterClipboardClient') {\n            this._clients.delete(sender);\n            debug(`Unregistered client ${sender}`);\n            invocation.return_value(null);\n            return;\n        }\n\n        if (methodName === 'SetClipboardData') {\n            const [clipboardType, format, value] = parameters.deepUnpack();\n            const type = Number(clipboardType);\n            const normalizedValue = toDataVariant(value);\n            if (!normalizedValue) {\n                debug(`SetClipboardData ignored for clipboardType=${type}, format=${format}: unsupported value`);\n                invocation.return_value(null);\n                return;\n            }\n            this._providedDataByType[type][format] = normalizedValue;\n            this._setClipboardData(type, format, normalizedValue);\n            debug(`SetClipboardData called for clipboardType=${type}, format=${format}`);\n            invocation.return_value(null);\n            return;\n        }\n\n        if (methodName === 'GetClipboardData') {\n            const [clipboardType, formats] = parameters.deepUnpack();\n            const requestedFormats = new Set(Array.isArray(formats) ? formats : []);\n            this._readClipboardData(clipboardType, requestedFormats, dataMap => {\n                invocation.return_value(new GLib.Variant('(a{sv})', [dataMap]));\n            });\n            return;\n        }\n\n        if (methodName === 'GetClipboardFormats') {\n            const [clipboardType] = parameters.deepUnpack();\n            const formats = this._getClipboardFormats(clipboardType);\n            invocation.return_value(new GLib.Variant('(as)', [formats]));\n        }\n    }\n\n    _notifyClients(clipboardType) {\n        if (!this._clients || this._clients.size === 0)\n            return;\n        debug(`Notifying clients for clipboardType=${clipboardType}, clients=${this._clients.size}`);\n\n        for (const [sender, clipboardTypes] of this._clients.entries()) {\n            if (!supportsClipboardType(clipboardTypes, clipboardType))\n                continue;\n            this._dbusConnection.call(\n                sender,\n                CLIENT_OBJECT_PATH,\n                CLIENT_INTERFACE_NAME,\n                'ClipboardChanged',\n                new GLib.Variant('(i)', [clipboardType]),\n                null,\n                Gio.DBusCallFlags.NO_AUTO_START,\n                1000,\n                null,\n                (_conn, result) => {\n                    try {\n                        _conn.call_finish(result);\n                    } catch (error) {\n                        log(`[copyq-clipboard] Broadcast failed for ${sender}: ${error}`);\n                        this._clients.delete(sender);\n                    }\n                }\n            );\n        }\n    }\n\n    _readClipboardData(clipboardType, requestedFormats, onDone) {\n        if (!this.selection) {\n            const fallback = this._providedDataByType[clipboardType] ?? {};\n            onDone({...fallback});\n            return;\n        }\n\n        const selectionType = metaSelectionTypeFromClipboardType(clipboardType);\n        const advertisedFormats = this.selection.get_mimetypes(selectionType) ?? [];\n        const formats = requestedFormats && requestedFormats.size > 0\n            ? [...requestedFormats]\n            : advertisedFormats;\n\n        if (formats.length === 0) {\n            onDone({});\n            return;\n        }\n\n        const data = {};\n        let pending = formats.length;\n        const complete = () => {\n            pending--;\n            if (pending !== 0)\n                return;\n            for (const format of formats) {\n                if (!Object.prototype.hasOwnProperty.call(data, format)\n                        && Object.prototype.hasOwnProperty.call(this._providedDataByType[clipboardType], format))\n                {\n                    data[format] = this._providedDataByType[clipboardType][format];\n                }\n            }\n            onDone(data);\n        };\n\n        for (const format of formats) {\n            const output = Gio.MemoryOutputStream.new_resizable();\n            this.selection.transfer_async(\n                selectionType,\n                format,\n                -1,\n                output,\n                null,\n                (_selection, result) => {\n                try {\n                    this.selection.transfer_finish(result);\n                    const bytes = output.steal_as_bytes()?.toArray?.() ?? [];\n                    if (bytes.length > 0)\n                        data[format] = new GLib.Variant('ay', Uint8Array.from(bytes));\n                } catch (_error) {\n                    // Ignore unavailable format and keep fallback behavior.\n                }\n                complete();\n            });\n        }\n    }\n\n    _getClipboardFormats(clipboardType) {\n        const provided = Object.keys(this._providedDataByType[clipboardType] ?? {});\n        if (!this.selection)\n            return provided;\n\n        const selectionType = metaSelectionTypeFromClipboardType(clipboardType);\n        const selectionFormats = this.selection.get_mimetypes(selectionType) ?? [];\n        const all = new Set([...selectionFormats, ...provided]);\n        return [...all];\n    }\n\n    _setClipboardData(clipboardType, format, value) {\n        if (!this.selection)\n            this._setupListener();\n\n        if (!this.selection) {\n            debug(`Failed to set clipboard content: Meta selection unavailable for clipboardType=${clipboardType}`);\n            return;\n        }\n\n        const bytes = toBytes(value);\n        if (!bytes)\n            return;\n\n        try {\n            const source = Meta.SelectionSourceMemory.new(format, GLib.Bytes.new(bytes));\n            this.selection.set_owner(metaSelectionTypeFromClipboardType(clipboardType), source);\n            debug(`Set clipboard content using Meta selection source for clipboardType=${clipboardType} format=${format}`);\n        } catch (error) {\n            debug(`Failed to set clipboard content using Meta selection source: ${error}`);\n        }\n    }\n}\n"
  },
  {
    "path": "shared/gnome-extension/metadata.json",
    "content": "{\n  \"name\": \"CopyQ Clipboard Monitor\",\n  \"description\": \"Forwards GNOME clipboard changes to active CopyQ sessions.\",\n  \"uuid\": \"copyq-clipboard@hluk.github.com\",\n  \"shell-version\": [\"45\", \"46\", \"47\", \"48\", \"49\"]\n}\n"
  },
  {
    "path": "shared/gpl-3.0.rtf",
    "content": "{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0 \\fswiss Helvetica;}{\\f1 Courier;}}\n{\\colortbl;\\red255\\green0\\blue0;\\red0\\green0\\blue255;}\n\\widowctrl\\hyphauto\n\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 GNU GENERAL PUBLIC LICENSE\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Version 3, 29 June 2007\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Copyright \\u169? 2007 Free Software Foundation, Inc. <{\\field{\\*\\fldinst{HYPERLINK \"https://fsf.org/\"}}{\\fldrslt{\\ul\nhttps://fsf.org/\n}}}\n>\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 Preamble\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The GNU General Public License is a free, copyleft license for software and other kinds of works.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The precise terms and conditions for copying, distribution and modification follow.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 TERMS AND CONDITIONS\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 0. Definitions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"This License\\u8221\" refers to version 3 of the GNU General Public License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"Copyright\\u8221\" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"The Program\\u8221\" refers to any copyrightable work licensed under this License. Each licensee is addressed as \\u8220\"you\\u8221\". \\u8220\"Licensees\\u8221\" and \\u8220\"recipients\\u8221\" may be individuals or organizations.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To \\u8220\"modify\\u8221\" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a \\u8220\"modified version\\u8221\" of the earlier work or a work \\u8220\"based on\\u8221\" the earlier work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"covered work\\u8221\" means either the unmodified Program or a work based on the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To \\u8220\"propagate\\u8221\" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To \\u8220\"convey\\u8221\" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 An interactive user interface displays \\u8220\"Appropriate Legal Notices\\u8221\" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 1. Source Code.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The \\u8220\"source code\\u8221\" for a work means the preferred form of the work for making modifications to it. \\u8220\"Object code\\u8221\" means any non-source form of a work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"Standard Interface\\u8221\" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The \\u8220\"System Libraries\\u8221\" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A \\u8220\"Major Component\\u8221\", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The \\u8220\"Corresponding Source\\u8221\" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The Corresponding Source for a work in source code form is that same work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 2. Basic Permissions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 4. Conveying Verbatim Copies.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 5. Conveying Modified Source Versions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab a) The work must carry prominent notices stating that you modified it, and giving a relevant date.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to \\u8220\"keep intact all notices\\u8221\".\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\\sa180\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an \\u8220\"aggregate\\u8221\" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 6. Conveying Non-Source Forms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\\sa180\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"User Product\\u8221\" is either (1) a \\u8220\"consumer product\\u8221\", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, \\u8220\"normally used\\u8221\" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"Installation Information\\u8221\" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 7. Additional Terms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\u8220\"Additional permissions\\u8221\" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab d) Limiting the use for publicity purposes of names of licensors or authors of the material; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\\par}\n{\\pard \\ql \\f0 \\sa0 \\li360 \\fi-360 \\bullet \\tx360\\tab f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\\sa180\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 All other non-permissive additional terms are considered \\u8220\"further restrictions\\u8221\" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 8. Termination.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 9. Acceptance Not Required for Having Copies.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 10. Automatic Licensing of Downstream Recipients.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 An \\u8220\"entity transaction\\u8221\" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 11. Patents.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A \\u8220\"contributor\\u8221\" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's \\u8220\"contributor version\\u8221\".\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A contributor's \\u8220\"essential patent claims\\u8221\" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, \\u8220\"control\\u8221\" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 In the following three paragraphs, a \\u8220\"patent license\\u8221\" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To \\u8220\"grant\\u8221\" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. \\u8220\"Knowingly relying\\u8221\" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 A patent license is \\u8220\"discriminatory\\u8221\" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 12. No Surrender of Others' Freedom.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 13. Use with the GNU Affero General Public License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 14. Revised Versions of this License.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License \\u8220\"or any later version\\u8221\" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 15. Disclaimer of Warranty.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \\u8220\"AS IS\\u8221\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 16. Limitation of Liability.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs24 17. Interpretation of Sections 15 and 16.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 END OF TERMS AND CONDITIONS\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\b \\fs28 How to Apply These Terms to Your New Programs\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the \\u8220\"copyright\\u8221\" line and a pointer to where the full notice is found.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\f1     <one line to give the program's name and a brief idea of what it does.>\\line\n    Copyright (C) <year>  <name of author>\\line\n\\line\n    This program is free software: you can redistribute it and/or modify\\line\n    it under the terms of the GNU General Public License as published by\\line\n    the Free Software Foundation, either version 3 of the License, or\\line\n    (at your option) any later version.\\line\n\\line\n    This program is distributed in the hope that it will be useful,\\line\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\\line\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\line\n    GNU General Public License for more details.\\line\n\\line\n    You should have received a copy of the GNU General Public License\\line\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 Also add information on how to contact you by electronic and paper mail.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 \\f1     <program>  Copyright (C) <year>  <name of author>\\line\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\\line\n    This is free software, and you are welcome to redistribute it\\line\n    under certain conditions; type `show c' for details.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an \\u8220\"about box\\u8221\".\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 You should also get your employer (if you work as a programmer) or school, if any, to sign a \\u8220\"copyright disclaimer\\u8221\" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <{\\field{\\*\\fldinst{HYPERLINK \"https://www.gnu.org/licenses/\"}}{\\fldrslt{\\ul\nhttps://www.gnu.org/licenses/\n}}}\n>.\\par}\n{\\pard \\ql \\f0 \\sa180 \\li0 \\fi0 The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <{\\field{\\*\\fldinst{HYPERLINK \"https://www.gnu.org/licenses/why-not-lgpl.html\"}}{\\fldrslt{\\ul\nhttps://www.gnu.org/licenses/why-not-lgpl.html\n}}}\n>.\\par}\n}\n"
  },
  {
    "path": "shared/plugins/example.js",
    "content": "// This is example plugin script for CopyQ.\n// Plugin scripts should be copied to plugins directory\n// (usually ~/.config/copyq/plugins/).\n\n// Override popup()\npopup = function(title, message, time)\n{\n    if (!time)\n        time = 1000\n    if (!message)\n        message = \"\"\n    execute(\"notify-send\", \"--expire-time=\" + time, title, message)\n}\n\nfunction copyq_script() {\n    popup(\"Script loaded!\")\n    return {\n        name: \"Test Script\",\n        author: function() { return \"author@example.com\" },\n        description: function() { return \"A script for testing\" },\n        formatsToSave: [\"test1\", \"test2\"],\n\n        copyItem: function(data) {\n            data['copy'] = \"copied\"\n            return data\n        },\n\n        transformItemData: function(data) {\n            data[mimeText] = \"TEST: \" + str(data[mimeText])\n            return data;\n        },\n    }\n}\n"
  },
  {
    "path": "shared/themes/black.ini",
    "content": "[General]\nnotes_css=\nfind_bg=#222222\nedit_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nbg=#000000\nfind_font=\"Sans,10,-1,5,50,0,0,0,0,0\"\nalt_item_css=\nsel_fg=#ffffff\nshow_scrollbars=true\nfind_fg=#ffffff\nedit_bg=#000000\nnum_fg=#888888\nfont=\"Sans,10,-1,5,50,0,0,0,0,0\"\nsel_item_css=\nsel_bg=#333333\nnotes_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nedit_fg=#ffffff\nshow_number=true\nnotes_fg=#ffffff\nitem_css=\nalt_bg=#111111\ncss=\nfg=#ffffff\nnum_font=\"Sans,7,-1,5,25,0,0,0,0,0\"\nnotes_bg=#000000\n"
  },
  {
    "path": "shared/themes/dark.ini",
    "content": "[General]\nnotes_css=\nfind_bg=#00689c\nedit_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nbg=#4b4b4b\nfind_font=\"Sans,10,-1,5,50,0,0,0,0,0\"\nalt_item_css=\nsel_fg=#ffffff\nshow_scrollbars=true\nfind_fg=#ffffff\nedit_bg=#ffffff\nnum_fg=#7f7f7f\nfont=\"Sans,10,-1,5,50,0,0,0,0,0\"\nsel_item_css=\nsel_bg=#61819c\nnotes_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nedit_fg=#1a1a1a\nshow_number=true\nnotes_fg=#232323\nitem_css=\nalt_bg=#383838\ncss=\nfg=#dfdfdf\nnum_font=\"Sans,7,-1,5,25,0,0,0,0,0\"\nnotes_bg=#ffffff\n"
  },
  {
    "path": "shared/themes/forest.ini",
    "content": "[General]\nalt_bg=#f1edcb\nalt_item_css=\"\n    ;background: qlineargradient(\n        x1: 0, y1: 0,\n        x2: 0, y2: 1,\n        stop: 0 ${alt_bg},\n        stop: 1.0 ${alt_bg - #112}\n        )\n    ;border-radius: 3px\n    \"\nbg=#fffaeb\ncss=ClipboardBrowser::selected:item{outline:0px}\nedit_bg=#fdfcfa\nedit_fg=#000000\nedit_font=\"Ubuntu Mono,11,-1,5,50,0,0,0,0,0\"\nfg=#2f2a15\nfind_bg=#d6ff94\nfind_fg=#000\nfind_font=\"Ubuntu Mono,11,-1,5,50,0,0,0,0,0\"\nfont=\"Ubuntu Mono,11,-1,5,50,0,0,0,0,0\"\nitem_css=\nnotes_bg=#d5ff94\nnotes_css=\nnotes_fg=#554e18\nnotes_font=\"Ubuntu Condensed,11,-1,5,50,0,0,0,0,0\"\nnum_fg=#96865b\nnum_font=\"Ubuntu Mono,7,-1,5,50,0,0,0,0,0\"\nsel_bg=#6eb662\nsel_fg=#ffffff\nsel_item_css=\"\n    ;background: qlineargradient(\n        x1: 0, y1: 0,\n        x2: 0, y2: 1,\n        stop: 0 ${sel_bg},\n        stop: 1.0 ${sel_bg - #222}\n        )\n    ;border: 0px solid transparent\n    ;border-radius: 3px\n    ;\n    \"\nshow_number=true\nshow_scrollbars=false\n"
  },
  {
    "path": "shared/themes/items.css",
    "content": "#ClipboardBrowser,#item,#item_child{\n    ;${font}\n    ;color: ${fg}\n    ;background: ${bg}\n}\n\n#ClipboardBrowser::item:alternate:!hover:!selected{\n    ;color: ${alt_fg}\n    ;background: ${alt_bg}\n}\n\n#ClipboardBrowser::item:selected\n,#item[CopyQ_selected=\"true\"]\n,#item[CopyQ_selected=\"true\"] #item_child\n{\n    ;color: ${sel_fg}\n    ;background: ${sel_bg}\n}\n\n#item #item_child\n,#item[CopyQ_selected=\"true\"] #item_child\n{\n    ;background: transparent\n}\n\n${hsv_saturation_factor = 0.5}\n    #ClipboardBrowser::item:selected:!active\n    {\n        ;background:${sel_bg}\n        ;${sel_item_css}\n    }\n${hsv_saturation_factor = 2}\n${hsv_value_factor = 0.9}\n    #ClipboardBrowser::item:hover:selected\n    {\n        ;background:${sel_bg}\n        ;${hover_item_css}\n    }\n    #ClipboardBrowser::item:hover:!selected\n    {\n        ;background:${bg}\n        ;${hover_item_css}\n    }\n${hsv_saturation_factor = 1}\n${hsv_value_factor = 1}\n\n/* Omit showing current item outline. */\n#ClipboardBrowser::focus{outline:0}\n\n#ClipboardBrowser::item:focus{ ${cur_item_css} }\n\n/* Allow user to change CSS. */\n#ClipboardBrowser{ ${item_css} }\n#ClipboardBrowser::item:alternate:!hover:!selected{ ${alt_item_css} }\n#ClipboardBrowser::item:selected{ ${sel_item_css} }\n\n#editor_status_bar * {\n    ;background: ${edit_bg}\n    ;color: ${edit_fg}\n    ;border: none\n}\n\n${css:tooltip}\n"
  },
  {
    "path": "shared/themes/light.ini",
    "content": "[General]\nalt_bg=#e0e0e0\nbg=#eeeeee\ncss=\nedit_bg=#cccccc\nedit_fg=fg - #111\nedit_font=\"monospace,11,-1,5,50,0,0,0,0,0\"\nfg=#444444\nfind_bg=\"rgba(0,0,0,0)\"\nfind_fg=#9d7200\nfind_font=\"monospace,11,-1,5,50,0,0,0,0,0\"\nfont=\"monospace,11,-1,5,50,0,0,0,0,0\"\nfont_antialiasing=true\nitem_css=padding:0.5em\nitem_spacing=\nmenu_bar_css=\"\n    ;background: ${bg}\n    ;color: ${fg + #444}\"\nmenu_bar_disabled_css=\"\n    ;color: ${bg - #666}\"\nmenu_bar_selected_css=\"\n    ;background: ${sel_bg}\n    ;color: ${sel_fg}\"\nmenu_css=\"\n    ;border-top: 0.08em solid ${bg + #333}\n    ;border-left: 0.08em solid ${bg + #333}\n    ;border-bottom: 0.08em solid ${bg - #333}\n    ;border-right: 0.08em solid ${bg - #333}\"\nnotes_bg=bg\nnotes_fg=#666666\nnotes_font=\"sans-serif,11,-1,5,25,0,0,0,0,0\"\nnotification_bg=#303030\nnotification_fg=#ddd\nnotification_font=\"monospace,11,-1,5,50,0,0,0,0,0\"\nnum_fg=#009588\nnum_font=\"sans-serif,8,-1,5,25,0,0,0,0,0\"\nsearch_bar=\"\n    ;background: ${edit_bg}\n    ;color: ${edit_fg}\n    ;border: 1px solid ${alt_bg}\n    ;margin: 2px\"\nsearch_bar_focused=\"\n    ;border: 1px solid ${sel_bg}\"\nsel_bg=#7dcad1\nsel_fg=#444444\nshow_number=true\nshow_scrollbars=false\nstyle_main_window=true\ntab_bar_css=\"\n    ;background: ${bg - #222}\"\ntab_bar_item_counter=\"\n    ;color: ${num_fg + #222}\n    ;font-size: 7pt\"\ntab_bar_scroll_buttons_css=\"\n    ;background: ${bg - #222}\n    ;color: ${fg}\n    ;border: 0\"\ntab_bar_sel_item_counter=\"\n    ;color: ${num_fg}\"\ntab_bar_tab_selected_css=\"\n    ;padding: 0.5em\n    ;background: ${bg}\n    ;border: 0.05em solid ${bg}\n    ;color: ${fg}\"\ntab_bar_tab_unselected_css=\"\n    ;border: 0.05em solid ${bg}\n    ;padding: 0.5em\n    ;background: ${bg - #222}\n    ;color: ${fg - #333}\"\ntab_tree_css=\"\n    ;font-family: sans-serif\n    ;font-size: 10pt\n    ;padding: .20em\n    ;color: ${fg + #222}\n    ;background-color: ${bg}\"\ntab_tree_item_counter=\"\n    ;padding:.33em\n    ;color: ${num_fg + #222}\n    ;font-size: 7pt\"\ntab_tree_sel_item_counter=\"\n    ;color: ${num_fg}\"\ntab_tree_sel_item_css=\"\n    ;color: ${fg + #222}\n    ;background: ${bg - #211}\"\ntool_bar_css=\"\n    ;color: ${fg}\n    ;background-color: ${bg}\n    ;border: 0\"\ntool_button_css=\"\n    ;background-color: transparent\"\nuse_system_icons=false\n"
  },
  {
    "path": "shared/themes/main_window.css",
    "content": "#searchBar{${search_bar}}\n\n#searchBar:focus{${search_bar_focused}}\n\n#tab_bar{${tab_bar_css}}\n#tab_bar::tab:selected{${tab_bar_tab_selected_css}}\n#tab_bar::tab:!selected{${tab_bar_tab_unselected_css}}\n#tab_bar #tab_item_counter{${tab_bar_item_counter}}\n#tab_bar #tab_item_counter[CopyQ_selected=\"true\"]{\n    ;${tab_bar_sel_item_counter}\n}\n\n#tab_bar QToolButton{${tab_bar_scroll_buttons_css}}\n\n#tab_tree, #tab_tree_item{${tab_tree_css}}\n\n#tab_tree::item:selected\n,#tab_tree_item[CopyQ_selected=\"true\"]\n{\n    ;${tab_tree_sel_item_css}\n}\n\n#tab_tree_item[CopyQ_selected=\"false\"]\n,#tab_tree_item[CopyQ_selected=\"true\"]\n{\n    ;background: transparent\n}\n\n#tab_tree #tab_item_counter{${tab_tree_item_counter}}\n#tab_tree #tab_item_counter[CopyQ_selected=\"true\"]{\n    ;${tab_tree_sel_item_counter}\n}\n\n#MainWindow>QToolBar QToolButton{\n    ;color: ${fg}\n    ;background: ${bg}\n}\n#MainWindow>QToolBar{${tool_bar_css}}\n#MainWindow>QToolBar QToolButton{${tool_button_css}}\n#MainWindow>QToolBar QToolButton:hover{${tool_button_selected_css}}\n#MainWindow>QToolBar QToolButton:pressed{${tool_button_pressed_css}}\n\n${css:main_window_simple}\n\n${css:menu}\n\n${css}\n"
  },
  {
    "path": "shared/themes/main_window_simple.css",
    "content": "#plainTextEditCommand {\n    ;${edit_font}\n}\n#comboBoxCommands {\n    ;${edit_font}\n}\n"
  },
  {
    "path": "shared/themes/menu.css",
    "content": "/* Remove icon border in menus. */\n#TrayMenu::item:selected,\n#MainWindow>QMenu::item:selected,\n#menu_bar>QMenu::item:selected\n{\n    border:none\n}\n\n#TrayMenu::item,\n#MainWindow>QMenu::item,\n#menu_bar>QMenu::item\n{\n    ;padding: 0.2em 1em 0.2em 1em\n    ;padding-left: ${scale=2}${icon_size}${scale=1}px\n}\n\n#TrayMenu::icon,\n#MainWindow>QMenu::icon,\n#menu_bar>QMenu::icon\n{\n    ;padding-left: ${scale=0.5}${icon_size}${scale=1}px\n}\n\n/* Keep default item highlighted (removing icon border resets the style). */\n#TrayMenu::item:default,\n#MainWindow>QMenu::item:default,\n#menu_bar>QMenu::item:default\n{\n    font-weight:bold\n}\n\n#TrayMenu,\n#MainWindow>QMenu,\n#menu_bar>QMenu\n{\n    ${menu_css}\n}\n\n#TrayMenu::item:selected,\n#MainWindow>QMenu::item:selected,\n#menu_bar>QMenu::item:selected\n{\n    ${menu_bar_selected_css}\n}\n\n#menu_bar, #menu_bar::item{${menu_bar_css}}\n#menu_bar::item:selected{${menu_bar_selected_css}}\n#menu_bar::item:disabled{${menu_bar_disabled_css}}\n\n${css:tooltip}\n"
  },
  {
    "path": "shared/themes/nord.ini",
    "content": "[General]\ncss_template_items=items\ncss_template_main_window=main_window\ncss_template_menu=menu\ncss_template_notification=notification\n\nstyle_main_window=true\nshow_number=true\nshow_scrollbars=false\nfont_antialiasing=true\nuse_system_icons=false\n\nicon_size=8\nitem_spacing=0\nnum_margin=2\n\nfont=\"Sans,11,-1,5,50,0,0,0,0,0\"\nfind_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nnum_font=\"Sans,8,-1,5,50,0,0,0,0,0\"\nedit_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nnotes_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nnotification_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\n\nbg=#2e3440\nfg=#eceff4\nalt_bg=#3b4252\nsel_bg=#5e81ac\nsel_fg=#eceff4\nfind_bg=#ebcb8b\nfind_fg=#2e3440\nedit_bg=#3b4252\nedit_fg=#eceff4\nnotes_bg=#4c566a\nnotes_fg=#eceff4\nnum_fg=#ebcb8b\nnum_sel_fg=#eceff4\nnotification_bg=#3b4252\nnotification_fg=#eceff4\n\ncss=\n\nmenu_bar_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;padding: 0.15em\n    ;border-radius: 5%\"\nmenu_bar_disabled_css=\nmenu_bar_selected_css=\"\n    ;background: ${sel_bg}\n    ;color: ${fg}\"\nmenu_css=\"\n    ;background: ${alt_bg}\n    ;color: ${fg}\n    ;border: 1px solid ${sel_bg}\"\n\ntool_bar_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;border: 0\"\ntool_button_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;font-weight: normal\n    ;border: 0\n    ;border-radius: 5%\"\ntool_button_pressed_css=\"\n    ;background: ${num_fg}\"\ntool_button_selected_css=\"\n    ;background: ${sel_bg}\n    ;color: ${sel_fg}\"\n\nsearch_bar=\"\n    ;background: ${find_bg}\n    ;color: ${bg}\n    ;margin: 0.2em 0 0.1em 0\n    ;padding: 0.2em 0 0.2em 0\n    ;border: 1px solid ${find_bg}\"\nsearch_bar_focused=\"\n    ;margin: 0.2em 0 0.1em 0\n    ;padding: 0.2em 0 0.2em 0\n    ;border: 1px solid ${sel_bg}\"\n\ntab_bar_css=\"\n    ;background: ${bg}\"\ntab_bar_item_counter=\"\n    ;color: #d08770\n    ;font-size: 6pt\"\ntab_bar_scroll_buttons_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;border: 0\"\ntab_bar_sel_item_counter=\"\n    ;color: #d08770\"\ntab_bar_tab_unselected_css=\"\n    ;background: ${bg}\n    ;color: ${num_fg}\n    ;padding: 0.2em\n    ;border: 1px solid ${bg}\"\ntab_bar_tab_selected_css=\"\n    ;background: ${alt_bg}\n    ;color: ${fg}\n    ;padding: 0.2em\n    ;border: 1px solid ${num_fg}\n    ;border-radius: 5%\"\n\ntab_tree_css=\"\n    ;background: ${bg}\n    ;color: ${num_fg}\"\ntab_tree_item_counter=\"\n    ;color: #d08770\n    ;font-size: 6pt\"\ntab_tree_sel_item_counter=\"\n    ;color: #d08770\"\ntab_tree_sel_item_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;text-decoration: underline\"\n\nitem_css=\"\n    ;padding: 0.3em 0.5em 0.5em 0.5em\"\nalt_item_css=\nsel_item_css=\ncur_item_css=\"\n    ;border: 1px solid ${sel_bg}\"\nhover_item_css=\"\n    ;background: #4c566a\"\nnotes_css=\n"
  },
  {
    "path": "shared/themes/nord_light.ini",
    "content": "[General]\ncss_template_items=items\ncss_template_main_window=main_window\ncss_template_menu=menu\ncss_template_notification=notification\n\nstyle_main_window=true\nshow_number=true\nshow_scrollbars=false\nfont_antialiasing=true\nuse_system_icons=false\n\nicon_size=8\nitem_spacing=0\nnum_margin=2\n\nfont=\"Sans,11,-1,5,50,0,0,0,0,0\"\nfind_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nnum_font=\"Sans,8,-1,5,50,0,0,0,0,0\"\nedit_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nnotes_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\nnotification_font=\"Sans,11,-1,5,50,0,0,0,0,0\"\n\nbg=#eceff4\nfg=#2e3440\nalt_bg=#e5e9f0\nsel_bg=#88c0d0\nsel_fg=#2e3440\nfind_bg=#ebcb8b\nfind_fg=#2e3440\nedit_bg=#d8dee9\nedit_fg=#2e3440\nnotes_bg=#d8dee9\nnotes_fg=#2e3440\nnum_fg=#88c0d0\nnum_sel_fg=#2e3440\nnotification_bg=#e5e9f0\nnotification_fg=#2e3440\n\ncss=\n\nmenu_bar_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;padding: 0.15em\n    ;border-radius: 5%\"\nmenu_bar_disabled_css=\nmenu_bar_selected_css=\"\n    ;background: ${sel_bg}\n    ;color: ${fg}\"\nmenu_css=\"\n    ;background: ${alt_bg}\n    ;color: ${fg}\n    ;border: 1px solid ${sel_bg}\"\n\ntool_bar_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;border: 0\"\ntool_button_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;font-weight: normal\n    ;border: 0\n    ;border-radius: 5%\"\ntool_button_pressed_css=\"\n    ;background: ${num_fg}\"\ntool_button_selected_css=\"\n    ;background: ${sel_bg}\n    ;color: ${sel_fg}\"\n\nsearch_bar=\"\n    ;background: ${find_bg}\n    ;color: ${fg}\n    ;margin: 0.2em 0 0.1em 0\n    ;padding: 0.2em 0 0.2em 0\n    ;border: 1px solid ${find_bg}\"\nsearch_bar_focused=\"\n    ;margin: 0.2em 0 0.1em 0\n    ;padding: 0.2em 0 0.2em 0\n    ;border: 1px solid ${sel_bg}\"\n\ntab_bar_css=\"\n    ;background: ${bg}\"\ntab_bar_item_counter=\"\n    ;color: #d08770\n    ;font-size: 6pt\"\ntab_bar_scroll_buttons_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;border: 0\"\ntab_bar_sel_item_counter=\"\n    ;color: #d08770\"\ntab_bar_tab_unselected_css=\"\n    ;background: ${bg}\n    ;color: ${num_fg}\n    ;padding: 0.2em\n    ;border: 1px solid ${bg}\"\ntab_bar_tab_selected_css=\"\n    ;background: ${alt_bg}\n    ;color: ${fg}\n    ;padding: 0.2em\n    ;border: 1px solid ${num_fg}\n    ;border-radius: 5%\"\n\ntab_tree_css=\"\n    ;background: ${bg}\n    ;color: ${num_fg}\"\ntab_tree_item_counter=\"\n    ;color: #d08770\n    ;font-size: 6pt\"\ntab_tree_sel_item_counter=\"\n    ;color: #d08770\"\ntab_tree_sel_item_css=\"\n    ;background: ${bg}\n    ;color: ${fg}\n    ;text-decoration: underline\"\n\nitem_css=\"\n    ;padding: 0.3em 0.5em 0.5em 0.5em\"\nalt_item_css=\nsel_item_css=\ncur_item_css=\"\n    ;border: 1px solid ${sel_bg}\"\nhover_item_css=\"\n    ;background: #d8dee9\"\nnotes_css=\n"
  },
  {
    "path": "shared/themes/notification.css",
    "content": "#Notification, #Notification QWidget\n{\n    /* Resets notification opacity. It will be set in NotificationDaemon::setNotificationOpacity(). */\n    ;background: ${notification_bg + #000}\n}\n#Notification QWidget{\n    ;color: ${notification_fg}\n    ;${notification_font}\n}\n#Notification #NotificationTitle{\n    ;${scale=1.2}${notification_font}${scale=1}\n}\n#Notification #NotificationTip{\n    ;font-style: italic\n}\n"
  },
  {
    "path": "shared/themes/paper.ini",
    "content": "[General]\nalt_bg=bg\nalt_item_css=\"\\n    \"\nbg=#f7f7f7\ncss=\"\\n    ClipboardBrowser::selected:item{outline:0px}\\n    ClipboardBrowser::item{border-bottom:1px solid #cdf}\\n    \"\nedit_bg=\"rgba(247,247,247,0.862745)\"\nedit_fg=fg - #111\nedit_font=\"Sans,9,-1,5,50,0,0,0,0,0\"\nfg=#068\nfind_bg=\"rgba(157,255,0,0)\"\nfind_fg=#09a\nfind_font=\"Ubuntu,9,-1,5,50,0,1,0,0,0\"\nfont=\"Sans,9,-1,5,50,0,0,0,0,0\"\nitem_css=padding:1.5em 3em 1.5em 3em\nnotes_bg=bg\nnotes_css=\nnotes_fg=fg\nnotes_font=\"Sans,10,-1,5,50,0,0,0,0,0\"\nnum_fg=bg - #866\nnum_font=\"Sans,7,-1,5,25,0,0,0,0,0\"\nsel_bg=#97ea6a\nsel_fg=#234\nsel_item_css=\"\\n    ;background: qlineargradient(\\n        x1: 0, y1: 0.2,\\n        x2: 0.8, y2: 0,\\n        stop: 0 ${sel_bg},\\n        stop: 1 ${bg}\\n        )\\n    \"\nshow_number=true\nshow_scrollbars=false\n"
  },
  {
    "path": "shared/themes/simple.ini",
    "content": "[General]\nalt_bg=bg\nalt_item_css=\"\n    ;border-radius: 2px\n    ;background: qlineargradient(\n        x1: 0, y1: 0,\n        x2: 1.5, y2: 0,\n        stop: 0 ${alt_bg - #100c0a},\n        stop: 1 ${alt_bg}\n        )\n    \"\nbg=#f7f7f7\ncss=ClipboardBrowser::selected:item{outline:0px}\nedit_bg=bg\nedit_fg=fg - #111\nedit_font=\"Sans,9,-1,5,50,0,0,0,0,0\"\nfg=#356\nfind_bg=\"rgba(0,0,0,0)\"\nfind_fg=#08a\nfind_font=\"Sans,9,-1,5,50,0,1,0,0,0\"\nfont=\"Sans,9,-1,5,50,0,0,0,0,0\"\nitem_css=padding:1em\nnotes_bg=bg\nnotes_css=\nnotes_fg=#222\nnotes_font=\"Serif,10,-1,5,50,0,0,0,0,0\"\nnum_fg=#586e75\nnum_font=\"Sans,7,-1,5,25,0,0,0,0,0\"\nsel_bg=\"bg + #000409 - #100\"\nsel_fg=#234\nsel_item_css=\"\n    ;border: 1px solid ${bg - #940}\n    ;border-radius: 2px\n    ;background: qlineargradient(\n        x1: 0, y1: 0,\n        x2: 1.5, y2: 0,\n        stop: 0 ${sel_bg},\n        stop: 1 ${bg}\n        )\n    \"\nshow_number=false\nshow_scrollbars=false\n"
  },
  {
    "path": "shared/themes/solarized-dark.ini",
    "content": "[General]\nalt_bg=#073642\nalt_item_css=\nbg=#002b36\ncss=\nedit_bg=alt_bg\nedit_fg=#2aa198\nedit_font=\"Monospace,9,-1,5,50,0,0,0,0,0\"\nfg=#93a1a1\nfind_bg=\"rgba(0,0,0,0)\"\nfind_fg=#b58900\nfind_font=\"Monospace,9,-1,5,50,0,0,0,0,0\"\nfont=\"Monospace,9,-1,5,50,0,0,0,0,0\"\nitem_css=\nnotes_css=\nnotes_bg=bg\nnotes_fg=#ce4d17\nnotes_font=\"Serif,10,-1,5,50,0,0,0,0,0\"\nnum_fg=#586e75\nnum_font=\"Monospace,7,-1,5,25,0,0,0,0,0\"\nsel_bg=fg\nsel_fg=bg\nsel_item_css=\nshow_number=true\nshow_scrollbars=false\n"
  },
  {
    "path": "shared/themes/solarized-light.ini",
    "content": "[General]\nalt_bg=#eee8d5\nalt_item_css=\nbg=#fdf6e3\ncss=\nedit_bg=bg\nedit_fg=#268bd2\nedit_font=\"Monospace,9,-1,5,50,0,0,0,0,0\"\nfg=#586e75\nfind_bg=\"rgba(0,0,0,0)\"\nfind_fg=#b58900\nfind_font=\"Monospace,9,-1,5,50,0,0,0,0,0\"\nfont=\"Monospace,9,-1,5,50,0,0,0,0,0\"\nitem_css=\nnotes_css=\nnotes_bg=bg\nnotes_fg=#ce4d17\nnotes_font=\"Serif,10,-1,5,50,0,0,0,0,0\"\nnum_fg=#586e75\nnum_font=\"Monospace,7,-1,5,25,0,0,0,0,0\"\nsel_bg=fg\nsel_fg=bg\nsel_item_css=\nshow_number=true\nshow_scrollbars=false\n"
  },
  {
    "path": "shared/themes/tooltip.css",
    "content": "#item QToolTip, QMenu QToolTip {\n    ;${notes_font}\n    ;background: ${notes_bg}\n    ;color: ${notes_fg}\n    /* Resetting border helps in some cases to set correct background color. */\n    ;border: 1px solid ${notes_fg}\n    ;${notes_css}\n}\n"
  },
  {
    "path": "shared/themes/wine.ini",
    "content": "[General]\nalt_bg=bg-#101a1a\nalt_item_css=\"\n    ;border: 0px solid transparent\n    ;border-radius: 5px\n    \"\nbg=#ffffff\ncss=ClipboardBrowser::selected:item{outline:0px}\nedit_bg=#ffffff\nedit_fg=#1a1a1a\nedit_font=\"Serif,9,-1,5,50,0,0,0,0,0\"\nfg=#515151\nfind_bg=sel_bg\nfind_fg=#fff\nfind_font=\"Serif,9,-1,5,50,0,1,0,0,0\"\nfont=\"Serif,9,-1,5,50,0,0,0,0,0\"\nitem_css=\nnotes_bg=#610001\nnotes_css=\nnotes_fg=#ffffff\nnotes_font=\"Serif,10,-1,5,50,0,0,0,0,0\"\nnum_fg=#a00028\nnum_font=\"Ubuntu,7,-1,5,25,0,0,0,0,0\"\nsel_bg=#a04\nsel_fg=#fff\nsel_item_css=\"\n    ;background: qlineargradient(\n        x1: 0, y1: 0,\n        x2: 0, y2: 1,\n        stop: 0 ${sel_bg},\n        stop: 1 ${sel_bg - #444}\n        )\n    ;border: 1px solid #000\n    ;border-radius: 5px\n    \"\nshow_number=true\nshow_scrollbars=false\n"
  },
  {
    "path": "src/CMakeLists.txt",
    "content": "# Project files\nfile(GLOB copyq_SOURCES\n    app/*.cpp\n    common/*.cpp\n    gui/*.cpp\n    gui/notification.h\n    item/*.cpp\n    scriptable/*.cpp\n    scriptable/scriptableproxy.h\n    )\n\nfile(GLOB copyq_FORMS\n    ui/*.ui\n    )\n\n# translations\nfile(GLOB copyq_TRANSLATIONS ../translations/*.ts)\n\nset(copyq_RESOURCES copyq.qrc)\n\n# Qt include paths and definitions\ninclude(notifications.cmake)\nif (WITH_AUDIO)\n    include(audio.cmake)\nendif()\ninclude(platform/platform.cmake)\n\nset_source_files_properties(\n    main.cpp ${copyq_SOURCES} PROPERTIES\n    COMPILE_OPTIONS \"${copyq_pedantic_flags}\")\n\n# Qxt - global shortcuts\nif (USE_QXT)\n    list(APPEND copyq_SOURCES ../qxt/qxtglobalshortcut.cpp)\n    list(APPEND copyq_DEFINITIONS QXT_STATIC COPYQ_GLOBAL_SHORTCUTS)\nendif()\n\nqt_wrap_ui(copyq_FORMS_HEADERS ${copyq_FORMS})\nqt_add_resources(copyq_RESOURCES_RCC ${copyq_RESOURCES})\n\nset(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})\n\n# Generate version.h from current git commit if available.\nset(copyq_VERSION_FILE \"${CMAKE_CURRENT_BINARY_DIR}/common/version.cpp\")\nadd_custom_target(\n    generate_version_file\n    ALL\n    COMMAND ${CMAKE_COMMAND}\n        -D INPUT_FILE=${CMAKE_CURRENT_SOURCE_DIR}/common/version.cpp.in\n        -D OUTPUT_FILE=${copyq_VERSION_FILE}\n        -P ${CMAKE_CURRENT_SOURCE_DIR}/version_file.cmake\n    BYPRODUCTS ${copyq_VERSION_FILE}\n    WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"\n)\nset_source_files_properties(${copyq_VERSION_FILE} PROPERTIES GENERATED TRUE)\nset_property(SOURCE ${copyq_VERSION_FILE} PROPERTY SKIP_AUTOMOC ON)\n\nset(copyq_COMPILE\n    ${copyq_COMPILE}\n    ${copyq_SOURCES}\n    ${copyq_FORMS_HEADERS}\n    ${copyq_VERSION_FILE}\n   )\nadd_library(copyq-common OBJECT ${copyq_COMPILE})\n\nfind_package(${copyq_qt} REQUIRED COMPONENTS LinguistTools)\nif(\"${QT_DEFAULT_MAJOR_VERSION}\" STREQUAL \"5\")\n    qt5_add_translation(copyq_QM ${copyq_TRANSLATIONS})\nelse()\n    qt_add_translations(copyq-common\n        TS_FILES ${copyq_TRANSLATIONS}\n        QM_FILES_OUTPUT_VARIABLE copyq_QM\n    )\nendif()\n\nif (NOT copyq_version)\n    message(FATAL_ERROR \"Application version is unset\")\nendif()\n\nif (NOT APPLE)\n    add_executable(${COPYQ_EXECUTABLE_NAME}\n        ${copyq_windows_no_console}\n        main.cpp\n        ${copyq_RESOURCES_RCC}\n        ${copyq_QM}\n        $<TARGET_OBJECTS:copyq-common>\n        ${MINIAUDIO_OBJECTS}\n    )\nelse()\n    FIND_LIBRARY(CARBON_LIBRARY Carbon REQUIRED)\n    FIND_LIBRARY(COCOA_LIBRARY Cocoa REQUIRED)\n    MARK_AS_ADVANCED(CARBON_LIBRARY COCOA_LIBRARY)\n    list(APPEND copyq_LIBRARIES \"${CARBON_LIBRARY}\" \"${COCOA_LIBRARY}\")\n\n    set(COPYQ_VERSION_REGEX \"^([0-9]+)\\.([0-9]+)\\.(.*)$\")\n    string(REGEX REPLACE \"${COPYQ_VERSION_REGEX}\"\n        \"\\\\1\" CPACK_PACKAGE_VERSION_MAJOR\n        \"${copyq_version}\"\n        )\n    string(REGEX REPLACE \"${COPYQ_VERSION_REGEX}\"\n        \"\\\\2\" CPACK_PACKAGE_VERSION_MINOR\n        \"${copyq_version}\"\n        )\n    string(REGEX REPLACE \"${COPYQ_VERSION_REGEX}\"\n        \"\\\\3\" CPACK_PACKAGE_VERSION_PATCH\n        \"${copyq_version}\"\n        )\n\n    set(MACOSX_BUNDLE_BUNDLE_NAME \"${COPYQ_EXECUTABLE_NAME}\")\n    set(MACOSX_BUNDLE_GUI_IDENTIFIER \"io.github.hluk.CopyQ\")\n    set(MACOSX_BUNDLE_INFO_STRING \"Advanced clipboard manager with editing and scripting features\")\n    set(MACOSX_BUNDLE_ICON_FILE \"icon.icns\")\n    set(MACOSX_BUNDLE_LONG_VERSION_STRING \"${copyq_version}\")\n    set(MACOSX_BUNDLE_SHORT_VERSION_STRING \"${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}\")\n    set(MACOSX_BUNDLE_BUNDLE_VERSION \"${copyq_version}\")\n\n    set_source_files_properties(\"${CMAKE_CURRENT_SOURCE_DIR}/images/icon.icns\" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)\n    set(copyq_COMPILE ${copyq_COMPILE} \"${CMAKE_CURRENT_SOURCE_DIR}/images/icon.icns\")\n\n    add_executable(${COPYQ_EXECUTABLE_NAME} MACOSX_BUNDLE\n        main.cpp\n        ${copyq_RESOURCES_RCC}\n        ${copyq_QM}\n        $<TARGET_OBJECTS:copyq-common>\n        ${MINIAUDIO_OBJECTS}\n        \"${CMAKE_CURRENT_SOURCE_DIR}/images/icon.icns\"\n    )\nendif()\n\ntarget_sources(copyq-common PRIVATE ${copyq_SOURCES})\nadd_dependencies(copyq-common generate_version_file)\n\n# Qt modules\nlist(APPEND copyq_qt_modules Network Svg Xml Qml)\nforeach (copyq_qt_module ${copyq_qt_modules})\n    find_package(${copyq_qt}${copyq_qt_module} REQUIRED)\n    list(APPEND copyq_LIBRARIES ${copyq_qt}::${copyq_qt_module})\nendforeach()\n\nset_target_properties(copyq-common PROPERTIES COMPILE_DEFINITIONS \"${copyq_DEFINITIONS}\")\nset_target_properties(${COPYQ_EXECUTABLE_NAME} PROPERTIES LINK_FLAGS \"${copyq_LINK_FLAGS}\")\ntarget_link_libraries(copyq-common ${copyq_LIBRARIES})\ntarget_link_libraries(${COPYQ_EXECUTABLE_NAME} ${copyq_LIBRARIES})\ntarget_include_directories(copyq-common PRIVATE ${CMAKE_CURRENT_BINARY_DIR} .)\nif (WITH_AUDIO)\n    # SYSTEM suppresses warnings from the third-party header on Clang/GCC.\n    if (MSVC)\n        target_include_directories(copyq-common PRIVATE \"${MINIAUDIO_INCLUDE_DIR}\")\n    else()\n        target_include_directories(copyq-common SYSTEM PRIVATE \"${MINIAUDIO_INCLUDE_DIR}\")\n    endif()\nendif()\ntarget_include_directories(${COPYQ_EXECUTABLE_NAME} PRIVATE .)\n\n# Precompiled headers for faster MSVC builds.\n# Clang with -Weverything and ccache+PCH cause issues on other platforms.\nif (MSVC)\n    target_precompile_headers(copyq-common PRIVATE\n        <QApplication>\n        <QByteArray>\n        <QCoreApplication>\n        <QDir>\n        <QFile>\n        <QList>\n        <QLoggingCategory>\n        <QMimeData>\n        <QObject>\n        <QRegularExpression>\n        <QSettings>\n        <QString>\n        <QStringList>\n        <QTimer>\n        <QVariant>\n        <QVariantMap>\n        <QWidget>\n    )\nendif()\n\n# install\nif (WIN32)\n    install(TARGETS ${COPYQ_EXECUTABLE_NAME}\n        RUNTIME DESTINATION . COMPONENT Runtime\n        LIBRARY DESTINATION . COMPONENT Runtime\n        )\nelse()\n    install(TARGETS ${COPYQ_EXECUTABLE_NAME}\n        BUNDLE DESTINATION . COMPONENT Runtime\n        RUNTIME DESTINATION bin COMPONENT Runtime\n        )\nendif()\n\nif (NOT APPLE)\n    if (TRANSLATION_INSTALL_PREFIX)\n        install(FILES ${copyq_QM} DESTINATION \"${TRANSLATION_INSTALL_PREFIX}\")\n    endif()\nelse()\n    set_source_files_properties(${copyq_QM} PROPERTIES MACOSX_PACKAGE_LOCATION \"Resources/translations\")\n\n    set_target_properties(${COPYQ_EXECUTABLE_NAME} PROPERTIES MACOSX_BUNDLE TRUE)\n    set_target_properties(${COPYQ_EXECUTABLE_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST \"${CMAKE_CURRENT_SOURCE_DIR}/../shared/Info.plist\")\n    set_target_properties(${COPYQ_EXECUTABLE_NAME} PROPERTIES\n        INSTALL_RPATH \"@executable_path/../Frameworks\")\n\n    set(BUNDLE \"\\${CMAKE_INSTALL_PREFIX}/${COPYQ_EXECUTABLE_NAME}.app\")\n\n    # https://doc.qt.io/qt-6/qt-deploy-runtime-dependencies.html\n    # Generate a deployment script to be executed at install time.\n    # Collect third-party library directories from CMAKE_PREFIX_PATH so\n    # macdeployqt can find them (via -libpath) and resolve their Qt deps.\n    set(COPYQ_DEPLOY_LIBPATHS \"\")\n    foreach(_prefix ${CMAKE_PREFIX_PATH})\n        get_filename_component(_lib_dir \"${_prefix}/lib\" ABSOLUTE)\n        if(IS_DIRECTORY \"${_lib_dir}\")\n            list(APPEND COPYQ_DEPLOY_LIBPATHS \"${_lib_dir}\")\n        endif()\n    endforeach()\n    list(REMOVE_DUPLICATES COPYQ_DEPLOY_LIBPATHS)\n\n    configure_file(\n        \"${CMAKE_CURRENT_SOURCE_DIR}/platform/mac/deploy.cmake.in\"\n        \"${CMAKE_CURRENT_BINARY_DIR}/deploy_copyq.cmake\"\n        @ONLY)\n    install(SCRIPT \"${CMAKE_CURRENT_BINARY_DIR}/deploy_copyq.cmake\")\n\n    configure_file(\n        \"${CMAKE_CURRENT_SOURCE_DIR}/platform/mac/fixup_bundle.cmake.in\"\n        \"${CMAKE_CURRENT_BINARY_DIR}/fixup_copyq_bundle.cmake\"\n        @ONLY)\n    install(SCRIPT \"${CMAKE_CURRENT_BINARY_DIR}/fixup_copyq_bundle.cmake\")\n\n    set(CPACK_GENERATOR \"DragNDrop\")\n    include(CPack)\nendif()\n\n# Compile with tests?\nOPTION(WITH_TESTS \"Run test cases from command line\" OFF)\nif(WITH_TESTS)\n    include(tests/tests.cmake)\nendif()\n"
  },
  {
    "path": "src/app/app.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"app.h\"\n\n#include \"common/commandstore.h\"\n#include \"common/settings.h\"\n#include \"common/textdata.h\"\n#include \"item/serialize.h\"\n#include \"platform/platformnativeinterface.h\"\n#ifdef Q_OS_UNIX\n#   include \"platform/unix/unixsignalhandler.h\"\n#endif\n\n#include <QCoreApplication>\n#include <QDir>\n#include <QLibraryInfo>\n#include <QLocale>\n#include <QStandardPaths>\n#include <QTranslator>\n#include <QVariant>\n\n#include <memory>\n\nnamespace {\n\nvoid installTranslator(const QString &filename, const QString &directory)\n{\n    std::unique_ptr<QTranslator> translator( new QTranslator(qApp) );\n    if ( translator->load(filename, directory) )\n        QCoreApplication::installTranslator(translator.release());\n}\n\nvoid installTranslator()\n{\n    QString locale = qEnvironmentVariable(\"COPYQ_LOCALE\");\n    if (locale.isEmpty()) {\n        locale = QSettings().value(QStringLiteral(\"Options/language\")).toString();\n        if (locale.isEmpty())\n            locale = QLocale::system().name();\n        qputenv(\"COPYQ_LOCALE\", locale.toLocal8Bit());\n    }\n\n#ifdef COPYQ_TRANSLATION_PREFIX\n    const QString translationPrefix = COPYQ_TRANSLATION_PREFIX;\n#else\n    const QString translationPrefix = platformNativeInterface()->translationPrefix();\n#endif\n\n    QStringList translationDirectories;\n    translationDirectories.prepend(translationPrefix);\n\n    // 1. Qt translations\n    installTranslator(QLatin1String(\"qt_\") + locale, translationPrefix);\n    installTranslator(QLatin1String(\"qt_\") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));\n\n    // 2. installed translations\n    installTranslator(QLatin1String(\"copyq_\") + locale, translationPrefix);\n\n    // 3. custom translations\n    const QString customPath = qEnvironmentVariable(\"COPYQ_TRANSLATION_PREFIX\");\n    if ( !customPath.isEmpty() ) {\n        const QString customDir = QDir::fromNativeSeparators(customPath);\n        installTranslator(QLatin1String(\"copyq_\") + locale, customDir);\n        translationDirectories.prepend(customDir);\n    }\n\n    // 4. compiled, non-installed translations in debug builds\n#ifdef COPYQ_DEBUG\n    const QString compiledTranslations = QCoreApplication::applicationDirPath() + QLatin1String(\"/src\");\n    installTranslator(QLatin1String(\"copyq_\") + locale, compiledTranslations);\n    translationDirectories.prepend(compiledTranslations);\n#endif\n\n    qApp->setProperty(\"CopyQ_translation_directories\", translationDirectories);\n\n    QLocale::setDefault(QLocale(locale));\n}\n\n} // namespace\n\nvoid setSessionName(const QString &sessionName)\n{\n    const QString appName =\n        sessionName.isEmpty()\n        ? QStringLiteral(\"copyq\")\n        : QStringLiteral(\"copyq-%1\").arg(sessionName);\n    QCoreApplication::setOrganizationName(appName);\n    QCoreApplication::setApplicationName(appName);\n}\n\nvoid initSession(QCoreApplication *app, const QString &sessionName)\n{\n    qputenv(\"COPYQ_SESSION_NAME\", sessionName.toLocal8Bit());\n    qputenv(\"COPYQ\", QCoreApplication::applicationFilePath().toLocal8Bit());\n\n    const auto settingsPath = qEnvironmentVariable(\"COPYQ_SETTINGS_PATH\");\n    if ( !settingsPath.isEmpty() ) {\n        QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, settingsPath);\n\n        // Setting the NativeFormat paths on Windows, macOS, and iOS has no effect.\n        QSettings::setDefaultFormat(QSettings::IniFormat);\n    }\n\n    if ( qEnvironmentVariableIsEmpty(\"COPYQ_ITEM_DATA_PATH\") ) {\n        if ( !app->property(\"CopyQ_item_data_path\").isValid() ) {\n            app->setProperty(\n                \"CopyQ_item_data_path\",\n                QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)\n                + QLatin1String(\"/items\"));\n        }\n    } else {\n        app->setProperty(\n            \"CopyQ_item_data_path\",\n            qEnvironmentVariable(\"COPYQ_ITEM_DATA_PATH\")\n        );\n    }\n}\n\nApp::App(QCoreApplication *application,\n        const QString &sessionName)\n    : m_app(application)\n    , m_exitCode(0)\n    , m_started(false)\n    , m_closed(false)\n{\n    registerDataFileConverter();\n\n    QObject::connect(m_app, &QCoreApplication::aboutToQuit, [this]() { exit(); });\n\n#ifdef Q_OS_UNIX\n    startUnixSignalHandler();\n#endif\n\n    m_app->setProperty( \"CopyQ_session_name\", QVariant(sessionName) );\n    initSession(m_app, sessionName);\n}\n\nApp::~App()\n{\n    QCoreApplication::processEvents();\n    App::exit();\n    delete m_app;\n}\n\nvoid App::installTranslator()\n{\n    ::installTranslator();\n}\n\nint App::exec()\n{\n    if ( wasClosed() ) {\n        m_app->processEvents();\n        return m_exitCode;\n    }\n\n    m_started = true;\n\n    return m_app->exec();\n}\n\nvoid App::exit(int exitCode)\n{\n    if ( wasClosed() )\n        return;\n\n    if (!m_started)\n        ::exit(exitCode);\n\n    m_exitCode = exitCode;\n    m_closed = true;\n    QCoreApplication::exit(exitCode);\n}\n\nbool App::wasClosed() const\n{\n    return m_closed;\n}\n"
  },
  {
    "path": "src/app/app.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QCoreApplication;\nclass QString;\n\nvoid setSessionName(const QString &sessionName);\n\nvoid initSession(QCoreApplication *application, const QString &sessionName);\n\n/** Application class. */\nclass App\n{\npublic:\n    explicit App(\n            QCoreApplication *application,\n            const QString &sessionName\n            );\n\n    virtual ~App();\n\n    static void installTranslator();\n\n    /**\n     * Execute application. Returns immediately if exit() was called before.\n     * @return Exit code.\n     */\n    int exec();\n\n    /**\n     * Exit application with given exit code.\n     */\n    virtual void exit(int exitCode=0);\n\n    /**\n     * Return true if exit() was called.\n     */\n    bool wasClosed() const;\n\n    App(const App &) = delete;\n    App &operator=(const App &) = delete;\n\nprivate:\n    QCoreApplication *m_app;\n    int m_exitCode;\n    bool m_started;\n    bool m_closed;\n};\n"
  },
  {
    "path": "src/app/applicationexceptionhandler.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"applicationexceptionhandler.h\"\n\n#include \"common/log.h\"\n\n#include <QCoreApplication>\n#include <QFile>\n#include <QMetaObject>\n\nvoid logException(const char *what)\n{\n    QFile f;\n    if ( f.open(stderr, QIODevice::WriteOnly) ) {\n        f.write(what ? what : \"Unknown exception\");\n        f.write(\"\\n\");\n        f.close();\n    }\n\n    log( QString(\"Exception: \") + what, LogError );\n}\n\nvoid detail::ApplicationExceptionHandlerBase::exit(int exitCode)\n{\n    QMetaObject::invokeMethod(this, \"exitSlot\", Q_ARG(int, exitCode));\n}\n\nvoid detail::ApplicationExceptionHandlerBase::exitSlot(int exitCode)\n{\n    qApp->exit(exitCode);\n}\n"
  },
  {
    "path": "src/app/applicationexceptionhandler.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QObject>\n\n#include <exception>\n\nclass QCoreApplication;\nclass QEvent;\n\nvoid logException(const char *what = nullptr);\n\nnamespace detail {\n\nclass ApplicationExceptionHandlerBase : public QObject\n{\n    Q_OBJECT\n\nprotected:\n    /// Exit application (thread-safe).\n    void exit(int exitCode);\n\nprivate slots:\n    void exitSlot(int exitCode);\n};\n\n} // namespace detail\n\ntemplate <typename QtApplication>\nclass ApplicationExceptionHandler : public detail::ApplicationExceptionHandlerBase, public QtApplication\n{\npublic:\n    ApplicationExceptionHandler(int &argc, char **argv)\n        : QtApplication(argc, argv)\n    {\n    }\n\n    bool notify(QObject *receiver, QEvent *event) override\n    {\n        try {\n            return QtApplication::notify(receiver, event);\n        } catch (const std::exception &e) {\n            logException(e.what());\n        } catch (...) {\n            logException();\n        }\n\n        detail::ApplicationExceptionHandlerBase::exit(1);\n        return true;\n    }\n};\n"
  },
  {
    "path": "src/app/clipboardclient.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardclient.h\"\n\n#include \"common/client_server.h\"\n#include \"common/clientsocket.h\"\n#include \"common/commandstatus.h\"\n#include \"common/commandstore.h\"\n#include \"common/common.h\"\n#include \"common/log.h\"\n#include \"common/textdata.h\"\n#include \"item/itemfactory.h\"\n#include \"platform/platformnativeinterface.h\"\n#include \"scriptable/scriptable.h\"\n#include \"scriptable/scriptableproxy.h\"\n\n#include <QApplication>\n#include <QFile>\n#include <QJSEngine>\n#include <QThread>\n#include <QTimer>\n\nnamespace {\n\nQString messageCodeToString(int code)\n{\n    switch (code) {\n    case CommandFunctionCallReturnValue:\n        return QStringLiteral(\"CommandFunctionCallReturnValue\");\n    case CommandInputDialogFinished:\n        return QStringLiteral(\"CommandInputDialogFinished\");\n    case CommandStop:\n        return QStringLiteral(\"CommandStop\");\n    case CommandData:\n        return QStringLiteral(\"CommandData\");\n    default:\n        return QStringLiteral(\"Unknown(%1)\").arg(code);\n    }\n}\n\nQCoreApplication *createClientApplication(int &argc, char **argv, const QStringList &arguments)\n{\n    // Clipboard access requires QApplication.\n    if ( arguments.size() > 1 && arguments[0] == QLatin1String(\"--clipboard-access\") ) {\n        const auto app = platformNativeInterface()\n                ->createClipboardProviderApplication(argc, argv);\n        return app;\n    }\n\n    const auto app = platformNativeInterface()->createClientApplication(argc, argv);\n    return app;\n}\n\n} // namespace\n\nClipboardClient::ClipboardClient(int &argc, char **argv, const QStringList &arguments, const QString &sessionName)\n    : App(createClientApplication(argc, argv, arguments), sessionName)\n{\n    App::installTranslator();\n\n    // Start script after QCoreApplication::exec().\n    QTimer::singleShot(0, this, [&]() { start(sessionName, arguments); });\n}\n\nvoid ClipboardClient::onMessageReceived(const QByteArray &data, int messageCode)\n{\n    COPYQ_LOG_VERBOSE( QLatin1String(\"Message received: \") + messageCodeToString(messageCode) );\n\n    switch (messageCode) {\n    case CommandFunctionCallReturnValue:\n        emit functionCallResultReceived(data);\n        break;\n\n    case CommandInputDialogFinished: {\n        emit inputDialogFinished(data);\n        break;\n    }\n\n    case CommandStop: {\n        emit stop();\n        break;\n    }\n\n    case CommandData:\n        emit dataReceived(data);\n        break;\n\n    default:\n        log( QLatin1String(\"Unhandled message: \") + messageCodeToString(messageCode), LogError );\n        break;\n    }\n}\n\nvoid ClipboardClient::onDisconnected()\n{\n    if ( wasClosed() )\n        return;\n\n    log( tr(\"Connection lost!\"), LogError );\n\n    exit(1);\n}\n\nvoid ClipboardClient::onConnectionFailed()\n{\n    log( tr(\"Cannot connect to server! Start CopyQ server first.\"), LogError );\n    exit(1);\n}\n\nvoid ClipboardClient::start(const QString &sessionName, const QStringList &arguments)\n{\n    ItemFactory itemFactory;\n    itemFactory.loadPlugins();\n    QSettings settings;\n    itemFactory.loadItemFactorySettings(&settings);\n\n    QJSEngine engine;\n    ScriptableProxy scriptableProxy(nullptr, nullptr);\n    Scriptable scriptable(&engine, &scriptableProxy, &itemFactory);\n\n    const auto serverName = clipboardServerName(sessionName);\n    ClientSocket socket(serverName);\n\n    connect( &socket, &ClientSocket::messageReceived,\n             this, &ClipboardClient::onMessageReceived );\n    connect( &socket, &ClientSocket::disconnected,\n             this, &ClipboardClient::onDisconnected );\n    connect( &socket, &ClientSocket::connectionFailed,\n             this, &ClipboardClient::onConnectionFailed );\n\n    connect( &scriptableProxy, &ScriptableProxy::sendMessage,\n             &socket, &ClientSocket::sendMessage );\n    connect( &socket, &ClientSocket::disconnected,\n             &scriptableProxy, &ScriptableProxy::disconnectClient );\n\n    connect( this, &ClipboardClient::functionCallResultReceived,\n             &scriptableProxy, &ScriptableProxy::setFunctionCallReturnValue );\n    connect( this, &ClipboardClient::inputDialogFinished,\n             &scriptableProxy, &ScriptableProxy::setInputDialogResult );\n    connect( this, &ClipboardClient::stop,\n             &scriptable, [&](){scriptable.abortEvaluation();} );\n\n    connect( this, &ClipboardClient::dataReceived,\n             &scriptable, &Scriptable::dataReceived, Qt::QueuedConnection );\n    connect( &scriptable, &Scriptable::receiveData,\n             &socket, [&]() {\n                socket.sendMessage(QByteArray(), CommandReceiveData);\n             });\n\n    bool hasActionId;\n    auto actionId = qEnvironmentVariableIntValue(\"COPYQ_ACTION_ID\", &hasActionId);\n    const auto actionName = qEnvironmentVariable(\"COPYQ_ACTION_NAME\");\n\n    if ( socket.start() ) {\n        if (hasActionId)\n            scriptable.setActionId(actionId);\n        scriptable.setActionName(actionName);\n\n        const int exitCode = scriptable.executeArguments(arguments);\n        socket.disconnect(&scriptableProxy);\n        scriptableProxy.disconnect(&scriptable);\n        exit(exitCode);\n    }\n}\n"
  },
  {
    "path": "src/app/clipboardclient.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"app.h\"\n\n#include <QObject>\n#include <QStringList>\n\n/**\n * Application client.\n *\n * Sends a command to the server and exits after the command is executed.\n * Exit code is same as exit code send by ClipboardServer::sendMessage().\n * Also the received message is printed on standard output (if exit code is\n * zero) or standard error output.\n */\nclass ClipboardClient final : public QObject, public App\n{\n    Q_OBJECT\n\npublic:\n    ClipboardClient(\n            int &argc, char **argv, const QStringList &arguments, const QString &sessionName);\n\nsignals:\n    void functionCallResultReceived(const QByteArray &returnValue);\n    void inputDialogFinished(const QByteArray &data);\n    void dataReceived(const QByteArray &data);\n    void stop();\n\nprivate:\n    void onMessageReceived(const QByteArray &data, int messageCode);\n    void onDisconnected();\n    void onConnectionFailed();\n\n    void start(const QString &sessionName, const QStringList &arguments);\n};\n"
  },
  {
    "path": "src/app/clipboardmonitor.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardmonitor.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/common.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"item/serialize.h\"\n#include \"platform/platformclipboard.h\"\n\n#include <QApplication>\n#include <QClipboard>\n\nnamespace {\n\nbool hasSameData(const QVariantMap &data, const QVariantMap &lastData)\n{\n    for (auto it = lastData.constBegin(); it != lastData.constEnd(); ++it) {\n        const auto &format = it.key();\n        if ( !data.contains(format) )\n            return false;\n    }\n\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        const auto &format = it.key();\n        if ( !data[format].toByteArray().isEmpty()\n             && data[format] != lastData.value(format) )\n        {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nbool isClipboardDataHidden(const QVariantMap &data)\n{\n    return data.value(mimeHidden).toByteArray() == \"1\";\n}\n\nbool isClipboardDataSecret(const QVariantMap &data)\n{\n    return data.value(mimeSecret).toByteArray() == \"1\";\n}\n\n} // namespace\n\nClipboardMonitor::ClipboardMonitor(const QStringList &formats)\n    : m_clipboard(platformNativeInterface()->clipboard())\n    , m_formats(formats)\n    , m_ownerMonitor(this)\n{\n    const AppConfig config;\n    m_storeClipboard = config.option<Config::check_clipboard>();\n    m_clipboardTab = config.option<Config::clipboard_tab>();\n\n    const int ownerUpdateInterval = config.option<Config::update_clipboard_owner_delay_ms>();\n    m_ownerMonitor.setUpdateInterval(std::max(ownerUpdateInterval, 0));\n\n    m_formats.append({mimeOwner, mimeWindowTitle, mimeItemNotes, mimeHidden, mimeSecret});\n    m_formats.removeDuplicates();\n\n    m_modes = ClipboardModeFlag::Clipboard;\n\n#ifdef HAS_MOUSE_SELECTIONS\n    m_storeSelection = config.option<Config::check_selection>();\n    m_runSelection = config.option<Config::run_selection>();\n\n    m_clipboardToSelection = config.option<Config::copy_clipboard>()\n        && m_clipboard->isSelectionSupported();\n    m_selectionToClipboard = config.option<Config::copy_selection>();\n\n    if (!m_storeSelection && !m_runSelection && !m_selectionToClipboard) {\n        COPYQ_LOG(\"Disabling selection monitoring\");\n    } else {\n        m_modes |= ClipboardModeFlag::Selection;\n    }\n#endif\n}\n\nvoid ClipboardMonitor::startMonitoring()\n{\n    setClipboardOwner(currentClipboardOwner());\n    connect(QGuiApplication::clipboard(), &QClipboard::changed,\n            this, [this](){ m_ownerMonitor.update(); });\n\n    m_connection = m_clipboard->createConnection(m_formats, m_modes);\n    connect(m_connection.get(), &ClipboardConnection::changed,\n            this, &ClipboardMonitor::onClipboardChanged);\n}\n\nQString ClipboardMonitor::currentClipboardOwner()\n{\n    QString owner;\n    emit fetchCurrentClipboardOwner(&owner);\n    return owner;\n}\n\nvoid ClipboardMonitor::setClipboardOwner(const QString &owner)\n{\n    if (m_clipboardOwner != owner) {\n        m_clipboardOwner = owner;\n        m_clipboard->setClipboardOwner(m_clipboardOwner);\n        COPYQ_LOG(QStringLiteral(\"Clipboard owner: %1\").arg(owner));\n    }\n}\n\nvoid ClipboardMonitor::onClipboardChanged(ClipboardMode mode)\n{\n    m_ownerMonitor.update();\n\n    QVariantMap data = m_clipboard->data(mode, m_formats);\n    auto clipboardData = mode == ClipboardMode::Clipboard\n            ? &m_clipboardData : &m_selectionData;\n\n    const bool isDataUnchanged = hasSameData(data, *clipboardData);\n    if (!isDataUnchanged) {\n        *clipboardData = data;\n#ifdef HAS_MOUSE_SELECTIONS\n    } else if (isDataUnchanged && !m_runSelection && mode == ClipboardMode::Selection) {\n        return;\n#endif\n    }\n\n    if ( !data.contains(mimeOwner)\n        && !data.contains(mimeWindowTitle)\n        && !m_clipboardOwner.isEmpty() )\n    {\n            data.insert(mimeWindowTitle, m_clipboardOwner.toUtf8());\n    }\n\n    COPYQ_LOG( QStringLiteral(\"%1 changed, owner is: %2\")\n               .arg(QLatin1String(mode == ClipboardMode::Clipboard ? \"Clipboard\" : \"Selection\"),\n                    getTextData(data, mimeOwner)) );\n\n    const auto defaultTab = m_clipboardTab.isEmpty() ? defaultClipboardTabName() : m_clipboardTab;\n    setTextData(&data, defaultTab, mimeCurrentTab);\n\n#ifdef HAS_MOUSE_SELECTIONS\n    if (mode == ClipboardMode::Selection)\n        data.insert(mimeClipboardMode, QByteArrayLiteral(\"selection\"));\n\n    if (mode == ClipboardMode::Clipboard ? m_storeClipboard : m_storeSelection) {\n#else\n    if (m_storeClipboard) {\n#endif\n        setTextData(&data, m_clipboardTab, mimeOutputTab);\n    }\n\n    if (isDataUnchanged) {\n        emit clipboardUnchanged(data);\n        return;\n    }\n\n#ifdef HAS_MOUSE_SELECTIONS\n    if ( (mode == ClipboardMode::Clipboard ? m_clipboardToSelection : m_selectionToClipboard)\n        && !data.contains(mimeOwner) )\n    {\n        const auto text = getTextData(data);\n        if ( !text.isEmpty() ) {\n            const auto targetMode = mode == ClipboardMode::Clipboard\n                ? ClipboardMode::Selection\n                : ClipboardMode::Clipboard;\n            const QVariantMap targetData = m_clipboard->data(targetMode, {mimeText});\n            const uint targetTextHash = qHash( targetData.value(mimeText).toByteArray() );\n            const uint sourceTextHash = qHash( data.value(mimeText).toByteArray() );\n            emit synchronizeSelection(mode, sourceTextHash, targetTextHash);\n        }\n    }\n\n    // omit running run automatic commands when disabled\n    if ( !m_runSelection && mode == ClipboardMode::Selection ) {\n        if ( m_storeSelection && !m_clipboardTab.isEmpty() && !isClipboardDataSecret(data) )\n            emit saveData(data);\n        return;\n    }\n#endif\n\n    // run script callbacks\n    if ( isClipboardDataSecret(data) ) {\n        emit secretClipboardChanged(data);\n    } else if ( isClipboardDataHidden(data) ) {\n        emit hiddenClipboardChanged(data);\n    } else if ( anySessionOwnsClipboardData(data) ) {\n        emit ownClipboardChanged(data);\n    } else {\n        emit clipboardChanged(data);\n    }\n}\n"
  },
  {
    "path": "src/app/clipboardmonitor.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"app/clipboardownermonitor.h\"\n#include \"common/clipboardmode.h\"\n#include \"common/common.h\"\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QVariantMap>\n\nclass ClipboardMonitor final : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit ClipboardMonitor(const QStringList &formats);\n    void startMonitoring();\n    QString currentClipboardOwner();\n    void setClipboardOwner(const QString &owner);\n\nsignals:\n    void clipboardChanged(const QVariantMap &data);\n    void secretClipboardChanged(const QVariantMap &data);\n    void hiddenClipboardChanged(const QVariantMap &data);\n    void ownClipboardChanged(const QVariantMap &data);\n    void clipboardUnchanged(const QVariantMap &data);\n    void saveData(const QVariantMap &data);\n    void synchronizeSelection(ClipboardMode sourceMode, uint sourceTextHash, uint targetTextHash);\n    void fetchCurrentClipboardOwner(QString *title);\n\nprivate:\n    void onClipboardChanged(ClipboardMode mode);\n\n    QVariantMap m_clipboardData;\n    QVariantMap m_selectionData;\n\n    PlatformClipboardPtr m_clipboard;\n    ClipboardConnectionPtr m_connection;\n    QStringList m_formats;\n    ClipboardModeMask m_modes;\n\n    QString m_clipboardTab;\n    bool m_storeClipboard;\n\n    ClipboardOwnerMonitor m_ownerMonitor;\n\n#ifdef HAS_MOUSE_SELECTIONS\n    bool m_storeSelection;\n    bool m_runSelection;\n    bool m_clipboardToSelection;\n    bool m_selectionToClipboard;\n#endif\n\n    QString m_clipboardOwner;\n};\n"
  },
  {
    "path": "src/app/clipboardownermonitor.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardownermonitor.h\"\n\n#include \"app/clipboardmonitor.h\"\n#include \"common/log.h\"\n\n#include <QCoreApplication>\n\nconstexpr int updateAfterEventIntervalMs = 20;\n\nClipboardOwnerMonitor::ClipboardOwnerMonitor(ClipboardMonitor *monitor)\n    : m_monitor(monitor)\n{\n    qApp->installNativeEventFilter(this);\n\n    m_timerSetOwner.setSingleShot(true);\n\n    m_timerUpdateAfterEvent.setSingleShot(true);\n    m_timerUpdateAfterEvent.setInterval(updateAfterEventIntervalMs);\n\n    QObject::connect(\n        &m_timerSetOwner, &QTimer::timeout,\n        [this]() {\n            if (!m_nextClipboardOwners.isEmpty()) {\n                m_monitor->setClipboardOwner(m_nextClipboardOwners.takeFirst());\n                if (!m_nextClipboardOwners.isEmpty())\n                    m_timerSetOwner.start();\n            }\n        });\n\n    QObject::connect( &m_timerUpdateAfterEvent, &QTimer::timeout, [this]() {\n        const QString title = m_monitor->currentClipboardOwner();\n        if (m_lastClipboardOwner != title) {\n            m_lastClipboardOwner = title;\n            if ( m_timerSetOwner.interval() == 0 )\n                m_nextClipboardOwners = QStringList{m_lastClipboardOwner};\n            else\n                m_nextClipboardOwners.append(m_lastClipboardOwner);\n\n            if (!m_timerSetOwner.isActive())\n                m_timerSetOwner.start();\n\n            COPYQ_LOG(QStringLiteral(\"Next clipboard owner: %1\").arg(title));\n        }\n    });\n}\n\nClipboardOwnerMonitor::~ClipboardOwnerMonitor()\n{\n    qApp->removeNativeEventFilter(this);\n}\n\nvoid ClipboardOwnerMonitor::update()\n{\n    if ( m_timerSetOwner.interval() == 0 ) {\n        m_lastClipboardOwner = m_monitor->currentClipboardOwner();\n        m_nextClipboardOwners.clear();\n        m_monitor->setClipboardOwner(m_lastClipboardOwner);\n    } else if ( !m_timerUpdateAfterEvent.isActive() ) {\n        m_timerUpdateAfterEvent.start();\n    }\n}\n\nbool ClipboardOwnerMonitor::nativeEventFilter(const QByteArray &, void *, NativeEventResult *)\n{\n    if ( !m_timerUpdateAfterEvent.isActive() )\n        m_timerUpdateAfterEvent.start();\n\n    return false;\n}\n"
  },
  {
    "path": "src/app/clipboardownermonitor.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QAbstractNativeEventFilter>\n#include <QByteArray>\n#include <QTimer>\n\nclass ClipboardMonitor;\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nusing NativeEventResult = qintptr;\n#else\nusing NativeEventResult = long;\n#endif\n\nclass ClipboardOwnerMonitor final : public QAbstractNativeEventFilter\n{\npublic:\n    explicit ClipboardOwnerMonitor(ClipboardMonitor *monitor);\n    ~ClipboardOwnerMonitor();\n\n    bool nativeEventFilter(\n        const QByteArray &, void *message, NativeEventResult *result) override;\n\n    void setUpdateInterval(int ms) { m_timerSetOwner.setInterval(ms); }\n\n    void update();\n\nprivate:\n    ClipboardMonitor *m_monitor;\n    QString m_lastClipboardOwner;\n    QStringList m_nextClipboardOwners;\n    QTimer m_timerSetOwner;\n    QTimer m_timerUpdateAfterEvent;\n};\n"
  },
  {
    "path": "src/app/clipboardserver.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardserver.h\"\n\n#include \"common/action.h\"\n#include \"common/appconfig.h\"\n#include \"common/clientsocket.h\"\n#include \"common/client_server.h\"\n#include \"common/commandstatus.h\"\n#include \"common/config.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/shortcuts.h\"\n#include \"common/sleeptimer.h\"\n#include \"common/timer.h\"\n#include \"common/textdata.h\"\n#include \"common/version.h\"\n#include \"gui/actionhandler.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/commanddialog.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/mainwindow.h\"\n#include \"gui/notificationbutton.h\"\n#include \"gui/notificationdaemon.h\"\n#include \"item/itemfactory.h\"\n#include \"item/itemstore.h\"\n#include \"item/serialize.h\"\n#include \"scriptable/scriptableproxy.h\"\n#include \"scriptable/scriptoverrides.h\"\n\n#include <QAction>\n#include <QApplication>\n#include <QApplicationStateChangeEvent>\n#include <QFile>\n#include <QKeyEvent>\n#include <QMenu>\n#include <QMessageBox>\n#include <QMimeData>\n#include <QPixmapCache>\n#include <QPushButton>\n#include <QSessionManager>\n#include <QStyleFactory>\n#include <QTimer>\n#include <QTextEdit>\n#include <QWindow>\n\n#ifdef COPYQ_GLOBAL_SHORTCUTS\n#include \"../qxt/qxtglobalshortcut.h\"\n#else\nclass QxtGlobalShortcut final {};\n#endif\n\n#include <memory>\n\nnamespace {\n\nuint monitorCommandStateHash(const QVector<Command> &commands)\n{\n    uint seed = 0;\n#if QT_VERSION >= QT_VERSION_CHECK(6,10,0)\n    QtPrivate::QHashCombine hash(seed);\n#else\n    QtPrivate::QHashCombine hash;\n#endif\n\n    for (const auto &command : commands) {\n        if (command.type() == CommandType::Script)\n            seed = hash(seed, command.cmd);\n        else if (command.type() == CommandType::Automatic && !command.input.isEmpty())\n            seed = hash(seed, command.input);\n    }\n\n    return seed;\n}\n\nvoid setTabWidth(QTextEdit *editor, int spaces)\n{\n    const QLatin1Char space(' ');\n    const QFontMetricsF metrics(editor->fontMetrics());\n    const qreal width = metrics.horizontalAdvance(QString(spaces, space));\n    editor->setTabStopDistance(width);\n}\n\nvoid cleanUpLogFilesTimer()\n{\n    bool ok;\n    int maxLogSize = qEnvironmentVariableIntValue(\"COPYQ_MAX_LOG_SIZE\", &ok);\n    if (!ok)\n        maxLogSize = 10 * 1024 * 1024;\n\n    int maxFiles = qEnvironmentVariableIntValue(\"COPYQ_MAX_LOG_FILES\", &ok);\n    if (!ok)\n        maxFiles = 100;\n\n    constexpr int startIntervalMs = 30 * 1000;\n    constexpr int cleanUpIntervalMs = 1 * 60 * 60 * 1000;\n\n    auto timer = new QTimer(qApp);\n    timer->setSingleShot(false);\n    timer->setInterval(cleanUpIntervalMs);\n    timer->start();\n\n    auto callback = [=](){ dropLogsToFileCountAndSize(maxFiles, maxLogSize); };\n    QTimer::singleShot(startIntervalMs, qApp, callback);\n    QObject::connect(timer, &QTimer::timeout, qApp, callback);\n}\n\nvoid setPreventScreenCapture(QWindow *window, bool prevent)\n{\n    platformNativeInterface()->setPreventScreenCapture(window->winId(), prevent);\n}\n\n} // namespace\n\nClipboardServer::ClipboardServer(QApplication *app, const QString &sessionName)\n    : QObject()\n    , App(app, sessionName)\n    , m_wnd(nullptr)\n    , m_shortcutActions()\n    , m_ignoreKeysTimer()\n    , m_sharedData(std::make_shared<ClipboardBrowserShared>())\n{\n    m_server = new Server(clipboardServerName(sessionName), this);\n\n    if ( m_server->isListening() ) {\n        log( QStringLiteral(\"Starting server: CopyQ %1\").arg(versionString) );\n        App::installTranslator();\n        qApp->setLayoutDirection(QLocale().textDirection());\n    } else {\n        App::installTranslator();\n        log( tr(\"CopyQ server is already running.\"), LogWarning );\n        exit(0);\n        return;\n    }\n\n    if ( qgetenv(\"COPYQ_QT_FILE_DIALOGS\") == \"1\" ) {\n        QCoreApplication::setAttribute(Qt::AA_DontUseNativeDialogs);\n    }\n\n    cleanUpLogFilesTimer();\n\n    if ( sessionName.isEmpty() ) {\n        QGuiApplication::setApplicationDisplayName(QStringLiteral(\"CopyQ\"));\n        QGuiApplication::setDesktopFileName(QStringLiteral(\"com.github.hluk.copyq\"));\n    } else {\n        log( QStringLiteral(\"Session: %1\").arg(sessionName) );\n        QGuiApplication::setApplicationDisplayName(\n            QStringLiteral(\"CopyQ-%1\").arg(sessionName));\n        QGuiApplication::setDesktopFileName(\n            QStringLiteral(\"com.github.hluk.copyq-%1\").arg(sessionName));\n    }\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);\n#endif\n\n    QApplication::setQuitOnLastWindowClosed(false);\n\n    ensureSettingsDirectoryExists();\n\n    m_sharedData->itemFactory = new ItemFactory(m_sharedData, this);\n    m_sharedData->notifications = new NotificationDaemon(this);\n    m_sharedData->actions = new ActionHandler(m_sharedData->notifications, this);\n    m_wnd = new MainWindow(m_sharedData);\n    qApp->setProperty(\"CopyQ_server\", QVariant::fromValue(static_cast<QObject*>(this)));\n\n    connect( m_sharedData->notifications, &NotificationDaemon::notificationButtonClicked,\n             this, &ClipboardServer::onNotificationButtonClicked );\n\n    m_sharedData->itemFactory->loadPlugins();\n    if ( !m_sharedData->itemFactory->hasLoaders() )\n        log(\"No plugins loaded\", LogNote);\n\n    connect( m_server, &Server::newConnection,\n             this, &ClipboardServer::onClientNewConnection );\n\n    connect( qApp, &QCoreApplication::aboutToQuit,\n             this, &ClipboardServer::onAboutToQuit );\n\n    connect( qApp, &QGuiApplication::commitDataRequest, this, &ClipboardServer::onCommitData );\n    connect( qApp, &QGuiApplication::saveStateRequest, this, &ClipboardServer::onSaveState );\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    qApp->setFallbackSessionManagementEnabled(false);\n#endif\n\n    connect( m_wnd, &MainWindow::requestExit,\n             this, &ClipboardServer::maybeQuit );\n    connect( m_wnd, &MainWindow::disableClipboardStoringRequest,\n             this, &ClipboardServer::onDisableClipboardStoringRequest );\n    connect( m_wnd, &MainWindow::sendActionData,\n             this, &ClipboardServer::sendActionData );\n    connect( m_wnd, &MainWindow::stopAction,\n             this, &ClipboardServer::stopAction );\n\n    // notify window if configuration changes\n    connect( m_wnd, &MainWindow::configurationChanged,\n             this, &ClipboardServer::loadSettings );\n\n    connect( m_wnd, &MainWindow::commandsSaved,\n             this, &ClipboardServer::onCommandsSaved );\n\n    m_server->start();\n\n    {\n        AppConfig appConfig;\n        loadSettings(&appConfig);\n    }\n\n    m_wnd->setCurrentTab(0);\n    m_wnd->enterBrowseMode();\n\n    qApp->installEventFilter(this);\n\n    // Ignore global shortcut key presses in any widget.\n    m_ignoreKeysTimer.setInterval(100);\n    m_ignoreKeysTimer.setSingleShot(true);\n\n    initSingleShotTimer(&m_timerClearUnsentActionData, 2000, this, [&]() {\n        m_actionDataToSend.clear();\n    });\n\n    initSingleShotTimer(&m_timerCleanItemFiles, 120000, this, &ClipboardServer::cleanDataFiles);\n\n    initSingleShotTimer(&m_updateThemeTimer, 1000, this, [this](){\n        AppConfig appConfig;\n        loadSettings(&appConfig);\n    });\n\n    setClipboardMonitorRunning(false);\n    startMonitoring();\n\n    callback(QStringLiteral(\"onStart\"));\n}\n\nClipboardServer::~ClipboardServer()\n{\n    qApp->setProperty(\"CopyQ_server\", QVariant());\n\n    removeGlobalShortcuts();\n\n    delete m_wnd;\n    m_wnd = nullptr;\n\n    delete m_sharedData->actions;\n    m_sharedData->actions = nullptr;\n\n    delete m_sharedData->notifications;\n    m_sharedData->notifications = nullptr;\n\n    delete m_sharedData->itemFactory;\n    m_sharedData->itemFactory = nullptr;\n}\n\nQStringList ClipboardServer::copyqStats() const\n{\n    const int total = m_clients.size();\n    const bool hasClipboardProvider = m_provideClipboardClientId != 0\n        && m_clients.contains(m_provideClipboardClientId);\n    const bool hasSelectionProvider = m_provideSelectionClientId != 0\n        && m_clients.contains(m_provideSelectionClientId);\n\n    return {QStringLiteral(\"CLIENTS: connected=%1, clipboard_provider=%2, selection_provider=%3\")\n        .arg(total)\n        .arg(hasClipboardProvider ? \"yes\" : \"no\")\n        .arg(hasSelectionProvider ? \"yes\" : \"no\")};\n}\n\nvoid ClipboardServer::stopMonitoring()\n{\n    if (!m_monitor)\n        return;\n\n    COPYQ_LOG(\"Terminating monitor\");\n    setClipboardMonitorRunning(false);\n\n    const auto client = findClient(m_monitor->id());\n    if (client)\n        client->sendMessage(QByteArray(), CommandStop);\n}\n\nvoid ClipboardServer::startMonitoring()\n{\n    if (m_monitor || m_exitting || m_ignoreNewConnections || !m_wnd->isMonitoringEnabled())\n        return;\n\n    COPYQ_LOG(\"Starting monitor\");\n\n    m_monitor = new Action();\n    m_monitor->setCommand(QStringLiteral(\"copyq --clipboard-access monitorClipboard\"));\n    connect( m_monitor.data(), &QObject::destroyed,\n             this, &ClipboardServer::onMonitorFinished );\n    m_sharedData->actions->internalAction(m_monitor);\n}\n\nvoid ClipboardServer::removeGlobalShortcuts()\n{\n    for (auto it = m_shortcutActions.constBegin(); it != m_shortcutActions.constEnd(); ++it)\n        delete it.key();\n    m_shortcutActions.clear();\n}\n\nvoid ClipboardServer::onCommandsSaved(const QVector<Command> &commands)\n{\n#ifdef COPYQ_GLOBAL_SHORTCUTS\n    removeGlobalShortcuts();\n\n    QList<QKeySequence> usedShortcuts;\n\n    for (const auto &command : commands) {\n        if (command.type() & CommandType::GlobalShortcut) {\n            for (const auto &shortcutText : command.globalShortcuts) {\n                QKeySequence shortcut(shortcutText, QKeySequence::PortableText);\n                if ( !shortcut.isEmpty() && !usedShortcuts.contains(shortcut) ) {\n                    usedShortcuts.append(shortcut);\n                    createGlobalShortcut(shortcut, command);\n                }\n            }\n        }\n    }\n#endif\n\n    const auto hash = monitorCommandStateHash(commands);\n    if ( m_monitor && hash != m_monitorCommandsStateHash ) {\n        m_monitorCommandsStateHash = hash;\n        stopMonitoring();\n        startMonitoring();\n    }\n}\n\nvoid ClipboardServer::onAboutToQuit()\n{\n    COPYQ_LOG(\"Closing server.\");\n\n    // Avoid calling onExit multiple times.\n    // (QCoreApplication::aboutToQuit() signal can be emitted multiple times\n    // when system is shutting down.)\n    if (m_exitting)\n        return;\n    m_exitting = true;\n\n    if (m_wnd->isScriptOverridden(ScriptOverrides::OnExit))\n        callback(QStringLiteral(\"onExit\"));\n    waitForCallbackToFinish();\n\n    m_ignoreNewConnections = true;\n\n    terminateClients(10000);\n    m_server->close(); // No new connections can be open.\n    terminateClients(5000);\n\n    m_wnd->saveTabs();\n    cleanDataFiles();\n}\n\nvoid ClipboardServer::onCommitData(QSessionManager &sessionManager)\n{\n    COPYQ_LOG(\"Got commit data request from session manager.\");\n\n    const bool cancel = sessionManager.allowsInteraction() && !askToQuit();\n    sessionManager.release();\n\n    if (cancel) {\n        sessionManager.cancel();\n        startMonitoring();\n    } else {\n        m_wnd->saveTabs();\n\n#ifdef Q_OS_WIN\n        // WORKAROUND: This is required to exit application from\n        //             installer, otherwise main window is only\n        //             minimized after this when tray is disabled.\n        m_wnd->hide();\n        exit();\n#endif\n    }\n}\n\nvoid ClipboardServer::onSaveState(QSessionManager &sessionManager)\n{\n    COPYQ_LOG(\"Got save state request from session manager.\");\n\n    QSettings settings(QSettings::IniFormat, QSettings::UserScope, \"copyq\", \"copyq_no_session\");\n    const auto sessionNameKey = \"session_\" + sessionManager.sessionId();\n    const auto sessionName = qApp->property(\"CopyQ_session_name\").toString();\n    settings.setValue(sessionNameKey, sessionName);\n\n    const QString lastSessionIdPrefix = \"last_session_id_for_\";\n    const auto lastSessionIdKey = lastSessionIdPrefix + sessionName;\n    settings.setValue(lastSessionIdKey, sessionNameKey);\n\n    // Remove no longer valid sessions from configuration.\n    QSet<QString> validSessions;\n    for (const QString &key : settings.childKeys()) {\n        if ( key.startsWith(lastSessionIdPrefix) )\n            validSessions.insert( settings.value(key).toString() );\n    }\n\n    for (const QString &key : settings.childKeys()) {\n        if ( !key.startsWith(lastSessionIdPrefix) && !validSessions.contains(key) )\n            settings.remove(key);\n    }\n}\n\nvoid ClipboardServer::onDisableClipboardStoringRequest(bool disabled)\n{\n    stopMonitoring();\n    if (!disabled)\n        startMonitoring();\n}\n\nvoid ClipboardServer::maybeQuit()\n{\n    if ( askToQuit() )\n        exit();\n}\n\nbool ClipboardServer::askToQuit()\n{\n    if ( !m_wnd->maybeCloseCommandDialog() )\n        return false;\n\n    if ( hasRunningCommands() ) {\n        QMessageBox messageBox( QMessageBox::Warning, tr(\"Cancel Active Commands\"),\n                                tr(\"Cancel active commands and exit?\"), QMessageBox::NoButton,\n                                m_wnd );\n\n        messageBox.addButton(tr(\"Cancel Exiting\"), QMessageBox::RejectRole);\n        QAbstractButton *exitButton = messageBox.addButton(tr(\"Exit Anyway\"), QMessageBox::AcceptRole);\n\n        // Close the message box automatically after all running commands finish.\n        QTimer timerCheckRunningCommands;\n        timerCheckRunningCommands.setInterval(1000);\n        connect( &timerCheckRunningCommands, &QTimer::timeout,\n                 exitButton, [&]() {\n                    if ( !hasRunningCommands() )\n                        exitButton->click();\n                 });\n        timerCheckRunningCommands.start();\n\n        messageBox.exec();\n        return exitButton == messageBox.clickedButton();\n    }\n\n    return true;\n}\n\nbool ClipboardServer::hasRunningCommands() const\n{\n    if (!m_sharedData->actions)\n        return false;\n\n    if ( m_sharedData->actions->runningActionCount() > 0 )\n        return true;\n\n    for (auto it = m_clients.constBegin(); it != m_clients.constEnd(); ++it) {\n        const auto actionId = it.value().proxy->actionId();\n        if ( !m_sharedData->actions->isInternalActionId(actionId) )\n            return true;\n    }\n\n    return false;\n}\n\nvoid ClipboardServer::terminateClients(int waitMs)\n{\n    const auto clients = m_clients;\n    for (auto it = clients.constBegin(); it != clients.constEnd(); ++it) {\n        const auto &clientData = it.value();\n        if (clientData.isValid())\n            clientData.client->sendMessage(QByteArray(), CommandStop);\n    }\n\n    waitForClientsToFinish(waitMs);\n    emit closeClients();\n    waitForClientsToFinish(waitMs / 2);\n}\n\nvoid ClipboardServer::waitForClientsToFinish(int waitMs)\n{\n    SleepTimer t(waitMs);\n    while ( !m_clients.isEmpty() && t.sleep() ) {}\n}\n\nvoid ClipboardServer::waitForCallbackToFinish()\n{\n    if (m_callback) {\n        COPYQ_LOG(\"Waiting for callback to finish\");\n        m_callback->waitForFinished();\n        COPYQ_LOG(\"Callback finished\");\n    }\n}\n\nvoid ClipboardServer::callback(const QString &scriptFunction)\n{\n    if (!m_sharedData->actions)\n        return;\n\n    waitForCallbackToFinish();\n    COPYQ_LOG( QStringLiteral(\"Starting callback: %1\").arg(scriptFunction) );\n    m_callback = new Action();\n    m_callback->setCommand(QStringList() << \"copyq\" << scriptFunction);\n    m_sharedData->actions->internalAction(m_callback);\n}\n\nClientSocketPtr ClipboardServer::findClient(int actionId)\n{\n    for (auto it = m_clients.constBegin(); it != m_clients.constEnd(); ++it) {\n        const auto &clientData = it.value();\n        if ( clientData.isValid() && clientData.proxy->actionId() == actionId )\n            return clientData.client;\n    }\n\n    return nullptr;\n}\n\nvoid ClipboardServer::sendActionData(int actionId, const QByteArray &bytes)\n{\n    const auto client = findClient(actionId);\n    if (client) {\n        client->sendMessage(bytes, CommandData);\n    } else {\n        m_actionDataToSend[actionId] = bytes;\n        m_timerClearUnsentActionData.start();\n    }\n}\n\nvoid ClipboardServer::stopAction(int actionId)\n{\n    const auto client = findClient(actionId);\n    if (client) {\n        client->sendMessage(QByteArray(), CommandStop);\n    } else {\n        m_pendingStopActionIds.insert(actionId);\n        QTimer::singleShot(10000, this, [this, actionId]() {\n            m_pendingStopActionIds.remove(actionId);\n        });\n    }\n}\n\nvoid ClipboardServer::cleanDataFiles()\n{\n    COPYQ_LOG(\"Cleaning unused item files\");\n    ::cleanDataFiles( m_wnd->tabs(), &m_sharedData->encryptionKey );\n}\n\nvoid ClipboardServer::setPreventScreenCapture(bool prevent)\n{\n    if (m_preventScreenCapture == prevent)\n        return;\n\n    m_preventScreenCapture = prevent;\n    for (QWindow *window : qApp->allWindows()) {\n        ::setPreventScreenCapture(window, m_preventScreenCapture);\n    }\n}\n\nvoid ClipboardServer::onClientNewConnection(const ClientSocketPtr &client)\n{\n    auto proxy = new ScriptableProxy(m_wnd);\n    proxy->setClientSocketId(client->id());\n    connect( client.get(), &ClientSocket::destroyed,\n             proxy, &ScriptableProxy::safeDeleteLater );\n    connect( proxy, &ScriptableProxy::sendMessage,\n             client.get(), &ClientSocket::sendMessage );\n\n    m_clients.insert( client->id(), ClientData(client, proxy) );\n    connect( this, &ClipboardServer::closeClients,\n             client.get(), &ClientSocket::close );\n    connect( client.get(), &ClientSocket::messageReceived,\n             this, &ClipboardServer::onClientMessageReceived );\n    connect( client.get(), &ClientSocket::disconnected,\n             this, &ClipboardServer::onClientDisconnected );\n    connect( client.get(), &ClientSocket::disconnected,\n             proxy, &ScriptableProxy::disconnectClient );\n    connect( client.get(), &ClientSocket::connectionFailed,\n             this, &ClipboardServer::onClientConnectionFailed );\n    client->start();\n    std::weak_ptr<ClientSocket> weakClient = client;\n    connect( proxy, &ScriptableProxy::actionIdChanged, this, [this, weakClient](int actionId) {\n        if (m_pendingStopActionIds.remove(actionId)) {\n            if (auto c = weakClient.lock())\n                c->sendMessage(QByteArray(), CommandStop);\n        }\n    });\n\n    connect( proxy, &ScriptableProxy::clipboardProviderRegistered,\n             this, &ClipboardServer::onClipboardProviderRegistered );\n\n    if (m_ignoreNewConnections) {\n        COPYQ_LOG(\"Ignoring new client while exiting\");\n        client->sendMessage(QByteArray(), CommandStop);\n    }\n}\n\nvoid ClipboardServer::onClientMessageReceived(\n        const QByteArray &message, int messageCode, ClientSocketId clientId)\n{\n    switch (messageCode) {\n    case CommandFunctionCallPriority:\n    case CommandFunctionCall: {\n        const auto &clientData = m_clients.value(clientId);\n        if (!clientData.isValid())\n            return;\n\n        // Postpone processing clients after configuration is loaded\n        if (m_loadingSettings && messageCode == CommandFunctionCall) {\n            m_pendingMessages.append({message, messageCode, clientId});\n            return;\n        }\n\n        clientData.proxy->callFunction(message);\n        break;\n    }\n    case CommandReceiveData: {\n        const auto &clientData = m_clients.value(clientId);\n        if (!clientData.isValid())\n            return;\n\n        const int actionId = clientData.proxy->actionId();\n        const QByteArray bytes = m_actionDataToSend.take(actionId);\n        clientData.client->sendMessage(bytes, CommandData);\n        break;\n    }\n    default:\n        log(QStringLiteral(\"Unhandled command status: %1\").arg(messageCode));\n        break;\n    }\n}\n\nvoid ClipboardServer::onClientDisconnected(ClientSocketId clientId)\n{\n    if (m_provideClipboardClientId == clientId)\n        m_provideClipboardClientId = 0;\n    if (m_provideSelectionClientId == clientId)\n        m_provideSelectionClientId = 0;\n    m_clients.remove(clientId);\n}\n\nvoid ClipboardServer::onClipboardProviderRegistered(ClientSocketId clientId, ClipboardMode mode)\n{\n    ClientSocketId &tracked = mode == ClipboardMode::Clipboard\n        ? m_provideClipboardClientId\n        : m_provideSelectionClientId;\n\n    if (tracked != 0 && tracked != clientId) {\n        auto it = m_clients.find(tracked);\n        if (it != m_clients.end() && it->isValid())\n            it->client->sendMessage(QByteArray(), CommandStop);\n    }\n\n    tracked = clientId;\n}\n\nvoid ClipboardServer::onClientConnectionFailed(ClientSocketId clientId)\n{\n    log(\"Client connection failed\", LogWarning);\n    m_clients.remove(clientId);\n}\n\nvoid ClipboardServer::onMonitorFinished()\n{\n    COPYQ_LOG(\"Monitor finished\");\n    if (!m_monitor)\n        setClipboardMonitorRunning(false);\n    stopMonitoring();\n    startMonitoring();\n}\n\nvoid ClipboardServer::onNotificationButtonClicked(const NotificationButton &button)\n{\n    if (!m_sharedData->actions)\n        return;\n\n    const QString mimeNotificationData = COPYQ_MIME_PREFIX \"notification-data\";\n\n    QVariantMap data;\n    data.insert(mimeNotificationData, button.data);\n\n    auto act = new Action();\n    act->setCommand( button.script, QStringList(getTextData(data)) );\n    act->setInputWithFormat(data, mimeNotificationData);\n    act->setData(data);\n    m_sharedData->actions->action(act);\n}\n\nvoid ClipboardServer::createGlobalShortcut(const QKeySequence &shortcut, const Command &command)\n{\n#ifndef COPYQ_GLOBAL_SHORTCUTS\n    Q_UNUSED(shortcut)\n    Q_UNUSED(command)\n#else\n    auto s = new QxtGlobalShortcut(shortcut, command.localizedName(), this);\n    if (!s->isValid()) {\n        log(QStringLiteral(\"Failed to set global shortcut \\\"%1\\\" for command \\\"%2\\\".\")\n            .arg(shortcut.toString(),\n                 command.name),\n            LogWarning);\n        delete s;\n        return;\n    }\n\n    connect( s, &QxtGlobalShortcut::activated,\n             this, &ClipboardServer::shortcutActivated );\n\n    m_shortcutActions[s] = command;\n#endif\n}\n\nbool ClipboardServer::eventFilter(QObject *object, QEvent *ev)\n{\n    const QEvent::Type type = ev->type();\n\n    if ( type == QEvent::KeyPress\n         || type == QEvent::Shortcut\n         || type == QEvent::ShortcutOverride )\n    {\n        if ( m_ignoreKeysTimer.isActive() ) {\n            ev->accept();\n            return true;\n        }\n\n        m_wnd->updateShortcuts();\n\n        // Close menu on Escape key and give focus back to search edit or browser.\n        if (type == QEvent::KeyPress) {\n            QKeyEvent *keyevent = static_cast<QKeyEvent *>(ev);\n            QMenu *menu = qobject_cast<QMenu*>(object);\n            if (menu && keyevent->key() == Qt::Key_Escape) {\n                menu->close();\n                if (m_wnd->browseMode())\n                    m_wnd->enterBrowseMode();\n                else\n                    m_wnd->enterSearchMode();\n            }\n        // Omit overriding arrow keys in text editors.\n        } else if ( type == QEvent::ShortcutOverride &&\n                    (object->metaObject()->className() == QLatin1String(\"QLineEdit\")\n                     || object->property(\"textInteractionFlags\")\n                        .value<Qt::TextInteractionFlags>()\n                        .testFlag(Qt::TextSelectableByKeyboard)) )\n        {\n            QKeyEvent *keyevent = static_cast<QKeyEvent *>(ev);\n            if ( keyevent->key() == Qt::Key_Left\n                 || keyevent->key() == Qt::Key_Right\n                 || keyevent->key() == Qt::Key_Up\n                 || keyevent->key() == Qt::Key_Down)\n            {\n                ev->accept();\n                return true;\n            }\n        }\n    } else if (type == QEvent::Paint) {\n        setActivePaintDevice(object);\n    } else if (type == QEvent::FontChange) {\n        QTextEdit *editor = qobject_cast<QTextEdit*>(object);\n        if (editor)\n            setTabWidth(editor, m_textTabSize);\n    } else if ( type == QEvent::ApplicationStateChange && m_saveOnDeactivate ) {\n        const auto stateChangeEvent = static_cast<QApplicationStateChangeEvent*>(ev);\n        const auto state = stateChangeEvent->applicationState();\n        if (state != Qt::ApplicationActive) {\n            COPYQ_LOG( QStringLiteral(\"Saving items on application state change (%1)\").arg(state) );\n            m_wnd->saveTabs();\n            m_timerCleanItemFiles.start();\n        }\n    } else if (type == QEvent::ThemeChange) {\n        if ( !m_updateThemeTimer.isActive() )\n            COPYQ_LOG(\"Got theme change event\");\n        QPixmapCache::clear();\n        m_updateThemeTimer.start();\n    } else if (m_preventScreenCapture && type == QEvent::Show) {\n        auto widget = qobject_cast<QWidget*>(object);\n        if (widget && widget->windowHandle())\n            ::setPreventScreenCapture(widget->windowHandle(), m_preventScreenCapture);\n    }\n\n    return false;\n}\n\nvoid ClipboardServer::loadSettings(AppConfig *appConfig)\n{\n    if (!m_sharedData->itemFactory || m_loadingSettings)\n        return;\n\n    m_loadingSettings = true;\n    COPYQ_LOG(\"Loading configuration\");\n\n    QSettings &settings = appConfig->settings();\n\n    m_sharedData->itemFactory->loadItemFactorySettings(&settings);\n\n    const QString styleName = appConfig->option<Config::style>();\n    if ( !styleName.isEmpty() ) {\n        log( QStringLiteral(\"Style: %1\").arg(styleName) );\n        QStyle *style = QStyleFactory::create(styleName);\n        if (style) {\n            QApplication::setStyle(style);\n        } else {\n            const QString styles = QStyleFactory::keys().join(QLatin1String(\", \"));\n            log( QStringLiteral(\"Failed to set style, valid are: %1\").arg(styles), LogWarning );\n        }\n    }\n\n    settings.beginGroup(QStringLiteral(\"Theme\"));\n    m_sharedData->theme.loadTheme(settings);\n    settings.endGroup();\n\n    m_sharedData->editor = appConfig->option<Config::editor>();\n    m_sharedData->maxItems = appConfig->option<Config::maxitems>();\n    m_sharedData->textWrap = appConfig->option<Config::text_wrap>();\n    m_sharedData->navigationStyle = appConfig->option<Config::navigation_style>();\n    m_sharedData->saveOnReturnKey = !appConfig->option<Config::edit_ctrl_return>();\n    m_sharedData->moveItemOnReturnKey = appConfig->option<Config::move>();\n    m_sharedData->showSimpleItems = appConfig->option<Config::show_simple_items>();\n    m_sharedData->numberSearch = appConfig->option<Config::number_search>();\n    m_sharedData->minutesToExpire = appConfig->option<Config::expire_tab>();\n    m_sharedData->encryptedExpireSeconds = appConfig->option<Config::expire_encrypted_tab_seconds>();\n    m_sharedData->tabsEncrypted = appConfig->option<Config::encrypt_tabs>();\n    m_sharedData->saveDelayMsOnItemAdded = appConfig->option<Config::save_delay_ms_on_item_added>();\n    m_sharedData->saveDelayMsOnItemModified = appConfig->option<Config::save_delay_ms_on_item_modified>();\n    m_sharedData->saveDelayMsOnItemRemoved = appConfig->option<Config::save_delay_ms_on_item_removed>();\n    m_sharedData->saveDelayMsOnItemMoved = appConfig->option<Config::save_delay_ms_on_item_moved>();\n    m_sharedData->saveDelayMsOnItemEdited = appConfig->option<Config::save_delay_ms_on_item_edited>();\n    m_sharedData->rowIndexFromOne = appConfig->option<Config::row_index_from_one>();\n\n    m_sharedData->actions->setMaxRowCount(appConfig->option<Config::max_process_manager_rows>());\n\n    m_wnd->loadSettings(settings, appConfig);\n\n    m_textTabSize = appConfig->option<Config::text_tab_width>();\n    m_saveOnDeactivate = appConfig->option<Config::save_on_app_deactivated>();\n\n    if ( platformNativeInterface()->canPreventScreenCapture() )\n        setPreventScreenCapture(appConfig->option<Config::prevent_screen_capture>());\n\n    if (m_monitor) {\n        stopMonitoring();\n        startMonitoring();\n    }\n\n    m_sharedData->notifications->setNativeNotificationsEnabled(\n        appConfig->option<Config::native_notifications>() );\n    m_sharedData->notifications->setNotificationOpacity(\n        m_sharedData->theme.color(QStringLiteral(\"notification_bg\")).alphaF() );\n    m_sharedData->notifications->setNotificationStyleSheet(\n        m_sharedData->theme.getNotificationStyleSheet() );\n\n    int id = appConfig->option<Config::notification_position>();\n    NotificationDaemon::Position position;\n    switch (id) {\n    case 0: position = NotificationDaemon::Top; break;\n    case 1: position = NotificationDaemon::Bottom; break;\n    case 2: position = NotificationDaemon::TopRight; break;\n    case 3: position = NotificationDaemon::BottomRight; break;\n    case 4: position = NotificationDaemon::BottomLeft; break;\n    default: position = NotificationDaemon::TopLeft; break;\n    }\n    m_sharedData->notifications->setPosition(position);\n\n    const int x = appConfig->option<Config::notification_horizontal_offset>();\n    const int y = appConfig->option<Config::notification_vertical_offset>();\n    m_sharedData->notifications->setOffset(x, y);\n\n    const int w = appConfig->option<Config::notification_maximum_width>();\n    const int h = appConfig->option<Config::notification_maximum_height>();\n    m_sharedData->notifications->setMaximumSize(w, h);\n\n    m_sharedData->notifications->updateNotificationWidgets();\n\n    m_updateThemeTimer.stop();\n\n    COPYQ_LOG(\"Configuration loaded\");\n    m_loadingSettings = false;\n\n    const QList<ClientMessage> pendingMessages = std::move(m_pendingMessages);\n    Q_ASSERT(m_pendingMessages.isEmpty());\n    for (const auto &msg : pendingMessages)\n        onClientMessageReceived(msg.message, msg.messageCode, msg.clientId);\n}\n\nvoid ClipboardServer::shortcutActivated(QxtGlobalShortcut *shortcut)\n{\n#ifndef COPYQ_GLOBAL_SHORTCUTS\n    Q_UNUSED(shortcut)\n#else\n    m_ignoreKeysTimer.start();\n\n    const QMap<QxtGlobalShortcut*, Command>::const_iterator it =\n            m_shortcutActions.constFind(shortcut);\n    if ( it != m_shortcutActions.constEnd() ) {\n        const QString shortcutText = portableShortcutText(shortcut->shortcut());\n        const Command &command = it.value();\n\n        // If global shortcut for a menu command is triggered when the main window\n        // is active, the command will be executed as if it has been trigger from\n        // menu - i.e. with item selection and item data available.\n        if ( command.inMenu && m_wnd->isActiveWindow() && m_wnd->triggerMenuCommand(command, shortcutText) ) {\n            COPYQ_LOG(\"Global shortcut command triggered as a menu command\");\n        } else {\n            QVariantMap data;\n            data.insert(mimeShortcut, shortcutText.toUtf8());\n            m_wnd->action(data, command, QModelIndex());\n        }\n    }\n#endif\n}\n"
  },
  {
    "path": "src/app/clipboardserver.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"app.h\"\n#include \"common/clipboardmode.h\"\n#include \"common/command.h\"\n#include \"common/server.h\"\n#include \"common/clientsocket.h\"\n#include \"gui/clipboardbrowsershared.h\"\n\n#include <QSet>\n#include <QMap>\n#include <QPointer>\n#include <QTimer>\n\nclass Action;\nclass ActionHandler;\nclass AppConfig;\nclass ItemFactory;\nclass MainWindow;\nclass NotificationDaemon;\nclass ScriptableProxy;\nclass Server;\nclass QxtGlobalShortcut;\nclass QApplication;\nclass QSessionManager;\nstruct NotificationButton;\n\n/**\n * The application main server.\n *\n * Creates clipboard monitor process when necessary and serves client commands.\n *\n * If user already run this server isListening() returns false.\n */\nclass ClipboardServer final : public QObject, public App\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList copyqStats READ copyqStats CONSTANT)\n\npublic:\n    ClipboardServer(QApplication *app, const QString &sessionName);\n    ~ClipboardServer();\n\n    QStringList copyqStats() const;\n\n    /** Stop monitor application. */\n    void stopMonitoring();\n\n    /** Start monitor application. */\n    void startMonitoring();\n\n    /**\n     * Create global shortcut for command.\n     *\n     * @see shortcutActivated()\n     */\n    void createGlobalShortcut(const QKeySequence &shortcut, const Command &command);\n\n    /** Load settings. */\n    void loadSettings(AppConfig *appConfig);\n\nsignals:\n    void closeClients();\n\nprotected:\n    bool eventFilter(QObject *object, QEvent *ev) override;\n\nprivate:\n    void onClientNewConnection(const ClientSocketPtr &client);\n    void onClientMessageReceived(const QByteArray &message, int messageCode, ClientSocketId clientId);\n    void onClientDisconnected(ClientSocketId clientId);\n    void onClientConnectionFailed(ClientSocketId clientId);\n    void onClipboardProviderRegistered(ClientSocketId clientId, ClipboardMode mode);\n\n    /** An error occurred on monitor connection. */\n    void onMonitorFinished();\n\n    void onNotificationButtonClicked(const NotificationButton &button);\n\n    /** Shortcut was pressed on host system. */\n    void shortcutActivated(QxtGlobalShortcut *shortcut);\n\n    void removeGlobalShortcuts();\n\n    /** Called when new commands are available. */\n    void onCommandsSaved(const QVector<Command> &commands);\n\n    /** Clean up before quitting. */\n    void onAboutToQuit();\n\n    /**\n     * Save all data before quitting and if some commands are still executing,\n     * allow user to cancel quitting (if session manager supports it).\n     */\n    void onCommitData(QSessionManager &sessionManager);\n\n    /**\n     * Save session name for next time.\n     */\n    void onSaveState(QSessionManager &sessionManager);\n\n    void onDisableClipboardStoringRequest(bool disabled);\n\n    /** Quit application, but ask to cancel exit if there are any active commands. */\n    void maybeQuit();\n\n    /** Ask to cancel application exit if there are any active commands. */\n    bool askToQuit();\n\n    bool hasRunningCommands() const;\n\n    void terminateClients(int waitMs);\n\n    void waitForClientsToFinish(int waitMs);\n    void waitForCallbackToFinish();\n\n    void callback(const QString &scriptFunction);\n\n    ClientSocketPtr findClient(int actionId);\n\n    void sendActionData(int actionId, const QByteArray &bytes);\n    void stopAction(int actionId);\n\n    void cleanDataFiles();\n\n    void setPreventScreenCapture(bool prevent);\n\n    Server *m_server = nullptr;\n    MainWindow* m_wnd = nullptr;\n    QPointer<Action> m_monitor;\n    QPointer<Action> m_callback;\n    bool m_exitting = false;\n    bool m_ignoreNewConnections = false;\n    QMap<QxtGlobalShortcut*, Command> m_shortcutActions;\n    QTimer m_ignoreKeysTimer;\n    QTimer m_updateThemeTimer;\n    uint m_monitorCommandsStateHash = 0;\n    int m_textTabSize = 8;\n    bool m_saveOnDeactivate = true;\n    bool m_preventScreenCapture = false;\n    bool m_loadingSettings = false;\n\n    ClipboardBrowserSharedPtr m_sharedData;\n\n    QMap<int, QByteArray> m_actionDataToSend;\n    QTimer m_timerClearUnsentActionData;\n    QSet<int> m_pendingStopActionIds;\n    QTimer m_timerCleanItemFiles;\n\n    struct ClientData {\n        ClientData() = default;\n        ClientData(const ClientSocketPtr &client, ScriptableProxy *proxy)\n            : client(client)\n            , proxy(proxy)\n        {\n        }\n\n        bool isValid() const\n        {\n            return client && proxy;\n        }\n\n        ClientSocketPtr client;\n        ScriptableProxy *proxy = nullptr;\n    };\n    QMap<ClientSocketId, ClientData> m_clients;\n    ClientSocketId m_provideClipboardClientId = 0;\n    ClientSocketId m_provideSelectionClientId = 0;\n\n    struct ClientMessage {\n        QByteArray message;\n        int messageCode;\n        ClientSocketId clientId;\n    };\n    QList<ClientMessage> m_pendingMessages;\n};\n"
  },
  {
    "path": "src/audio.cmake",
    "content": "find_path(MINIAUDIO_INCLUDE_DIR miniaudio.h\n    HINTS \"${MINIAUDIO_INCLUDE_DIR}\"\n    \"$ENV{MINIAUDIO_INCLUDE_DIR}\"\n    \"${CMAKE_CURRENT_SOURCE_DIR}\"\n)\n\nif (NOT MINIAUDIO_INCLUDE_DIR OR NOT EXISTS \"${MINIAUDIO_INCLUDE_DIR}/miniaudio.h\")\n    message(FATAL_ERROR\n        \"Header file miniaudio.h not found. To solve this do any of these:\"\n        \"\\na) Install miniaudio development package\"\n        \" (miniaudio-devel on Fedora, libminiaudio-dev on Debian/Ubuntu)\"\n        \"\\nb) Download it from https://github.com/mackron/miniaudio\"\n        \" and set MINIAUDIO_INCLUDE_DIR to the directory containing miniaudio.h\"\n        \"\\nc) Set WITH_AUDIO=OFF to disable audio support\")\nendif()\nmessage(STATUS \"miniaudio found: ${MINIAUDIO_INCLUDE_DIR}\")\n\n# miniaudio_impl.cpp lives in src/miniaudio/ — a separate CMake directory\n# scope where CMAKE_CXX_FLAGS is stripped of coverage flags (--coverage\n# cannot be negated by -fno-*).  See src/miniaudio/CMakeLists.txt.\nadd_subdirectory(miniaudio)\nset(MINIAUDIO_OBJECTS $<TARGET_OBJECTS:miniaudio_impl>)\n\nlist(APPEND copyq_DEFINITIONS WITH_AUDIO)\n\n# miniaudio needs threads and math on POSIX, dl on Linux\nfind_package(Threads REQUIRED)\nif (UNIX AND NOT APPLE)\n    list(APPEND copyq_LIBRARIES Threads::Threads m ${CMAKE_DL_LIBS})\nelseif (APPLE)\n    find_library(COREAUDIO_LIB CoreAudio REQUIRED)\n    find_library(AUDIOTOOLBOX_LIB AudioToolbox REQUIRED)\n    find_library(COREFOUNDATION_LIB CoreFoundation REQUIRED)\n    list(APPEND copyq_LIBRARIES\n        ${COREAUDIO_LIB} ${AUDIOTOOLBOX_LIB} ${COREFOUNDATION_LIB})\nendif()\n# Windows: miniaudio uses WASAPI via COM, linked automatically\n"
  },
  {
    "path": "src/common/action.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"action.h\"\n\n#include \"common/mimetypes.h\"\n#include \"common/process.h\"\n#include \"common/processsignals.h\"\n#include \"item/serialize.h\"\n\n#include <QCoreApplication>\n#include <QDir>\n#include <QEventLoop>\n#include <QLoggingCategory>\n#include <QPointer>\n#include <QProcessEnvironment>\n#include <QRegularExpression>\n#include <QTimer>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.action\")\n\nvoid startProcess(QProcess *process, const QStringList &args, QIODevice::OpenModeFlag mode)\n{\n    QString executable = args.value(0);\n\n    // Replace \"copyq\" command with full application path.\n    if (executable == \"copyq\")\n        executable = QCoreApplication::applicationFilePath();\n\n    process->start(executable, args.mid(1), mode);\n}\n\ntemplate <typename Entry, typename Container>\nvoid appendAndClearNonEmpty(Entry &entry, Container &container)\n{\n    if ( !entry.isEmpty() ) {\n        container.append(entry);\n        entry.clear();\n    }\n}\n\nbool getScriptFromLabel(const char *labelStr, const QString &cmd, int i, QString *script)\n{\n    const QLatin1String label(labelStr);\n    const auto mid = QStringView(cmd).mid(i, label.size());\n    if (mid == label) {\n        *script = cmd.mid(i + label.size());\n        return true;\n    }\n\n    return false;\n}\n\nQList< QList<QStringList> > parseCommands(const QString &cmd, const QStringList &capturedTexts)\n{\n    QList< QList<QStringList> > lines;\n    QList<QStringList> commands;\n    QStringList command;\n    QString script;\n\n    QString arg;\n    QChar quote;\n    bool escape = false;\n    bool percent = false;\n\n    // Ignore escape sequences if command starts with an unescaped Windows path.\n    const QRegularExpression reUnescapedWindowsPath(R\"(^\\s*['\"]?[a-zA-Z]:\\\\[^\\\\])\");\n    const bool allowEscape = !cmd.contains(reUnescapedWindowsPath);\n\n    for (int i = 0; i < cmd.size(); ++i) {\n        const QChar &c = cmd[i];\n\n        if (percent) {\n            if (c == '1' || (c >= '2' && c <= '9' && capturedTexts.size() > 1)) {\n                arg.resize( arg.size() - 1 );\n                arg.append( capturedTexts.value(c.digitValue() - 1) );\n                continue;\n            }\n        }\n        percent = !escape && c == '%';\n\n        if (escape) {\n            escape = false;\n            if (c == 'n') {\n                arg.append('\\n');\n            } else if (c == 't') {\n                arg.append('\\t');\n            } else if (c == '\\n') {\n                // Ignore escaped new line character.\n            } else {\n                arg.append(c);\n            }\n        } else if (allowEscape && c == '\\\\') {\n            escape = true;\n        } else if (!quote.isNull()) {\n            if (quote == c) {\n                quote = QChar();\n                command.append(arg);\n                arg.clear();\n            } else {\n                arg.append(c);\n            }\n        } else if (c == '\\'' || c == '\"') {\n            quote = c;\n        } else if (c == '|') {\n            appendAndClearNonEmpty(arg, command);\n            appendAndClearNonEmpty(command, commands);\n        } else if (c == '\\n' || c == ';') {\n            appendAndClearNonEmpty(arg, command);\n            appendAndClearNonEmpty(command, commands);\n            appendAndClearNonEmpty(commands, lines);\n        } else if ( c.isSpace() ) {\n            if (!arg.isEmpty()) {\n                command.append(arg);\n                arg.clear();\n            }\n        } else if ( c == ':' && i + 1 < cmd.size() && cmd[i+1] == '\\n' ) {\n            // If there is unescaped colon at the end of a line,\n            // treat the rest of the command as single argument.\n            appendAndClearNonEmpty(arg, command);\n            arg = cmd.mid(i + 2);\n            break;\n        } else {\n            if ( arg.isEmpty() && command.isEmpty() ) {\n                // Treat command as script if known label is present.\n                if ( getScriptFromLabel(\"copyq:\", cmd, i, &script) )\n                    command << \"copyq\" << \"eval\" << \"--\" << script;\n                else if ( getScriptFromLabel(\"sh:\", cmd, i, &script) )\n                    command << \"sh\" << \"-c\" << \"--\" << script << \"--\";\n                else if ( getScriptFromLabel(\"bash:\", cmd, i, &script) )\n                    command << \"bash\" << \"-c\" << \"--\" << script << \"--\";\n                else if ( getScriptFromLabel(\"perl:\", cmd, i, &script) )\n                    command << \"perl\" << \"-e\" << script << \"--\";\n                else if ( getScriptFromLabel(\"python:\", cmd, i, &script) )\n                    command << \"python\" << \"-c\" << script;\n                else if ( getScriptFromLabel(\"ruby:\", cmd, i, &script) )\n                    command << \"ruby\" << \"-e\" << script << \"--\";\n\n                if ( !script.isEmpty() ) {\n                    command.append( capturedTexts.mid(1) );\n                    commands.append(command);\n                    lines.append(commands);\n                    return lines;\n                }\n            }\n\n            arg.append(c);\n        }\n    }\n\n    appendAndClearNonEmpty(arg, command);\n    appendAndClearNonEmpty(command, commands);\n    appendAndClearNonEmpty(commands, lines);\n\n    return lines;\n}\n\ntemplate <typename Iterator>\nvoid pipeThroughProcesses(Iterator begin, Iterator end)\n{\n    auto it1 = begin;\n    for (auto it2 = it1 + 1; it2 != end; it1 = it2++) {\n        (*it1)->setStandardOutputProcess(*it2);\n        connectProcessFinished(*it2, *it1, &QProcess::terminate);\n    }\n}\n\n} // namespace\n\nAction::Action(QObject *parent)\n    : QObject(parent)\n    , m_failed(false)\n    , m_currentLine(-1)\n    , m_exitCode(0)\n{\n}\n\nAction::~Action()\n{\n    closeSubCommands();\n}\n\nQString Action::commandLine() const\n{\n    QString text;\n    for ( const auto &line : m_cmds ) {\n        for ( const auto &args : line ) {\n            if ( !text.isEmpty() )\n                text.append(QChar('|'));\n            text.append(args.join(\" \"));\n        }\n        text.append('\\n');\n    }\n    return text.trimmed();\n}\n\nvoid Action::setCommand(const QString &command, const QStringList &arguments)\n{\n    m_cmds = parseCommands(command, arguments);\n}\n\nvoid Action::setCommand(const QStringList &arguments)\n{\n    m_cmds.clear();\n    m_cmds.append(QList<QStringList>() << arguments);\n}\n\nvoid Action::setInputWithFormat(const QVariantMap &data, const QString &inputFormat)\n{\n    if (inputFormat == mimeItems) {\n        m_input = serializeData(data);\n        m_inputFormats = data.keys();\n    } else {\n        m_input = data.value(inputFormat).toByteArray();\n        m_inputFormats = QStringList(inputFormat);\n    }\n}\n\nvoid Action::start()\n{\n    closeSubCommands();\n\n    if ( m_currentLine + 1 >= m_cmds.size() ) {\n        finish();\n        return;\n    }\n\n    ++m_currentLine;\n    const QList<QStringList> &cmds = m_cmds[m_currentLine];\n\n    Q_ASSERT( !cmds.isEmpty() );\n\n    // Avoid calling non-trivial QProcessEnvironment::systemEnvironment() repeatedly.\n    static const QProcessEnvironment baseEnv = QProcessEnvironment::systemEnvironment();\n    QProcessEnvironment env = baseEnv;\n    if (m_id != -1)\n        env.insert(\"COPYQ_ACTION_ID\", QString::number(m_id));\n    if ( !m_name.isEmpty() )\n        env.insert(\"COPYQ_ACTION_NAME\", m_name);\n\n    for (int i = 0; i < cmds.size(); ++i) {\n        auto process = new QProcess(this);\n        m_processes.push_back(process);\n        process->setProcessEnvironment(env);\n        if ( !m_workingDirectoryPath.isEmpty()\n           && m_workingDirectoryPath != QDir::currentPath() )\n        {\n            process->setWorkingDirectory(m_workingDirectoryPath);\n        }\n\n        connectProcessError(process, this, &Action::onSubProcessError);\n        connect( process, &QProcess::readyReadStandardError,\n                 this, &Action::onSubProcessErrorOutput );\n    }\n\n    pipeThroughProcesses(m_processes.constBegin(), m_processes.constEnd());\n\n    QProcess *lastProcess = m_processes.back();\n    connect( lastProcess, &QProcess::started,\n             this, &Action::onSubProcessStarted );\n    connectProcessFinished( lastProcess, this, &Action::onSubProcessFinished );\n    connect( lastProcess, &QProcess::readyReadStandardOutput,\n             this, &Action::onSubProcessOutput );\n\n    // Writing directly to stdin of a process on Windows can hang the app.\n    QProcess *firstProcess = m_processes.front();\n    connect( firstProcess, &QProcess::started,\n             this, &Action::writeInput, Qt::QueuedConnection );\n    connect( firstProcess, &QProcess::bytesWritten,\n             this, &Action::onBytesWritten, Qt::QueuedConnection );\n\n    const bool needWrite = !m_input.isEmpty();\n    if (m_processes.size() == 1) {\n        const auto mode =\n                (needWrite && m_readOutput) ? QIODevice::ReadWrite\n              : needWrite ? QIODevice::WriteOnly\n              : m_readOutput ? QIODevice::ReadOnly\n              : QIODevice::NotOpen;\n        startProcess(firstProcess, cmds.first(), mode);\n    } else {\n        auto it = m_processes.begin();\n        auto cmdIt = cmds.constBegin();\n        startProcess(*it, *cmdIt, needWrite ? QIODevice::ReadWrite : QIODevice::ReadOnly);\n        for (++it, ++cmdIt; it != m_processes.end() - 1; ++it, ++cmdIt)\n            startProcess(*it, *cmdIt, QIODevice::ReadWrite);\n        startProcess(lastProcess, cmds.last(), m_readOutput ? QIODevice::ReadWrite : QIODevice::WriteOnly);\n    }\n}\n\nbool Action::waitForFinished(int msecs)\n{\n    if ( !isRunning() )\n        return true;\n\n    QPointer<QObject> self(this);\n    QEventLoop loop;\n    QTimer t;\n    connect(this, &Action::actionFinished, &loop, &QEventLoop::quit);\n    if (msecs >= 0) {\n        connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);\n        t.setSingleShot(true);\n        t.start(msecs);\n    }\n    loop.exec(QEventLoop::AllEvents);\n\n    // Loop stopped because application is exiting?\n    while ( self && isRunning() && (msecs < 0 || t.isActive()) )\n        QCoreApplication::processEvents(QEventLoop::WaitForMoreEvents, 10);\n\n    return !self || !isRunning();\n}\n\nbool Action::isRunning() const\n{\n    return !m_processes.empty() && m_processes.back()->state() != QProcess::NotRunning;\n}\n\nvoid Action::setData(const QVariantMap &data)\n{\n    m_data = data;\n}\n\nconst QVariantMap &Action::data() const\n{\n    return m_data;\n}\n\nvoid Action::appendOutput(const QByteArray &output)\n{\n    if ( !output.isEmpty() )\n        emit actionOutput(output);\n}\n\nvoid Action::appendErrorOutput(const QByteArray &errorOutput)\n{\n    m_errorOutput.append(errorOutput);\n}\n\nvoid Action::onSubProcessError(int error)\n{\n    QProcess *p = qobject_cast<QProcess*>(sender());\n    Q_ASSERT(p);\n\n    // Ignore write-to-process error, process can ignore the input.\n    if (error != QProcess::WriteError) {\n        if (!m_errorString.isEmpty())\n            m_errorString.append(\"\\n\");\n        m_errorString.append( p->errorString() );\n        m_failed = true;\n    }\n\n    if ( !isRunning() )\n        finish();\n}\n\nvoid Action::onSubProcessStarted()\n{\n    if (m_currentLine == 0)\n        emit actionStarted(this);\n}\n\nvoid Action::onSubProcessFinished()\n{\n    onSubProcessOutput();\n    start();\n}\n\nvoid Action::onSubProcessOutput()\n{\n    if ( m_processes.empty() )\n        return;\n\n    QProcess *p = m_processes.back();\n    if ( p->isReadable() )\n        appendOutput( p->readAll() );\n}\n\nvoid Action::onSubProcessErrorOutput()\n{\n    QProcess *p = qobject_cast<QProcess*>(sender());\n    Q_ASSERT(p);\n\n    if ( p->isReadable() )\n        appendErrorOutput( p->readAllStandardError() );\n}\n\nvoid Action::writeInput()\n{\n    if (m_processes.empty())\n        return;\n\n    QProcess *p = m_processes.front();\n\n    if (m_input.isEmpty())\n        p->closeWriteChannel();\n    else\n        p->write(m_input);\n}\n\nvoid Action::onBytesWritten()\n{\n    if ( !m_processes.empty() )\n        m_processes.front()->closeWriteChannel();\n}\n\nvoid Action::terminate()\n{\n    if (m_processes.empty())\n        return;\n\n    for (auto p : m_processes)\n        p->terminate();\n\n    waitForFinished(5000);\n    for (auto p : m_processes)\n        terminateProcess(p);\n}\n\nvoid Action::requestTerminate()\n{\n    if (m_processes.empty() || !isRunning())\n        return;\n\n    qCWarning(logCategory) << \"Terminating action:\" << commandLine();\n    for (auto p : m_processes)\n        p->terminate();\n}\n\nvoid Action::requestKill()\n{\n    if (m_processes.empty() || !isRunning())\n        return;\n\n    qCWarning(logCategory) << \"Killing action:\" << commandLine();\n    for (auto p : m_processes) {\n        if (p->state() != QProcess::NotRunning)\n            p->kill();\n    }\n}\n\nvoid Action::closeSubCommands()\n{\n    terminate();\n\n    if (m_processes.empty())\n        return;\n\n    QProcess *last = m_processes.back();\n    m_exitCode = last->exitCode();\n    m_failed = m_failed || last->exitStatus() != QProcess::NormalExit;\n\n    for (auto p : m_processes)\n        p->deleteLater();\n\n    m_processes.clear();\n}\n\nvoid Action::finish()\n{\n    closeSubCommands();\n    emit actionFinished(this);\n}\n"
  },
  {
    "path": "src/common/action.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QStringList>\n#include <QVariantMap>\n\nclass QAction;\nclass QProcess;\n\n/**\n * Execute external program and emits signals\n * to create or change items from the program's stdout.\n */\nclass Action final : public QObject\n{\n    Q_OBJECT\npublic:\n    /** Create action with command line parameters. */\n    explicit Action(QObject *parent = nullptr);\n\n    ~Action();\n\n    /** Return true only if command execution failed. */\n    bool actionFailed() const { return m_failed; }\n\n    /** Return standard error output string. */\n    const QByteArray &errorOutput() const { return m_errorOutput; }\n\n    /** Return command line. */\n    QString commandLine() const;\n\n    /// Set command and texts to be placed as %2..%9 in command.\n    void setCommand(const QString &commandLine, const QStringList &arguments = QStringList());\n\n    /// Set command with arguments.\n    void setCommand(const QStringList &arguments);\n\n    /// Return programs and arguments.\n    const QList<QList<QStringList>> &command() const { return m_cmds; }\n\n    /** Return input. */\n    const QByteArray &input() const { return m_input; }\n    void setInput(const QByteArray &input) { m_input = input; }\n\n    /** Set data for input and input format. */\n    void setInputWithFormat(const QVariantMap &data, const QString &inputFormat);\n\n    /** Return input formats. */\n    const QStringList &inputFormats() const { return m_inputFormats; }\n\n    /** Set working directory path (default is empty so it doesn't change working directory). */\n    void setWorkingDirectory(const QString &path) { m_workingDirectoryPath = path; }\n\n    /** Execute command. */\n    void start();\n\n    bool waitForFinished(int msecs = -1);\n\n    bool isRunning() const;\n\n    /** Set human-readable name for action. */\n    void setName(const QString &actionName) { m_name = actionName; }\n\n    /** Return human-readable name for action. */\n    QString name() const { return m_name; }\n\n    void setExitCode(int exitCode) { m_exitCode = exitCode; }\n    int exitCode() const { return m_exitCode; }\n    QString errorString() const { return m_errorString; }\n\n    void setData(const QVariantMap &data);\n    const QVariantMap &data() const;\n\n    void setId(int actionId) { m_id = actionId; }\n    int id() const { return m_id; }\n\n    void setReadOutput(bool read) { m_readOutput = read; }\n\n    void appendOutput(const QByteArray &output);\n    void appendErrorOutput(const QByteArray &errorOutput);\n\n    /** Terminate (kill) process. */\n    void terminate();\n\n    /** Async: send SIGTERM to child processes, no blocking wait. */\n    void requestTerminate();\n\n    /** Async: send SIGKILL to still-running child processes, no blocking wait. */\n    void requestKill();\n\nsignals:\n    /** Emitted when finished. */\n    void actionFinished(Action *act);\n    /** Emitter when started. */\n    void actionStarted(Action *act);\n\n    void actionOutput(const QByteArray &output);\n\nprivate:\n    void onSubProcessError(int error);\n    void onSubProcessStarted();\n    void onSubProcessFinished();\n    void onSubProcessOutput();\n    void onSubProcessErrorOutput();\n    void writeInput();\n    void onBytesWritten();\n\n    void closeSubCommands();\n    void finish();\n\n    QByteArray m_input;\n    QList< QList<QStringList> > m_cmds;\n    QStringList m_inputFormats;\n    QString m_workingDirectoryPath;\n    QByteArray m_errorOutput;\n    bool m_failed;\n    bool m_readOutput = false;\n    int m_currentLine;\n    QString m_name;\n    QVariantMap m_data;\n    QList<QProcess*> m_processes;\n\n    int m_exitCode;\n    QString m_errorString;\n\n    int m_id = -1;\n};\n"
  },
  {
    "path": "src/common/actionhandlerenums.h",
    "content": "#pragma once\n\n\n#include <QtGlobal>\n\nenum class ActionState {\n    Starting,\n    Running,\n    Finished,\n    Error,\n};\n\nnamespace ActionHandlerColumn {\nenum {\n    id,\n    name,\n    status,\n    started,\n    finished,\n    error,\n    count\n};\n}\n\nnamespace ActionHandlerRole {\nenum {\n    sort = Qt::UserRole,\n    status,\n    id\n};\n}\n"
  },
  {
    "path": "src/common/actionoutput.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"actionoutput.h\"\n\n#include \"common/action.h\"\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/mainwindow.h\"\n#include \"item/serialize.h\"\n\n#include <QObject>\n#include <QPersistentModelIndex>\n\nnamespace {\n\ntemplate <typename ActionOutput>\nvoid connectActionOutput(Action *action, ActionOutput *actionOutput)\n{\n    QObject::connect( action, &Action::actionOutput,\n                      actionOutput, &ActionOutput::onActionOutput );\n    QObject::connect( action, &Action::actionFinished,\n                      actionOutput, &ActionOutput::onActionFinished );\n\n    action->setReadOutput(true);\n}\n\nclass ActionOutputItems final : public QObject\n{\npublic:\n    ActionOutputItems(\n            MainWindow *wnd,\n            Action *action,\n            const QString &outputItemFormat,\n            const QString &outputTabName,\n            const QRegularExpression &itemSeparator)\n        : QObject(action)\n        , m_wnd(wnd)\n        , m_outputFormat(outputItemFormat)\n        , m_tab(outputTabName)\n        , m_sep(itemSeparator)\n    {\n        connectActionOutput(action, this);\n    }\n\n    void onActionOutput(const QByteArray &output)\n    {\n        m_lastOutput.append( getTextData(output) );\n        auto items = m_lastOutput.split(m_sep);\n        m_lastOutput = items.takeLast();\n        if ( !items.isEmpty() )\n            addItems(items);\n    }\n\n    void onActionFinished(Action *)\n    {\n        if ( !m_lastOutput.isEmpty() )\n            addItems(QStringList() << m_lastOutput);\n    }\n\nprivate:\n    void addItems(const QStringList &items)\n    {\n        ClipboardBrowser *c = m_tab.isEmpty() ? m_wnd->browser() : m_wnd->tab(m_tab);\n        for (const auto &item : items)\n            c->add( createDataMap(m_outputFormat, item) );\n    }\n\n    MainWindow *m_wnd;\n    QString m_outputFormat;\n    QString m_tab;\n    QRegularExpression m_sep;\n    QString m_lastOutput;\n};\n\nclass ActionOutputItem final : public QObject\n{\npublic:\n    ActionOutputItem(\n            MainWindow *wnd,\n            Action *action,\n            const QString &outputItemFormat,\n            const QString &outputTabName)\n        : QObject(action)\n        , m_wnd(wnd)\n        , m_outputFormat(outputItemFormat)\n        , m_tab(outputTabName)\n    {\n        connectActionOutput(action, this);\n    }\n\n    void onActionOutput(const QByteArray &output)\n    {\n        m_output.append(output);\n    }\n\n    void onActionFinished(Action *)\n    {\n        if ( m_output.isEmpty() )\n            return;\n\n        ClipboardBrowser *c = m_tab.isEmpty() ? m_wnd->browser() : m_wnd->tab(m_tab);\n        c->add( createDataMap(m_outputFormat, m_output) );\n    }\n\nprivate:\n    MainWindow *m_wnd;\n    QString m_outputFormat;\n    QString m_tab;\n    QByteArray m_output;\n};\n\nclass ActionOutputIndex final : public QObject\n{\npublic:\n    ActionOutputIndex(\n            MainWindow *wnd,\n            Action *action,\n            const QString &outputItemFormat,\n            const QModelIndex &index)\n        : QObject(action)\n        , m_wnd(wnd)\n        , m_outputFormat(outputItemFormat)\n        , m_index(index)\n    {\n        connectActionOutput(action, this);\n    }\n\n    void onActionOutput(const QByteArray &output)\n    {\n        m_output.append(output);\n        changeItem();\n    }\n\n    void onActionFinished(Action *action)\n    {\n        changeItem();\n\n        auto removeFormats = action->inputFormats();\n        if ( !removeFormats.isEmpty() ) {\n            ClipboardBrowser *c = m_wnd->browserForItem(m_index);\n            if (c) {\n                removeFormats.removeAll(m_outputFormat);\n                if ( !removeFormats.isEmpty() )\n                    c->model()->setData(m_index, removeFormats, contentType::removeFormats);\n            }\n        }\n    }\n\nprivate:\n    void changeItem()\n    {\n        ClipboardBrowser *c = m_wnd->browserForItem(m_index);\n        if (c == nullptr)\n            return;\n\n        QVariantMap dataMap;\n        if (m_outputFormat == mimeItems)\n            deserializeData(&dataMap, m_output);\n        else\n            dataMap.insert(m_outputFormat, m_output);\n\n        c->model()->setData(m_index, dataMap, contentType::updateData);\n    }\n\n    MainWindow *m_wnd;\n    QString m_outputFormat;\n    QPersistentModelIndex m_index;\n    QByteArray m_output;\n};\n\n} // namespace\n\nvoid actionOutput(\n        MainWindow *wnd,\n        Action *action,\n        const QString &outputItemFormat,\n        const QString &outputTabName,\n        const QRegularExpression &itemSeparator\n        )\n{\n    new ActionOutputItems(wnd, action, outputItemFormat, outputTabName, itemSeparator);\n}\n\nvoid actionOutput(\n        MainWindow *wnd,\n        Action *action,\n        const QString &outputItemFormat,\n        const QString &outputTabName\n        )\n{\n    new ActionOutputItem(wnd, action, outputItemFormat, outputTabName);\n}\n\nvoid actionOutput(\n        MainWindow *wnd,\n        Action *action,\n        const QString &outputItemFormat,\n        const QModelIndex &index\n        )\n{\n    new ActionOutputIndex(wnd, action, outputItemFormat, index);\n}\n"
  },
  {
    "path": "src/common/actionoutput.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass Action;\nclass MainWindow;\nclass QString;\nclass QRegularExpression;\nclass QModelIndex;\n\nvoid actionOutput(\n        MainWindow *wnd,\n        Action *action,\n        const QString &outputItemFormat,\n        const QString &outputTabName,\n        const QRegularExpression &itemSeparator\n        );\n\nvoid actionOutput(\n        MainWindow *wnd,\n        Action *action,\n        const QString &outputItemFormat,\n        const QString &outputTabName\n        );\n\nvoid actionOutput(\n        MainWindow *wnd,\n        Action *action,\n        const QString &outputItemFormat,\n        const QModelIndex &index\n        );\n"
  },
  {
    "path": "src/common/actiontablemodel.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"actiontablemodel.h\"\n\n#include \"common/action.h\"\n#include \"common/actionhandlerenums.h\"\n\n#include <QColor>\n\n#include <algorithm>\n\nnamespace {\n\nconstexpr auto dateTimeFormat = \"yyyy-MM-dd HH:mm:ss.zzz\";\n\nQString actionStateToString(ActionState state)\n{\n    switch (state) {\n    case ActionState::Error: return \"Error\";\n    case ActionState::Finished: return \"Finished\";\n    case ActionState::Running: return \"Running\";\n    case ActionState::Starting: return \"Starting\";\n    }\n    return QString();\n}\n\nint actionStateOrder(ActionState state)\n{\n    switch (state) {\n    case ActionState::Error: return 1;\n    case ActionState::Finished: return 0;\n    case ActionState::Running: return 2;\n    case ActionState::Starting: return 3;\n    }\n    return -1;\n}\n\n} // namespace\n\nActionTableModel::ActionTableModel(QObject *parent)\n    : QAbstractTableModel(parent)\n{\n}\n\nvoid ActionTableModel::setMaxRowCount(uint rows)\n{\n    if (m_maxRowCount == rows)\n        return;\n\n    m_maxRowCount = rows;\n    limitItems();\n}\n\nint ActionTableModel::actionAboutToStart(Action *action)\n{\n    ActionData actionData;\n    actionData.id = m_actions.empty() ? 1 : m_actions[m_actions.size() - 1].id + 1;\n    actionData.name = action->name();\n    if ( actionData.name.isEmpty() )\n        actionData.name = action->commandLine();\n    actionData.finished = -1;\n\n    limitItems();\n\n    beginInsertRows(QModelIndex(), actionCount(), actionCount());\n    m_actions.push_back(actionData);\n    endInsertRows();\n\n    return actionData.id;\n}\n\nvoid ActionTableModel::actionStarted(Action *action)\n{\n    const int row = rowFor(action);\n    actionData(row).started = QDateTime::currentDateTime();\n    for (const int column : { ActionHandlerColumn::started, ActionHandlerColumn::status }) {\n        const auto index = this->index(row, column);\n        emit dataChanged(index, index);\n    }\n}\n\nvoid ActionTableModel::actionFailed(Action *action, const QString &error)\n{\n    const int row = rowFor(action);\n    actionData(row).error = error;\n    for (const int column : { ActionHandlerColumn::error, ActionHandlerColumn::status }) {\n        const auto index = this->index(row, column);\n        emit dataChanged(index, index);\n    }\n}\n\nvoid ActionTableModel::actionFinished(Action *action)\n{\n    const int row = rowFor(action);\n    ActionData &data = actionData(row);\n    data.finished = data.started.msecsTo(QDateTime::currentDateTime());\n    for (const int column : { ActionHandlerColumn::finished, ActionHandlerColumn::status }) {\n        const auto index = this->index(row, column);\n        emit dataChanged(index, index);\n    }\n}\n\nvoid ActionTableModel::actionFinished(const QString &name)\n{\n    ActionData actionData;\n    actionData.id = m_actions.empty() ? 1 : m_actions.end()->id + 1;\n    actionData.name = name;\n    actionData.started = QDateTime::currentDateTime();\n    actionData.finished = 0;\n\n    limitItems();\n\n    beginInsertRows(QModelIndex(), actionCount(), actionCount());\n    m_actions.push_back(actionData);\n    endInsertRows();\n}\n\nQVariant ActionTableModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {\n        switch (section) {\n        case ActionHandlerColumn::id:\n            return \"ID\";\n        case ActionHandlerColumn::name:\n            return \"Name\";\n        case ActionHandlerColumn::status:\n            return \"Status\";\n        case ActionHandlerColumn::started:\n            return \"Started\";\n        case ActionHandlerColumn::finished:\n            return \"Finished\";\n        case ActionHandlerColumn::error:\n            return \"Error\";\n        }\n    }\n\n    return QVariant();\n}\n\nint ActionTableModel::rowCount(const QModelIndex &parent) const\n{\n    if (parent.isValid())\n        return 0;\n\n    return actionCount();\n}\n\nint ActionTableModel::columnCount(const QModelIndex &parent) const\n{\n    if (parent.isValid())\n        return 0;\n\n    return ActionHandlerColumn::count;\n}\n\nQVariant ActionTableModel::data(const QModelIndex &index, int role) const\n{\n    if (!index.isValid())\n        return QVariant();\n\n    if (role == Qt::DisplayRole || role == Qt::EditRole) {\n        const int row = index.row();\n        const int column = index.column();\n        const ActionData &data = actionData(row);\n        switch (column) {\n        case ActionHandlerColumn::id:\n            return row;\n        case ActionHandlerColumn::name:\n            return data.name;\n        case ActionHandlerColumn::status:\n            return actionStateToString(actionState(data));\n        case ActionHandlerColumn::started:\n            return data.started.toString(dateTimeFormat);\n        case ActionHandlerColumn::finished:\n            return data.finished == -1 ? QString() : data.started.addMSecs(data.finished).toString(dateTimeFormat);\n        case ActionHandlerColumn::error:\n            return data.error;\n        }\n    } else if (role == Qt::ToolTipRole) {\n        const int row = index.row();\n        const int column = index.column();\n        const ActionData &data = actionData(row);\n        if (column == ActionHandlerColumn::name)\n            return data.name;\n        if (column == ActionHandlerColumn::error)\n            return data.error;\n    } else if (role == Qt::DecorationRole) {\n            const int column = index.column();\n            if (column == ActionHandlerColumn::status) {\n                const int row = index.row();\n                const ActionData &data = actionData(row);\n                switch (actionState(data)) {\n                case ActionState::Error: return QColor(0xe56950);\n                case ActionState::Running: return QColor(0xcce550);\n                case ActionState::Starting: return QColor(0xe5b350);\n                case ActionState::Finished: break;\n                }\n            }\n    } else if (role >= Qt::UserRole) {\n        if (role == ActionHandlerRole::sort) {\n            const int row = index.row();\n            const int column = index.column();\n            const ActionData &data = actionData(row);\n            switch (column) {\n            case ActionHandlerColumn::id:\n                return data.id;\n            case ActionHandlerColumn::name:\n                return data.name;\n            case ActionHandlerColumn::status:\n                return actionStateOrder(actionState(data));\n            case ActionHandlerColumn::started:\n                return data.started;\n            case ActionHandlerColumn::finished:\n                return data.finished;\n            case ActionHandlerColumn::error:\n                return data.error;\n            }\n        } else if (role == ActionHandlerRole::status) {\n            const int row = index.row();\n            const ActionData &data = actionData(row);\n            return static_cast<int>(actionState(data));\n        } else if (role == ActionHandlerRole::id) {\n            const int row = index.row();\n            const ActionData &data = actionData(row);\n            return data.id;\n        }\n    }\n\n    return QVariant();\n}\n\nActionState ActionTableModel::actionState(const ActionTableModel::ActionData &data)\n{\n    if ( !data.error.isEmpty() )\n        return ActionState::Error;\n    if ( data.finished != -1 )\n        return ActionState::Finished;\n    if ( data.started.isValid() )\n        return ActionState::Running;\n    return ActionState::Starting;\n}\n\nint ActionTableModel::rowFor(const Action *action) const\n{\n    const auto found = std::lower_bound(\n        std::begin(m_actions), std::end(m_actions), action->id(),\n        [](const ActionData &data, int id) {\n            return data.id < id;\n        });\n    const auto row = std::distance(std::begin(m_actions), found);\n    return static_cast<int>(row);\n}\n\nvoid ActionTableModel::limitItems()\n{\n    if (m_actions.size() < m_maxRowCount * 4 / 3)\n        return;\n\n    while (m_actions.size() >= m_maxRowCount) {\n        const auto found = std::find_if(\n            std::begin(m_actions), std::end(m_actions),\n            [](const ActionData &data) {\n                const auto state = actionState(data);\n                return state == ActionState::Finished || state == ActionState::Error;\n            });\n\n        if ( found == std::end(m_actions) )\n            break;\n\n        const auto row = static_cast<int>( std::distance(std::begin(m_actions), found) );\n        beginRemoveRows(QModelIndex(), row, row);\n        m_actions.erase(found);\n        endRemoveRows();\n    }\n}\n"
  },
  {
    "path": "src/common/actiontablemodel.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QAbstractTableModel>\n#include <QDateTime>\n\nclass Action;\n\nenum class ActionState;\n\nclass ActionTableModel final : public QAbstractTableModel\n{\npublic:\n    explicit ActionTableModel(QObject *parent = nullptr);\n\n    void setMaxRowCount(uint rows);\n\n    int actionAboutToStart(Action *action);\n    void actionStarted(Action *action);\n    void actionFailed(Action *action, const QString &error);\n    void actionFinished(Action *action);\n    void actionFinished(const QString &name);\n\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;\n\n    int rowCount(const QModelIndex &parent = QModelIndex()) const override;\n    int columnCount(const QModelIndex &parent = QModelIndex()) const override;\n\n    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;\n\nprivate:\n    struct ActionData {\n        int id;\n        QString name;\n        QDateTime started;\n        qint64 finished;\n        QString error;\n    };\n\n    static ActionState actionState(const ActionData &data);\n\n    ActionData &actionData(int row) { return m_actions[row]; }\n    const ActionData &actionData(int row) const { return m_actions[row]; }\n    int rowFor(const Action *action) const;\n    int actionCount() const { return m_actions.size(); }\n    void limitItems();\n\n    std::vector<ActionData> m_actions;\n    uint m_maxRowCount = 1000;\n};\n"
  },
  {
    "path": "src/common/appconfig.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"appconfig.h\"\n\n#include \"platform/platformnativeinterface.h\"\n\n#include <QObject>\n#include <QString>\n\nConfig::Config<QString>::Value Config::editor::defaultValue()\n{\n    return platformNativeInterface()->defaultEditorCommand();\n}\n\nConfig::Config<bool>::Value Config::autostart::defaultValue()\n{\n    return platformNativeInterface()->isAutostartEnabled();\n}\n\nQString defaultClipboardTabName()\n{\n    return QObject::tr(\n                \"&clipboard\", \"Default name of the tab that automatically stores new clipboard content\");\n}\n\nQVariant AppConfig::option(const QString &name) const\n{\n    return m_settings.value(QStringLiteral(\"Options/\") + name);\n}\n\nvoid AppConfig::setOption(const QString &name, const QVariant &value)\n{\n    if ( option(name) != value )\n        m_settings.setValue(QStringLiteral(\"Options/\") + name, value);\n}\n\nvoid AppConfig::removeOption(const QString &name)\n{\n    m_settings.remove(QStringLiteral(\"Options/\") + name);\n}\n"
  },
  {
    "path": "src/common/appconfig.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/navigationstyle.h\"\n#include \"common/settings.h\"\n\nclass QString;\nclass QVariant;\n\nQString defaultClipboardTabName();\n\nnamespace Config {\n\nconst int maxItems = 100'000;\n\ntemplate<typename ValueType>\nstruct Config {\n    using Value = ValueType;\n    static Value defaultValue() { return Value(); }\n    static Value value(Value v) { return v; }\n    static const char *description() { return nullptr; }\n};\n\nstruct autostart : Config<bool> {\n    static QString name() { return QStringLiteral(\"autostart\"); }\n    static Value defaultValue();\n};\n\nstruct prevent_screen_capture : Config<bool> {\n    static QString name() { return QStringLiteral(\"prevent_screen_capture\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct maxitems : Config<int> {\n    static QString name() { return QStringLiteral(\"maxitems\"); }\n    static Value defaultValue() { return 200; }\n    static Value value(Value v) { return qBound(0, v, maxItems); }\n};\n\nstruct item_data_threshold : Config<int> {\n    static QString name() { return QStringLiteral(\"item_data_threshold\"); }\n    static Value defaultValue() { return 1024; }\n    static const char *description() {\n        return \"Maximum item data size in bytes to save in tab data file\"\n               \" (larger data are stored in separate files)\";\n    }\n};\n\nstruct encrypt_tabs : Config<bool> {\n    static QString name() { return QStringLiteral(\"encrypt_tabs\"); }\n    static Value defaultValue() { return false; }\n};\n\nstruct use_key_store : Config<bool> {\n    static QString name() { return QStringLiteral(\"use_key_store\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct clipboard_tab : Config<QString> {\n    static QString name() { return QStringLiteral(\"clipboard_tab\"); }\n    static Value defaultValue() { return defaultClipboardTabName(); }\n};\n\nstruct expire_tab : Config<int> {\n    static QString name() { return QStringLiteral(\"expire_tab\"); }\n};\n\nstruct expire_encrypted_tab_seconds : Config<int> {\n    static QString name() { return QStringLiteral(\"expire_encrypted_tab_seconds\"); }\n    static Value value(Value v) { return qBound(0, v, 999999); }\n};\n\nstruct editor : Config<QString> {\n    static QString name() { return QStringLiteral(\"editor\"); }\n    static Value defaultValue();\n};\n\nstruct item_popup_interval : Config<int> {\n    static QString name() { return QStringLiteral(\"item_popup_interval\"); }\n};\n\nstruct notification_position : Config<int> {\n    static QString name() { return QStringLiteral(\"notification_position\"); }\n    static Value defaultValue() { return 3; }\n};\n\nstruct clipboard_notification_lines : Config<int> {\n    static QString name() { return QStringLiteral(\"clipboard_notification_lines\"); }\n    static Value value(Value v) { return qBound(0, v, 100); }\n};\n\nstruct notification_horizontal_offset : Config<int> {\n    static QString name() { return QStringLiteral(\"notification_horizontal_offset\"); }\n    static Value defaultValue() { return 10; }\n};\n\nstruct notification_vertical_offset : Config<int> {\n    static QString name() { return QStringLiteral(\"notification_vertical_offset\"); }\n    static Value defaultValue() { return 10; }\n};\n\nstruct notification_maximum_width : Config<int> {\n    static QString name() { return QStringLiteral(\"notification_maximum_width\"); }\n    static Value defaultValue() { return 300; }\n};\n\nstruct notification_maximum_height : Config<int> {\n    static QString name() { return QStringLiteral(\"notification_maximum_height\"); }\n    static Value defaultValue() { return 100; }\n};\n\nstruct edit_ctrl_return : Config<bool> {\n    static QString name() { return QStringLiteral(\"edit_ctrl_return\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct move : Config<bool> {\n    static QString name() { return QStringLiteral(\"move\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct show_simple_items : Config<bool> {\n    static QString name() { return QStringLiteral(\"show_simple_items\"); }\n    static Value defaultValue() { return false; }\n};\n\nstruct number_search : Config<bool> {\n    static QString name() { return QStringLiteral(\"number_search\"); }\n    static Value defaultValue() { return false; }\n};\n\nstruct check_clipboard : Config<bool> {\n    static QString name() { return QStringLiteral(\"check_clipboard\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct confirm_exit : Config<bool> {\n    static QString name() { return QStringLiteral(\"confirm_exit\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct navigation_style : Config<NavigationStyle> {\n    static QString name() { return QStringLiteral(\"navigation_style\"); }\n};\n\nstruct save_filter_history : Config<bool> {\n    static QString name() { return QStringLiteral(\"save_filter_history\"); }\n};\n\nstruct filter_regular_expression : Config<bool> {\n    static QString name() { return QStringLiteral(\"filter_regular_expression\"); }\n    static Value defaultValue() { return false; }\n    static const char *description() {\n        return \"Use regular expressions to search items\";\n    }\n};\n\nstruct filter_case_insensitive : Config<bool> {\n    static QString name() { return QStringLiteral(\"filter_case_insensitive\"); }\n    static Value defaultValue() { return true; }\n    static const char *description() {\n        return \"Use case-insensitive item search\";\n    }\n};\n\nstruct always_on_top : Config<bool> {\n    static QString name() { return QStringLiteral(\"always_on_top\"); }\n};\n\nstruct close_on_unfocus : Config<bool> {\n    static QString name() { return QStringLiteral(\"close_on_unfocus\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct close_on_unfocus_delay_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"close_on_unfocus_delay_ms\"); }\n    static Value defaultValue() { return 500; }\n    static const char *description() {\n        return \"Delay to close the main window when unfocused/deactivated\";\n    }\n};\n\nstruct close_on_unfocus_extra_delay_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"close_on_unfocus_extra_delay_ms\"); }\n    static Value defaultValue() { return 2000; }\n    static const char *description() {\n        return \"Delay to close the main window when unfocused/deactivated\"\n               \" after being moved/resized, or items are dragged\"\n               \" (workaround for some window managers)\";\n    }\n};\n\nstruct open_windows_on_current_screen : Config<bool> {\n    static QString name() { return QStringLiteral(\"open_windows_on_current_screen\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct restore_geometry : Config<bool> {\n    static QString name() { return QStringLiteral(\"restore_geometry\"); }\n    static Value defaultValue() { return true; }\n    static const char *description() {\n        return \"Restore position and size for the main window and other dialogs\";\n    }\n};\n\nstruct transparency_focused : Config<int> {\n    static QString name() { return QStringLiteral(\"transparency_focused\"); }\n    static Value value(Value v) { return qBound(0, v, 100); }\n};\n\nstruct transparency : Config<int> {\n    static QString name() { return QStringLiteral(\"transparency\"); }\n    static Value value(Value v) { return qBound(0, v, 100); }\n};\n\nstruct hide_tabs : Config<bool> {\n    static QString name() { return QStringLiteral(\"hide_tabs\"); }\n};\n\nstruct hide_toolbar : Config<bool> {\n    static QString name() { return QStringLiteral(\"hide_toolbar\"); }\n};\n\nstruct hide_toolbar_labels : Config<bool> {\n    static QString name() { return QStringLiteral(\"hide_toolbar_labels\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct disable_tray : Config<bool> {\n    static QString name() { return QStringLiteral(\"disable_tray\"); }\n};\n\nstruct hide_main_window : Config<bool> {\n    static QString name() { return QStringLiteral(\"hide_main_window\"); }\n};\n\nstruct hide_main_window_in_task_bar : Config<bool> {\n    static QString name() { return QStringLiteral(\"hide_main_window_in_task_bar\"); }\n    static Value defaultValue() { return false; }\n    static const char *description() {\n        return \"Avoid showing entry for the main window in the task bar\";\n    }\n};\n\nstruct tab_tree : Config<bool> {\n    static QString name() { return QStringLiteral(\"tab_tree\"); }\n};\n\nstruct show_tab_item_count : Config<bool> {\n    static QString name() { return QStringLiteral(\"show_tab_item_count\"); }\n};\n\nstruct text_wrap : Config<bool> {\n    static QString name() { return QStringLiteral(\"text_wrap\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct text_tab_width : Config<int> {\n    static QString name() { return QStringLiteral(\"text_tab_width\"); }\n    static Value defaultValue() { return 8; }\n    static const char *description() {\n        return \"Width of Tab character in number of spaces\";\n    }\n};\n\nstruct activate_item_with_single_click : Config<bool> {\n    static QString name() { return QStringLiteral(\"activate_item_with_single_click\"); }\n    static Value defaultValue() { return false; }\n};\n\nstruct activate_closes : Config<bool> {\n    static QString name() { return QStringLiteral(\"activate_closes\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct activate_focuses : Config<bool> {\n    static QString name() { return QStringLiteral(\"activate_focuses\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct activate_pastes : Config<bool> {\n    static QString name() { return QStringLiteral(\"activate_pastes\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct tray_items : Config<int> {\n    static QString name() { return QStringLiteral(\"tray_items\"); }\n    static Value defaultValue() { return 5; }\n    static Value value(Value v) { return qBound(0, v, 99); }\n};\n\nstruct tray_item_paste : Config<bool> {\n    static QString name() { return QStringLiteral(\"tray_item_paste\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct tray_commands : Config<bool> {\n    static QString name() { return QStringLiteral(\"tray_commands\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct tray_tab_is_current : Config<bool> {\n    static QString name() { return QStringLiteral(\"tray_tab_is_current\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct tray_images : Config<bool> {\n    static QString name() { return QStringLiteral(\"tray_images\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct tray_menu_open_on_left_click : Config<bool> {\n    static QString name() { return QStringLiteral(\"tray_menu_open_on_left_click\"); }\n    static Value defaultValue() { return false; }\n    static const char *description() {\n        return \"Open tray menu on left mouse button\";\n    }\n};\n\nstruct tray_tab : Config<QString> {\n    static QString name() { return QStringLiteral(\"tray_tab\"); }\n};\n\nstruct command_history_size : Config<int> {\n    static QString name() { return QStringLiteral(\"command_history_size\"); }\n    static Value defaultValue() { return 100; }\n    static const char *description() {\n        return \"Number of commands to keep in action dialog history\";\n    }\n};\n\nstruct check_selection : Config<bool> {\n    static QString name() { return QStringLiteral(\"check_selection\"); }\n};\n\nstruct copy_clipboard : Config<bool> {\n    static QString name() { return QStringLiteral(\"copy_clipboard\"); }\n};\n\nstruct copy_selection : Config<bool> {\n    static QString name() { return QStringLiteral(\"copy_selection\"); }\n};\n\nstruct run_selection : Config<bool> {\n    static QString name() { return QStringLiteral(\"run_selection\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct tabs : Config<QStringList> {\n    static QString name() { return QStringLiteral(\"tabs\"); }\n    static Value value(Value v) {\n        v.removeAll(QString());\n        v.removeDuplicates();\n        return v;\n    }\n    static const char *description() {\n        return \"Ordered list of tabs\";\n    }\n};\n\nstruct show_advanced_command_settings : Config<bool> {\n    static QString name() { return QStringLiteral(\"show_advanced_command_settings\"); }\n    static Value defaultValue() { return false; }\n    static const char *description() {\n        return \"Show advanced command configuration in Command dialog\";\n    }\n};\n\nstruct autocompletion : Config<bool> {\n    static QString name() { return QStringLiteral(\"autocompletion\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct max_process_manager_rows : Config<uint> {\n    static QString name() { return QStringLiteral(\"max_process_manager_rows\"); }\n    static Value defaultValue() { return 1000; }\n    static const char *description() {\n        return \"Maximum number of rows in process manager dialog\";\n    }\n};\n\nstruct save_delay_ms_on_item_added : Config<int> {\n    static QString name() { return QStringLiteral(\"save_delay_ms_on_item_added\"); }\n    static Value defaultValue() { return 5 * 60 * 1000; }\n    static const char *description() {\n        return \"Tab save delay after an item is added to the tab\";\n    }\n};\n\nstruct save_delay_ms_on_item_modified : Config<int> {\n    static QString name() { return QStringLiteral(\"save_delay_ms_on_item_modified\"); }\n    static Value defaultValue() { return 5 * 60 * 1000; }\n    static const char *description() {\n        return \"Tab save delay after an item is modified in the tab\";\n    }\n};\n\nstruct save_delay_ms_on_item_removed : Config<int> {\n    static QString name() { return QStringLiteral(\"save_delay_ms_on_item_removed\"); }\n    static Value defaultValue() { return 10 * 60 * 1000; }\n    static const char *description() {\n        return \"Tab save delay after an item is removed from the tab\";\n    }\n};\n\nstruct save_delay_ms_on_item_moved : Config<int> {\n    static QString name() { return QStringLiteral(\"save_delay_ms_on_item_moved\"); }\n    static Value defaultValue() { return 30 * 60 * 1000; }\n    static const char *description() {\n        return \"Tab save delay after an item is moved in the tab\";\n    }\n};\n\nstruct save_delay_ms_on_item_edited : Config<int> {\n    static QString name() { return QStringLiteral(\"save_delay_ms_on_item_edited\"); }\n    static Value defaultValue() { return 1000; }\n    static const char *description() {\n        return \"Tab save delay after an item is edited in the tab\";\n    }\n};\n\nstruct save_on_app_deactivated : Config<bool> {\n    static QString name() { return QStringLiteral(\"save_on_app_deactivated\"); }\n    static Value defaultValue() { return true; }\n    static const char *description() {\n        return \"Save unsaved tabs immediately after the app is deactivated (main window loses focus)\";\n    }\n};\n\nstruct native_menu_bar : Config<bool> {\n    static QString name() { return QStringLiteral(\"native_menu_bar\"); }\n#ifdef Q_OS_MAC\n    // Native menu bar doesn't show on macOS.\n    // See: https://github.com/hluk/CopyQ/issues/1444\n    static Value defaultValue() { return false; }\n#else\n    static Value defaultValue() { return true; }\n#endif\n    static const char *description() {\n        return \"Use native menu bar, otherwise the menu bar shows in the main window\";\n    }\n};\n\nstruct native_tray_menu : Config<bool> {\n    static QString name() { return QStringLiteral(\"native_tray_menu\"); }\n    static Value defaultValue() { return false; }\n    static const char *description() {\n        return \"Use native tray menu (menu items search may not work)\";\n    }\n};\n\nstruct script_paste_delay_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"script_paste_delay_ms\"); }\n    static Value defaultValue() { return 250; }\n    static const char *description() {\n        return \"Delay after pasting from script (when using `paste()`)\";\n    }\n};\n\nstruct window_paste_with_ctrl_v_regex : Config<QString> {\n    static QString name() { return QStringLiteral(\"window_paste_with_ctrl_v_regex\"); }\n    static const char *description() {\n        return \"Regular expression matching window titles where Ctrl+V should be used for pasting\"\n               \" instead of the default Shift+Insert\";\n    }\n};\n\nstruct window_wait_before_raise_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"window_wait_before_raise_ms\"); }\n#ifdef Q_OS_WIN\n    static Value defaultValue() { return 0; }\n#else\n    static Value defaultValue() { return 20; }\n#endif\n    static const char *description() {\n        return \"Delay before trying to raise target window for pasting\";\n    }\n};\n\nstruct window_wait_raised_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"window_wait_raised_ms\"); }\n    static Value defaultValue() { return 150; }\n    static const char *description() {\n        return \"Wait interval for raising target window for pasting\";\n    }\n};\n\nstruct window_wait_after_raised_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"window_wait_after_raised_ms\"); }\n#ifdef Q_OS_WIN\n    static Value defaultValue() { return 150; }\n#elif defined(Q_OS_MAC)\n    static Value defaultValue() { return 0; }\n#else\n    static Value defaultValue() { return 50; }\n#endif\n    static const char *description() {\n        return \"Delay after raising target window for pasting\";\n    }\n};\n\nstruct window_key_press_time_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"window_key_press_time_ms\"); }\n#ifdef Q_OS_WIN\n    static Value defaultValue() { return 0; }\n#elif defined(Q_OS_MAC)\n    static Value defaultValue() { return 100; }\n#else\n    static Value defaultValue() { return 50; }\n#endif\n    static const char *description() {\n        return \"Interval to keep simulated keys (Shift+Insert) pressed for pasting\"\n               \" (needed for some apps)\";\n    }\n};\n\nstruct window_wait_for_modifier_released_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"window_wait_for_modifier_released_ms\"); }\n    static Value defaultValue() { return 2000; }\n    static const char *description() {\n        return \"Wait for any keyboard modifiers to be released before simulating/sending\"\n               \" shortcut for pasting\";\n    }\n};\n\nstruct update_clipboard_owner_delay_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"update_clipboard_owner_delay_ms\"); }\n    static Value defaultValue() { return -1; }\n    static const char *description() {\n        return \"Delay to update new clipboard owner window title\"\n               \" (use negative value for the default interval)\";\n    }\n};\n\nstruct row_index_from_one : Config<bool> {\n    static QString name() { return QStringLiteral(\"row_index_from_one\"); }\n    static Value defaultValue() { return true; }\n    static const char *description() {\n        return \"Index items/rows in UI starting from 1 instead of 0\"\n               \" (in scripts, rows are always indexed from 0)\";\n    }\n};\n\nstruct style : Config<QString> {\n    static QString name() { return QStringLiteral(\"style\"); }\n    static const char *description() {\n        return \"Current application style (available styles can be listed with `copyq styles` command)\";\n    }\n};\n\nstruct native_notifications : Config<bool> {\n    static QString name() { return QStringLiteral(\"native_notifications\"); }\n    static Value defaultValue() { return true; }\n};\n\nstruct frameless_window : Config<bool> {\n    static QString name() { return QStringLiteral(\"frameless_window\"); }\n    static Value defaultValue() { return false; }\n    static const char *description() {\n        return \"Hide the main window frame and title if supported by the window manager\";\n    }\n};\n\nstruct terminate_action_timeout_ms : Config<int> {\n    static QString name() { return QStringLiteral(\"terminate_action_timeout_ms\"); }\n    static Value defaultValue() { return 5000; }\n    static const char *description() {\n        return \"Time to wait for action to be terminated before sending kill signal\";\n    }\n    static Value value(Value v) { return qMax(0, v); }\n};\n\n} // namespace Config\n\nclass AppConfig final\n{\npublic:\n    QVariant option(const QString &name) const;\n\n    template <typename T>\n    T option(const QString &name, T defaultValue) const\n    {\n        const QVariant value = option(name);\n        return value.isValid() ? value.value<T>() : defaultValue;\n    }\n\n    template <typename T>\n    typename T::Value option() const\n    {\n        typename T::Value value = option(T::name(), T::defaultValue());\n        return T::value(value);\n    }\n\n    void setOption(const QString &name, const QVariant &value);\n\n    void removeOption(const QString &name);\n\n    Settings &settings() { return m_settings; }\n\nprivate:\n    Settings m_settings;\n};\n"
  },
  {
    "path": "src/common/audioplayer.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#include \"audioplayer.h\"\n\n#ifdef WITH_AUDIO\n\n#include <miniaudio.h>\n\n#include <QFileInfo>\n#include <QLoggingCategory>\n#include <QThread>\n\n#include <algorithm>\n#include <atomic>\n#include <memory>\n#include <vector>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.audio\")\n\n// Timeout (ms) for ma_engine_init.  PulseAudio's mainloop is known to deadlock\n// during device enumeration on some Linux configurations (headless CI, broken\n// PipeWire-PulseAudio bridge, etc.).  Running init in a detached thread with\n// a timeout prevents the whole process from hanging.\n// Override with COPYQ_AUDIO_INIT_TIMEOUT_SECS for diagnostics.\nint initTimeoutMs()\n{\n    bool ok = false;\n    const int secs = qEnvironmentVariableIntValue(\"COPYQ_AUDIO_INIT_TIMEOUT_SECS\", &ok);\n    return (ok && secs > 0 ? secs : 5) * 1000;\n}\n\n// RAII wrapper for a single ma_sound.  The ma_sound is heap-allocated and\n// never relocated — miniaudio's async playback thread holds a pointer to it,\n// so it must stay at a stable address for its entire lifetime.\nclass SoundEntry {\npublic:\n    SoundEntry() : m_sound(std::make_unique<ma_sound>()) {}\n\n    /// Initialise from file.  Returns the ma_result code.\n    ma_result initFromFile(\n        ma_engine *engine, const char *path, ma_uint32 flags)\n    {\n        const ma_result r = ma_sound_init_from_file(\n            engine, path, flags, nullptr, nullptr, m_sound.get());\n        m_initialized = (r == MA_SUCCESS);\n        return r;\n    }\n\n    ma_sound *get() { return m_initialized ? m_sound.get() : nullptr; }\n\n    bool atEnd() const { return m_initialized && ma_sound_at_end(m_sound.get()); }\n\n    ~SoundEntry()\n    {\n        if (m_initialized)\n            ma_sound_uninit(m_sound.get());\n    }\n\n    SoundEntry(SoundEntry &&) noexcept = default;\n    SoundEntry &operator=(SoundEntry &&) noexcept = default;\n    SoundEntry(const SoundEntry &) = delete;\n    SoundEntry &operator=(const SoundEntry &) = delete;\n\nprivate:\n    std::unique_ptr<ma_sound> m_sound;\n    bool m_initialized = false;\n};\n\n} // namespace\n\nstruct AudioPlayer::Private {\n    std::shared_ptr<ma_engine> engine;\n    bool initialized = false;\n    std::vector<SoundEntry> entries;\n\n    /// Remove sounds that have finished playing.\n    void collectFinished()\n    {\n        entries.erase(\n            std::remove_if(entries.begin(), entries.end(),\n                [](const SoundEntry &e) { return e.atEnd(); }),\n            entries.end());\n    }\n};\n\n// Maximum volume multiplier (200%) to prevent accidental hearing damage.\nstatic constexpr float maxVolume = 2.0f;\n\nQString audioBackendVersion()\n{\n    return QStringLiteral(\"miniaudio \" MA_VERSION_STRING);\n}\n\nAudioPlayer &AudioPlayer::instance()\n{\n    static AudioPlayer s;\n    return s;\n}\n\nAudioPlayer::AudioPlayer()\n    : d(std::make_unique<Private>())\n{\n    qCDebug(logCategory) << \"Initializing miniaudio engine\";\n\n    // Run ma_engine_init on a helper thread so we can bail out if the\n    // PulseAudio (or other) backend deadlocks during device enumeration.\n    // We use QThread::wait() instead of QEventLoop to avoid reentrancy:\n    // a nested event loop would process pending events (e.g. clipboard\n    // change timers) that could call playSound() and deadlock on the\n    // static-local initialization guard of instance().\n    auto initResult = std::make_shared<std::atomic<ma_result>>(MA_ERROR);\n\n    // The engine is shared between AudioPlayer and the init worker thread.\n    // If init times out the worker keeps the engine alive until it finishes.\n    d->engine = std::shared_ptr<ma_engine>(new ma_engine{}, [initResult](ma_engine *e) {\n        if (initResult->load(std::memory_order_acquire) == MA_SUCCESS)\n            ma_engine_uninit(e);\n        delete e;\n    });\n\n    auto *worker = QThread::create([initResult, engine = d->engine]() mutable {\n        initResult->store(ma_engine_init(nullptr, engine.get()), std::memory_order_release);\n        engine.reset(); // release this thread's reference to the engine\n    });\n    worker->start();\n\n    const bool finished = worker->wait(initTimeoutMs());\n\n    if (!finished) {\n        qCWarning(logCategory)\n            << \"miniaudio engine init timed out after\"\n            << initTimeoutMs() / 1000 << \"seconds \\u2014 audio disabled\";\n        // The worker thread holds a shared_ptr to the engine, so the engine\n        // outlives the thread even if AudioPlayer is destroyed first.\n        QObject::connect(worker, &QThread::finished, worker, &QObject::deleteLater);\n        return;\n    }\n\n    worker->deleteLater();\n\n    const ma_result result = initResult->load(std::memory_order_acquire);\n    if (result == MA_SUCCESS) {\n        qCDebug(logCategory) << \"Initialized miniaudio engine successfully\";\n        d->initialized = true;\n    } else {\n        qCWarning(logCategory) << \"Failed to initialize miniaudio, result code:\" << result;\n        d->initialized = false;\n    }\n}\n\nAudioPlayer::~AudioPlayer()\n{\n    if (d && d->initialized) {\n        d->entries.clear();\n        d->engine.reset();\n    }\n}\n\nQString AudioPlayer::play(const QString &filePath, float volume)\n{\n    if (!d->initialized)\n        return QStringLiteral(\"Audio engine not initialized\");\n\n    if (!QFileInfo::exists(filePath))\n        return QStringLiteral(\"File not found: \") + filePath;\n\n    // Reclaim memory from sounds that have finished playing.\n    d->collectFinished();\n\n    SoundEntry entry;\n    const QByteArray path = filePath.toUtf8();\n    const ma_uint32 flags = MA_SOUND_FLAG_ASYNC\n                          | MA_SOUND_FLAG_NO_PITCH\n                          | MA_SOUND_FLAG_NO_SPATIALIZATION;\n    ma_result result = entry.initFromFile(d->engine.get(), path.constData(), flags);\n    if (result != MA_SUCCESS)\n        return QStringLiteral(\"Failed to play sound (error %1)\").arg(result);\n\n    ma_sound_set_volume(entry.get(), std::clamp(volume, 0.0f, maxVolume));\n\n    result = ma_sound_start(entry.get());\n    if (result != MA_SUCCESS)\n        return QStringLiteral(\"Failed to start sound (error %1)\").arg(result);\n\n    d->entries.push_back(std::move(entry));\n    return {};\n}\n\n\n#else // !WITH_AUDIO — stub\n\nQString audioBackendVersion()\n{\n    return QStringLiteral(\"none\");\n}\n\nAudioPlayer &AudioPlayer::instance()\n{\n    static AudioPlayer s;\n    return s;\n}\n\nstruct AudioPlayer::Private {};\n\nAudioPlayer::AudioPlayer() = default;\nAudioPlayer::~AudioPlayer() = default;\n\nQString AudioPlayer::play(const QString &, float)\n{\n    return QStringLiteral(\"Audio playback is not available in this build\");\n}\n\n\n#endif\n"
  },
  {
    "path": "src/common/audioplayer.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QString>\n#include <memory>\n\n/// Returns the audio backend name and version (e.g. \"miniaudio 0.11.25\"), or \"none\" if disabled.\nQString audioBackendVersion();\n\nclass AudioPlayer {\npublic:\n    static AudioPlayer &instance();\n\n    /// Start playing an audio file at the given volume (0.0 = silent, 1.0 = 100%).\n    /// Volume is clamped to [0.0, 2.0] for safety.\n    /// Returns an empty string on success or an error message on failure.\n    QString play(const QString &filePath, float volume);\n\n    ~AudioPlayer();\n\nprivate:\n    AudioPlayer();\n    AudioPlayer(const AudioPlayer &) = delete;\n    AudioPlayer &operator=(const AudioPlayer &) = delete;\n\n    struct Private;\n    std::unique_ptr<Private> d;\n};\n"
  },
  {
    "path": "src/common/client_server.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"common/client_server.h\"\n#include \"common/config.h\"\n\n#include <QDir>\n#include <QLoggingCategory>\n#include <QString>\n#include <QtGlobal>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.client_server\")\n\n} // namespace\n\nQString clipboardServerName(const QString &sessionName)\n{\n    const QString appName =\n        sessionName.isEmpty()\n        ? QStringLiteral(\"copyq\")\n        : QStringLiteral(\"copyq-%1\").arg(sessionName);\n\n#ifdef Q_OS_UNIX\n    const QString socketPath = settingsDirectoryPath();\n    if ( !QDir(socketPath).mkpath(QStringLiteral(\".\")) )\n        qCCritical(logCategory) << \"Failed to create the settings directory:\" << socketPath;\n\n    // On Unix, files for local socket are created in temporary path which can be\n    // overridden by environment variable. This can lead to having multiple\n    // instances that can write simultaneously to same settings and data files.\n    // It's ugly but creating socket files in settings directory should fix this.\n    return QStringLiteral(\"%1/.%2_s\").arg(socketPath, appName);\n#else\n    return QStringLiteral(\"%1_%2_s\").arg(appName, qgetenv(\"USERNAME\"));\n#endif\n}\n"
  },
  {
    "path": "src/common/client_server.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QString;\n\nQString clipboardServerName(const QString &sessionName);\n"
  },
  {
    "path": "src/common/clientsocket.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clientsocket.h\"\n\n#include \"common/client_server.h\"\n#include \"common/log.h\"\n#include \"common/sleeptimer.h\"\n\n#include <QDataStream>\n\n#define SOCKET_LOG(text) \\\n    COPYQ_LOG_VERBOSE( QString(\"Socket %1: %2\").arg(m_socketId).arg(text) )\n\nnamespace {\n\nClientSocketId lastSocketId = 0;\n\nconst quint32 protocolMagicNumber = 0x0C090701;\nconst quint32 protocolVersion = 1;\n\ntemplate <typename T>\nint doStreamDataSize(T value)\n{\n    QByteArray bytes;\n    {\n        QDataStream dataStream(&bytes, QIODevice::WriteOnly);\n        dataStream.setVersion(QDataStream::Qt_5_0);\n        dataStream << value;\n    }\n    return bytes.length();\n}\n\ntemplate <typename T>\nint streamDataSize(T value)\n{\n    static int size = doStreamDataSize<T>(value);\n    return size;\n}\n\nint headerDataSize()\n{\n    QByteArray bytes;\n    {\n        QDataStream dataStream(&bytes, QIODevice::WriteOnly);\n        dataStream.setVersion(QDataStream::Qt_5_0);\n        dataStream << protocolMagicNumber << protocolVersion;\n    }\n    return bytes.length();\n}\n\ntemplate <typename T>\nbool readValue(T *value, QByteArray *message)\n{\n    QDataStream stream(*message);\n    stream.setVersion(QDataStream::Qt_5_0);\n    stream >> *value;\n    message->remove(0, streamDataSize(*value));\n    return stream.status() == QDataStream::Ok;\n}\n\nbool writeMessage(QLocalSocket *socket, const QByteArray &msg)\n{\n    COPYQ_LOG_VERBOSE( QString(\"Write message (%1 bytes).\").arg(msg.size()) );\n\n    QDataStream out(socket);\n    out.setVersion(QDataStream::Qt_5_0);\n    // length is serialized as a quint32, followed by msg\n    const auto length = static_cast<quint32>(msg.length());\n    out << protocolMagicNumber << protocolVersion;\n    out.writeBytes( msg.constData(), length );\n\n    if (out.status() != QDataStream::Ok) {\n        COPYQ_LOG(\"Cannot write message!\");\n        return false;\n    }\n\n    COPYQ_LOG_VERBOSE(\"Message written.\");\n    return true;\n}\n\n} //namespace\n\nLocalSocketGuard::LocalSocketGuard(QLocalSocket *socket)\n    : m_socket(socket)\n{\n}\n\nLocalSocketGuard::~LocalSocketGuard()\n{\n    if (m_socket) {\n        if (m_socket->state() == QLocalSocket::UnconnectedState)\n            m_socket->deleteLater();\n        else\n            m_socket->disconnectFromServer();\n    }\n}\n\nClientSocket::ClientSocket()\n    : QObject()\n    , m_socket(nullptr)\n    , m_socketId(++lastSocketId)\n    , m_closed(true)\n{\n}\n\nClientSocket::ClientSocket(const QString &serverName, QObject *parent)\n    : QObject(parent)\n    , m_socket(new QLocalSocket)\n    , m_socketId(++lastSocketId)\n    , m_closed(false)\n{\n    m_socket->connectToServer(serverName);\n\n    // Try to connect again in case the server just started.\n    if ( m_socket->state() == QLocalSocket::UnconnectedState ) {\n        COPYQ_LOG(\"Waiting for server to start\");\n\n        bool ok;\n        int waitMs = qEnvironmentVariableIntValue(\"COPYQ_WAIT_FOR_SERVER_MS\", &ok);\n        if (!ok)\n            waitMs = 1000;\n\n        SleepTimer t(waitMs);\n        do {\n            m_socket->connectToServer(serverName);\n        } while ( m_socket->state() == QLocalSocket::UnconnectedState && t.sleep() );\n    }\n}\n\nClientSocket::ClientSocket(QLocalSocket *socket, QObject *parent)\n    : QObject(parent)\n    , m_socket(socket)\n    , m_socketId(++lastSocketId)\n    , m_closed(false)\n{\n}\n\nClientSocket::~ClientSocket()\n{\n    SOCKET_LOG(\"Destroying socket.\");\n    close();\n}\n\nbool ClientSocket::start()\n{\n    if ( !m_socket || !m_socket->waitForConnected(4000) )\n    {\n        emit connectionFailed(id());\n        return false;\n    }\n\n    SOCKET_LOG(\"Creating socket.\");\n\n    connect( m_socket.get(), &QLocalSocket::stateChanged,\n             this, &ClientSocket::onStateChanged );\n    connect( m_socket.get(), &QLocalSocket::errorOccurred,\n             this, &ClientSocket::onError );\n    connect( m_socket.get(), &QLocalSocket::readyRead,\n             this, &ClientSocket::onReadyRead );\n\n    onStateChanged(m_socket->state());\n\n    onReadyRead();\n\n    return true;\n}\n\nvoid ClientSocket::sendMessage(const QByteArray &message, int messageCode)\n{\n    SOCKET_LOG( QString(\"Sending message to client (exit code: %1).\").arg(messageCode) );\n\n    if (!m_socket) {\n        SOCKET_LOG(\"Cannot send message to client. Socket is already deleted.\");\n    } else if (m_closed) {\n        SOCKET_LOG(\"Client disconnected!\");\n    } else {\n        QByteArray msg;\n        QDataStream out(&msg, QIODevice::WriteOnly);\n        out.setVersion(QDataStream::Qt_5_0);\n        out << static_cast<qint32>(messageCode);\n        out.writeRawData( message.constData(), message.length() );\n        if ( writeMessage(m_socket, msg) ) {\n            m_socket->flush();\n            SOCKET_LOG(\"Message sent to client.\");\n        } else {\n            SOCKET_LOG(\"Failed to send message to client!\");\n        }\n    }\n}\n\nvoid ClientSocket::close()\n{\n    if (m_socket) {\n        SOCKET_LOG(\"Disconnecting socket.\");\n        m_socket->disconnectFromServer();\n    }\n}\n\nvoid ClientSocket::onReadyRead()\n{\n    if (!m_socket) {\n        SOCKET_LOG(\"Cannot read message from client. Socket is already deleted.\");\n        return;\n    }\n\n    const qint64 available = m_socket->bytesAvailable();\n    m_message.append( m_socket->read(available) );\n\n    while ( !m_message.isEmpty() ) {\n        if (!m_hasMessageLength) {\n            const int preambleSize = headerDataSize() + streamDataSize(m_messageLength);\n            if ( m_message.length() < preambleSize )\n                break;\n\n            {\n                QDataStream stream(m_message);\n                stream.setVersion(QDataStream::Qt_5_0);\n                quint32 magicNumber;\n                quint32 version;\n                stream >> magicNumber >> version >> m_messageLength;\n                if ( stream.status() != QDataStream::Ok ) {\n                    error(\"Failed to read message length from client!\");\n                    return;\n                }\n\n                if (magicNumber != protocolMagicNumber) {\n                    error(\"Unexpected message magic number from client!\");\n                    return;\n                }\n\n                if (version != protocolVersion) {\n                    error(\"Unexpected message version from client!\");\n                    return;\n                }\n            }\n\n            m_message.remove(0, preambleSize);\n            m_hasMessageLength = true;\n        }\n\n        const auto length = static_cast<int>(m_messageLength);\n        if ( m_message.length() < length )\n            break;\n\n        QByteArray msg = m_message.mid(0, length);\n        qint32 messageCode;\n\n        if ( !readValue(&messageCode, &msg) ) {\n            error(\"Failed to read message code from client!\");\n            return;\n        }\n\n        m_hasMessageLength = false;\n        m_message = m_message.mid(length);\n\n        emit messageReceived(msg, messageCode, id());\n    }\n}\n\nvoid ClientSocket::onError(QLocalSocket::LocalSocketError error)\n{\n    if (error == QLocalSocket::SocketTimeoutError)\n        return;\n\n    if (error == QLocalSocket::PeerClosedError\n        || (error == QLocalSocket::ConnectionError\n            && m_socket->errorString().startsWith(\"QLocalSocketPrivate::completeAsyncRead\")) )\n    {\n        SOCKET_LOG(\"Disconnected from client.\");\n    } else {\n        log( m_socket->errorString(), LogError );\n    }\n\n    onStateChanged(QLocalSocket::UnconnectedState);\n}\n\nvoid ClientSocket::onStateChanged(QLocalSocket::LocalSocketState state)\n{\n    if (!m_closed) {\n        m_closed = state == QLocalSocket::UnconnectedState;\n        if (m_closed) {\n            if (m_hasMessageLength)\n                log(\"ERROR: Socket disconnected before receiving message\", LogError);\n\n            emit disconnected(id());\n        }\n    }\n}\n\nvoid ClientSocket::error(const QString &errorMessage)\n{\n    log(errorMessage, LogError);\n    if (m_socket)\n        m_socket->abort();\n    onStateChanged(QLocalSocket::UnconnectedState);\n}\n"
  },
  {
    "path": "src/common/clientsocket.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QLocalSocket>\n#include <QObject>\n#include <QPointer>\n\nusing ClientSocketId = qulonglong;\n\nclass LocalSocketGuard final\n{\npublic:\n    explicit LocalSocketGuard(QLocalSocket *socket);\n    ~LocalSocketGuard();\n\n    QLocalSocket *get() const { return m_socket; }\n    QLocalSocket *operator->() const { return m_socket; }\n    operator QLocalSocket*() { return m_socket; }\n    operator bool() { return !m_socket.isNull(); }\n\n    LocalSocketGuard(const LocalSocketGuard &) = delete;\n    LocalSocketGuard &operator=(const LocalSocketGuard &) = delete;\n\nprivate:\n    QPointer<QLocalSocket> m_socket;\n};\n\nclass ClientSocket final : public QObject\n{\n    Q_OBJECT\npublic:\n    ClientSocket();\n\n    explicit ClientSocket(const QString &serverName, QObject *parent = nullptr);\n\n    explicit ClientSocket(QLocalSocket *socket, QObject *parent = nullptr);\n\n    ~ClientSocket();\n\n    /// Return socket ID unique in process (thread-safe).\n    ClientSocketId id() const { return m_socketId; }\n\n    /// Start emitting messageReceived().\n    bool start();\n\n    /** Send message to client. */\n    void sendMessage(\n            const QByteArray &message, //!< Message for client.\n            int messageCode //!< Custom message code.\n            );\n\n    void close();\n\nsignals:\n    void messageReceived(const QByteArray &message, int messageCode, ClientSocketId clientId);\n    void disconnected(ClientSocketId clientId);\n    void connectionFailed(ClientSocketId clientId);\n\nprivate:\n    void onReadyRead();\n    void onError(QLocalSocket::LocalSocketError error);\n    void onStateChanged(QLocalSocket::LocalSocketState state);\n\n    void error(const QString &errorMessage);\n\n    LocalSocketGuard m_socket;\n    ClientSocketId m_socketId;\n    bool m_closed;\n\n    bool m_hasMessageLength = false;\n    quint32 m_messageLength = 0;\n    QByteArray m_message;\n};\n"
  },
  {
    "path": "src/common/clipboarddataguard.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#include \"common/clipboarddataguard.h\"\n#include \"common/common.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n\n#include <QImage>\n#include <QList>\n#include <QMimeData>\n#include <QObject>\n#include <QUrl>\n#include <QCoreApplication>\n\nnamespace {\n\nint clipboardCopyTimeoutMs()\n{\n    static bool ok = false;\n    static int ms = qEnvironmentVariableIntValue(\"COPYQ_CLIPBOARD_COPY_TIMEOUT_MS\", &ok);\n    return ok ? ms : 5000;\n}\n\nconst QMimeData *dummyMimeData()\n{\n    static QMimeData mimeData;\n    return &mimeData;\n}\n\nclass ElapsedGuard {\npublic:\n    explicit ElapsedGuard(const QString &type, const QString &format)\n        : m_type(type)\n        , m_format(format)\n    {\n        COPYQ_LOG_VERBOSE( QStringLiteral(\"Accessing [%1:%2]\").arg(type, format) );\n        m_elapsed.start();\n    }\n\n    ~ElapsedGuard()\n    {\n        const auto t = m_elapsed.elapsed();\n        if (t > 500)\n            log( QStringLiteral(\"ELAPSED %1 ms accessing [%2:%3]\").arg(t).arg(m_type, m_format), LogWarning );\n    }\nprivate:\n    QString m_type;\n    QString m_format;\n    QElapsedTimer m_elapsed;\n};\n\n} //namespace\n\nClipboardDataGuard::ClipboardDataGuard(const QMimeData *data, const long int *clipboardSequenceNumber)\n    : m_data(data)\n    , m_clipboardSequenceNumber(clipboardSequenceNumber)\n    , m_clipboardSequenceNumberOriginal(clipboardSequenceNumber ? *clipboardSequenceNumber : 0)\n{\n    // This uses simple connection to ensure pointer is not destroyed\n    // instead of QPointer to work around a possible Qt bug:\n    // - https://bugzilla.redhat.com/show_bug.cgi?id=2320093\n    // - https://bugzilla.redhat.com/show_bug.cgi?id=2326881\n    m_connection = QObject::connect(m_data, &QObject::destroyed, [this](){\n        m_data = nullptr;\n        log( QByteArrayLiteral(\"Aborting clipboard cloning: Data deleted\"), LogWarning );\n    });\n    m_timerExpire.start();\n}\n\nClipboardDataGuard::~ClipboardDataGuard()\n{\n    QObject::disconnect(m_connection);\n}\n\nQStringList ClipboardDataGuard::formats()\n{\n    ElapsedGuard _(QString(), QStringLiteral(\"formats\"));\n    return mimeData()->formats();\n}\n\nbool ClipboardDataGuard::hasFormat(const QString &mime)\n{\n    ElapsedGuard _(QStringLiteral(\"hasFormat\"), mime);\n    return mimeData()->hasFormat(mime);\n}\n\nQByteArray ClipboardDataGuard::data(const QString &mime)\n{\n    ElapsedGuard _(QStringLiteral(\"data\"), mime);\n    return mimeData()->data(mime);\n}\n\nQList<QUrl> ClipboardDataGuard::urls()\n{\n    ElapsedGuard _(QString(), QStringLiteral(\"urls\"));\n    return mimeData()->urls();\n}\n\nQString ClipboardDataGuard::text()\n{\n    ElapsedGuard _(QString(), QStringLiteral(\"text\"));\n    return mimeData()->text();\n}\n\nbool ClipboardDataGuard::hasText()\n{\n    ElapsedGuard _(QString(), QStringLiteral(\"hasText\"));\n    return mimeData()->hasText();\n}\n\nQImage ClipboardDataGuard::getImageData()\n{\n    ElapsedGuard _(QString(), QStringLiteral(\"imageData\"));\n\n    // NOTE: Application hangs if using multiple sessions and\n    //       calling QMimeData::hasImage() on X11 clipboard.\n    QImage image = mimeData()->imageData().value<QImage>();\n    if ( image.isNull() ) {\n        image.loadFromData( data(QStringLiteral(\"image/png\")), \"png\" );\n        if ( image.isNull() ) {\n            image.loadFromData( data(QStringLiteral(\"image/bmp\")), \"bmp\" );\n        }\n    }\n    COPYQ_LOG_VERBOSE(\n        QStringLiteral(\"Image is %1\")\n        .arg(image.isNull() ? QStringLiteral(\"invalid\") : QStringLiteral(\"valid\")) );\n    return image;\n}\n\nQByteArray ClipboardDataGuard::getUtf8Data(const QString &format)\n{\n    ElapsedGuard _(QStringLiteral(\"UTF8\"), format);\n\n    if (format == mimeUriList) {\n        QByteArray bytes;\n        for ( const auto &url : urls() ) {\n            if ( !bytes.isEmpty() )\n                bytes += '\\n';\n            bytes += url.toString().toUtf8();\n        }\n        return bytes;\n    }\n\n    if ( format == mimeText && !hasFormat(mimeText) )\n        return text().toUtf8();\n\n    if ( format.startsWith(QLatin1String(\"text/\")) )\n        return dataToText( data(format), format ).toUtf8();\n\n    return data(format);\n}\n\nbool ClipboardDataGuard::isExpired() {\n    if (!m_data)\n        return true;\n\n    if (m_clipboardSequenceNumber && *m_clipboardSequenceNumber != m_clipboardSequenceNumberOriginal) {\n        m_data = nullptr;\n        log( QByteArrayLiteral(\"Aborting clipboard cloning: Clipboard changed again\"), LogWarning );\n        return true;\n    }\n\n    if (m_timerExpire.elapsed() > clipboardCopyTimeoutMs()) {\n        m_data = nullptr;\n        log( QByteArrayLiteral(\"Aborting clipboard cloning: Data access took too long\"), LogWarning );\n        return true;\n    }\n\n    return false;\n}\n\nconst QMimeData *ClipboardDataGuard::mimeData()\n{\n    if (isExpired())\n        return dummyMimeData();\n\n    if (m_timerExpire.elapsed() > 100) {\n        QCoreApplication::processEvents();\n        if (isExpired())\n            return dummyMimeData();\n    }\n\n    return m_data;\n}\n"
  },
  {
    "path": "src/common/clipboarddataguard.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QElapsedTimer>\n#include <QtContainerFwd>\n#include <QMetaType>\n\nclass QMimeData;\nclass QImage;\nclass QUrl;\n\n// Avoids accessing old clipboard/drag'n'drop data.\nclass ClipboardDataGuard final {\npublic:\n    explicit ClipboardDataGuard(\n        const QMimeData *data,\n        const long int *clipboardSequenceNumber = nullptr);\n\n    ~ClipboardDataGuard();\n\n    QStringList formats();\n    bool hasFormat(const QString &mime);\n\n    QByteArray data(const QString &mime);\n\n    QList<QUrl> urls();\n    QString text();\n    bool hasText();\n    QImage getImageData();\n    QByteArray getUtf8Data(const QString &format);\n    bool isExpired();\n    const QMimeData *mimeData();\n\nprivate:\n    const QMimeData *m_data;\n    QElapsedTimer m_timerExpire;\n    const long int *m_clipboardSequenceNumber;\n    long int m_clipboardSequenceNumberOriginal;\n    QMetaObject::Connection m_connection;\n};\n"
  },
  {
    "path": "src/common/clipboardmode.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nenum class ClipboardMode {\n    Clipboard,\n    Selection,\n};\n"
  },
  {
    "path": "src/common/command.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"command.h\"\n\n#include <QDataStream>\n#include <QLocale>\n\nbool Command::operator==(const Command &other) const\n{\n    return name == other.name\n        && re == other.re\n        && wndre == other.wndre\n        && matchCmd == other.matchCmd\n        && cmd == other.cmd\n        && sep == other.sep\n        && input == other.input\n        && output == other.output\n        && wait == other.wait\n        && automatic == other.automatic\n        && display == other.display\n        && inMenu == other.inMenu\n        && isGlobalShortcut == other.isGlobalShortcut\n        && isScript == other.isScript\n        && transform == other.transform\n        && remove == other.remove\n        && hideWindow == other.hideWindow\n        && enable == other.enable\n        && icon == other.icon\n        && shortcuts == other.shortcuts\n        && globalShortcuts == other.globalShortcuts\n        && tab == other.tab\n        && outputTab == other.outputTab\n        && internalId == other.internalId\n        && nameLocalization == other.nameLocalization;\n}\n\nbool Command::operator!=(const Command &other) const {\n    return !(*this == other);\n}\n\nint Command::type() const\n{\n    auto type =\n           (automatic ? CommandType::Automatic : 0)\n         | (display ? CommandType::Display : 0)\n         | (isGlobalShortcut ? CommandType::GlobalShortcut : 0)\n         | (inMenu && !name.isEmpty() ? CommandType::Menu : 0);\n\n    // Scripts cannot be used in other types of commands.\n    if (isScript)\n        type = CommandType::Script;\n\n    if (type == CommandType::None)\n        type = CommandType::Invalid;\n\n    if (!enable)\n        type |= CommandType::Disabled;\n\n    return type;\n}\n\nQString Command::localizedName() const\n{\n    static const QLocale locale;\n    static const QString code1 = locale.name();\n    static const int i = code1.indexOf('_');\n    static const QString code2 = i == -1 ? QString() : code1.mid(0, i);\n\n    const auto value = nameLocalization.value(code1);\n    if (!value.isEmpty())\n        return value;\n\n    if (code2.isEmpty())\n        return name;\n\n    return nameLocalization.value(code2, name);\n}\n\nQDataStream &operator<<(QDataStream &out, const Command &command)\n{\n    out << command.name\n        << command.re\n        << command.wndre\n        << command.matchCmd\n        << command.cmd\n        << command.sep\n        << command.input\n        << command.output\n        << command.wait\n        << command.automatic\n        << command.display\n        << command.inMenu\n        << command.isGlobalShortcut\n        << command.isScript\n        << command.transform\n        << command.remove\n        << command.hideWindow\n        << command.enable\n        << command.icon\n        << command.shortcuts\n        << command.globalShortcuts\n        << command.tab\n        << command.outputTab\n        << command.internalId\n        << command.nameLocalization;\n    Q_ASSERT(out.status() == QDataStream::Ok);\n    return out;\n}\n\nQDataStream &operator>>(QDataStream &in, Command &command)\n{\n    in >> command.name\n       >> command.re\n       >> command.wndre\n       >> command.matchCmd\n       >> command.cmd\n       >> command.sep\n       >> command.input\n       >> command.output\n       >> command.wait\n       >> command.automatic\n       >> command.display\n       >> command.inMenu\n       >> command.isGlobalShortcut\n       >> command.isScript\n       >> command.transform\n       >> command.remove\n       >> command.hideWindow\n       >> command.enable\n       >> command.icon\n       >> command.shortcuts\n       >> command.globalShortcuts\n       >> command.tab\n       >> command.outputTab\n       >> command.internalId\n       >> command.nameLocalization;\n    Q_ASSERT(in.status() == QDataStream::Ok);\n    return in;\n}\n"
  },
  {
    "path": "src/common/command.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QMap>\n#include <QString>\n#include <QStringList>\n#include <QRegularExpression>\n\nnamespace CommandType {\nenum CommandType {\n    None = 0,\n    Invalid = 1,\n    Automatic = 1 << 1,\n    GlobalShortcut = 1 << 2,\n    Menu = 1 << 3,\n    Script = 1 << 4,\n    Display = 1 << 5,\n    Disabled = 1 << 6\n};\n} // namespace CommandType\n\n/**\n * Command for matched items.\n *\n * Executes an command for matched items.\n * Possible commands are (can be combined):\n * * execute program,\n * * copy item to other tab or\n * * don't add new item to list.\n */\nstruct Command {\n    bool operator==(const Command &other) const;\n\n    bool operator!=(const Command &other) const;\n\n    int type() const;\n\n    QString localizedName() const;\n\n    /** Name or short description. Used for menu item. */\n    QString name;\n\n    /** Regular expression to match items (empty matches all). */\n    QRegularExpression re;\n\n    /** Regular expression to match window titles (empty matches all). */\n    QRegularExpression wndre;\n\n    /**\n     * Program to execute to match items.\n     * Contains space separated list of arguments.\n     * Item is passed to stdin of the program.\n     */\n    QString matchCmd;\n\n    /**\n     * Program to execute on matched items.\n     * Contains space separated list of arguments.\n     * Argument %1 stands for item text.\n     */\n    QString cmd;\n\n    /** Separator for output items. */\n    QString sep;\n\n    /**\n     *  If not empty send item text to program's standard input.\n     *  Also match only items with this format (match all if empty).\n     */\n    QString input;\n\n    /** MIME for new items created from program's stdout. */\n    QString output;\n\n    /** Open action dialog before executing program. */\n    bool wait = false;\n\n    /** If true run command automatically on new matched items. */\n    bool automatic = false;\n\n    /** If true, run command automatically when displaying matched items. */\n    bool display = false;\n\n    /** If true show command in context menu on matching items. */\n    bool inMenu = false;\n\n    /** If true command can be triggered by global shortcut. */\n    bool isGlobalShortcut = false;\n\n    /** If true, overrides scripting functionality. */\n    bool isScript = false;\n\n    /** If true change item data, don't create any new items. */\n    bool transform = false;\n\n    /** If true remove matched items. */\n    bool remove = false;\n\n    /** If true close window after command is activated from menu. */\n    bool hideWindow = false;\n\n    /** If false command is disabled and should not be used. */\n    bool enable = true;\n\n    /** Icon for menu item. */\n    QString icon;\n\n    /** Shortcut for menu item. */\n    QStringList shortcuts;\n\n    /** Global/system shortcut. */\n    QStringList globalShortcuts;\n\n    /** Copy item to other tab (automatically on new matched item). */\n    QString tab;\n\n    /** Tab for output items. */\n    QString outputTab;\n\n    QString internalId;\n\n    QMap<QString, QString> nameLocalization;\n};\n\nQDataStream &operator<<(QDataStream &out, const Command &command);\n\nQDataStream &operator>>(QDataStream &in, Command &command);\n\nnamespace Private {\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nconstexpr bool testCommandMetaType()\n{\n    return QTypeTraits::has_stream_operator_v<QDataStream, Command>;\n}\nconstexpr const bool testCommandMetaTypeOk = testCommandMetaType();\nstatic_assert(testCommandMetaTypeOk, \"\");\n#endif\n}\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nQ_DECLARE_METATYPE(Command)\n#endif\n"
  },
  {
    "path": "src/common/commandstatus.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n/** Command status. */\nenum CommandStatus {\n    /** Script finished */\n    CommandFinished = 0,\n    /** Script finished with exit code 1 (fail() was called) */\n    CommandError = 1,\n    /** Bad command syntax */\n    CommandBadSyntax = 2,\n    /** Exception thrown */\n    CommandException = 4,\n\n    /** Print on stdout */\n    CommandPrint = 5,\n\n    CommandFunctionCall = 8,\n    CommandFunctionCallReturnValue = 9,\n\n    CommandStop = 10,\n\n    CommandInputDialogFinished = 11,\n\n    CommandData = 12,\n\n    CommandReceiveData = 13,\n\n    CommandFunctionCallPriority = 14,\n};\n"
  },
  {
    "path": "src/common/commandstore.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandstore.h\"\n\n#include \"common/command.h\"\n#include \"common/common.h\"\n#include \"common/config.h\"\n#include \"common/mimetypes.h\"\n#include \"common/settings.h\"\n#include \"common/temporarysettings.h\"\n#include \"common/textdata.h\"\n\n#include <QSettings>\n#include <QString>\n\nnamespace {\n\nconst QLatin1String falseString(\"false\");\nconst QLatin1String trueString(\"true\");\nconst QRegularExpression nameLocalizationRe(R\"(^Name(?:_(.*))?$)\");\n\nvoid normalizeLineBreaks(QString &cmd)\n{\n    if (cmd.startsWith(\"\\n    \")) {\n        cmd.remove(0, 5);\n        cmd.replace(\"\\n    \", \"\\n\");\n    } else if (cmd.startsWith(\"\\r\\n    \")) {\n        cmd.remove(0, 6);\n        cmd.replace(\"\\r\\n    \", \"\\n\");\n    }\n}\n\nvoid loadCommand(const QSettings &settings, Commands *commands)\n{\n    Command c;\n\n    for (auto &&key : settings.childKeys()) {\n        if (key == QLatin1String(\"Enable\")) {\n            c.enable = settings.value(key).toBool();\n        } else if (auto match = nameLocalizationRe.match(key); match.hasMatch()) {\n            const QString languageCode = match.captured(1);\n            const QString value = settings.value(key).toString();\n            if (languageCode.isEmpty())\n                c.name = value;\n            else\n                c.nameLocalization[languageCode] = value;\n        } else if (key == QLatin1String(\"Match\")) {\n            c.re = QRegularExpression( settings.value(key).toString() );\n        } else if (key == QLatin1String(\"Window\")) {\n            c.wndre = QRegularExpression( settings.value(key).toString() );\n        } else if (key == QLatin1String(\"MatchCommand\")) {\n            c.matchCmd = settings.value(key).toString();\n        } else if (key == QLatin1String(\"Command\")) {\n            c.cmd = settings.value(key).toString();\n        } else if (key == QLatin1String(\"Separator\")) {\n            c.sep = settings.value(key).toString();\n        } else if (key == QLatin1String(\"Input\")) {\n            c.input = settings.value(key).toString();\n            if (c.input == falseString || c.input == trueString)\n                c.input = c.input == trueString ? mimeText : QLatin1String();\n        } else if (key == QLatin1String(\"Output\")) {\n            c.output = settings.value(key).toString();\n            if (c.output == falseString || c.output == trueString)\n                c.output = c.output == trueString ? mimeText : QLatin1String();\n        } else if (key == QLatin1String(\"Wait\")) {\n            c.wait = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"Automatic\")) {\n            c.automatic = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"Display\")) {\n            c.display = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"Transform\")) {\n            c.transform = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"HideWindow\")) {\n            c.hideWindow = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"Icon\")) {\n            c.icon = settings.value(key).toString();\n        } else if (key == QLatin1String(\"Shortcut\")) {\n            c.shortcuts = settings.value(key).toStringList();\n        } else if (key == QLatin1String(\"GlobalShortcut\")) {\n            c.globalShortcuts = settings.value(key).toStringList();\n        } else if (key == QLatin1String(\"Tab\")) {\n            c.tab = settings.value(key).toString();\n        } else if (key == QLatin1String(\"OutputTab\")) {\n            c.outputTab = settings.value(key).toString();\n        } else if (key == QLatin1String(\"InternalId\")) {\n            c.internalId = settings.value(key).toString();\n        } else if (key == QLatin1String(\"InMenu\")) {\n            c.inMenu = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"IsScript\")) {\n            c.isScript = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"IsGlobalShortcut\")) {\n            c.isGlobalShortcut = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"Remove\")) {\n            c.remove = settings.value(key).toBool();\n        } else if (key == QLatin1String(\"Ignore\")) {\n            if (settings.value(key).toBool())\n                c.remove = c.automatic = true;\n        }\n    }\n\n    commands->append(c);\n}\n\nvoid saveValue(const QString &key, const QRegularExpression &re, QSettings *settings)\n{\n    settings->setValue(key, re.pattern());\n}\n\nvoid saveValue(const QString &key, const QVariant &value, QSettings *settings)\n{\n    settings->setValue(key, value);\n}\n\n/// Save only modified command properties.\ntemplate <typename Member>\nvoid saveNewValue(const QString &key, const Command &command, const Member &member, QSettings *settings)\n{\n    if (command.*member != Command().*member)\n        saveValue(key, command.*member, settings);\n}\n\nvoid saveCommand(const Command &c, QSettings *settings)\n{\n    saveNewValue(QStringLiteral(\"Name\"), c, &Command::name, settings);\n    saveNewValue(QStringLiteral(\"Match\"), c, &Command::re, settings);\n    saveNewValue(QStringLiteral(\"Window\"), c, &Command::wndre, settings);\n    saveNewValue(QStringLiteral(\"MatchCommand\"), c, &Command::matchCmd, settings);\n    saveNewValue(QStringLiteral(\"Command\"), c, &Command::cmd, settings);\n    saveNewValue(QStringLiteral(\"Input\"), c, &Command::input, settings);\n    saveNewValue(QStringLiteral(\"Output\"), c, &Command::output, settings);\n\n    // Separator for new command is set to '\\n' for convenience.\n    // But this value shouldn't be saved if output format is not set.\n    if ( c.sep != QLatin1String(\"\\\\n\") || !c.output.isEmpty() )\n        saveNewValue(QStringLiteral(\"Separator\"), c, &Command::sep, settings);\n\n    saveNewValue(QStringLiteral(\"Wait\"), c, &Command::wait, settings);\n    saveNewValue(QStringLiteral(\"Automatic\"), c, &Command::automatic, settings);\n    saveNewValue(QStringLiteral(\"Display\"), c, &Command::display, settings);\n    saveNewValue(QStringLiteral(\"InMenu\"), c, &Command::inMenu, settings);\n    saveNewValue(QStringLiteral(\"IsGlobalShortcut\"), c, &Command::isGlobalShortcut, settings);\n    saveNewValue(QStringLiteral(\"IsScript\"), c, &Command::isScript, settings);\n    saveNewValue(QStringLiteral(\"Transform\"), c, &Command::transform, settings);\n    saveNewValue(QStringLiteral(\"Remove\"), c, &Command::remove, settings);\n    saveNewValue(QStringLiteral(\"HideWindow\"), c, &Command::hideWindow, settings);\n    saveNewValue(QStringLiteral(\"Enable\"), c, &Command::enable, settings);\n    saveNewValue(QStringLiteral(\"Icon\"), c, &Command::icon, settings);\n    saveNewValue(QStringLiteral(\"Shortcut\"), c, &Command::shortcuts, settings);\n    saveNewValue(QStringLiteral(\"GlobalShortcut\"), c, &Command::globalShortcuts, settings);\n    saveNewValue(QStringLiteral(\"Tab\"), c, &Command::tab, settings);\n    saveNewValue(QStringLiteral(\"OutputTab\"), c, &Command::outputTab, settings);\n    saveNewValue(QStringLiteral(\"InternalId\"), c, &Command::internalId, settings);\n\n    for (auto it = c.nameLocalization.constBegin(); it != c.nameLocalization.constEnd(); ++it) {\n        const auto key = QStringLiteral(\"Name_%1\").arg(it.key());\n        saveValue(key, it.value(), settings);\n    }\n}\n\nCommands importCommands(QSettings *settings)\n{\n    auto commands = loadCommands(settings);\n\n    for (auto &command : commands) {\n        normalizeLineBreaks(command.cmd);\n        normalizeLineBreaks(command.matchCmd);\n    }\n\n    return commands;\n}\n\n} // namespace\n\nCommands loadAllCommands()\n{\n    const QString commandConfigPath = getConfigurationFilePath(\"-commands.ini\");\n    return importCommandsFromFile(commandConfigPath);\n}\n\nvoid saveCommands(const Commands &commands)\n{\n    Settings settings(getConfigurationFilePath(\"-commands.ini\"));\n    saveCommands(commands, &settings);\n}\n\nCommands loadCommands(QSettings *settings)\n{\n    Commands commands;\n\n    const QStringList groups = settings->childGroups();\n\n    if ( groups.contains(\"Command\") ) {\n        settings->beginGroup(\"Command\");\n        loadCommand(*settings, &commands);\n        settings->endGroup();\n    }\n\n    const int size = settings->beginReadArray(\"Commands\");\n    // Allow undefined \"size\" for the array in settings.\n    if (size == 0) {\n        for (int i = 0; ; ++i) {\n            settings->setArrayIndex(i);\n            if ( settings->childKeys().isEmpty() )\n                break;\n            loadCommand(*settings, &commands);\n        }\n    } else {\n        for (int i = 0; i < size; ++i) {\n            settings->setArrayIndex(i);\n            loadCommand(*settings, &commands);\n        }\n    }\n\n    settings->endArray();\n\n    return commands;\n}\n\nvoid saveCommands(const Commands &commands, QSettings *settings)\n{\n    settings->remove(\"Commands\");\n    settings->remove(\"Command\");\n\n    if (commands.size() == 1) {\n        settings->beginGroup(\"Command\");\n        saveCommand(commands[0], settings);\n        settings->endGroup();\n    } else {\n        settings->beginWriteArray(\"Commands\");\n        int i = 0;\n        for (const auto &c : commands) {\n            settings->setArrayIndex(i++);\n            saveCommand(c, settings);\n        }\n        settings->endArray();\n    }\n}\n\nCommands importCommandsFromFile(const QString &filePath)\n{\n    QSettings commandsSettings(filePath, QSettings::IniFormat);\n    return importCommands(&commandsSettings);\n}\n\nCommands importCommandsFromText(const QString &commands)\n{\n    TemporarySettings temporarySettings(commands.toUtf8());\n    return importCommands( temporarySettings.settings() );\n}\n\nQString exportCommands(const Commands &commands)\n{\n    TemporarySettings temporarySettings({});\n    saveCommands( commands, temporarySettings.settings() );\n\n    // Replace ugly '\\n' with indented lines.\n    const QString data = getTextData( temporarySettings.content() );\n    QString commandData;\n    QRegularExpression re(R\"(^(\\d+\\\\)?(Command|MatchCommand)=\"?)\");\n\n    for (const auto &line : data.split('\\n')) {\n        const auto m = re.match(line);\n        if (m.hasMatch()) {\n            int i = m.capturedLength();\n            commandData.append(line.left(i));\n\n            const bool addQuotes = !commandData.endsWith('\"');\n            if (addQuotes)\n                commandData.append('\"');\n\n            commandData.append('\\n');\n            const QLatin1String indent(\"    \");\n            bool escape = false;\n\n            for (; i < line.size(); ++i) {\n                const QChar c = line[i];\n\n                if (escape) {\n                    escape = false;\n\n                    if (c == 'n') {\n                        commandData.append('\\n');\n                    } else {\n                        if ( commandData.endsWith('\\n') )\n                            commandData.append(indent);\n                        commandData.append('\\\\');\n                        commandData.append(c);\n                    }\n                } else if (c == '\\\\') {\n                    escape = !escape;\n                } else {\n                    if ( commandData.endsWith('\\n') )\n                        commandData.append(indent);\n                    commandData.append(c);\n                }\n            }\n\n            if (addQuotes)\n                commandData.append('\"');\n        } else {\n            commandData.append(line);\n        }\n\n        commandData.append('\\n');\n    }\n\n    return commandData.trimmed();\n}\n"
  },
  {
    "path": "src/common/commandstore.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QtContainerFwd>\n\nclass QSettings;\nstruct Command;\n\nusing Commands = QVector<Command>;\n\nCommands loadAllCommands();\nvoid saveCommands(const Commands &commands);\n\nCommands loadCommands(QSettings *settings);\nvoid saveCommands(const Commands &commands, QSettings *settings);\n\nCommands importCommandsFromFile(const QString &filePath);\nCommands importCommandsFromText(const QString &commands);\nQString exportCommands(const Commands &commands);\n"
  },
  {
    "path": "src/common/common.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"common/common.h\"\n\n#include \"common/clipboarddataguard.h\"\n#include \"common/display.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n\n#include <QApplication>\n#include <QBuffer>\n#include <QDropEvent>\n#include <QElapsedTimer>\n#include <QFont>\n#include <QFontMetrics>\n#include <QImage>\n#include <QImageWriter>\n#include <QKeyEvent>\n#include <QMimeData>\n#include <QMovie>\n#include <QObject>\n#include <QProcess>\n#include <QRegularExpression>\n#include <QThread>\n#include <QUrl>\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n#   include <QTextCodec>\nusing Encoding = QTextCodec*;\n#else\n#   include <QStringDecoder>\nusing Encoding = std::optional<QStringConverter::Encoding>;\n#endif\n\n#include <algorithm>\n#include <memory>\n\nnamespace {\n\nconst int maxElidedTextLineLength = 512;\n\nclass MimeData final : public QMimeData {\nprotected:\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    QVariant retrieveData(const QString &mimeType, QMetaType preferredType) const override\n#else\n    QVariant retrieveData(const QString &mimeType, QVariant::Type preferredType) const override\n#endif\n    {\n        COPYQ_LOG_VERBOSE( QStringLiteral(\"Providing \\\"%1\\\"\").arg(mimeType) );\n        return QMimeData::retrieveData(mimeType, preferredType);\n    }\n};\n\nQString getImageFormatFromMime(const QString &mime)\n{\n    static const QString imageMimePrefix = QStringLiteral(\"image/\");\n    return mime.startsWith(imageMimePrefix) ? mime.mid(imageMimePrefix.length()) : QString();\n}\n\n/**\n * Sometimes only Qt internal image data are available in clipboard,\n * so this tries to convert the image data (if available) to given format.\n */\nvoid cloneImageData(\n        const QImage &image, const QString &format,\n        const QString &mime, QVariantMap *dataMap)\n{\n    if (image.isNull())\n        return;\n\n    // Omit converting unsupported formats (takes too much time and still fails).\n    if ( !QImageWriter::supportedImageFormats().contains(format.toUtf8()) )\n        return;\n\n    QBuffer buffer;\n    bool saved = image.save(&buffer, format.toUtf8().constData());\n\n    COPYQ_LOG( QStringLiteral(\"Converting image to \\\"%1\\\" format: %2\")\n               .arg(format,\n                    saved ? QStringLiteral(\"Done\") : QStringLiteral(\"Failed\")) );\n\n    if (saved)\n        dataMap->insert(mime, buffer.buffer());\n}\n\n/**\n * Allow cloning images only with reasonable size.\n */\nbool canCloneImageData(const QImage &image)\n{\n    return !image.isNull()\n        && image.height() <= 4096\n        && image.width() <= 4096;\n}\n\nbool setImageData(\n    QByteArray &bytes, const char *imageFormat, const std::unique_ptr<QMimeData> &mimeData)\n{\n    // Omit converting animated images to static ones.\n    QBuffer buffer(&bytes);\n    const QMovie animatedImage(&buffer, imageFormat);\n    if ( animatedImage.frameCount() > 1 )\n        return false;\n\n    const QImage image = QImage::fromData(bytes, imageFormat);\n    if ( image.isNull() )\n        return false;\n\n    mimeData->setImageData(image);\n    return true;\n}\n\nbool setImageData(\n    const QVariantMap &data, const QString &mime, const char *imageFormat, const std::unique_ptr<QMimeData> &mimeData)\n{\n    QByteArray imageData = data.value(mime).toByteArray();\n    return !imageData.isEmpty()\n        && setImageData(imageData, imageFormat, mimeData);\n}\n\nEncoding encodingForName(const char *name)\n{\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    return QTextCodec::codecForName(name);\n#else\n    return QStringConverter::encodingForName(name);\n#endif\n}\n\nEncoding encodingForText(const QByteArray &bytes)\n{\n    // Guess unicode codec for text if BOM is missing.\n    if (bytes.size() >= 2 && bytes.size() % 2 == 0) {\n        if (bytes.size() >= 4 && bytes.size() % 4 == 0) {\n            if (bytes.at(0) == 0 && bytes.at(1) == 0)\n                return encodingForName(\"utf-32be\");\n            if (bytes.at(2) == 0 && bytes.at(3) == 0)\n                return encodingForName(\"utf-32le\");\n        }\n\n        if (bytes.at(0) == 0)\n            return encodingForName(\"utf-16be\");\n\n        if (bytes.at(1) == 0)\n            return encodingForName(\"utf-16le\");\n    }\n\n    return encodingForName(\"utf-8\");\n}\n\nbool findFormatsWithPrefix(bool hasPrefix, const QString &prefix, const QVariantMap &data)\n{\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        if ( it.key().startsWith(prefix) == hasPrefix )\n            return hasPrefix;\n    }\n\n    return !hasPrefix;\n}\n\nbool isBinaryImageFormat(const QString &format)\n{\n    return format.startsWith(QStringLiteral(\"image/\"))\n           && !format.contains(QStringLiteral(\"xml\"))\n           && !format.contains(QStringLiteral(\"svg\"));\n}\n\n} // namespace\n\nQVariantMap cloneData(ClipboardDataGuard &data, const QStringList &formats)\n{\n    QVariantMap newdata;\n\n    /*\n     Some apps provide images even when copying huge spreadsheet, this can\n     block those apps while generating and providing the data.\n\n     This code removes ignores any image data if text is available.\n\n     Images in SVG and other XML formats are expected to be relatively small\n     so these doesn't have to be ignored.\n     */\n    const bool skipBinaryImageFormats = formats.contains(mimeText) && data.hasText();\n\n    QStringList imageFormats;\n    for (const auto &mime : formats) {\n        if (isBinaryImageFormat(mime)) {\n            if (!skipBinaryImageFormats)\n                imageFormats.append(mime);\n        } else {\n            const QByteArray bytes = data.getUtf8Data(mime);\n            if ( bytes.isEmpty() )\n                imageFormats.append(mime);\n            else\n                newdata.insert(mime, bytes);\n        }\n    }\n\n    // Retrieve images last since this can take a while.\n    if ( !imageFormats.isEmpty() ) {\n        const QImage image = data.getImageData();\n        if ( canCloneImageData(image) ) {\n            for (const auto &mime : imageFormats) {\n                const QString format = getImageFormatFromMime(mime);\n                if ( !format.isEmpty() )\n                    cloneImageData(image, format, mime, &newdata);\n            }\n        }\n    }\n\n    if (data.isExpired())\n        return {};\n\n    // Drop duplicate UTF-8 text format.\n    if ( newdata.contains(mimeTextUtf8) && newdata[mimeTextUtf8] == newdata.value(mimeText) )\n        newdata.remove(mimeTextUtf8);\n\n    return newdata;\n}\n\nQVariantMap cloneData(const QMimeData *rawData, const QStringList &formats, const long int *clipboardSequenceNumber)\n{\n    ClipboardDataGuard data(rawData, clipboardSequenceNumber);\n    return cloneData(data, formats);\n}\n\nQVariantMap cloneData(const QMimeData *rawData)\n{\n    ClipboardDataGuard data(rawData);\n\n    static const QSet<QString> ignoredFormats({\n        mimeOwner,\n        mimeClipboardMode,\n        mimeCurrentTab,\n        mimeSelectedItems,\n        mimeCurrentItem,\n        mimeShortcut,\n        mimeOutputTab,\n    });\n\n    const QStringList availableFormats = data.formats();\n\n    QStringList formats;\n\n    bool skipBinaryImages = formats.contains(mimeText) && data.hasText();\n    if (!skipBinaryImages && availableFormats.contains(QStringLiteral(\"image/png\")) ) {\n        formats.append(QStringLiteral(\"image/png\"));\n        if ( availableFormats.contains(QStringLiteral(\"image/webp\")) )\n            formats.append(QStringLiteral(\"image/webp\"));\n        if ( availableFormats.contains(QStringLiteral(\"image/gif\")) )\n            formats.append(QStringLiteral(\"image/gif\"));\n        skipBinaryImages = true;\n    }\n\n    for (const auto &mime : availableFormats) {\n        // ignore uppercase mimetypes (e.g. UTF8_STRING, TARGETS, TIMESTAMP)\n        // and specific internal types\n        if ( mime.isEmpty() || !mime[0].isLower() || ignoredFormats.contains(mime) )\n            continue;\n\n        // ignore redundant image formats\n        if ( skipBinaryImages && isBinaryImageFormat(mime) )\n            continue;\n\n        formats.append(mime);\n    }\n\n    if ( !formats.contains(mimeText) ) {\n        const QString textPrefix(mimeText + QStringLiteral(\";\"));\n        const auto first = std::remove_if(\n            std::begin(formats), std::end(formats), [&](const QString &format){\n                return format.startsWith(textPrefix);\n            }\n        );\n        if (first != std::end(formats)) {\n            formats.erase(first, std::end(formats));\n            formats.append(mimeText);\n        }\n    }\n\n    return cloneData(data, formats);\n}\n\nQMimeData* createMimeData(const QVariantMap &data)\n{\n    std::unique_ptr<QMimeData> newClipboardData(new MimeData);\n\n    bool hasImage =\n        setImageData(data, QStringLiteral(\"image/png\"), \"png\", newClipboardData)\n        || setImageData(data, QStringLiteral(\"image/bmp\"), \"bmp\", newClipboardData)\n        || setImageData(data, QStringLiteral(\"application/x-qt-image\"), nullptr, newClipboardData)\n    ;\n\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        if ( it.key() == mimeClipboardMode )\n            continue;\n\n        QByteArray bytes = it.value().toByteArray();\n\n        newClipboardData->setData( it.key(), bytes );\n\n        if (!hasImage) {\n            const QString imageFormat = getImageFormatFromMime(it.key());\n            if ( !imageFormat.isEmpty()\n                && setImageData(bytes, imageFormat.toUtf8().constData(), newClipboardData) )\n            {\n                hasImage = true;\n            }\n        }\n    }\n\n    if ( !data.contains(mimeOwner) ) {\n        const auto owner = makeClipboardOwnerData();\n        if ( !owner.isEmpty() )\n            newClipboardData->setData( mimeOwner, owner );\n    }\n\n    return newClipboardData.release();\n}\n\nbool anySessionOwnsClipboardData(const QVariantMap &data)\n{\n    return data.contains(mimeOwner);\n}\n\nQString elideText(const QString &text, const QFont &font, const QString &format,\n                  bool escapeAmpersands, int maxWidthPixels, int maxLines)\n{\n    if ( text.isEmpty() )\n        return QString();\n\n    if (maxWidthPixels <= 0)\n        maxWidthPixels = smallIconSize() * 20;\n\n    QStringList lines = text.split('\\n');\n\n    int firstLine = -1;\n    int lastLine = -1;\n    int commonIndent = text.size();\n    static const QRegularExpression reNonSpace(\"\\\\S\");\n    for (int i = 0; i < lines.size(); ++i) {\n        const auto &line = lines[i];\n        const int lineIndent = line.indexOf(reNonSpace);\n        if (lineIndent == -1)\n            continue;\n\n        if (firstLine == -1)\n            firstLine = i;\n\n        lastLine = i;\n        if (lineIndent < commonIndent)\n            commonIndent = lineIndent;\n\n        if (firstLine - lastLine + 1 >= maxLines)\n            break;\n    }\n\n    if (lastLine == -1)\n        return QLatin1String(\"...\");\n\n    // If there are too many lines, append triple dot.\n    if (lastLine + 1 != lines.size())\n        lines[lastLine].append(\"...\");\n\n    lines = lines.mid(firstLine, lastLine - firstLine + 1);\n\n    QFontMetrics fm(font);\n    const int formatWidth = format.isEmpty() ? 0 : fm.horizontalAdvance(format.arg(QString()));\n\n    // Remove redundant spaces from single line text.\n    if (lines.size() == 1) {\n        lines[0] = lines[0].simplified();\n        commonIndent = 0;\n    }\n\n    // Remove common indentation each line and elide text if too long.\n    for (auto &line : lines) {\n        line = line.mid(commonIndent);\n\n        // Make eliding huge text faster.\n        if (line.size() > maxElidedTextLineLength)\n            line = line.left(maxElidedTextLineLength) + \"...\";\n\n        line = fm.elidedText(line, Qt::ElideMiddle, maxWidthPixels - formatWidth);\n    }\n\n    // If empty lines are at beginning, prepend triple dot.\n    if (firstLine != 0) {\n        if (lines.size() == 1)\n            lines.first().prepend(\"...\");\n        else\n            lines.prepend(\"...\");\n    }\n\n    QString result = lines.join(\"\\n\");\n\n    // Escape all ampersands.\n    if (escapeAmpersands)\n        result.replace( QLatin1Char('&'), QLatin1String(\"&&\") );\n\n    return format.isEmpty() ? result : format.arg(result);\n}\n\nQString textLabelForData(const QVariantMap &data, const QFont &font, const QString &format,\n                         bool escapeAmpersands, int maxWidthPixels, int maxLines)\n{\n    QString label;\n\n    const QString notes = data.value(mimeItemNotes).toString();\n\n    if ( data.contains(mimeHidden) || data.contains(mimeSecret) ) {\n        label = QObject::tr(\"<HIDDEN>\", \"Label for hidden/secret clipboard content\");\n    } else if ( data.contains(mimeText) || data.contains(mimeUriList) ) {\n        const QString text = getTextData(data);\n        const int n = text.count(QChar('\\n')) + 1;\n\n        if (n > 1)\n            label = QObject::tr(\"%1 (%n lines)\", \"Label for multi-line text in clipboard\", n);\n        else\n            label = QLatin1String(\"%1\");\n\n        if (!format.isEmpty())\n            label = format.arg(label);\n\n        const QString textWithNotes = notes.isEmpty() ? text : notes + \": \" + text;\n        return elideText(textWithNotes, font, label, escapeAmpersands, maxWidthPixels, maxLines);\n    } else if ( findFormatsWithPrefix(true, \"image/\", data) ) {\n        label = QObject::tr(\"<IMAGE>\", \"Label for image in clipboard\");\n    } else if ( data.contains(mimeItems) ) {\n        label = QObject::tr(\"<ITEMS>\", \"Label for copied items in clipboard\");\n    } else if ( findFormatsWithPrefix(false, COPYQ_MIME_PREFIX, data) ) {\n        label = QObject::tr(\"<EMPTY>\", \"Label for empty clipboard\");\n    } else {\n        label = QObject::tr(\"<DATA>\", \"Label for data in clipboard\");\n    }\n\n    if (!notes.isEmpty()) {\n        label = elideText(notes, font, QString(), escapeAmpersands, maxWidthPixels, maxLines)\n                + \": \" + label;\n    }\n\n    if (!format.isEmpty())\n        label = format.arg(label);\n\n    return label;\n}\n\nQString textLabelForData(const QVariantMap &data)\n{\n    return textLabelForData(data, QFont(), QString());\n}\n\nvoid renameToUnique(QString *name, const QStringList &names)\n{\n    const QString baseName = *name;\n    int i = 0;\n    while ( names.contains(*name) )\n        *name = baseName + \" (\" + QString::number(++i) + ')';\n}\n\nQString dataToText(const QByteArray &bytes, const QString &mime)\n{\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    auto codec = (mime == mimeHtml)\n            ? QTextCodec::codecForHtml(bytes, nullptr)\n            : QTextCodec::codecForUtfText(bytes, nullptr);\n\n    if (!codec)\n        codec = encodingForText(bytes);\n\n    return codec->toUnicode(bytes);\n#else\n    auto encoding = (mime == mimeHtml)\n            ? QStringConverter::encodingForHtml(bytes)\n            : QStringConverter::encodingForData(bytes);\n\n    if (!encoding)\n        encoding = encodingForText(bytes);\n\n    return QStringDecoder(*encoding).decode(bytes);\n#endif\n}\n\nbool isClipboardData(const QVariantMap &data)\n{\n    return data.value(mimeClipboardMode).toByteArray().isEmpty();\n}\n\nbool canDropToTab(const QDropEvent &event)\n{\n    const auto &data = *event.mimeData();\n    return data.hasFormat(mimeItems) || data.hasText() || data.hasImage() || data.hasUrls();\n}\n\nvoid acceptDrag(QDropEvent *event)\n{\n    // Default drop action in item list and tab bar/tree should be \"move.\"\n    if ( event->possibleActions().testFlag(Qt::MoveAction)\n         && event->mimeData()->hasFormat(mimeOwner)\n         && !event->keyboardModifiers().testFlag(Qt::ControlModifier)\n        )\n    {\n        event->setDropAction(Qt::MoveAction);\n        event->accept();\n    } else {\n        event->acceptProposedAction();\n    }\n}\n\nQByteArray makeClipboardOwnerData()\n{\n    static const QVariant owner = qApp->property(\"CopyQ_session_name\");\n    if ( !owner.isValid() )\n        return QByteArray();\n\n    static int id = 0;\n    return owner.toString().toUtf8() + \" \" + logLabel() + \"/\" + QByteArray::number(++id);\n}\n\nQString cloneText(const QMimeData &data)\n{\n    const auto text = dataToText( data.data(mimeText), mimeText );\n    return text.isEmpty() ? data.text() : text;\n}\n"
  },
  {
    "path": "src/common/common.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QtContainerFwd>\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n#include <QVariantMap>\n#endif\n\nclass ClipboardDataGuard;\nclass QByteArray;\nclass QDropEvent;\nclass QFont;\nclass QMimeData;\nclass QProcess;\nclass QString;\n\nQByteArray makeClipboardOwnerData();\n\n/** Clone data for given formats (text or HTML will be UTF8 encoded). */\nQVariantMap cloneData(ClipboardDataGuard &data, const QStringList &formats);\nQVariantMap cloneData(const QMimeData *data, const QStringList &formats, const long int *clipboardSequenceNumber = nullptr);\n\n/** Clone all data as is. */\nQVariantMap cloneData(const QMimeData *data);\n\nQString cloneText(const QMimeData &data);\n\nQMimeData* createMimeData(const QVariantMap &data);\n\n/** Return true if clipboard content was created by any session of this application. */\nbool anySessionOwnsClipboardData(const QVariantMap &data);\n\n/**\n * Elide text with given font or to maximum length\n *\n * @param text              text to shorten\n * @param format            optional format for result, e.g. \"-- %1 --\"\n * @param font              used to calculate ideal width if @a maxChars is zero or negative\n * @param escapeAmpersands  escape ampersands because only key hint can follow it\n * @param maxWidthPixels    maximum width of result text in pixels\n * @param maxLines          maximum number of lines\n *\n * @return shortened text (or same text if not too long)\n */\nQString elideText(const QString &text, const QFont &font,\n                  const QString &format, bool escapeAmpersands = false,\n                  int maxWidthPixels = -1, int maxLines = 1);\n\n/**\n * Show small label for data.\n *\n * @param data  data\n * @param font  font for label\n * @param format  optional format for result, e.g. \"-- %1 --\"\n * @param escapeAmpersands  escape ampersand characters for labes\n *          (unescaped ampersand is used for shortcut key in labels)\n * @param maxWidthPixels  maximum width in pixels\n * @param maxLines  maximum number of lines\n *\n * @return result text\n */\nQString textLabelForData(const QVariantMap &data, const QFont &font,\n                         const QString &format, bool escapeAmpersands = false,\n                         int maxWidthPixels = -1, int maxLines = 1);\n\nQString textLabelForData(const QVariantMap &data);\n\nvoid renameToUnique(QString *name, const QStringList &names);\n\nQString dataToText(const QByteArray &bytes, const QString &mime);\n\nbool isClipboardData(const QVariantMap &data);\n\n/**\n * Return true only if tabs can accept the drag'n'drop event.\n */\nbool canDropToTab(const QDropEvent &event);\n\n/**\n * Accept any proposed drop action, preferably \"move\" if items data available.\n */\nvoid acceptDrag(QDropEvent *event);\n"
  },
  {
    "path": "src/common/config.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"config.h\"\n\n#include <QApplication>\n#include <QByteArray>\n#include <QDir>\n#include <QLoggingCategory>\n#include <QSettings>\n#include <QString>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.config\")\n\nQString getConfigurationFilePathHelper()\n{\n    const QSettings settings(\n                QSettings::IniFormat, QSettings::UserScope,\n                QCoreApplication::organizationName(),\n                QCoreApplication::applicationName() );\n    return settings.fileName();\n}\n\n} // namespace\n\nbool ensureSettingsDirectoryExists()\n{\n    QDir settingsDir( settingsDirectoryPath() );\n    if ( !settingsDir.mkpath(QStringLiteral(\".\")) ) {\n        qCCritical(logCategory)\n            << \"Failed to create the directory for settings:\"\n            << settingsDir.path();\n        return false;\n    }\n\n    return true;\n}\n\nconst QString &getConfigurationFilePath()\n{\n    static const QString path = getConfigurationFilePathHelper();\n    return path;\n}\n\nQString getConfigurationFilePath(const char *suffix)\n{\n    QString path = getConfigurationFilePath();\n    // Replace suffix.\n    const int i = path.lastIndexOf(QLatin1Char('.'));\n    Q_ASSERT(i != -1);\n    Q_ASSERT( path.endsWith(QLatin1String(\".ini\")) );\n    return path.left(i) + QLatin1String(suffix);\n}\n\nconst QString &settingsDirectoryPath()\n{\n    static const QString path =\n        QDir::cleanPath( getConfigurationFilePath() + QLatin1String(\"/..\") );\n    return path;\n}\n"
  },
  {
    "path": "src/common/config.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\nclass QString;\n\nbool ensureSettingsDirectoryExists();\n\nconst QString &getConfigurationFilePath();\n\nQString getConfigurationFilePath(const char *suffix);\n\nconst QString &settingsDirectoryPath();\n"
  },
  {
    "path": "src/common/contenttype.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <Qt>\n\n/**\n * Enum values are used in ClipboardModel class to fetch or set data from ClipboardItem.\n * @see ClipboardModel:setData(), ClipboardModel::data()\n */\nnamespace contentType {\n\nenum {\n    /**\n     * Set/get data as QVarianMap (key is MIME type and value is QByteArray).\n     */\n    data = Qt::UserRole,\n\n    /**\n     * Update existing data. Clears non-internal data if passed data map contains non-internal data.\n     */\n    updateData,\n\n    /**\n     * Remove formats (QStringList of MIME types).\n     */\n    removeFormats,\n\n    text,\n    html,\n    notes,\n\n    /// Item color (string expression as used in themes).\n    color,\n\n    /// If true, hide content of item (not notes, tags etc.).\n    isHidden\n};\n\n}\n"
  },
  {
    "path": "src/common/display.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"display.h\"\n\n#include \"gui/screen.h\"\n\n#include <QApplication>\n#include <QPoint>\n#include <QScreen>\n#include <QStyle>\n#include <QWidget>\n#include <QWindow>\n\nnamespace {\n\nQScreen *screenForWidget(QWidget *w)\n{\n    if (w) {\n        if ( w->screen() )\n            return w->screen();\n\n        const int i = screenNumberAt(w->pos());\n        const auto screens = QGuiApplication::screens();\n        if (0 <= i && i < screens.size())\n            return screens[i];\n    }\n\n    return QGuiApplication::primaryScreen();\n}\n\n} // namespace\n\nint smallIconSize()\n{\n    return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);\n}\n\nQPoint toScreen(QPoint pos, QWidget *w)\n{\n    QWindow *window = w->windowHandle();\n    w->move(pos);\n\n    const QRect availableGeometry = screenAvailableGeometry(*w);\n    if ( !availableGeometry.isValid() )\n        return pos;\n\n    const QSize size = window ? window->size() : w->size();\n    return QPoint(\n                qMax(availableGeometry.left(), qMin(pos.x(), availableGeometry.right() - size.width())),\n                qMax(availableGeometry.top(), qMin(pos.y(), availableGeometry.bottom() - size.height()))\n                );\n}\n\nint pointsToPixels(int points, QWidget *w)\n{\n    QScreen *screen = screenForWidget(w);\n    return static_cast<int>(points * screen->physicalDotsPerInchX() / 72.0);\n}\n"
  },
  {
    "path": "src/common/display.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QPoint;\nclass QWidget;\n\nint smallIconSize();\n\nQPoint toScreen(QPoint pos, QWidget *w);\n\nint pointsToPixels(int points, QWidget *w = nullptr);\n"
  },
  {
    "path": "src/common/encryption.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"encryption.h\"\n#include \"common/config.h\"\n\n#ifdef WITH_QCA_ENCRYPTION\n\n#include <QCoreApplication>\n#include <QDataStream>\n#include <QDebug>\n#include <QDir>\n#include <QFile>\n#include <QFileInfo>\n#include <QCryptographicHash>\n#include <QLoggingCategory>\n#include <QMessageAuthenticationCode>\n#include <QPluginLoader>\n#include <QSaveFile>\n#include <QStandardPaths>\n#include <QTimer>\n#include <QtCrypto>\n\n#include <optional>\n#include <utility>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.encryption\")\n\n// Cipher specification for QCA::isSupported() check (full name with mode and padding)\nconst QLatin1String encryptionCipher(\"aes256-cbc-pkcs7\");\n// Algorithm name for QCA::Cipher constructor (without mode/padding)\nconst QLatin1String encryptionAlgorithm(\"aes256\");\nconst QByteArray encryptedDataMagic(\"CPQ1\");\nconstexpr int aes256KeySize = 32;\nconstexpr int aesBlockSize = 16;\nconstexpr int hmacTagSize = 32;\nconstexpr int perMessageSaltSize = 16;\nconstexpr int hkdfSha256HashLength = 32;\nconstexpr int hkdfSha256MaxLength = 255 * hkdfSha256HashLength;\nconstexpr int pbkdf2IterationCount = 100'000;\n\nQString dekFilePath() { return getConfigurationFilePath(\"wrapped_dek.dat\"); }\nQString saltFilePath() { return getConfigurationFilePath(\"kek_salt.dat\"); }\n\nvoid logFeatures()\n{\n    QStringList providerNames;\n    for (const auto *provider : QCA::providers()) {\n        providerNames << provider->name();\n    }\n    qCCritical(logCategory) << \"Available providers:\" << QCA::providers();\n    qCCritical(logCategory) << \"Supported features:\" << QCA::supportedFeatures().join(QLatin1String(\", \"));\n}\n\nbool initializeQCA()\n{\n    qCDebug(logCategory) << \"Initializing QCA\";\n\n#ifdef Q_OS_MACOS\n    // Disable automatic QCA plugin loading to prevent loading Homebrew plugins\n    // which would cause crashes due to ABI mismatches\n    qputenv(\"QCA_NO_PLUGINS\", \"1\");\n    qCDebug(logCategory) << \"Disabled automatic QCA plugin loading (QCA_NO_PLUGINS=1)\";\n#endif\n\n    // QCA Initializer - must be kept alive for the entire application\n    static auto qcaInit = new QCA::Initializer();\n    Q_UNUSED(qcaInit);\n\n#ifdef Q_OS_MACOS\n    // Manually load the bundled ossl plugin since we disabled automatic loading\n    const QString appDir = QCoreApplication::applicationDirPath();\n    const QString osslPluginPath = appDir + \"/../PlugIns/crypto/libqca-ossl.dylib\";\n\n    QPluginLoader pluginLoader(osslPluginPath);\n    if (!pluginLoader.load()) {\n        qCCritical(logCategory) << \"Failed to load bundled ossl plugin:\" << pluginLoader.errorString();\n        return false;\n    }\n\n    QObject *plugin = pluginLoader.instance();\n    if (!plugin) {\n        qCCritical(logCategory) << \"Failed to get plugin instance\";\n        return false;\n    }\n\n    QCAPlugin *qcaPlugin = qobject_cast<QCAPlugin*>(plugin);\n    if (!qcaPlugin) {\n        qCCritical(logCategory) << \"Plugin does not implement QCAPlugin interface\";\n        return false;\n    }\n\n    QCA::Provider *provider = qcaPlugin->createProvider();\n    if (!provider) {\n        qCCritical(logCategory) << \"Failed to create provider from plugin\";\n        return false;\n    }\n\n    if (!QCA::insertProvider(provider)) {\n        qCCritical(logCategory) << \"Failed to insert provider into QCA\";\n        delete provider;\n        return false;\n    }\n\n    qCDebug(logCategory) << \"Successfully loaded bundled ossl plugin:\" << provider->name();\n#endif\n\n    if ( !QCA::isSupported(encryptionCipher.data()) ) {\n        qCCritical(logCategory) << \"Cipher\" << encryptionCipher << \"not supported by QCA\";\n        logFeatures();\n        return false;\n    }\n\n    // Check if PBKDF2 with SHA1 is supported\n    // Note: We use SHA1 for PBKDF2 as it's widely supported and still secure for key derivation\n    // (SHA1 vulnerabilities don't apply to HMAC-based constructions like PBKDF2)\n    if ( !QCA::isSupported(\"pbkdf2(sha1)\") ) {\n        qCCritical(logCategory) << \"PBKDF2 with SHA1 not supported by QCA\";\n        logFeatures();\n        return false;\n    }\n\n    qCDebug(logCategory) << \"QCA encryption initialized with\" << encryptionCipher;\n    return true;\n}\n\nbool backupFile(const QString &fileName)\n{\n    QFile file(fileName);\n    if (!file.exists(fileName))\n        return true;\n\n    QFile backup(QStringLiteral(\"%1.backup\").arg(fileName));\n    if (backup.exists() && !backup.remove()) {\n        qCCritical(logCategory) << \"Failed to remove backup\" << backup.fileName()\n            << \"- error:\" << backup.errorString();\n        return false;\n    }\n\n    if (!file.copy(backup.fileName())) {\n        qCCritical(logCategory) << \"Failed to backup\" << fileName\n            << \"to\" << backup.fileName()\n            << \"- error:\" << file.errorString();\n        return false;\n    }\n\n    qCDebug(logCategory) << \"Back up created\" << backup.fileName();\n    return true;\n}\n\nbool restoreBackupFile(const QString &fileName)\n{\n    QFile backup(QStringLiteral(\"%1.backup\").arg(fileName));\n    if (!backup.exists())\n        return true;\n\n    if (!backup.isReadable()) {\n        qCCritical(logCategory) << \"Backup file is not readable\" << fileName;\n        return false;\n    }\n\n    QFile file(fileName);\n    if (file.exists() && !file.remove()) {\n        qCCritical(logCategory) << \"Failed to restore backup, cannot remove original\" << fileName\n            << \"- error:\" << file.errorString();\n        return false;\n    }\n\n    if (!backup.copy(fileName)) {\n        qCCritical(logCategory) << \"Failed to restore backup\" << backup.fileName()\n            << \"to\" << fileName\n            << \"- error:\" << backup.errorString();\n        return false;\n    }\n\n    qCDebug(logCategory) << \"Restored from backup\" << fileName;\n\n    if (!backup.remove()) {\n        qCCritical(logCategory) << \"Failed to remove restored backup\" << backup.fileName()\n            << \"- error:\" << backup.errorString();\n    }\n\n    return true;\n}\n\nbool removeBackup(const QString &fileName)\n{\n    QFile backup(QStringLiteral(\"%1.backup\").arg(fileName));\n    if (!backup.exists())\n        return true;\n\n    if (backup.remove()) {\n        qCDebug(logCategory) << \"Removed backup\" << backup.fileName();\n        return true;\n    }\n\n    qCCritical(logCategory) << \"Failed to remove backup\" << backup.fileName()\n        << \"- error:\" << backup.errorString();\n    return false;\n}\n\nbool backupEncryptionFiles()\n{\n    return backupFile(::dekFilePath())\n        && backupFile(::saltFilePath());\n}\n\nbool restoreEncryptionFiles()\n{\n    return restoreBackupFile(::dekFilePath())\n        && restoreBackupFile(::saltFilePath());\n}\n\nvoid removeEncryptionBackups()\n{\n    removeBackup(::dekFilePath());\n    removeBackup(::saltFilePath());\n}\n\nbool saveFile(const QString &fileName, const Encryption::SecureArray &data)\n{\n    QSaveFile file(fileName);\n    if (!file.open(QIODevice::WriteOnly)) {\n        qCCritical(logCategory)\n            << \"Failed to open for writing:\" << fileName\n            << \"- error:\" << file.errorString();\n        return false;\n    }\n\n    const Encryption::Cleared<QByteArray> bytes(data.toByteArray());\n    if (file.write(bytes.value()) != bytes.size()) {\n        qCCritical(logCategory)\n            << \"Failed to write\" << fileName\n            << \"- error:\" << file.errorString();\n        file.cancelWriting();\n        return false;\n    }\n\n    if (!file.commit()) {\n        qCCritical(logCategory)\n            << \"Failed to commit\" << fileName\n            << \"- error:\" << file.errorString();\n        return false;\n    }\n\n#ifndef Q_OS_WIN\n    // Set restrictive permissions on Unix systems\n    QFile storedFile(fileName);\n    if (!storedFile.setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner)) {\n        qCWarning(logCategory)\n            << \"Failed to restrict permissions\" << fileName\n            << \"- error:\" << storedFile.errorString();\n    }\n#endif\n\n    qCDebug(logCategory) << \"Saved\" << fileName;\n    return true;\n}\n\nbool canUseEncryptionKey(const char *operation, const QCA::SymmetricKey &key)\n{\n    if ( !QCA::isSupported(encryptionCipher.data()) ) {\n        qCCritical(logCategory) << operation << \"cipher not supported\";\n        return false;\n    }\n\n    if ( key.isEmpty() ) {\n        qCCritical(logCategory) << operation << \"DEK is empty\";\n        return false;\n    }\n\n    return true;\n}\n\nEncryption::SecureArray loadNonEmptySecureFile(const QString &path, const char *label)\n{\n    if (!QFileInfo::exists(path)) {\n        return {};\n    }\n\n    QFile file(path);\n    if (!file.open(QIODevice::ReadOnly)) {\n        qCCritical(logCategory)\n            << \"Failed to open\" << label << \"file\" << path\n            << \"- error:\" << file.errorString();\n        return {};\n    }\n\n    const Encryption::Cleared<QByteArray> data(file.readAll());\n    file.close();\n\n    if (data.isEmpty()) {\n        qCWarning(logCategory) << label << \"file is empty\";\n        return {};\n    }\n\n    qCDebug(logCategory) << label << \"loaded from settings directory:\" << path;\n    return Encryption::SecureArray(data.value());\n}\n\nQCA::SymmetricKey deriveFromPasswordAndSalt(\n    const Encryption::SecureArray &password, const Encryption::Salt &salt)\n{\n    if (password.isEmpty()) {\n        qCCritical(logCategory) << \"EncryptionKey: Cannot derive key from empty password\";\n        return {};\n    }\n\n    // Derive key from password using PBKDF2 with a fixed salt\n    // Using SHA1 as it's widely supported and still secure for PBKDF2\n    QCA::PBKDF2 pbkdf2(QStringLiteral(\"sha1\"));\n    QCA::SymmetricKey symKey =\n        pbkdf2.makeKey(password, salt, aes256KeySize, pbkdf2IterationCount);\n\n    if (symKey.isEmpty()) {\n        qCCritical(logCategory) << \"EncryptionKey: PBKDF2 key derivation failed\";\n        return {};\n    }\n\n    return QCA::SymmetricKey(std::move(symKey));\n}\n\nstd::optional<QCA::SecureArray> encrypt(\n    const char *label,\n    QCA::Direction direction,\n    const Encryption::SecureArray &data,\n    const QCA::SymmetricKey &key,\n    const QCA::InitializationVector &iv)\n{\n    QCA::Cipher cipher(\n        encryptionAlgorithm,\n        QCA::Cipher::CBC,\n        QCA::Cipher::DefaultPadding,\n        direction,\n        key,\n        iv\n    );\n\n    QCA::SecureArray encrypted = cipher.update(data);\n    if (!cipher.ok()) {\n        qCCritical(logCategory) << label << \"encryption failed\";\n        return std::nullopt;\n    }\n\n    encrypted += cipher.final();\n    if (!cipher.ok()) {\n        qCCritical(logCategory) << label << \"finalization failed\";\n        return std::nullopt;\n    }\n\n    if (direction == QCA::Encode) {\n        Encryption::SecureArray result(iv);\n        result.append(encrypted);\n        return QCA::SecureArray(result);\n    }\n\n    return encrypted;\n}\n\nbool constantTimeEquals(const QByteArray &left, const QByteArray &right)\n{\n    if (left.size() != right.size())\n        return false;\n\n    unsigned char diff = 0;\n    for (int i = 0; i < left.size(); ++i)\n        diff |= static_cast<unsigned char>(left[i]) ^ static_cast<unsigned char>(right[i]);\n\n    return diff == 0;\n}\n\nQByteArray hkdfExpandSha256SingleBlock(const QByteArray &prk, const QByteArray &info, int length)\n{\n    // HKDF-Expand with a single block (N = 1), suitable for up to 32 bytes with SHA-256.\n    // T(1) = HMAC-Hash(PRK, T(0) | info | 0x01) with T(0) = empty.\n    Q_ASSERT(length > 0 && length <= 32);\n\n    QByteArray data;\n    data.reserve(info.size() + 1);\n    data.append(info);\n    data.append(char(0x01));\n\n    const QByteArray okm = QMessageAuthenticationCode::hash(\n        data,\n        prk,\n        QCryptographicHash::Sha256\n    );\n\n    return okm.left(length);\n}\n\nQByteArray hmacKeyFor(const QCA::SymmetricKey &key)\n{\n    // Derive a separate HMAC key from the encryption key using HKDF-SHA256.\n    static const QByteArray info = QByteArrayLiteral(\"copyq-hmac-v1\");\n    const Encryption::Cleared<QByteArray> ikm = key.toByteArray();\n    const QByteArray prk = QMessageAuthenticationCode::hash(\n        ikm.value(),\n        QByteArray(hkdfSha256HashLength, '\\0'),\n        QCryptographicHash::Sha256\n    );\n    return hkdfExpandSha256SingleBlock(prk, info, hkdfSha256HashLength);\n}\n\n// HKDF with HMAC-SHA256 as specified in RFC 5869.\n// ikm  - input keying material\n// salt - optional salt (here: per-message salt)\n// info - context and application specific information\n// length - number of bytes to generate\nQByteArray hkdfSha256(const QByteArray &ikm,\n                       const QByteArray &salt,\n                       const QByteArray &info,\n                       int length)\n{\n    if (length <= 0) {\n        return QByteArray();\n    }\n    if (length > hkdfSha256MaxLength) {\n        return QByteArray();\n    }\n\n    // HKDF-Extract: PRK = HMAC(salt, IKM)\n    QByteArray effectiveSalt = salt;\n    if (effectiveSalt.isEmpty()) {\n        // If salt is not provided, use a zero-filled salt of HashLen bytes.\n        effectiveSalt = QByteArray(hkdfSha256HashLength, '\\0');\n    }\n\n    const QByteArray prk = QMessageAuthenticationCode::hash(\n        ikm,\n        effectiveSalt,\n        QCryptographicHash::Sha256\n    );\n\n    // HKDF-Expand\n    QByteArray okm;\n    okm.reserve(length);\n\n    QByteArray previousBlock;\n    const int iterations =\n        (length + hkdfSha256HashLength - 1) / hkdfSha256HashLength; // ceil(length / HashLen)\n    for (int i = 1; i <= iterations; ++i) {\n        QByteArray data = previousBlock;\n        data += info;\n        data += static_cast<char>(i);\n\n        previousBlock = QMessageAuthenticationCode::hash(\n            data,\n            prk,\n            QCryptographicHash::Sha256\n        );\n\n        okm += previousBlock;\n    }\n\n    return okm.left(length);\n}\n\nQCA::SymmetricKey derivePerMessageKey(const QCA::SymmetricKey &key, const QByteArray &salt)\n{\n    // Derive a 256-bit per-message key using HKDF-SHA256.\n    const Encryption::Cleared<QByteArray> ikm = key.toByteArray();\n    const QByteArray info = QByteArrayLiteral(\"copyq-msg-key-v1\");\n    const int derivedKeyLength = aes256KeySize;\n\n    const QByteArray okm = hkdfSha256(ikm.value(), salt, info, derivedKeyLength);\n    return QCA::SymmetricKey(okm);\n}\n\nQByteArray hmacTagFor(const QByteArray &payload, const QCA::SymmetricKey &key)\n{\n    return QMessageAuthenticationCode::hash(\n        payload,\n        hmacKeyFor(key),\n        QCryptographicHash::Sha256\n    );\n}\n\nstd::optional<Encryption::SecureArray> encryptAuthenticated(\n    const char *label,\n    const Encryption::SecureArray &data,\n    const QCA::SymmetricKey &key)\n{\n    const QByteArray salt = QCA::Random::randomArray(perMessageSaltSize).toByteArray();\n    const QCA::SymmetricKey messageKey = derivePerMessageKey(key, salt);\n    if (messageKey.isEmpty())\n        return std::nullopt;\n\n    const QCA::InitializationVector iv = QCA::Random::randomArray(aesBlockSize);\n    const auto encryptedData = ::encrypt(label, QCA::Encode, data, messageKey, iv);\n    if (!encryptedData)\n        return std::nullopt;\n\n    const Encryption::Cleared<QByteArray> payloadData(encryptedData->toByteArray());\n    QByteArray payload = encryptedDataMagic + salt + payloadData.value();\n    payload += hmacTagFor(payload, messageKey);\n\n    return Encryption::SecureArray(payload);\n}\n\nstd::optional<Encryption::SecureArray> decryptAuthenticated(\n    const char *label,\n    const QByteArray &encryptedData,\n    const QCA::SymmetricKey &key)\n{\n    if (!encryptedData.startsWith(encryptedDataMagic)) {\n        qCCritical(logCategory) << label << \"rejected: unsupported legacy encryption format\";\n        return std::nullopt;\n    }\n\n    const int minSize = encryptedDataMagic.size() + perMessageSaltSize + aesBlockSize + aesBlockSize + hmacTagSize;\n    if (encryptedData.size() < minSize) {\n        qCCritical(logCategory) << label << \"rejected: encrypted payload is too short\";\n        return std::nullopt;\n    }\n\n    const QByteArray payload = encryptedData.left(encryptedData.size() - hmacTagSize);\n    const QByteArray salt = payload.mid(encryptedDataMagic.size(), perMessageSaltSize);\n    const QCA::SymmetricKey messageKey = derivePerMessageKey(key, salt);\n    if (messageKey.isEmpty()) {\n        qCCritical(logCategory) << label << \"failed to derive per-message key\";\n        return std::nullopt;\n    }\n\n    const QByteArray expectedTag = hmacTagFor(payload, messageKey);\n    const QByteArray actualTag = encryptedData.right(hmacTagSize);\n    if (!constantTimeEquals(expectedTag, actualTag)) {\n        qCCritical(logCategory) << label << \"authentication failed\";\n        return std::nullopt;\n    }\n\n    const QByteArray legacyEncrypted =\n        payload.mid(encryptedDataMagic.size() + perMessageSaltSize);\n    const QCA::InitializationVector iv(legacyEncrypted.left(aesBlockSize));\n    const QCA::SecureArray ciphertext(legacyEncrypted.mid(aesBlockSize));\n    return ::encrypt(label, QCA::Decode, ciphertext, messageKey, iv);\n}\n\n} // namespace\n\nnamespace Encryption {\n\nEncryptionKey::EncryptionKey(const SecureArray &password)\n    : m_dek(deriveFromPasswordAndSalt(password, Salt(QByteArray(\"copyq_salt_v1\"))))\n{\n}\n\nEncryptionKey::~EncryptionKey()\n{\n    m_dek.clear();\n}\n\nbool EncryptionKey::generateRandomDEK()\n{\n    m_dek = QCA::SymmetricKey(aes256KeySize);\n\n    if (m_dek.isEmpty()) {\n        qCCritical(logCategory) << \"Failed to generate random DEK\";\n        return false;\n    }\n\n    qCDebug(logCategory) << \"Generated new random DEK\";\n    return true;\n}\n\nEncryptionKey::EncryptionKey(\n    const SecureArray &password,\n    const SecureArray &wrappedDEK,\n    const Salt &kekSalt)\n{\n    if (wrappedDEK.isEmpty()) {\n        qCCritical(logCategory) << \"Cannot unwrap DEK: empty wrapped DEK\";\n        return;\n    }\n\n    if (kekSalt.isEmpty()) {\n        qCCritical(logCategory) << \"Cannot unwrap DEK: empty KEK salt\";\n        return;\n    }\n\n    const QCA::SymmetricKey kek = deriveFromPasswordAndSalt(password, kekSalt);\n    if (kek.isEmpty()) {\n        qCCritical(logCategory) << \"Failed to derive KEK from password\";\n        return;\n    }\n\n    const auto decryptedDEK = decryptAuthenticated(\n        \"Unwrap DEK:\",\n        wrappedDEK.toByteArray(),\n        kek\n    );\n    if (!decryptedDEK)\n        return;\n\n    m_dek = QCA::SymmetricKey(*decryptedDEK);\n    if (m_dek.isEmpty()) {\n        qCCritical(logCategory) << \"Unwrapped DEK is empty\";\n        return;\n    }\n}\n\nSecureArray EncryptionKey::wrapDEK(const SecureArray &password, const Salt &kekSalt) const\n{\n    if (m_dek.isEmpty()) {\n        qCCritical(logCategory) << \"Cannot wrap DEK: DEK is empty\";\n        return {};\n    }\n\n    if (kekSalt.isEmpty()) {\n        qCCritical(logCategory) << \"Cannot wrap DEK: empty KEK salt\";\n        return {};\n    }\n\n    const QCA::SymmetricKey kek = deriveFromPasswordAndSalt(password, kekSalt);\n    if (kek.isEmpty()) {\n        qCCritical(logCategory) << \"Failed to derive KEK for wrapping\";\n        return {};\n    }\n\n    const auto wrapped = encryptAuthenticated(\"Wrap DEK:\", m_dek.toByteArray(), kek);\n    return wrapped.value_or(SecureArray());\n}\n\nbool EncryptionKey::isValid() const\n{\n    return !m_dek.isEmpty();\n}\n\nvoid EncryptionKey::clear()\n{\n    m_dek.clear();\n}\n\nbool initialize()\n{\n    static bool initialized = initializeQCA();\n    return initialized;\n}\n\nQByteArray encrypt(const SecureArray &data, const EncryptionKey &key)\n{\n    if (!canUseEncryptionKey(\"Cannot encrypt:\", key.symmetricKey())) {\n        return QByteArray();\n    }\n\n    const auto encrypted =\n        encryptAuthenticated(\"Encrypt data:\", data, key.symmetricKey());\n    return encrypted ? encrypted->toByteArray() : QByteArray();\n}\n\nQByteArray decrypt(const QByteArray &encryptedData, const EncryptionKey &key)\n{\n    if (!canUseEncryptionKey(\"Cannot decrypt:\", key.symmetricKey())) {\n        return QByteArray();\n    }\n\n    const auto decrypted =\n        decryptAuthenticated(\"Decrypt data:\", encryptedData, key.symmetricKey());\n    return decrypted ? decrypted->toByteArray() : QByteArray();\n}\n\nvoid removeEncryptionKeys()\n{\n    const QString dekFilePath = ::dekFilePath();\n    if (QFile::exists(dekFilePath)) {\n        if (QFile::remove(dekFilePath)) {\n            qCInfo(logCategory) << \"Removed encryption key file:\" << dekFilePath;\n        } else {\n            qCWarning(logCategory) << \"Failed to remove encryption key file:\" << dekFilePath;\n        }\n    }\n\n    const QString saltFilePath = ::saltFilePath();\n    if (QFile::exists(saltFilePath)) {\n        if (QFile::remove(saltFilePath)) {\n            qCInfo(logCategory) << \"Removed KEK salt file:\" << saltFilePath;\n        } else {\n            qCWarning(logCategory) << \"Failed to remove KEK salt file:\" << saltFilePath;\n        }\n    }\n}\n\nEncryptionKey saveKey(const EncryptionKey &key, const SecureArray &newPassword)\n{\n    if (newPassword.isEmpty()) {\n        qCCritical(logCategory) << \"Password cannot be empty\";\n        return {};\n    }\n\n    if (!key.isValid()) {\n        qCCritical(logCategory) << \"Encryption key is not valid\";\n        return {};\n    }\n\n    const QCA::SecureArray newKekSalt = QCA::Random::randomArray(perMessageSaltSize);\n    if (newKekSalt.isEmpty()) {\n        qCCritical(logCategory) << \"Failed to generate new KEK salt\";\n        return {};\n    }\n\n    // Re-wrap DEK with new password\n    // The DEK itself remains unchanged, we just encrypt it with a new KEK\n    const SecureArray newWrappedDEK = key.wrapDEK(newPassword, newKekSalt);\n    if (newWrappedDEK.isEmpty()) {\n        qCCritical(logCategory) << \"Failed to wrap DEK with new password\";\n        return {};\n    }\n\n    qCDebug(logCategory) << \"Successfully wrapped DEK with new password\";\n\n    if (!backupEncryptionFiles()) {\n        qCCritical(logCategory) << \"Failed to backup encryption files\";\n        return {};\n    }\n\n    if ( !saveFile(::dekFilePath(), newWrappedDEK)\n      || !saveFile(::saltFilePath(), newKekSalt) )\n    {\n        qCCritical(logCategory) << \"Failed to save new key - rolling back\";\n        restoreEncryptionFiles();\n        return {};\n    }\n\n    const EncryptionKey verifiedKey(newPassword, newWrappedDEK, newKekSalt);\n    if (!verifiedKey.isValid()) {\n        qCCritical(logCategory)\n            << \"Verification failed: cannot unwrap DEK with new password - rolling back\";\n        restoreEncryptionFiles();\n        return {};\n    }\n\n    // Verify the unwrapped DEK matches the original\n    if (verifiedKey.exportDEK() != key.exportDEK()) {\n        qCCritical(logCategory)\n            << \"Verification failed: unwrapped DEK does not match original - rolling back\";\n        restoreEncryptionFiles();\n        return {};\n    }\n\n    removeEncryptionBackups();\n\n    return EncryptionKey(newPassword, newWrappedDEK, newKekSalt);\n}\n\nSecureArray loadWrappedDEK()\n{\n    return loadNonEmptySecureFile(::dekFilePath(), \"Wrapped DEK\");\n}\n\nSalt loadKEKSalt()\n{\n    return Salt(loadNonEmptySecureFile(::saltFilePath(), \"KEK salt\"));\n}\n\n} // namespace Encryption\n\n#else // !WITH_QCA_ENCRYPTION\n\n// Stub implementations when QCA is not available\n\nnamespace Encryption {\n\nEncryptionKey::EncryptionKey(const SecureArray &)\n{\n}\n\nEncryptionKey::EncryptionKey(const SecureArray &, const SecureArray &, const Salt &)\n{\n}\n\nEncryptionKey::~EncryptionKey()\n{\n}\n\nbool EncryptionKey::generateRandomDEK()\n{\n    return false;\n}\n\nQByteArray EncryptionKey::wrapDEK(const QByteArray &, const QByteArray &) const\n{\n    return QByteArray();\n}\n\nbool EncryptionKey::isValid() const\n{\n    return false;\n}\n\nvoid EncryptionKey::clear()\n{\n}\n\nbool initialize()\n{\n    return false;\n}\n\nQByteArray encrypt(const QByteArray &, const EncryptionKey &)\n{\n    return QByteArray();\n}\n\nQByteArray decrypt(const QByteArray &, const EncryptionKey &)\n{\n    return QByteArray();\n}\n\nEncryptionKey saveKey(const EncryptionKey &, const SecureArray &)\n{\n    return {};\n}\n\nSecureArray loadWrappedDEK()\n{\n    return {};\n}\n\nQByteArray loadKEKSalt()\n{\n    return QByteArray();\n}\n\nvoid removeEncryptionKeys()\n{\n}\n\n} // namespace Encryption\n\n#endif // WITH_QCA_ENCRYPTION\n"
  },
  {
    "path": "src/common/encryption.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include <QByteArray>\n#include <QString>\n\nclass QDataStream;\n\n#ifdef WITH_QCA_ENCRYPTION\n#include <QtCrypto>\n#endif\n\nnamespace QCA {\n    class SecureArray;\n}\n\nnamespace Encryption {\n\n#ifdef WITH_QCA_ENCRYPTION\nusing SecureArray = QCA::SecureArray;\nusing Salt = QCA::InitializationVector;\n#else\nusing SecureArray = QByteArray;\nusing Salt = QByteArray;\n#endif\n\n/// Wrap a value and clear it on destruction.\ntemplate <typename T>\nclass Cleared {\npublic:\n    Cleared(T &&ba): m_value(std::move(ba)) {}\n    ~Cleared() { m_value.fill('\\0'); }\n    bool isEmpty() const { return m_value.isEmpty(); }\n    qsizetype size() const { return m_value.size(); }\n    const T &value() const { return m_value; }\nprivate:\n    T m_value;\n};\n\n/**\n * Wrapper class for encryption key using envelope encryption (key wrapping).\n *\n * Architecture:\n * - DEK (Data Encryption Key): Random 256-bit key that encrypts all tab data\n * - KEK (Key Encryption Key): Derived from user password using PBKDF2 with random salt\n * - The DEK is encrypted by the KEK and stored on disk (envelope encryption)\n *\n * Benefits:\n * - Password changes only require re-encrypting the small DEK, not all data\n * - Each user gets a unique random salt for password derivation\n * - DEK is cryptographically random, stronger than password-derived keys\n *\n * When QCA encryption is not available, this class acts as a stub\n * that always returns invalid/empty results.\n */\nclass EncryptionKey {\npublic:\n    EncryptionKey() = default;\n    EncryptionKey(const EncryptionKey &) = default;\n    EncryptionKey &operator=(const EncryptionKey &) = default;\n    EncryptionKey(EncryptionKey &&) = default;\n    EncryptionKey &operator=(EncryptionKey &&) = default;\n\n    /// Derive from password.\n    explicit EncryptionKey(const SecureArray &password);\n\n    /// Unwrap from DEK.\n    EncryptionKey(\n        const SecureArray &password,\n        const SecureArray &wrappedDEK,\n        const Salt &kekSalt);\n\n    ~EncryptionKey();\n\n    /**\n     * Generate a new random Data Encryption Key (DEK).\n     * Should be called once during initial setup.\n     * @return true if DEK generation succeeded (always false without QCA)\n     */\n    bool generateRandomDEK();\n\n    /**\n     * Derive KEK from password and unwrap (decrypt) the DEK.\n     * @param password Password to derive KEK from\n     * @param wrappedDEK Encrypted DEK (previously encrypted with a KEK)\n     * @param kekSalt Salt for KEK derivation\n     * @return true if KEK derivation and DEK unwrapping succeeded\n     */\n    bool unwrapDEK(const SecureArray &password, const SecureArray &wrappedDEK, const Salt &kekSalt);\n\n    /**\n     * Wrap (encrypt) the DEK using a KEK derived from password.\n     * Used when setting or changing passwords.\n     * @param password Password to derive KEK from\n     * @param kekSalt Salt for KEK derivation\n     * @return Encrypted DEK, or empty array on failure\n     */\n    SecureArray wrapDEK(const SecureArray &password, const Salt &kekSalt) const;\n\n    /**\n     * Check if DEK is valid and ready to use.\n     * @return true if valid (always false without QCA)\n     */\n    bool isValid() const;\n\n    /**\n     * Clear the keys from memory.\n     */\n    void clear();\n\n#ifdef WITH_QCA_ENCRYPTION\n    // Internal access for encryption/decryption operations\n    // Returns the DEK for data encryption/decryption\n    const QCA::SymmetricKey &symmetricKey() const { return m_dek; }\n\n    /**\n     * Export DEK as raw bytes for serialization.\n     * WARNING: This exposes the raw encryption key - use only for secure serialization.\n     * @return DEK as byte array, or empty if invalid\n     */\n    QByteArray exportDEK() const { return m_dek.toByteArray(); }\n\n    /**\n     * Import DEK from raw bytes (for deserialization).\n     * @param dekBytes Raw DEK bytes\n     * @return true if import succeeded\n     */\n    bool importDEK(const QByteArray &dekBytes)\n    {\n        m_dek = QCA::SymmetricKey(dekBytes);\n        return !m_dek.isEmpty();\n    }\n\nprivate:\n    QCA::SymmetricKey m_dek;  // Data Encryption Key (used for actual data encryption)\n#endif\n};\n\n/**\n * Initialize encryption system.\n * Returns true if encryption is available and initialized successfully.\n * Always returns false when QCA is not available.\n */\nbool initialize();\n\n/**\n * Encrypt data using AES-256.\n * @param data Data to encrypt\n * @param key Encryption key to use\n * @return Encrypted data, or empty array on failure (always empty without QCA)\n */\nQByteArray encrypt(const SecureArray &data, const EncryptionKey &key);\n\n/**\n * Decrypt data that was encrypted with encrypt().\n * @param encryptedData Data to decrypt\n * @param key Encryption key to use\n * @return Decrypted data, or empty array on failure (always empty without QCA)\n */\nQByteArray decrypt(const QByteArray &encryptedData, const EncryptionKey &key);\n\n/** Save encryption key safely. */\nEncryptionKey saveKey(const EncryptionKey &key, const SecureArray &newPassword);\n\n/**\n * Load wrapped DEK from secure storage.\n * @return Wrapped DEK, or empty array if not found or on error\n */\nSecureArray loadWrappedDEK();\n\n/**\n * Load KEK salt from secure storage.\n * @return KEK salt, or empty array if not found or on error\n */\nSalt loadKEKSalt();\n\n/**\n * Remove all encryption key files from disk.\n * This should only be called after successfully disabling encryption for all tabs.\n *\n * Removes:\n * - wrapped_dek.dat (wrapped Data Encryption Key)\n * - kek_salt.dat (Key Encryption Key salt)\n */\nvoid removeEncryptionKeys();\n\n} // namespace Encryption\n"
  },
  {
    "path": "src/common/globalshortcutcommands.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"globalshortcutcommands.h\"\n\n#include \"common/command.h\"\n#include \"gui/fromiconid.h\"\n\n#include <QCoreApplication>\n#include <QLocale>\n#include <QVector>\n\n#ifdef COPYQ_GLOBAL_SHORTCUTS\n#   include \"common/shortcuts.h\"\n#   include \"gui/icons.h\"\n\nnamespace {\n\nconstexpr auto commandScreenshot = R\"(\nvar imageData = screenshotSelect()\nwrite('image/png', imageData)\ncopy('image/png', imageData)\n)\";\n\nconstexpr auto commandPasteDateTimeTemplate = R\"(\n// http://doc.qt.io/qt-6/qdatetime.html#toString\nvar format = '%1'\nvar dateTime = dateString(format)\ncopy(dateTime)\ncopySelection(dateTime)\npaste()\n)\";\n\nclass AddCommandDialog final\n{\n    Q_DECLARE_TR_FUNCTIONS(AddCommandDialog)\n};\n\nQString commandPasteDateTime()\n{\n    const auto format = QLocale::system().dateTimeFormat(QLocale::LongFormat)\n            .replace(\"\\\\\", \"\\\\\\\\\")\n            .replace(\"'\", \"\\\\'\")\n            .replace(\"\\n\", \"\\\\n\");\n\n    return QString(commandPasteDateTimeTemplate).arg(format);\n}\n\nCommand createGlobalShortcut(const QString &name, const QString &script, IconId icon, const QString &internalId)\n{\n    Command c;\n    c.internalId = internalId;\n    c.name = name;\n    c.cmd = \"copyq: \" + script;\n    c.icon = fromIconId(icon);\n    c.isGlobalShortcut = true;\n    return c;\n}\n\n} // namespace\n\nQVector<Command> globalShortcutCommands()\n{\n    return {\n        createGlobalShortcut( AddCommandDialog::tr(\"Show/hide main window\"), \"toggle()\", IconRectangleList, \"copyq_global_toggle\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Show the tray menu\"), \"menu()\", IconInbox, \"copyq_global_menu\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Show main window under mouse cursor\"), \"showAt()\", IconRectangleList, \"copyq_global_show_under_mouse\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Edit clipboard\"), \"edit(-1)\", IconPenToSquare, \"copyq_global_edit_clipboard\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Edit first item\"), \"edit(0)\", IconPenToSquare, \"copyq_global_edit_first_item\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Copy second item\"), \"select(1)\", IconCopy, \"copyq_global_copy_second_item\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Show action dialog\"), \"action()\", IconGear, \"copyq_global_show_action_dialog\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Create new item\"), \"edit()\", IconAsterisk, \"copyq_global_create_new_item\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Copy next item\"), \"next()\", IconArrowDown, \"copyq_global_copy_next\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Copy previous item\"), \"previous()\", IconArrowUp, \"copyq_global_copy_previous\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Paste clipboard as plain text\"), pasteAsPlainTextScript(\"clipboard()\"), IconPaste, \"copyq_global_paste_clipboard_plain\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Disable clipboard storing\"), \"disable()\", IconEyeSlash, \"copyq_global_disable_clipboard_store\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Enable clipboard storing\"), \"enable()\", IconEye, \"copyq_global_enable_clipboard_store\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Paste and copy next\"), \"paste(); next()\", IconCircleArrowDown, \"copyq_global_paste_copy_next\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Paste and copy previous\"), \"paste(); previous()\", IconCircleArrowUp, \"copyq_global_paste_copy_previous\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Take screenshot\"), commandScreenshot, IconCamera, \"copyq_global_screenshot\"),\n        createGlobalShortcut( AddCommandDialog::tr(\"Paste current date and time\"), commandPasteDateTime(), IconClock , \"copyq_global_paste_datetime\"),\n    };\n}\n#else\nQVector<Command> globalShortcutCommands()\n{\n    return {};\n}\n#endif\n\nQString pasteAsPlainTextScript(const QString &what)\n{\n    return \"\\n\"\n           \"var text = \" + what + \"\\n\"\n           \"copy(text)\\n\"\n           \"copySelection(text)\\n\"\n           \"paste()\";\n}\n"
  },
  {
    "path": "src/common/globalshortcutcommands.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QtContainerFwd>\n\nclass QString;\nstruct Command;\n\nQVector<Command> globalShortcutCommands();\n\nQString pasteAsPlainTextScript(const QString &what);\n"
  },
  {
    "path": "src/common/keychainaccess.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"keychainaccess.h\"\n\n#ifdef WITH_KEYCHAIN\n#   if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n#       include <qt6keychain/keychain.h>\n#   else\n#       include <qt5keychain/keychain.h>\n#   endif\n#include <QCoreApplication>\n#include <QEventLoop>\n#include <QLoggingCategory>\n#include <QTimer>\n\nnamespace {\n\nconstexpr int keychainTimeoutMs = 30000;\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.keychain\")\n\nbool waitOrTimeout(QKeychain::Job &job)\n{\n    QEventLoop loop;\n    bool finished = false;\n    QObject::connect(&job, &QKeychain::Job::finished, &loop, [&](){\n        finished = true;\n        loop.quit();\n    });\n\n    // Set a timeout to prevent hanging indefinitely\n    QTimer timer;\n    timer.setSingleShot(true);\n    QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);\n    timer.start(keychainTimeoutMs);\n\n    job.start();\n    loop.exec();\n\n    return finished;\n}\n\n} // namespace\n\nnamespace KeychainAccess {\n\nQByteArray readPassword(const QString &service, const QString &key)\n{\n    QKeychain::ReadPasswordJob job(service);\n    job.setAutoDelete(false);\n    job.setKey(key);\n\n    if (!waitOrTimeout(job)) {\n        qCWarning(logCategory) << \"Reading keychain timed out\";\n        return {};\n    }\n\n    if (job.error()) {\n        qCWarning(logCategory) << \"Reading keychain failed:\" << job.errorString();\n        return {};\n    }\n\n    return job.binaryData();\n}\n\nbool writePassword(const QString &service, const QString &key, const QByteArray &password)\n{\n    QKeychain::WritePasswordJob job(service);\n    job.setAutoDelete(false);\n    job.setKey(key);\n    job.setBinaryData(password);\n\n    if (!waitOrTimeout(job)) {\n        qCWarning(logCategory) << \"Writing keychain timed out\";\n        return false;\n    }\n\n    if (job.error()) {\n        qCWarning(logCategory) << \"Writing keychain failed:\" << job.errorString();\n        return false;\n    }\n\n    return true;\n}\n\nvoid deletePassword(const QString &service, const QString &key)\n{\n    const auto job = new QKeychain::DeletePasswordJob(service);\n    job->setAutoDelete(true);\n    job->setKey(key);\n    QObject::connect(job, &QKeychain::Job::finished, [](QKeychain::Job *job) {\n        const auto error = job->error();\n        if (error != QKeychain::NoError && error != QKeychain::EntryNotFound)\n            qCWarning(logCategory) << \"Deleting keychain failed:\" << job->errorString();\n    });\n    job->start();\n}\n\n} // namespace KeychainAccess\n\n#else // !WITH_KEYCHAIN\n\n// Stub implementations when QtKeychain is not available\nnamespace KeychainAccess {\n\nQByteArray readPassword(const QString &, const QString &)\n{\n    return {};\n}\n\nbool writePassword(const QString &, const QString &, const QByteArray &)\n{\n    return false;\n}\n\nvoid deletePassword(const QString &, const QString &)\n{\n}\n\n} // namespace KeychainAccess\n\n#endif // WITH_KEYCHAIN\n"
  },
  {
    "path": "src/common/keychainaccess.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include <QByteArray>\n#include <QString>\n\nnamespace KeychainAccess {\n\nQByteArray readPassword(const QString &service, const QString &key);\n\nbool writePassword(const QString &service, const QString &key, const QByteArray &password);\n\nvoid deletePassword(const QString &service, const QString &key);\n\n} // namespace KeychainAccess\n"
  },
  {
    "path": "src/common/log.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"log.h\"\n\n#include <QCoreApplication>\n#include <QDateTime>\n#include <QDir>\n#include <QFile>\n#include <QString>\n#include <QtGlobal>\n#include <QVariant>\n\n#include <QStandardPaths>\n\nnamespace {\n\nQString logFileName(int i)\n{\n    if (i <= 0)\n        return ::logFileName();\n    return ::logFileName() + QLatin1String(\".\") + QString::number(i);\n}\n\nvoid rotateLogFiles()\n{\n    for (int i = logFileCount - 1; i > 0; --i) {\n        const QString sourceFileName = logFileName(i - 1);\n        const QString targetFileName = logFileName(i);\n        QFile::remove(targetFileName);\n        QFile::rename(sourceFileName, targetFileName);\n    }\n}\n\nbool writeLogFile(const QByteArray &message)\n{\n    QFile f( ::logFileName() );\n    if ( !f.open(QIODevice::Append) )\n        return false;\n\n    if ( f.write(message) <= 0 )\n        return false;\n\n    f.close();\n    if ( f.size() > logFileSize )\n        rotateLogFiles();\n\n    return true;\n}\n\nQByteArray createLogMessage(const QByteArray &label, const QByteArray &text)\n{\n    if ( text.contains('\\n') ) {\n        const QByteArray continuation = '\\n' + label + \"   \";\n        return label + QByteArray(text).replace('\\n', continuation) + '\\n';\n    }\n\n    return label + text + '\\n';\n}\n\nQByteArray createSimpleLogMessage(const QByteArray &text, const LogLevel level)\n{\n    const auto label = logLevelLabel(level) + \": \";\n    return createLogMessage(label, text);\n}\n\nQByteArray createLogMessage(const QByteArray &text, const LogLevel level)\n{\n    const auto timeStamp =\n        QDateTime::currentDateTime().toString(QStringLiteral(\"[yyyy-MM-dd hh:mm:ss.zzz] \")).toLatin1();\n    const auto label = timeStamp + logLevelLabel(level) + \" \" + logLabel() + \": \";\n    return createLogMessage(label, text);\n}\n\nQString getLogFileName()\n{\n    const QString fileName = qEnvironmentVariable(\"COPYQ_LOG_FILE\");\n    if (!fileName.isEmpty()) {\n        return fileName;\n    }\n\n    const QString dateTime = QDateTime::currentDateTime()\n        .toString(QStringLiteral(\"yyyyMMdd\"));\n    const QString logSuffix = QStringLiteral(\"-%1-%2.log\")\n        .arg(dateTime).arg(QCoreApplication::applicationPid());\n\n    const QString path = getDefaultLogFilePath();\n    QDir dir(path);\n    dir.mkpath(QStringLiteral(\".\"));\n\n    return QStringLiteral(\"%1/copyq%2\").arg(path, logSuffix);\n}\n\nvoid logAlways(const QByteArray &msgText, const LogLevel level)\n{\n    const auto msg = createLogMessage(msgText, level);\n    const bool writtenToLogFile = qApp && writeLogFile(msg);\n\n    // Log to file and if needed to stderr.\n    if ( !writtenToLogFile || level <= LogWarning || hasLogLevel(LogDebug) ) {\n        QFile ferr;\n        if ( ferr.open(stderr, QIODevice::WriteOnly) ) {\n            const auto simpleMsg = createSimpleLogMessage(msgText, level);\n            ferr.write(simpleMsg);\n        }\n    }\n}\n\n\nbool removeLogFile(const QFileInfo &logFileInfo)\n{\n    QFile logFile(logFileInfo.absoluteFilePath());\n    if (logFile.remove())\n        return true;\n\n    log( QStringLiteral(\"Failed to remove log file \\\"%1\\\": %2\")\n        .arg(logFile.fileName(), logFile.errorString()), LogError );\n    return false;\n}\n\n} // namespace\n\nQFileInfoList logFileNames()\n{\n    const QFileInfo logFileInfo(::logFileName());\n    const QDir logDir = logFileInfo.absoluteDir();\n    const QString pattern = QStringLiteral(\"%1-*.log*\").arg(\n        logFileInfo.baseName().section('-', 0, -3) );\n    return logDir.entryInfoList({logFileInfo.fileName(), pattern}, QDir::Files, QDir::Time);\n}\n\nQString getDefaultLogFilePath()\n{\n    const QString dir = qEnvironmentVariable(\"COPYQ_LOG_DIR\");\n    if (!dir.isEmpty()) {\n        return dir;\n    }\n    return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);\n}\n\nconst QString &logFileName()\n{\n    static QCoreApplication *app = QCoreApplication::instance();\n    static QString logFileName = getLogFileName();\n    // If the application instance got set later, assume that org and\n    // application names also changed and update the log file path.\n    if (app != QCoreApplication::instance()) {\n        app = QCoreApplication::instance();\n        logFileName = getLogFileName();\n    }\n    return logFileName;\n}\n\nQByteArray readLogFile(int maxReadSize)\n{\n    /*\n     * Read all log files (from newest to oldest) and sort lines by timestamp.\n     */\n    std::vector<QByteArray> sortedLogLines;\n    int currentSize = 0;\n\n    for (const QFileInfo &logFile : logFileNames()) {\n        QFile f(logFile.absoluteFilePath());\n        if ( !f.open(QIODevice::ReadOnly) )\n            continue;\n\n        const auto seek = f.size() - maxReadSize;\n        if (seek > 0) {\n            f.seek(seek);\n            f.readLine();  // Skip first partial line.\n        }\n\n        while (!f.atEnd()) {\n            const QByteArray line = f.readLine();\n            // Sort only by timestamp to preserve the relative order of records\n            // with the same timestamp.\n            constexpr auto timestampSize =\n                std::char_traits<char>::length(\"yyyy-MM-dd hh:mm:ss.zzz\");\n            const auto it = std::upper_bound(\n                sortedLogLines.begin(), sortedLogLines.end(), line,\n                [](const QByteArray &a, const QByteArray &b) {\n                    return a.mid(1, timestampSize) >= b.mid(1, timestampSize);\n                });\n            if (it == sortedLogLines.end() && currentSize >= maxReadSize)\n                continue;\n\n            currentSize += line.size();\n            sortedLogLines.insert(it, line);\n\n            while (currentSize > maxReadSize && !sortedLogLines.empty()) {\n                currentSize -= sortedLogLines.back().size();\n                sortedLogLines.pop_back();\n            }\n        }\n    }\n\n    QByteArray result;\n    while( !sortedLogLines.empty() ) {\n        result += sortedLogLines.back();\n        sortedLogLines.pop_back();\n    }\n\n    return result;\n}\n\nbool dropLogsToFileCountAndSize(int maxFileCount, int keepMaxSize)\n{\n    QFileInfoList logFiles = logFileNames();\n    bool success = true;\n\n    if (maxFileCount > 0 && maxFileCount < logFiles.size()) {\n        const auto begin = logFiles.cbegin() + maxFileCount;\n        for (auto it = begin; it != logFiles.cend(); ++it)\n            success = removeLogFile(*it) && success;\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n        logFiles.erase(begin);\n#else\n        logFiles.erase(logFiles.begin() + maxFileCount);\n#endif\n    }\n\n    if (keepMaxSize < 0)\n        return success;\n\n    int totalSize = 0;\n    for (const QFileInfo &logFile : logFiles)\n        totalSize += logFile.size();\n\n    if (totalSize <= keepMaxSize)\n        return success;\n\n    for (auto it = logFiles.crbegin(); it != logFiles.crend(); ++it) {\n        const auto fileSize = it->size();\n        if (removeLogFile(*it)) {\n            totalSize -= fileSize;\n            if (totalSize <= keepMaxSize)\n                break;\n        } else {\n            success = false;\n        }\n    }\n\n    return success;\n}\n\nint getLogLevel()\n{\n    const QByteArray logLevelString = qgetenv(\"COPYQ_LOG_LEVEL\").toUpper();\n\n    if ( logLevelString.startsWith(\"TRAC\") )\n        return LogTrace;\n    if ( logLevelString.startsWith(\"DEBUG\") )\n        return LogDebug;\n    if ( logLevelString.startsWith(\"NOT\") )\n        return LogNote;\n    if ( logLevelString.startsWith(\"WARN\") )\n        return LogWarning;\n    if ( logLevelString.startsWith(\"ERR\") )\n        return LogError;\n\n#ifdef COPYQ_DEBUG\n    return LogDebug;\n#else\n    return LogNote;\n#endif\n}\n\nbool hasLogLevel(LogLevel level)\n{\n    static const int currentLogLevel = getLogLevel();\n    return currentLogLevel >= level;\n}\n\nQByteArray logLevelLabel(LogLevel level)\n{\n    switch(level) {\n    case LogWarning:\n        return QByteArrayLiteral(\"Warning\");\n    case LogError:\n        return QByteArrayLiteral(\"ERROR\");\n    case LogDebug:\n        return QByteArrayLiteral(\"DEBUG\");\n    case LogTrace:\n        return QByteArrayLiteral(\"TRACE\");\n    case LogNote:\n    case LogAlways:\n        return QByteArrayLiteral(\"Note\");\n    }\n\n    Q_ASSERT(false);\n    return \"\";\n}\n\nvoid log(const char *text, LogLevel level)\n{\n    if ( hasLogLevel(level) )\n        logAlways(QByteArray(text), level);\n}\n\nvoid log(const QByteArray &text, LogLevel level)\n{\n    if ( hasLogLevel(level) )\n        logAlways(text, level);\n}\n\nvoid log(const QString &text, const LogLevel level)\n{\n    if ( hasLogLevel(level) )\n        logAlways(text.toUtf8(), level);\n}\n\nvoid setLogLabel(const QByteArray &name)\n{\n    const auto id = QCoreApplication::applicationPid();\n    logLabel() = \"<\" + name + \"-\" + QByteArray::number(id) + \">\";\n}\n\nQByteArray &logLabel()\n{\n    static QByteArray label;\n    return label;\n}\n"
  },
  {
    "path": "src/common/log.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n\nclass QByteArray;\nclass QFileInfo;\nclass QString;\ntemplate <class T> class QList;\nusing QFileInfoList = QList<QFileInfo>;\n\nenum LogLevel {\n    LogAlways,\n    LogError,\n    LogWarning,\n    LogNote,\n    LogDebug,\n    LogTrace\n};\n\nconstexpr int logFileSize = 512 * 1024;\nconstexpr int logFileCount = 10;\n\nQString getDefaultLogFilePath();\nconst QString &logFileName();\nQFileInfoList logFileNames();\n\nQByteArray readLogFile(int maxReadSize);\n\nbool dropLogsToFileCountAndSize(int maxFileCount, int keepMaxSize);\n\nvoid createSessionMutex();\n\nint getLogLevel();\n\nbool hasLogLevel(LogLevel level);\n\nQByteArray logLevelLabel(LogLevel level);\n\n#define COPYQ_LOG(msg) do { if ( hasLogLevel(LogDebug) ) log(msg, LogDebug); } while (false)\n#define COPYQ_LOG_VERBOSE(msg) do { if ( hasLogLevel(LogTrace) ) log(msg, LogTrace); } while (false)\n\nvoid log(const char *text, LogLevel level = LogNote);\nvoid log(const QString &text, LogLevel level = LogNote);\nvoid log(const QByteArray &text, LogLevel level = LogNote);\n\nvoid setLogLabel(const QByteArray &name);\n\nQByteArray &logLabel();\n"
  },
  {
    "path": "src/common/messagehandlerforqt.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"messagehandlerforqt.h\"\n\n#include \"common/log.h\"\n\n#include <QLoggingCategory>\n#include <QString>\n#include <QtGlobal>\n\n#include <exception>\n\nnamespace {\n\nclass ExceptionQtFatal final : public std::exception {\npublic:\n    explicit ExceptionQtFatal(const QByteArray &message)\n        : m_message(message)\n    {\n    }\n\n    const char* what() const noexcept override\n    {\n        return m_message.constData();\n    }\n\nprivate:\n    QByteArray m_message;\n};\n\nvoid messageHandlerForQt(QtMsgType type, const QMessageLogContext &context, const QString &msg)\n{\n    QString message = msg;\n    if (context.file && context.file[0]) {\n        message.append(\n            QStringLiteral(\" (%1:%2, %3)\")\n                .arg(context.file, QString::number(context.line), context.function));\n    }\n\n    const QString format = QStringLiteral(\"[%1] %2\");\n    const QLatin1String category(context.category);\n    switch (type) {\n    case QtDebugMsg:\n        log( format.arg(category, message), LogDebug);\n        break;\n    case QtInfoMsg:\n        log( format.arg(category, message), LogNote);\n        break;\n    case QtWarningMsg:\n        log( format.arg(category, message), LogWarning);\n        break;\n    case QtCriticalMsg:\n        log( format.arg(category, message), LogError);\n        break;\n    case QtFatalMsg:\n        log( format.arg(category, message), LogError);\n        throw ExceptionQtFatal( message.toUtf8() );\n    }\n}\n\n} // namespace\n\nvoid installMessageHandlerForQt()\n{\n    switch(getLogLevel()) {\n    case LogDebug:\n    case LogTrace:\n        QLoggingCategory::setFilterRules(\"copyq.*=true\");\n        break;\n\n    case LogNote:\n    case LogAlways:\n        QLoggingCategory::setFilterRules(\n            \"copyq.*.info=true\\ncopyq.*.warning=true\\ncopyq.*.critical=true\");\n        break;\n\n    case LogWarning:\n        QLoggingCategory::setFilterRules(\n            \"copyq.*.warning=true\\ncopyq.*.critical=true\");\n        break;\n\n    case LogError:\n        QLoggingCategory::setFilterRules(\"copyq.*.critical=true\");\n        break;\n    }\n    qInstallMessageHandler(messageHandlerForQt);\n}\n"
  },
  {
    "path": "src/common/messagehandlerforqt.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nvoid installMessageHandlerForQt();\n"
  },
  {
    "path": "src/common/mimetypes.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"mimetypes.h\"\n\n#include <QLatin1String>\n\nconst QLatin1String mimePrivatePrefix(COPYQ_MIME_PRIVATE_PREFIX);\nconst QLatin1String mimeText(\"text/plain\");\nconst QLatin1String mimeTextUtf8(\"text/plain;charset=utf-8\");\nconst QLatin1String mimeHtml(\"text/html\");\nconst QLatin1String mimeUriList(\"text/uri-list\");\nconst QLatin1String mimeWindowTitle(COPYQ_MIME_PREFIX \"owner-window-title\");\nconst QLatin1String mimeItems(COPYQ_MIME_PREFIX \"item\");\nconst QLatin1String mimeItemNotes(COPYQ_MIME_PREFIX \"item-notes\");\nconst QLatin1String mimeIcon(COPYQ_MIME_PREFIX \"item-icon\");\nconst QLatin1String mimeOwner(COPYQ_MIME_PREFIX \"owner\");\nconst QLatin1String mimeClipboardMode(COPYQ_MIME_PREFIX \"clipboard-mode\");\nconst QLatin1String mimeCurrentTab(COPYQ_MIME_PREFIX \"current-tab\");\nconst QLatin1String mimeSelectedItems(COPYQ_MIME_PREFIX \"selected-items\");\nconst QLatin1String mimeCurrentItem(COPYQ_MIME_PREFIX \"current-item\");\nconst QLatin1String mimeHidden(COPYQ_MIME_PREFIX \"hidden\");\nconst QLatin1String mimeShortcut(COPYQ_MIME_PREFIX \"shortcut\");\nconst QLatin1String mimeColor(COPYQ_MIME_PREFIX \"color\");\nconst QLatin1String mimeOutputTab(COPYQ_MIME_PREFIX \"output-tab\");\nconst QLatin1String mimeDisplayItemInMenu(COPYQ_MIME_PREFIX \"display-item-in-menu\");\nconst QLatin1String mimeSecret(COPYQ_MIME_PREFIX \"secret\");\n"
  },
  {
    "path": "src/common/mimetypes.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\nclass QLatin1String;\n\n#define COPYQ_MIME_PREFIX \"application/x-copyq-\"\n// Prefix for MIME format not visible to user for data private to plugins.\n#define COPYQ_MIME_PRIVATE_PREFIX COPYQ_MIME_PREFIX \"private-\"\nextern const QLatin1String mimePrivatePrefix;\nextern const QLatin1String mimeText;\nextern const QLatin1String mimeTextUtf8;\nextern const QLatin1String mimeHtml;\nextern const QLatin1String mimeUriList;\nextern const QLatin1String mimeWindowTitle;\nextern const QLatin1String mimeItems;\nextern const QLatin1String mimeItemNotes;\nextern const QLatin1String mimeIcon;\nextern const QLatin1String mimeOwner;\nextern const QLatin1String mimeClipboardMode;\nextern const QLatin1String mimeCurrentTab;\nextern const QLatin1String mimeSelectedItems;\nextern const QLatin1String mimeCurrentItem;\nextern const QLatin1String mimeHidden;\nextern const QLatin1String mimeShortcut;\nextern const QLatin1String mimeColor;\nextern const QLatin1String mimeOutputTab;\nextern const QLatin1String mimeDisplayItemInMenu;\nextern const QLatin1String mimeSecret;\n"
  },
  {
    "path": "src/common/navigationstyle.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QtGlobal>\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n#   include <QMetaType>\n#endif\n\nenum class NavigationStyle {\n    Default,\n    Vi,\n    Emacs\n};\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nQ_DECLARE_METATYPE(NavigationStyle)\n#endif\n"
  },
  {
    "path": "src/common/option.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"option.h\"\n\n#include <QObject>\n\nnamespace {\n\nQString getToolTip(const QObject &object)\n{\n    return object.property(\"toolTip\").toString();\n}\n\nQString toolTip(const QObject &object)\n{\n    const QString toolTip = getToolTip(object);\n\n    if ( toolTip.isEmpty() && object.parent() )\n        return getToolTip( *object.parent() );\n\n    return toolTip;\n}\n\n} // namespace\n\nOption::Option()\n    : m_default_value()\n    , m_value()\n    , m_property_name(nullptr)\n    , m_obj(nullptr)\n{}\n\nOption::Option(const QVariant &default_value, const char *property_name,\n               QObject *obj)\n    : m_default_value(default_value)\n    , m_value(m_default_value)\n    , m_property_name(property_name)\n    , m_obj(obj)\n{\n    if (m_obj)\n        m_obj->setProperty(m_property_name, m_default_value);\n}\n\nOption::Option(const QVariant &default_value, const char *description)\n    : m_default_value(default_value)\n    , m_value(m_default_value)\n    , m_description(description)\n{\n}\n\nQVariant Option::value() const\n{\n    return m_obj != nullptr ? m_obj->property(m_property_name) : m_value;\n}\n\nbool Option::setValue(const QVariant &value)\n{\n    if (m_obj != nullptr) {\n        m_obj->setProperty(m_property_name, value);\n        return m_obj->property(m_property_name) == value;\n    }\n\n    m_value = value;\n    return true;\n}\n\nvoid Option::reset()\n{\n    setValue(m_default_value);\n}\n\nQString Option::tooltip() const\n{\n    if (m_obj) {\n        const QString tooltip = toolTip(*m_obj);\n        if (tooltip.isEmpty()) {\n            const QString text = m_obj->property(\"text\").toString();\n            Q_ASSERT(!text.isEmpty());\n            return text;\n        }\n        return tooltip;\n    }\n\n    Q_ASSERT(m_description);\n    return m_description ? QString::fromUtf8(m_description) : QString();\n}\n"
  },
  {
    "path": "src/common/option.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QVariant>\n\nclass QObject;\n\n/**\n * Configuration option.\n */\nclass Option final {\npublic:\n    Option();\n\n    /**\n     * Create option with a default value.\n     * Current value is taken from object's property.\n     */\n    explicit Option(\n        const QVariant &default_value,\n        const char *property_name,\n        QObject *obj\n        );\n\n    explicit Option(\n        const QVariant &default_value,\n        const char *description = nullptr\n        );\n\n    /** Return current value. */\n    QVariant value() const;\n\n    /** Set current value. */\n    bool setValue(const QVariant &value);\n\n    /** Reset option to default value. */\n    void reset();\n\n    /**\n     * Tooltip for option.\n     * This text is taken from toolTip property of a QObject which was passed\n     * to constructor.\n     */\n    QString tooltip() const;\n\nprivate:\n    QVariant m_default_value;\n    QVariant m_value;\n    const char *m_property_name = nullptr;\n    const char *m_description = nullptr;\n    QObject *m_obj = nullptr;\n};\n"
  },
  {
    "path": "src/common/predefinedcommands.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"predefinedcommands.h\"\n\n#include \"common/command.h\"\n#include \"common/globalshortcutcommands.h\"\n#include \"common/mimetypes.h\"\n#include \"common/shortcuts.h\"\n#include \"common/textdata.h\"\n#include \"gui/icons.h\"\n#include \"gui/fromiconid.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QCoreApplication>\n\nnamespace {\n\nCommand *newCommand(QVector<Command> *commands)\n{\n    commands->append(Command());\n    return &commands->last();\n}\n\nclass AddCommandDialog final\n{\n    Q_DECLARE_TR_FUNCTIONS(AddCommandDialog)\n};\n\n} // namespace\n\nQVector<Command> predefinedCommands()\n{\n    const QRegularExpression reURL(\"^(https?|ftps?|file)://\");\n    const QRegularExpression reNotURL(\"^(?!(http|ftp)s?://)\");\n\n    QVector<Command> commands = globalShortcutCommands();\n    Command *c;\n\n    commands.prepend(Command());\n    c = &commands.first();\n    c->name = AddCommandDialog::tr(\"New command\");\n    c->icon = fromIconId(IconFile);\n    c->input = c->output = QString();\n    c->wait = c->automatic = c->remove = false;\n    c->sep = QLatin1String(\"\\\\n\");\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Ignore items with no or single character\");\n    c->icon = fromIconId(IconCircleExclamation);\n    c->cmd  = R\"(function hasEmptyOrSingleCharText() {\n    if (dataFormats().includes(mimeText)) {\n        const text = str(data(mimeText));\n        if (/^\\s*.?\\s*$/.test(text)) {\n            serverLog('Ignoring text with single or no character');\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction overrideFunction(fn) {\n    const oldFn = global[fn];\n    global[fn] = function() {\n        if (!hasEmptyOrSingleCharText()) {\n            oldFn();\n        }\n    }\n}\n\noverrideFunction('onClipboardChanged');\noverrideFunction('provideClipboard');\noverrideFunction('provideSelection');\n    )\";\n    c->isScript = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Open in &Browser\");\n    c->re   = reURL;\n    c->icon = fromIconId(IconGlobe);\n    c->cmd  = QStringLiteral(\"copyq open %1\");\n    c->hideWindow = true;\n    c->inMenu = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Paste as Plain Text\");\n    c->input = mimeText;\n    c->icon = fromIconId(IconPaste);\n    c->cmd  = QStringLiteral(\"copyq:\") + pasteAsPlainTextScript(\"input()\");\n    c->hideWindow = true;\n    c->inMenu = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Autoplay videos\");\n    c->re   = QRegularExpression(\"^http://.*\\\\.(mp4|avi|mkv|wmv|flv|ogv)$\");\n    c->icon = fromIconId(IconCirclePlay);\n    c->cmd  = QStringLiteral(\"copyq open %1\");\n    c->automatic = true;\n    c->hideWindow = true;\n    c->inMenu = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Copy URL (web address) to other tab\");\n    c->re   = reURL;\n    c->icon = fromIconId(IconCopy);\n    c->tab  = QStringLiteral(\"&web\");\n    c->automatic = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Create thumbnail (needs ImageMagick)\");\n    c->icon = fromIconId(IconImage);\n    c->cmd  = QStringLiteral(\"convert - -resize 92x92 png:-\");\n    c->input = QStringLiteral(\"image/png\");\n    c->output = QStringLiteral(\"image/png\");\n    c->inMenu = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Create QR Code from URL (needs qrencode)\");\n    c->re   = reURL;\n    c->icon = fromIconId(IconQrcode);\n    c->cmd  = QStringLiteral(\"qrencode -o - -t PNG -s 6\");\n    c->input = mimeText;\n    c->output = QStringLiteral(\"image/png\");\n    c->inMenu = true;\n\n    const auto todoTab = AddCommandDialog::tr(\"Tasks\", \"Tab name for some predefined commands\");\n    const auto todoTabQuoted = quoteString(todoTab);\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Add to %1 tab\", \"%1 is quoted Tasks tab name\")\n            .arg(todoTabQuoted);\n    c->icon = fromIconId(IconShare);\n    c->tab  = todoTab;\n    c->input = mimeText;\n    c->inMenu = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Move to %1 tab\", \"%1 is quoted Tasks tab name\")\n            .arg(todoTabQuoted);\n    c->icon = fromIconId(IconShare);\n    c->tab  = todoTab;\n    c->remove = true;\n    c->inMenu = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Ignore copied files\");\n    c->re   = reNotURL;\n    c->icon = fromIconId(IconCircleExclamation);\n    c->input = mimeUriList;\n    c->remove = true;\n    c->automatic = true;\n\n    if ( platformNativeInterface()->canGetWindowTitle() ) {\n        c = newCommand(&commands);\n        c->name = AddCommandDialog::tr(\"Ignore *\\\"Password\\\"* window\");\n        c->wndre = QRegularExpression(AddCommandDialog::tr(\"Password\"));\n        c->icon = fromIconId(IconAsterisk);\n        c->remove = true;\n        c->automatic = true;\n        c->cmd = QStringLiteral(\"copyq ignore\");\n    }\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Move to Trash\");\n    c->icon = fromIconId(IconTrash);\n    c->inMenu = true;\n    c->tab  = AddCommandDialog::tr(\"(trash)\");\n    c->remove = true;\n\n    c = newCommand(&commands);\n    c->name = AddCommandDialog::tr(\"Clear Current Tab\");\n    c->icon = fromIconId(IconBroom);\n    c->inMenu = true;\n    c->cmd = QStringLiteral(\"copyq: ItemSelection(selectedTab()).selectRemovable().removeAll()\");\n    c->matchCmd = QStringLiteral(\"copyq: tab(selectedTab()); if (size() == 0) fail()\");\n\n    return commands;\n}\n"
  },
  {
    "path": "src/common/predefinedcommands.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QtContainerFwd>\n\nstruct Command;\n\nQVector<Command> predefinedCommands();\n"
  },
  {
    "path": "src/common/process.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"process.h\"\n\n#include <QProcess>\n\nvoid terminateProcess(QProcess *p)\n{\n    if (p->state() == QProcess::NotRunning)\n        return;\n\n    p->terminate();\n    if ( p->state() != QProcess::NotRunning && !p->waitForFinished(5000) ) {\n        p->kill();\n        p->waitForFinished(5000);\n    }\n}\n"
  },
  {
    "path": "src/common/process.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\nclass QProcess;\n\n/**\n * Terminate process or kill if it takes too long.\n */\nvoid terminateProcess(QProcess *p);\n"
  },
  {
    "path": "src/common/processsignals.h",
    "content": "#pragma once\n\n\n#include <QObject>\n#include <QProcess>\n\ntemplate <typename Receiver>\nvoid connectProcessFinished(QProcess *process, Receiver *receiver, void (Receiver::*slot)())\n{\n    const auto processFinishedSignal = static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished);\n    QObject::connect(\n        process, processFinishedSignal, receiver,\n        [receiver, slot](int, QProcess::ExitStatus) {\n            (receiver->*slot)();\n        });\n}\n\ntemplate <typename Receiver>\nvoid connectProcessFinished(QProcess *process, Receiver *receiver, void (Receiver::*slot)(int, QProcess::ExitStatus))\n{\n    const auto processFinishedSignal = static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished);\n    QObject::connect(process, processFinishedSignal, receiver, slot);\n}\n\ntemplate <typename Receiver, typename Slot>\nvoid connectProcessError(QProcess *process, Receiver receiver, Slot slot)\n{\n    QObject::connect( process, &QProcess::errorOccurred, receiver, slot );\n}\n"
  },
  {
    "path": "src/common/regexp.h",
    "content": "#pragma once\n\n\n#include <QRegularExpression>\n\nstatic QRegularExpression anchoredRegExp(const QString &pattern)\n{\n    return QRegularExpression(QRegularExpression::anchoredPattern(pattern));\n}\n"
  },
  {
    "path": "src/common/server.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"server.h\"\n\n#include \"common/common.h\"\n#include \"common/config.h\"\n#include \"common/clientsocket.h\"\n#include \"common/client_server.h\"\n#include \"common/log.h\"\n\n#include <QDir>\n#include <QEventLoop>\n#include <QLocalServer>\n#include <QLocalSocket>\n#include <QLockFile>\n\nnamespace {\n\nbool serverIsRunning(const QString &serverName)\n{\n    QLocalSocket socket;\n    socket.connectToServer(serverName);\n    return socket.waitForConnected(-1);\n}\n\nQString lockFilePath()\n{\n    const QString lockFilePath = getConfigurationFilePath(\".lock\");\n\n    // Ensure parent dir exists.\n    const QString path = QDir::cleanPath( lockFilePath + QLatin1String(\"/..\") );\n    QDir dir(path);\n    dir.mkpath(QStringLiteral(\".\"));\n\n    return lockFilePath;\n}\n\n} // namespace\n\nstruct Server::PrivateData {\n    QLocalServer server;\n    QLockFile lockFile{lockFilePath()};\n    int socketCount = 0;\n    QEventLoop *loop = nullptr;\n};\n\nServer::Server(const QString &name, QObject *parent)\n    : QObject(parent)\n    , m_data(new PrivateData)\n{\n    if ( m_data->lockFile.tryLock() && !serverIsRunning(name) ) {\n        QLocalServer::removeServer(name);\n        if ( !m_data->server.listen(name) ) {\n            log( QStringLiteral(\"Failed to create server \\\"%1\\\": %2\")\n                 .arg(name, m_data->server.errorString()),\n                 LogError);\n        }\n    } else if (m_data->lockFile.error() == QLockFile::LockFailedError) {\n        COPYQ_LOG( QStringLiteral(\"Another process holds lock file: %1\")\n                   .arg(lockFilePath()) );\n    } else if (m_data->lockFile.error() == QLockFile::PermissionError) {\n        log( QStringLiteral(\"Insufficient permissions to create lock file: %1\")\n             .arg(lockFilePath()), LogError );\n    } else if (m_data->lockFile.error() == QLockFile::UnknownError) {\n        log( QStringLiteral(\"Failed to lock file: %1\")\n             .arg(lockFilePath()), LogError );\n    }\n}\n\nServer::~Server()\n{\n    // Postpone destroying server, otherwise it crashes when re-creating server.\n    m_data->server.deleteLater();\n}\n\nvoid Server::start()\n{\n    connect( &m_data->server, &QLocalServer::newConnection,\n             this, &Server::onNewConnection );\n\n    while (m_data->server.hasPendingConnections())\n        onNewConnection();\n}\n\nbool Server::isListening() const\n{\n    return m_data->server.isListening();\n}\n\nvoid Server::close()\n{\n    m_data->server.close();\n\n    if (m_data->socketCount > 0) {\n        COPYQ_LOG( QStringLiteral(\"Waiting for %1 sockets to disconnect\").arg(m_data->socketCount) );\n\n        QEventLoop loop;\n        m_data->loop = &loop;\n        loop.exec(QEventLoop::ExcludeUserInputEvents);\n        m_data->loop = nullptr;\n    }\n\n    m_data->lockFile.unlock();\n}\n\nvoid Server::onNewConnection()\n{\n    QLocalSocket* socket = m_data->server.nextPendingConnection();\n    if (!socket) {\n        log(\"No pending client connections!\", LogError);\n    } else if ( socket->state() != QLocalSocket::ConnectedState ) {\n        log(\"Client is not connected!\", LogError);\n        socket->deleteLater();\n    } else {\n        ++m_data->socketCount;\n        connect( socket, &QLocalSocket::disconnected,\n                 this, &Server::onSocketDestroyed );\n\n        auto clientSocket = std::make_shared<ClientSocket>(socket);\n        emit newConnection(clientSocket);\n    }\n}\n\nvoid Server::onSocketDestroyed()\n{\n    Q_ASSERT(m_data->socketCount > 0);\n    --m_data->socketCount;\n    if (m_data->loop)\n        m_data->loop->quit();\n}\n"
  },
  {
    "path": "src/common/server.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QMetaType>\n#include <QObject>\n\n#include <memory>\n\nclass ClientSocket;\nclass QEventLoop;\nclass QLocalServer;\n\nusing ClientSocketPtr = std::shared_ptr<ClientSocket>;\nQ_DECLARE_METATYPE(ClientSocketPtr)\n\nclass Server final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit Server(const QString &name, QObject *parent = nullptr);\n\n    ~Server();\n\n    void start();\n\n    bool isListening() const;\n\n    void close();\n\nsignals:\n    void newConnection(const ClientSocketPtr &socket);\n\nprivate:\n    void onNewConnection();\n    void onSocketDestroyed();\n\n    struct PrivateData;\n    std::unique_ptr<PrivateData> m_data;\n};\n"
  },
  {
    "path": "src/common/settings.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"settings.h\"\n\n#include <QCoreApplication>\n\nSettings::Settings()\n    : QSettings(\n          QSettings::defaultFormat(),\n          QSettings::UserScope,\n          QCoreApplication::organizationName(),\n          QCoreApplication::applicationName() )\n{\n}\n\nSettings::Settings(const QString &path)\n    : QSettings(path, QSettings::IniFormat)\n{\n}\n"
  },
  {
    "path": "src/common/settings.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include <QSettings>\n\nclass QString;\n\n/**\n * Simple wrapper class for QSettings.\n */\nclass Settings final : public QSettings\n{\npublic:\n    Settings();\n\n    explicit Settings(const QString &path);\n\n    Settings(const Settings &) = delete;\n    Settings &operator=(const Settings &) = delete;\n};\n"
  },
  {
    "path": "src/common/shortcuts.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"shortcuts.h\"\n\n#include <QKeySequence>\n#include <QObject>\n#include <QString>\n\nnamespace {\n\nint indexOfKeyHint(const QString &name)\n{\n    bool amp = false;\n    int i = 0;\n\n    for (const auto &c : name) {\n        if (c == '&')\n            amp = !amp;\n        else if (amp)\n            return i - 1;\n        ++i;\n    }\n\n    return -1;\n}\n\n} // namespace\n\nQString shortcutToRemove()\n{\n#ifdef Q_OS_MAC\n    return QObject::tr(\"Backspace\", \"Key to remove item or MIME on OS X\");\n#else\n    return QObject::tr(\"Delete\", \"Key to remove item or MIME\");\n#endif\n}\n\nQString portableShortcutText(const QKeySequence &shortcut)\n{\n    // WORKAROUND: Qt has convert some keys to upper case which\n    //             breaks some shortcuts on some keyboard layouts.\n    return shortcut.toString(QKeySequence::PortableText).toLower();\n}\n\nQString toPortableShortcutText(const QString &shortcutNativeText)\n{\n    return portableShortcutText(\n                QKeySequence(shortcutNativeText, QKeySequence::NativeText));\n}\n\nbool hasKeyHint(const QString &name)\n{\n    return indexOfKeyHint(name) != -1;\n}\n\nQString &removeKeyHint(QString *name)\n{\n    const int i = indexOfKeyHint(*name);\n    return i == -1 ? *name : name->remove(i, 1);\n}\n"
  },
  {
    "path": "src/common/shortcuts.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QString;\nclass QKeySequence;\n\n/**\n * Shortcut to remove items, formats etc.\n */\nQString shortcutToRemove();\n\nQString portableShortcutText(const QKeySequence &shortcut);\n\nQString toPortableShortcutText(const QString &shortcutNativeText);\n\n/// Returns true only if UI name contains key hint (unescaped '&').\nbool hasKeyHint(const QString &name);\n\n/// Removes key hint (first unescaped '&') from UI name.\nQString &removeKeyHint(QString *name);\n"
  },
  {
    "path": "src/common/sleeptimer.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QCoreApplication>\n#include <QElapsedTimer>\n\nclass SleepTimer final\n{\npublic:\n    explicit SleepTimer(int timeoutMs, int minSleepCount = 2)\n        : m_timeoutMs(timeoutMs)\n        , m_minSleepCount(minSleepCount)\n    {\n        m_timer.start();\n    }\n\n    bool sleep()\n    {\n        if (m_minSleepCount <= 0 && m_timer.elapsed() >= m_timeoutMs)\n            return false;\n\n        --m_minSleepCount;\n        QCoreApplication::processEvents(QEventLoop::AllEvents, 5);\n        return true;\n    }\n\nprivate:\n    QElapsedTimer m_timer;\n    int m_timeoutMs;\n    int m_minSleepCount = 2;\n};\n\ninline void waitFor(int ms)\n{\n    SleepTimer t(ms);\n    while (t.sleep()) {}\n}\n"
  },
  {
    "path": "src/common/tabs.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"tabs.h\"\n\n#include <QRegularExpression>\n#include <QSettings>\n\nconstexpr auto settingsGroupTabs = \"Tabs\";\nconstexpr auto optionTabName = \"name\";\nconstexpr auto optionIconName = \"icon\";\nconstexpr auto optionMaxItemCount = \"max_item_count\";\nconstexpr auto optionStoreItems = \"store_items\";\nconstexpr auto optionEncryptedExpireSeconds = \"encrypted_expire_seconds\";\n\nstruct Tabs::PrivateData {\n    QHash<QString, TabProperties> tabs;\n};\n\nTabs::Tabs()\n    : m_data(new PrivateData())\n{\n    QSettings settings;\n    const int size = settings.beginReadArray(settingsGroupTabs);\n    for(int i = 0; i < size; ++i) {\n        settings.setArrayIndex(i);\n\n        TabProperties properties;\n        properties.name = settings.value(optionTabName).toString();\n        properties.iconName = settings.value(optionIconName).toString();\n        properties.storeItems = settings.value(optionStoreItems, true).toBool();\n\n        bool ok;\n        const int maxItemCount = settings.value(optionMaxItemCount).toInt(&ok);\n        if (ok)\n            properties.maxItemCount = maxItemCount;\n        const int encryptedExpireSeconds = settings.value(optionEncryptedExpireSeconds).toInt(&ok);\n        if (ok)\n            properties.encryptedExpireSeconds = encryptedExpireSeconds;\n\n        setTabProperties(properties);\n    }\n}\n\nTabs::~Tabs() = default;\n\nTabs::Tabs(const Tabs &other)\n    : m_data(new PrivateData())\n{\n    m_data->tabs = other.m_data->tabs;\n}\n\nTabs &Tabs::operator=(const Tabs &other)\n{\n    m_data->tabs = other.m_data->tabs;\n    return *this;\n}\n\nvoid Tabs::setTabProperties(const TabProperties &tabProperties)\n{\n    if ( tabProperties.name.isEmpty() )\n        return;\n\n    m_data->tabs[tabProperties.name] = tabProperties;\n}\n\nvoid Tabs::save(QSettings *settings, const QStringList &tabs)\n{\n    settings->beginWriteArray(settingsGroupTabs, m_data->tabs.size());\n\n    int row = 0;\n    for (auto it = m_data->tabs.constBegin(); it != m_data->tabs.constEnd(); ++it) {\n        const auto &name = it.key();\n        const auto &tab = it.value();\n\n        const bool isTab = tabs.contains(name);\n        const bool isTabGroup =\n            !isTab && tabs.indexOf(QRegularExpression(QString::fromLatin1(\"^%1/.*\").arg(QRegularExpression::escape(name)))) != -1;\n\n        if (isTab || isTabGroup) {\n            settings->setArrayIndex(row++);\n            settings->setValue(optionTabName, name);\n            settings->setValue(optionIconName, tab.iconName);\n            if (isTab) {\n                settings->setValue(optionMaxItemCount, tab.maxItemCount);\n                settings->setValue(optionStoreItems, tab.storeItems);\n                settings->setValue(optionEncryptedExpireSeconds, tab.encryptedExpireSeconds);\n            }\n        }\n    }\n\n    settings->endArray();\n}\n\nTabProperties Tabs::tabProperties(const QString &name) const\n{\n    TabProperties tab = m_data->tabs.value(name);\n    tab.name = name;\n    return tab;\n}\n"
  },
  {
    "path": "src/common/tabs.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QString>\n#include <QtContainerFwd>\n\n#include <memory>\n\nclass QSettings;\n\nstruct TabProperties {\n    QString name;\n    QString iconName;\n    int maxItemCount = 0;\n    bool storeItems = true;\n    int encryptedExpireSeconds = 0;\n};\n\nclass Tabs\n{\npublic:\n    Tabs();\n    ~Tabs();\n\n    Tabs(const Tabs &other);\n    Tabs &operator=(const Tabs &other);\n\n    TabProperties tabProperties(const QString &name) const;\n    void setTabProperties(const TabProperties &tabProperties);\n\n    void save(QSettings *settings, const QStringList &tabs);\n\nprivate:\n    struct PrivateData;\n    std::unique_ptr<PrivateData> m_data;\n};\n"
  },
  {
    "path": "src/common/temporaryfile.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"temporaryfile.h\"\n\n#include <QDir>\n#include <QLoggingCategory>\n#include <QTemporaryFile>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(tempFileCategory)\nQ_LOGGING_CATEGORY(tempFileCategory, \"copyq.temporaryfile\")\n\n} // namespace\n\nbool openTemporaryFile(QTemporaryFile *file, const QString &suffix)\n{\n    const QString tmpFileName = \"CopyQ.XXXXXX\" + suffix;\n    const QString tmpPath = QDir( QDir::tempPath() ).absoluteFilePath(tmpFileName);\n    file->setFileTemplate(tmpPath);\n\n    if ( !file->open() ) {\n        qCCritical(tempFileCategory) << \"Failed to open temporary file\"\n            << file->fileName() << \"template\" << tmpPath << \":\" << file->errorString();\n        return false;\n    }\n\n    if ( !file->setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner) ) {\n        qCCritical(tempFileCategory) << \"Failed set permissions to temporary file\"\n            << file->fileName() << \":\" << file->errorString();\n        return false;\n    }\n\n    return true;\n}\n"
  },
  {
    "path": "src/common/temporaryfile.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n\nclass QString;\nclass QTemporaryFile;\n\nbool openTemporaryFile(QTemporaryFile *file, const QString &suffix);\n"
  },
  {
    "path": "src/common/temporarysettings.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"temporarysettings.h\"\n\n#include \"common/log.h\"\n#include \"common/temporaryfile.h\"\n\n#include <QSettings>\n#include <QTemporaryFile>\n\nnamespace {\n\nQString temporaryFileName(const QByteArray &content)\n{\n    QTemporaryFile tmpfile;\n    if ( !openTemporaryFile(&tmpfile, \".ini\") )\n    {\n        log(\"Failed to create temporary settings file\", LogError);\n        return QString();\n    }\n\n    tmpfile.write(content);\n    tmpfile.setAutoRemove(false);\n    return tmpfile.fileName();\n}\n\n} // namespace\n\nTemporarySettings::TemporarySettings(const QByteArray &content)\n    : m_settings(new QSettings(temporaryFileName(content), QSettings::IniFormat))\n{\n}\n\nTemporarySettings::~TemporarySettings()\n{\n    const QString fileName = m_settings->fileName();\n    delete m_settings;\n    m_settings = nullptr;\n\n    if (!fileName.isEmpty())\n        QFile::remove(fileName);\n}\n\nQSettings *TemporarySettings::settings()\n{\n    return m_settings;\n}\n\nQByteArray TemporarySettings::content()\n{\n    m_settings->sync();\n\n    QFile file(m_settings->fileName());\n    if (!file.open(QIODevice::ReadOnly)) {\n        log(\"Failed to open temporary settings file\", LogError);\n        return QByteArray();\n    }\n\n    return file.readAll();\n}\n"
  },
  {
    "path": "src/common/temporarysettings.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QByteArray;\nclass QSettings;\n\n/**\n * Temporary ini settings which is removed after destroyed.\n *\n * Use this to get ini as data instead of saving to a file.\n */\nclass TemporarySettings final\n{\npublic:\n    /// Creates temporary settings file.\n    explicit TemporarySettings(const QByteArray &content);\n\n    /// Destroys underlying settings and removes settings file.\n    ~TemporarySettings();\n\n    /// Returns underlying settings.\n    QSettings *settings();\n\n    /// Return content of settings file.\n    QByteArray content();\n\n    TemporarySettings(const TemporarySettings &) = delete;\n    TemporarySettings &operator=(const TemporarySettings &) = delete;\n\nprivate:\n    QSettings *m_settings;\n};\n"
  },
  {
    "path": "src/common/textdata.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"textdata.h\"\n\n#include \"common/mimetypes.h\"\n\n#include <QLocale>\n#include <QString>\n#include <QVariantMap>\n\n#include <algorithm>\n#include <iterator>\n\nnamespace {\n\nconst QLatin1String mimePluginPrefix(COPYQ_MIME_PREFIX \"item\");\n\nQString escapeHtmlSpaces(const QString &str)\n{\n    return QString(str)\n            .replace(' ', QLatin1String(\"&nbsp;\"))\n            .replace('\\n', QLatin1String(\"<br />\"));\n}\n\nbool isPluginFormat(const QString &mime)\n{\n    return mime.startsWith(mimePrivatePrefix) || (\n        mime.startsWith(mimePluginPrefix)\n        && mime.size() > mimePluginPrefix.size()\n    );\n}\n\n} // namespace\n\nuint hash(const QVariantMap &data)\n{\n    uint seed = 0;\n#if QT_VERSION >= QT_VERSION_CHECK(6,10,0)\n    QtPrivate::QHashCombine hash(seed);\n#else\n    QtPrivate::QHashCombine hash;\n#endif\n\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        const auto &mime = it.key();\n\n        // Skip some special data.\n        if (mime == mimeWindowTitle || mime == mimeOwner || mime == mimeClipboardMode)\n            continue;\n\n        if ( isPluginFormat(mime) )\n            continue;\n\n        seed = hash(seed, mime);\n\n        const auto &value = it.value();\n        if ( value.type() == QVariant::ByteArray )\n            seed = hash(seed, value.toByteArray());\n        else\n            seed = hash(seed, value.toString());\n    }\n\n    return seed;\n}\n\nQString quoteString(const QString &str)\n{\n    return QLocale().quoteString(str);\n}\n\nQString escapeHtml(const QString &str)\n{\n    return escapeHtmlSpaces(str.toHtmlEscaped());\n}\n\nQString getTextData(const QByteArray &bytes)\n{\n    // QString::fromUtf8(bytes) ends string at first '\\0'.\n    return QString::fromUtf8( bytes.constData(), bytes.size() );\n}\n\nQString getTextData(const QVariantMap &data, const QString &mime)\n{\n    if (mime.isEmpty())\n        return getTextData(data);\n\n    const auto it = data.find(mime);\n    if ( it != data.constEnd() )\n        return getTextData( it->toByteArray() );\n\n    return QString();\n}\n\nQString getTextData(const QVariantMap &data)\n{\n    for (const auto &mime : {mimeTextUtf8, mimeText, mimeUriList}) {\n        const auto it = data.find(mime);\n        if ( it != data.constEnd() )\n            return getTextData( it->toByteArray() );\n    }\n\n    return QString();\n}\n\nvoid setTextData(QVariantMap *data, const QString &text, const QString &mime)\n{\n    data->insert(mime, text.toUtf8());\n}\n\nvoid setTextData(QVariantMap *data, const QString &text)\n{\n    setTextData(data, text, mimeText);\n    data->remove(mimeTextUtf8);\n}\n\nQVariantMap createDataMap(const QString &format, const QVariant &value)\n{\n    QVariantMap dataMap;\n    dataMap.insert(format, value);\n    return dataMap;\n}\n\nQVariantMap createDataMap(const QString &format, const QByteArray &value)\n{\n    return createDataMap( format, QVariant(value) );\n}\n\nQVariantMap createDataMap(const QString &format, const QString &value)\n{\n    return createDataMap( format, value.toUtf8() );\n}\n\nQString accentsRemoved(const QString &text)\n{\n    if (text.isEmpty())\n        return {};\n\n    QString result = text.normalized(QString::NormalizationForm_D);\n    const auto newEnd = std::remove_if(\n        std::begin(result), std::end(result),\n        [](QChar c){ return c.category() == QChar::Mark_NonSpacing; });\n    const auto newSize = std::distance(std::begin(result), newEnd);\n    result.resize(newSize);\n    return result;\n}\n"
  },
  {
    "path": "src/common/textdata.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QtContainerFwd>\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n#include <QVariantMap>\n#endif\n\nclass QByteArray;\nclass QString;\n\nuint hash(const QVariantMap &data);\n\nQString quoteString(const QString &str);\n\nQString escapeHtml(const QString &str);\n\nQString getTextData(const QByteArray &bytes);\n\n/**\n * Get given text format from data; null string if not available.\n * Assumes that text data is UTF8 encoded.\n */\nQString getTextData(const QVariantMap &data, const QString &mime);\n\n/** Helper function that calls getTextData(data, \"text/plain\"). */\nQString getTextData(const QVariantMap &data);\n\nvoid setTextData(QVariantMap *data, const QString &text, const QString &mime);\n\nvoid setTextData(QVariantMap *data, const QString &text);\n\nQVariantMap createDataMap(const QString &format, const QVariant &value);\n\nQVariantMap createDataMap(const QString &format, const QByteArray &value);\n\nQVariantMap createDataMap(const QString &format, const QString &value);\n\n/// Returns text without accents/diacritics.\nQString accentsRemoved(const QString &text);\n"
  },
  {
    "path": "src/common/timer.h",
    "content": "#pragma once\n\n#include <QTimer>\n\ntemplate <typename Receiver, typename Slot>\nvoid initSingleShotTimer(QTimer *timer, int milliseconds, const Receiver *receiver, Slot slot)\n{\n    timer->setSingleShot(true);\n    timer->setInterval(milliseconds);\n\n    Q_ASSERT(receiver);\n    if (!receiver)\n        return;\n\n    // Unique connection only works with member functions.\n    const auto flags = std::is_invocable<Slot&>() ? Qt::AutoConnection : Qt::UniqueConnection;\n    QObject::connect(timer, &QTimer::timeout, receiver, slot, flags);\n}\n"
  },
  {
    "path": "src/common/version.cpp.in",
    "content": "#include \"common/version.h\"\n#include <QLatin1String>\nconst QLatin1String versionString(\"${copyq_version}\");\n"
  },
  {
    "path": "src/common/version.h",
    "content": "#pragma once\nclass QLatin1String;\nextern const QLatin1String versionString;\n"
  },
  {
    "path": "src/copyq.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file alias=\"images/icon\">images/icon.svg</file>\n        <file alias=\"images/icon_mask\">images/icon_mask.svg</file>\n        <file alias=\"images/tab_icon\">images/tab_icon.svg</file>\n        <file alias=\"images/tab_new\">images/tab_new.svg</file>\n        <file alias=\"images/tab_rename\">images/tab_rename.svg</file>\n        <file alias=\"images/tab_remove\">images/tab_remove.svg</file>\n        <file alias=\"images/logo.png\">images/icon_512x512.png</file>\n        <file>images/fontawesome.ttf</file>\n        <file alias=\"knotifications6/copyq.notifyrc\">knotifications5/copyq.notifyrc</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/copyq.rc",
    "content": "DI_ICON1               ICON    DISCARDABLE     \"images/icon.ico\"\n"
  },
  {
    "path": "src/gui/aboutdialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"aboutdialog.h\"\n#include \"ui_aboutdialog.h\"\n\n#include \"common/textdata.h\"\n#include \"common/version.h\"\n#include \"gui/icons.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/theme.h\"\n\nnamespace {\n\nQString helpUrl(const char *url)\n{\n    return QString::fromLatin1(\"<a href='%1'>%1</a>\").arg(url);\n}\n\nQString helpMail(const char *url)\n{\n    return QString::fromLatin1(\"<a href='mailto:%1'>%1</a>\").arg(url);\n}\n\nQString helpLink(const QString &name, const QString &link, ushort icon)\n{\n    return \"<tr>\"\n           \"<td class='info'>\" + name + \"</td>\"\n           \"<td valign='middle' align='center' class='help-icon icon'>\"\n           + QString(\"&#%1;\").arg(icon) + \"</td>\"\n           \"<td>\" + link + \"</td>\"\n           \"</tr>\";\n}\n\nQString helpLib(const char *name, const QString &copyright, const char *url)\n{\n    return QString(\"<p><span class='library'>%1</span>\"\n                   \"&nbsp;&nbsp;&nbsp;<br />\"\n                   \"<span class='copyright'>%2</span><br />\"\n                   \"%3</p>\")\n            .arg( name, copyright, helpUrl(url) );\n}\n\n} // namespace\n\nAboutDialog::AboutDialog(const Theme &theme, QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::AboutDialog)\n{\n    ui->setupUi(this);\n    ui->textBrowser->setText( aboutPage(theme) );\n}\n\nAboutDialog::~AboutDialog()\n{\n    delete ui;\n}\n\nQString AboutDialog::aboutPage(const Theme &theme)\n{\n    const auto bg = theme.color(\"bg\").name();\n    const auto fg = theme.color(\"fg\").name();\n    const auto link = theme.color(\"num_fg\").name();\n    return\n        \"<html>\"\n\n        \"<head><style type='text/css'>\"\n        \"body{font-size:10pt;background:\" + bg + \";color:\" + fg + \";margin:1.0em}\"\n        \"p,li{margin-left:4ex;white-space:pre-wrap;margin-left:1ex}\"\n        \"a{text-decoration:none;color:\" + link + \"}\"\n        \"table{border:0}\"\n        \"td{padding:0.1em}\"\n        \"#title{font-size:26pt;white-space:pre;margin-bottom:0.2em}\"\n        \"#subtitle{font-size:16pt;color:\" + link + \";white-space:pre;margin-bottom:0.2em}\"\n        \"#version{font-size:12pt}\"\n        \".copyright{font-size:9pt}\"\n        \".icon{font-family: \\\"\" + iconFontFamily() + \"\\\"}\"\n        \".help-icon{color:\" + link + \";padding-left:1em;padding-right:1em}\"\n        \".library{font-size:12pt}\"\n        \"</style></head>\"\n\n        \"<body>\"\n\n        \"<table><tr valign='middle'>\"\n        \"<td><img src=':/images/logo.png' width='128' /></td>\"\n        \"<td>\"\n        \"<div id='title'>CopyQ</div>\"\n        \"<div id='subtitle'>\" + escapeHtml(tr(\"Clipboard Manager\")) + \"</div>\"\n        \"<div id='version'>\" + versionString + \"</div>\"\n        \"</td>\"\n        \"</tr></table>\"\n\n        \"<p>\"\n        \"<table class='links'>\"\n            + helpLink( tr(\"Author\"), QString::fromUtf8(\"Lukáš Holeček\"), IconUser )\n            + helpLink( tr(\"E-mail\"), helpMail(\"copyq@googlegroups.com\"), IconEnvelope )\n            + helpLink( tr(\"Web\"), helpUrl(\"https://hluk.github.io/CopyQ/\"), IconHouse )\n            + helpLink( tr(\"Donate\"), helpUrl(\"https://liberapay.com/CopyQ/\"), IconGift )\n            +\n        \"</table>\"\n        \"</p>\"\n\n        \"<p class='copyright'>Copyright (c) 2009 - 2024</p>\"\n\n        \"<p></p>\"\n\n        + \"<p>\"\n            + helpUrl(\"https://github.com/hluk/CopyQ/graphs/contributors\")\n            +\n        \"</p>\"\n\n            + helpLib(\"Qt Toolkit\",\n                      \"Copyright (c) The Qt Company Ltd. and other contributors\",\n                      \"https://www.qt.io/\")\n            + helpLib(\"KDE Frameworks\",\n                      \"Copyright (c) KDE Community\",\n                      \"https://develop.kde.org/products/frameworks/\")\n            + helpLib(\"Snoretoast\",\n                      \"Copyright (c) Hannah von Reth\",\n                      \"https://invent.kde.org/libraries/snoretoast\")\n            + helpLib(\"Weblate\",\n                      \"Copyright (c) Michal &#268;iha&#345;\", \"https://weblate.org\")\n            + helpLib(\"Font Awesome\",\n                      \"Copyright (c) Fonticons, Inc.\", \"https://fontawesome.com\")\n            + helpLib(\"LibQxt\",\n                      \"Copyright (c), the LibQxt project\", \"https://bitbucket.org/libqxt/libqxt/wiki/Home\")\n#ifdef WITH_AUDIO\n            + helpLib(\"miniaudio\",\n                      \"Copyright (c) David Reid\",\n                      \"https://miniaud.io/\")\n#endif\n            + helpLib(\"Solarized\",\n                      \"Copyright (c) Ethan Schoonover\", \"https://ethanschoonover.com/solarized\")\n\n        + \"<p></p>\"\n\n        \"</body></html>\";\n}\n"
  },
  {
    "path": "src/gui/aboutdialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n\nclass Theme;\n\nnamespace Ui {\n    class AboutDialog;\n}\n\nclass AboutDialog final : public QDialog\n{\n    Q_OBJECT\npublic:\n    explicit AboutDialog(const Theme &theme, QWidget *parent = nullptr);\n    ~AboutDialog();\n\nprivate:\n    static QString aboutPage(const Theme &theme);\n\n    Ui::AboutDialog *ui;\n};\n"
  },
  {
    "path": "src/gui/actiondialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"actiondialog.h\"\n#include \"ui_actiondialog.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/command.h\"\n#include \"common/config.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"item/serialize.h\"\n\n#include <QAbstractButton>\n#include <QFile>\n#include <QLoggingCategory>\n#include <QMessageBox>\n#include <QShortcut>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.actiondialog\")\n\nvoid initFormatComboBox(QComboBox *combo, const QStringList &additionalFormats = QStringList())\n{\n    QStringList formats = QStringList() << QString() << QString(mimeText) << additionalFormats;\n    formats.removeDuplicates();\n    combo->clear();\n    combo->addItems(formats);\n}\n\nbool wasChangedByUser(QObject *object)\n{\n    return object->property(\"UserChanged\").toBool();\n}\n\nvoid setChangedByUser(QWidget *object)\n{\n    object->setProperty(\"UserChanged\", object->hasFocus());\n}\n\nQString commandToLabel(const QString &command)\n{\n    QString label = command.size() > 48 ? command.left(48) + \"...\" : command;\n    label.replace('\\n', \" \");\n    label.replace(QRegularExpression(\"\\\\s\\\\+\"), \" \");\n    return label;\n}\n\n} // namespace\n\nActionDialog::ActionDialog(QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::ActionDialog)\n    , m_data()\n    , m_currentCommandIndex(-1)\n{\n    ui->setupUi(this);\n\n    // WORKAROUND for broken initial focus in Qt 6.6 (QTBUG-121514)\n    ui->comboBoxCommands->setFocus();\n\n    auto shortcut = new QShortcut(QKeySequence(Qt::ControlModifier | Qt::Key_P), this);\n    connect(shortcut, &QShortcut::activated, this, &ActionDialog::previousCommand);\n    shortcut = new QShortcut(QKeySequence(Qt::ControlModifier | Qt::Key_N), this);\n    connect(shortcut, &QShortcut::activated, this, &ActionDialog::nextCommand);\n\n    connect(ui->buttonBox, &QDialogButtonBox::clicked,\n            this, &ActionDialog::onButtonBoxClicked);\n    connect(ui->comboBoxCommands, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),\n            this, &ActionDialog::onComboBoxCommandsCurrentIndexChanged);\n    connect(ui->comboBoxInputFormat, &QComboBox::currentTextChanged,\n            this, &ActionDialog::onComboBoxInputFormatCurrentTextChanged);\n    connect(ui->comboBoxOutputFormat, &QComboBox::editTextChanged,\n            this, &ActionDialog::onComboBoxOutputFormatEditTextchanged);\n    connect(ui->comboBoxOutputTab, &QComboBox::editTextChanged,\n            this, &ActionDialog::onComboBoxOutputTabEditTextChanged);\n    connect(ui->separatorEdit, &QLineEdit::textEdited,\n            this, &ActionDialog::onSeparatorEditTextEdited);\n\n    onComboBoxInputFormatCurrentTextChanged(QString());\n    onComboBoxOutputFormatEditTextchanged(QString());\n    loadSettings();\n}\n\nActionDialog::~ActionDialog()\n{\n    delete ui;\n}\n\nvoid ActionDialog::setInputData(const QVariantMap &data)\n{\n    m_data = data;\n\n    QString defaultFormat = ui->comboBoxInputFormat->currentText();\n    initFormatComboBox(ui->comboBoxInputFormat, data.keys());\n    const int index = qMax(0, ui->comboBoxInputFormat->findText(defaultFormat));\n    ui->comboBoxInputFormat->setCurrentIndex(index);\n}\n\nvoid ActionDialog::restoreHistory()\n{\n    const int maxCount = AppConfig().option<Config::command_history_size>();\n    ui->comboBoxCommands->setMaxCount(maxCount + 1);\n    ui->comboBoxCommands->clear();\n    ui->comboBoxCommands->addItem(QString());\n    ui->comboBoxCommands->setCurrentIndex(0);\n\n    QFile file( dataFilename() );\n    if ( !file.exists() )\n        return;\n\n    if ( !file.open(QIODevice::ReadOnly) ) {\n        qCWarning(logCategory) << \"Failed to restore Action dialog history from\"\n            << file.fileName() << \":\" << file.errorString();\n        return;\n    }\n\n    QDataStream in(&file);\n    QVariant v;\n\n    while( !in.atEnd() && ui->comboBoxCommands->count() <= maxCount ) {\n        in >> v;\n        const QVariantMap values = v.value<QVariantMap>();\n        const QString cmd = values.value(\"cmd\").toString();\n        ui->comboBoxCommands->addItem( commandToLabel(cmd), v );\n    }\n}\n\nconst QString ActionDialog::dataFilename() const\n{\n    return getConfigurationFilePath(\"_cmds.dat\");\n}\n\nvoid ActionDialog::saveHistory()\n{\n    QFile file( dataFilename() );\n    if ( !file.open(QIODevice::WriteOnly) ) {\n        qCWarning(logCategory) << \"Failed to save Action dialog history to\"\n            << file.fileName() << \":\" << file.errorString();\n        return;\n    }\n\n    QDataStream out(&file);\n\n    for (int i = 1; i < ui->comboBoxCommands->count(); ++i) {\n        const QVariant itemData = ui->comboBoxCommands->itemData(i);\n        out << itemData;\n    }\n}\n\nvoid ActionDialog::setCommand(const Command &cmd)\n{\n    ui->comboBoxCommands->setCurrentIndex(0);\n    ui->commandEdit->setCommand(cmd.cmd);\n    ui->separatorEdit->setText(cmd.sep);\n\n    int index = ui->comboBoxInputFormat->findText(cmd.input);\n    if (index == -1) {\n        ui->comboBoxInputFormat->insertItem(0, cmd.input);\n        index = 0;\n    }\n    ui->comboBoxInputFormat->setCurrentIndex(index);\n\n    ui->comboBoxOutputFormat->setEditText(cmd.output);\n}\n\nvoid ActionDialog::setOutputTabs(const QStringList &tabs)\n{\n    QComboBox *w = ui->comboBoxOutputTab;\n    w->clear();\n    w->addItem(\"\");\n    w->addItems(tabs);\n}\n\nvoid ActionDialog::setCurrentTab(const QString &currentTabName)\n{\n    ui->comboBoxOutputTab->setEditText(currentTabName);\n}\n\nvoid ActionDialog::loadSettings()\n{\n    initFormatComboBox(ui->comboBoxInputFormat);\n    initFormatComboBox(ui->comboBoxOutputFormat);\n    restoreHistory();\n}\n\nCommand ActionDialog::command() const\n{\n    Command cmd;\n\n    cmd.cmd = ui->commandEdit->command();\n    cmd.name = commandToLabel(cmd.cmd);\n    cmd.input = ui->comboBoxInputFormat->currentText();\n    cmd.output = ui->comboBoxOutputFormat->currentText();\n    cmd.sep = ui->separatorEdit->text();\n    cmd.outputTab = ui->comboBoxOutputTab->currentText();\n\n    return cmd;\n}\n\nvoid ActionDialog::onButtonBoxClicked(QAbstractButton* button)\n{\n    switch ( ui->buttonBox->standardButton(button) ) {\n    case QDialogButtonBox::Ok:\n        acceptCommand();\n        saveCurrentCommandToHistory();\n        close();\n        break;\n\n    case QDialogButtonBox::Apply:\n        acceptCommand();\n        saveCurrentCommandToHistory();\n        break;\n\n    case QDialogButtonBox::Cancel:\n        close();\n        break;\n\n    default:\n        break;\n    }\n}\n\nvoid ActionDialog::onComboBoxCommandsCurrentIndexChanged(int index)\n{\n    if ( m_currentCommandIndex >= 0 && m_currentCommandIndex < ui->comboBoxCommands->count() ) {\n        QVariant itemData = createCurrentItemData();\n        if (itemData != ui->comboBoxCommands->itemData(m_currentCommandIndex))\n            ui->comboBoxCommands->setItemData(m_currentCommandIndex, itemData);\n    }\n\n    m_currentCommandIndex = index;\n\n    // Restore values from history.\n    QVariant v = ui->comboBoxCommands->itemData(index);\n    QVariantMap values = v.value<QVariantMap>();\n\n    ui->commandEdit->setCommand(values.value(\"cmd\").toString());\n\n    // Don't automatically change values if they were edited by user.\n    if ( !wasChangedByUser(ui->comboBoxInputFormat) ) {\n        int i = ui->comboBoxInputFormat->findText(values.value(\"input\").toString());\n        if (i != -1)\n            ui->comboBoxInputFormat->setCurrentIndex(i);\n    }\n\n    if ( !wasChangedByUser(ui->comboBoxOutputFormat) )\n        ui->comboBoxOutputFormat->setEditText(values.value(\"output\").toString());\n\n    if ( !wasChangedByUser(ui->separatorEdit) )\n        ui->separatorEdit->setText(values.value(\"sep\").toString());\n\n    const auto outputTab = values.value(\"outputTab\").toString();\n    if ( !wasChangedByUser(ui->comboBoxOutputTab) && !outputTab.isEmpty() )\n        ui->comboBoxOutputTab->setEditText(values.value(outputTab).toString());\n}\n\nvoid ActionDialog::onComboBoxInputFormatCurrentTextChanged(const QString &format)\n{\n    setChangedByUser(ui->comboBoxInputFormat);\n\n    const bool show = format.startsWith(\"text\", Qt::CaseInsensitive);\n    ui->inputText->setVisible(show);\n\n    QString text;\n    if ((show || format.isEmpty()) && !m_data.isEmpty() )\n        text = getTextData( m_data, format.isEmpty() ? mimeText : format );\n    ui->inputText->setPlainText(text);\n}\n\nvoid ActionDialog::onComboBoxOutputFormatEditTextchanged(const QString &text)\n{\n    setChangedByUser(ui->comboBoxOutputFormat);\n\n    const bool showSeparator = text.startsWith(\"text\", Qt::CaseInsensitive);\n    ui->separatorLabel->setVisible(showSeparator);\n    ui->separatorEdit->setVisible(showSeparator);\n\n    const bool showOutputTab = !text.isEmpty();\n    ui->labelOutputTab->setVisible(showOutputTab);\n    ui->comboBoxOutputTab->setVisible(showOutputTab);\n}\n\nvoid ActionDialog::onComboBoxOutputTabEditTextChanged(const QString &)\n{\n    setChangedByUser(ui->comboBoxOutputTab);\n}\n\nvoid ActionDialog::onSeparatorEditTextEdited(const QString &)\n{\n    setChangedByUser(ui->separatorEdit);\n}\n\nvoid ActionDialog::nextCommand()\n{\n    const int index = ui->comboBoxCommands->currentIndex();\n    ui->comboBoxCommands->setCurrentIndex(index - 1);\n}\n\nvoid ActionDialog::previousCommand()\n{\n    const int index = ui->comboBoxCommands->currentIndex();\n    ui->comboBoxCommands->setCurrentIndex(index + 1);\n}\n\nvoid ActionDialog::acceptCommand()\n{\n    const auto command = this->command();\n\n    auto re = command.re;\n    const QString text = getTextData(m_data);\n    const auto m = re.match(text);\n    auto capturedTexts = m.capturedTexts();\n    if ( capturedTexts.isEmpty() )\n        capturedTexts.append(QString());\n    capturedTexts[0] = text;\n\n    if ( ui->inputText->isVisible() )\n        m_data[mimeText] = ui->inputText->toPlainText();\n\n    emit commandAccepted(command, capturedTexts, m_data);\n}\n\nQVariant ActionDialog::createCurrentItemData()\n{\n    QVariantMap values;\n    values[\"cmd\"] = ui->commandEdit->command();\n    values[\"input\"] = ui->comboBoxInputFormat->currentText();\n    values[\"output\"] = ui->comboBoxOutputFormat->currentText();\n    values[\"sep\"] = ui->separatorEdit->text();\n    values[\"outputTab\"] = ui->comboBoxOutputTab->currentText();\n\n    return values;\n}\n\nvoid ActionDialog::saveCurrentCommandToHistory()\n{\n    const QString cmd = ui->commandEdit->command();\n    const QVariant itemData = createCurrentItemData();\n    ui->comboBoxCommands->setCurrentIndex(0);\n\n    for (int i = ui->comboBoxCommands->count() - 1; i >= 1; --i) {\n        const QVariant itemData2 = ui->comboBoxCommands->itemData(i);\n        const QString cmd2 = itemData2.toMap().value(\"cmd\").toString();\n        if (cmd2.isEmpty() || cmd == cmd2)\n            ui->comboBoxCommands->removeItem(i);\n    }\n\n    if ( cmd.isEmpty() ) {\n        ui->comboBoxCommands->setItemData(0, itemData);\n    } else {\n        ui->comboBoxCommands->insertItem(1, commandToLabel(cmd), itemData);\n        ui->comboBoxCommands->setCurrentIndex(1);\n    }\n\n    saveHistory();\n}\n"
  },
  {
    "path": "src/gui/actiondialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n#include <QModelIndex>\n#include <QPersistentModelIndex>\n#include <QRegularExpression>\n#include <QVariantMap>\n\nclass QAbstractButton;\nstruct Command;\n\nnamespace Ui {\n    class ActionDialog;\n}\n\n/** Dialog class for executing Command objects. */\nclass ActionDialog final : public QDialog {\n    Q_OBJECT\npublic:\n    explicit ActionDialog(QWidget *parent = nullptr);\n    ~ActionDialog();\n\n    /** Restore command history from configuration. */\n    void restoreHistory();\n\n    /** Save command history. */\n    void saveHistory();\n\n    /** Return filename for storing command history. */\n    const QString dataFilename() const;\n\n    /** Set action input data. */\n    void setInputData(const QVariantMap &data);\n    /** Set command for dialog. */\n    void setCommand(const Command &cmd);\n    /** Set texts for tabs in combo box. */\n    void setOutputTabs(const QStringList &tabs);\n\n    void setCurrentTab(const QString &currentTabName);\n\n    /** Load settings. */\n    void loadSettings();\n\n    /** Return current command. */\n    Command command() const;\n\nsignals:\n    /** Emitted if dialog was accepted. */\n    void commandAccepted(const Command &command, const QStringList &arguments, const QVariantMap &data);\n\nprivate:\n    void onButtonBoxClicked(QAbstractButton* button);\n    void onComboBoxCommandsCurrentIndexChanged(int index);\n    void onComboBoxInputFormatCurrentTextChanged(const QString &format);\n    void onComboBoxOutputFormatEditTextchanged(const QString &text);\n    void onComboBoxOutputTabEditTextChanged(const QString &text);\n    void onSeparatorEditTextEdited(const QString &text);\n\n    void previousCommand();\n    void nextCommand();\n\n    void acceptCommand();\n    QVariant createCurrentItemData();\n    void saveCurrentCommandToHistory();\n\n    Ui::ActionDialog *ui;\n    QVariantMap m_data;\n\n    int m_currentCommandIndex;\n};\n"
  },
  {
    "path": "src/gui/actionhandler.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"actionhandler.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/action.h\"\n#include \"common/actiontablemodel.h\"\n#include \"common/commandstatus.h\"\n#include \"common/common.h\"\n#include \"common/display.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"gui/actionhandlerdialog.h\"\n#include \"gui/icons.h\"\n#include \"gui/notification.h\"\n#include \"gui/notificationdaemon.h\"\n#include \"gui/mainwindow.h\"\n#include \"item/serialize.h\"\n\n#include <QDialog>\n#include <QTimer>\n\n#include <cmath>\n\nnamespace {\n\nQString actionDescription(const Action &action)\n{\n    const auto name = action.name();\n    if ( !name.isEmpty() )\n        return QStringLiteral(\"Command \\\"%1\\\"\").arg(name);\n\n    return action.commandLine();\n}\n\n} // namespace\n\nQStringList ActionHandler::copyqStats() const\n{\n    QStringList lines;\n    for (auto it = m_actions.constBegin(); it != m_actions.constEnd(); ++it) {\n        if (m_internalActions.contains(it.key()))\n            continue;\n        QString desc = actionDescription(*it.value());\n        desc.replace('\\n', \" | \");\n        lines.append(QStringLiteral(\"ACTION \") + desc);\n    }\n    return lines;\n}\n\nActionHandler::ActionHandler(NotificationDaemon *notificationDaemon, QObject *parent)\n    : QObject(parent)\n    , m_notificationDaemon(notificationDaemon)\n    , m_actionModel(new ActionTableModel(parent))\n{\n}\n\nvoid ActionHandler::setMaxRowCount(uint rows)\n{\n    m_actionModel->setMaxRowCount(rows);\n}\n\nvoid ActionHandler::showProcessManagerDialog(QWidget *parent)\n{\n    auto dialog = new ActionHandlerDialog(this, m_actionModel, parent);\n    dialog->setAttribute(Qt::WA_DeleteOnClose, true);\n    dialog->show();\n}\n\nvoid ActionHandler::addFinishedAction(const QString &name)\n{\n    m_actionModel->actionFinished(name);\n}\n\nQVariantMap ActionHandler::actionData(int id) const\n{\n    const auto action = m_actions.value(id);\n    return action ? action->data() : QVariantMap();\n}\n\nvoid ActionHandler::setActionData(int id, const QVariantMap &data)\n{\n    const auto action = m_actions.value(id);\n    if (action)\n        action->setData(data);\n}\n\nvoid ActionHandler::internalAction(Action *action)\n{\n    this->action(action);\n    if ( m_actions.contains(action->id()) )\n        m_internalActions.insert(action->id());\n}\n\nbool ActionHandler::isInternalActionId(int id) const\n{\n    return m_internalActions.contains(id);\n}\n\nvoid ActionHandler::action(Action *action)\n{\n    action->setParent(this);\n\n    connect( action, &Action::actionStarted,\n             m_actionModel, &ActionTableModel::actionStarted );\n    connect( action, &Action::actionFinished,\n             this, &ActionHandler::closeAction );\n\n    const int id = m_actionModel->actionAboutToStart(action);\n    action->setId(id);\n    m_actions.insert(id, action);\n\n    COPYQ_LOG( QStringLiteral(\"Executing: %1\").arg(actionDescription(*action)) );\n    action->start();\n}\n\nvoid ActionHandler::terminateAction(int id)\n{\n    Action *action = m_actions.value(id);\n    if (!action || !action->isRunning())\n        return;\n\n    action->requestTerminate();\n    const int terminateTimeout =\n        AppConfig().option<Config::terminate_action_timeout_ms>();\n    QTimer::singleShot(terminateTimeout, action, &Action::requestKill);\n}\n\nAction *ActionHandler::findAction(int id) const\n{\n    auto it = m_actions.find(id);\n    return it != m_actions.end() ? it.value() : nullptr;\n}\n\nvoid ActionHandler::closeAction(Action *action)\n{\n    m_actions.remove(action->id());\n    const bool isInternal = m_internalActions.remove(action->id());\n\n    if ( action->actionFailed() ) {\n        const auto msg = tr(\"Error: %1\").arg(action->errorString());\n        showActionErrors(action, msg, IconCircleExclamation);\n#ifdef Q_OS_WIN\n    // FIXME: Ignore specific exit code for clipboard monitor on Windows when logging out.\n    } else if ( action->exitCode() == 1073807364 ) {\n        COPYQ_LOG( QStringLiteral(\"Exit code %1 (on logout?) with command: %2\")\n                   .arg(action->exitCode())\n                   .arg(action->commandLine()) );\n#elif defined(Q_OS_UNIX)\n    // Ignore SIGINT (2) exit code for internal actions.\n    } else if ( isInternal && action->exitCode() == 128 + 2 ) {\n        COPYQ_LOG( QStringLiteral(\"Internal action interrupted on SIGINT: %1\")\n                  .arg(actionDescription(*action)) );\n#endif\n    } else if ( isInternal && action->exitCode() == CommandStop ) {\n        COPYQ_LOG( QStringLiteral(\"Internal action interrupted: %1\")\n                  .arg(actionDescription(*action)) );\n    } else if ( action->exitCode() != 0 ) {\n        const auto msg = tr(\"Exit code: %1\").arg(action->exitCode());\n        showActionErrors(action, msg, IconCircleXmark);\n    }\n\n    m_actionModel->actionFinished(action);\n    Q_ASSERT(runningActionCount() >= 0);\n\n    action->deleteLater();\n}\n\nvoid ActionHandler::showActionErrors(Action *action, const QString &message, ushort icon)\n{\n    m_actionModel->actionFailed(action, message);\n#if QT_VERSION >= QT_VERSION_CHECK(6,10,0)\n    QtPrivate::QHashCombine hash(0);\n#else\n    QtPrivate::QHashCombine hash;\n#endif\n    const auto notificationId = QString::number( hash(hash(0, action->commandLine()), message) );\n    if ( m_notificationDaemon->findNotification(notificationId) )\n        return;\n\n    auto msg = message;\n\n    if ( !action->errorOutput().isEmpty() )\n        msg.append( \"\\n\" + action->errorOutput() );\n\n    const int maxWidthPoints =\n            AppConfig().option<Config::notification_maximum_width>();\n    const QString command = action->commandLine()\n            .replace(QLatin1String(\"copyq eval --\"), QLatin1String(\"copyq:\"));\n    const QString name = action->name().isEmpty()\n            ? QString(command).replace('\\n', QLatin1String(\" \"))\n            : action->name();\n    const QString format = tr(\"Command %1\").arg(quoteString(\"%1\"));\n    const QString title = elideText(name, QFont(), format, pointsToPixels(maxWidthPoints));\n\n    // Print command with line numbers.\n    int lineNumber = 0;\n    const auto lines = command.split(\"\\n\");\n    const auto lineNumberWidth = static_cast<int>(std::log10(lines.size())) + 1;\n    for (const auto &line : lines)\n        msg.append(QStringLiteral(\"\\n%1. %2\").arg(++lineNumber, lineNumberWidth).arg(line));\n\n    auto logMsg = QStringLiteral(\"%1: %2\").arg(title, msg);\n    logMsg.replace(QLatin1Char('\\n'), QLatin1String(\" | \"));\n    log(logMsg, LogWarning);\n\n    auto notification = m_notificationDaemon->createNotification(notificationId);\n    notification->setTitle(title);\n    notification->setMessage(msg, Qt::PlainText);\n    notification->setIcon(icon);\n    notification->setUrgency(Notification::Urgency::High);\n    notification->setPersistency(Notification::Persistency::Persistent);\n}\n"
  },
  {
    "path": "src/gui/actionhandler.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QObject>\n#include <QSet>\n#include <QStringList>\n\nclass Action;\nclass NotificationDaemon;\nclass ActionTableModel;\n\nclass ActionHandler final : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList copyqStats READ copyqStats CONSTANT)\npublic:\n    explicit ActionHandler(NotificationDaemon *notificationDaemon, QObject *parent);\n\n    void setMaxRowCount(uint rows);\n\n    int runningActionCount() const { return m_actions.size() - m_internalActions.size(); }\n    QStringList copyqStats() const;\n\n    void showProcessManagerDialog(QWidget *parent);\n\n    void addFinishedAction(const QString &name);\n\n    QVariantMap actionData(int id) const;\n    void setActionData(int id, const QVariantMap &data);\n\n    void internalAction(Action *action);\n    bool isInternalActionId(int id) const;\n\n    /** Execute action. */\n    void action(Action *action);\n\n    void terminateAction(int id);\n    Action *findAction(int id) const;\n\nprivate:\n    /** Delete finished action and its menu item. */\n    void closeAction(Action *action);\n\n    void showActionErrors(Action *action, const QString &message, ushort icon);\n\n    NotificationDaemon *m_notificationDaemon;\n    ActionTableModel *m_actionModel;\n    QHash<int, Action*> m_actions;\n    QSet<int> m_internalActions;\n    int m_lastActionId = -1;\n};\n"
  },
  {
    "path": "src/gui/actionhandlerdialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/actionhandlerdialog.h\"\n#include \"ui_actionhandlerdialog.h\"\n\n#include \"common/actionhandlerenums.h\"\n#include \"gui/actionhandler.h\"\n\n#include <QSortFilterProxyModel>\n#include <QSet>\n\nnamespace {\n\nvoid terminateSelectedActions(QItemSelectionModel *selectionModel, ActionHandler *actionHandler)\n{\n     QSet<int> ids;\n     for ( const auto &index : selectionModel->selectedIndexes() ) {\n         const int actionId = index.data(ActionHandlerRole::id).toInt();\n         ids.insert(actionId);\n     }\n     for (const int id : ids)\n         actionHandler->terminateAction(id);\n}\n\nvoid updateTerminateButton(QItemSelectionModel *selectionModel, QAbstractItemModel *model, QPushButton *button)\n{\n     for ( const auto &index : selectionModel->selectedIndexes() ) {\n         const int row = index.row();\n         const auto statusIndex = model->index(row, 0);\n         const auto state = static_cast<ActionState>(statusIndex.data(ActionHandlerRole::status).toInt());\n         if (state == ActionState::Running || state == ActionState::Starting) {\n             button->setEnabled(true);\n             return;\n         }\n     }\n\n     button->setEnabled(false);\n}\n\n} // namespace\n\nActionHandlerDialog::ActionHandlerDialog(ActionHandler *actionHandler, QAbstractItemModel *model, QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::ActionHandlerDialog)\n{\n    ui->setupUi(this);\n\n    auto proxyModel = new QSortFilterProxyModel(this);\n    proxyModel->setSourceModel(model);\n    proxyModel->setDynamicSortFilter(true);\n    proxyModel->setSortRole(ActionHandlerRole::sort);\n    proxyModel->setFilterKeyColumn(ActionHandlerColumn::name);\n    ui->tableView->setModel(proxyModel);\n\n    ui->tableView->resizeColumnsToContents();\n\n    ui->tableView->sortByColumn(ActionHandlerColumn::status, Qt::DescendingOrder);\n\n    connect( ui->filterLineEdit, &QLineEdit::textChanged, proxyModel,\n             [proxyModel](const QString &pattern) {\n                 const QRegularExpression re(pattern, QRegularExpression::CaseInsensitiveOption);\n                 proxyModel->setFilterRegularExpression(re);\n             } );\n\n    const auto selectionModel = ui->tableView->selectionModel();\n    connect( ui->terminateButton, &QPushButton::clicked, this,\n             [selectionModel, actionHandler]() {\n                 terminateSelectedActions(selectionModel, actionHandler);\n             } );\n\n    const auto updateTerminateButtonSlot =\n        [this, selectionModel, proxyModel]() {\n            updateTerminateButton(selectionModel, proxyModel, ui->terminateButton);\n        };\n\n    connect( model, &QAbstractItemModel::dataChanged, this, updateTerminateButtonSlot );\n    connect( selectionModel, &QItemSelectionModel::selectionChanged, this, updateTerminateButtonSlot );\n}\n\nActionHandlerDialog::~ActionHandlerDialog()\n{\n    delete ui;\n}\n"
  },
  {
    "path": "src/gui/actionhandlerdialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n\nclass ActionHandler;\nclass QAbstractItemModel;\n\nnamespace Ui {\nclass ActionHandlerDialog;\n}\n\nclass ActionHandlerDialog final : public QDialog\n{\npublic:\n    explicit ActionHandlerDialog(ActionHandler *actionHandler, QAbstractItemModel *model, QWidget *parent = nullptr);\n    ~ActionHandlerDialog();\n\nprivate:\n    Ui::ActionHandlerDialog *ui;\n};\n"
  },
  {
    "path": "src/gui/addcommanddialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"addcommanddialog.h\"\n#include \"ui_addcommanddialog.h\"\n\n#include \"common/command.h\"\n#include \"common/mimetypes.h\"\n#include \"common/predefinedcommands.h\"\n#include \"common/shortcuts.h\"\n#include \"common/textdata.h\"\n#include \"item/itemfactory.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/windowgeometryguard.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QAbstractListModel>\n#include <QLocale>\n#include <QSortFilterProxyModel>\n\nnamespace {\n\nclass CommandModel final : public QAbstractListModel {\npublic:\n    explicit CommandModel(const QVector<Command> &commands, QObject *parent = nullptr)\n        : QAbstractListModel(parent)\n        , m_commands(commands)\n    {\n    }\n\n    int rowCount(const QModelIndex &) const override\n    {\n        return m_commands.size();\n    }\n\n    QVariant data(const QModelIndex &index, int role) const override\n    {\n        if (!index.isValid())\n            return QVariant();\n\n        if (role == Qt::DecorationRole) {\n            const QString &icon = m_commands[index.row()].icon;\n\n            QVariant iconOrIconId;\n            if (icon.size() == 1)\n                iconOrIconId = static_cast<uint>(icon[0].unicode());\n            else\n                iconOrIconId = QIcon(icon);\n\n            return getIcon(iconOrIconId);\n        }\n        if (role == Qt::DisplayRole)\n            return m_commands[index.row()].name;\n        if (role == Qt::UserRole)\n            return QVariant::fromValue(m_commands[index.row()]);\n\n        return QVariant();\n    }\n\nprivate:\n    QVector<Command> m_commands;\n};\n\n} // namespace\n\nAddCommandDialog::AddCommandDialog(const QVector<Command> &pluginCommands, QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::AddCommandDialog)\n    , m_filterModel(new QSortFilterProxyModel(this))\n{\n    ui->setupUi(this);\n\n    connect(ui->lineEditFilter, &QLineEdit::textChanged,\n            this, &AddCommandDialog::onLineEditFilterTextChanged);\n    connect(ui->listViewCommands, &QListView::activated,\n            this, &AddCommandDialog::onListViewCommandsActivated);\n\n    QAbstractItemModel *model = new CommandModel(predefinedCommands() + pluginCommands, m_filterModel);\n    m_filterModel->setSourceModel(model);\n    ui->listViewCommands->setModel(m_filterModel);\n    ui->listViewCommands->setCurrentIndex(m_filterModel->index(0, 0));\n\n    WindowGeometryGuard::create(this);\n}\n\nAddCommandDialog::~AddCommandDialog()\n{\n    delete ui;\n}\n\nvoid AddCommandDialog::accept()\n{\n    const QModelIndexList indexes =\n            ui->listViewCommands->selectionModel()->selectedIndexes();\n\n    if (!indexes.isEmpty()) {\n        QVector<Command> commands;\n\n        commands.reserve( indexes.size() );\n        for (const auto &index : indexes)\n            commands.append( index.data(Qt::UserRole).value<Command>() );\n\n        emit addCommands(commands);\n    }\n\n    QDialog::accept();\n}\n\nvoid AddCommandDialog::onLineEditFilterTextChanged(const QString &text)\n{\n    const QRegularExpression re(text, QRegularExpression::CaseInsensitiveOption);\n    m_filterModel->setFilterRegularExpression(re);\n}\n\nvoid AddCommandDialog::onListViewCommandsActivated()\n{\n    accept();\n}\n"
  },
  {
    "path": "src/gui/addcommanddialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/command.h\"\n\n#include <QDialog>\n#include <QtContainerFwd>\n\nnamespace Ui {\nclass AddCommandDialog;\n}\n\nclass QSortFilterProxyModel;\n\nclass AddCommandDialog final : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit AddCommandDialog(const QVector<Command> &pluginCommands, QWidget *parent = nullptr);\n    ~AddCommandDialog();\n\n    void accept() override;\n\nsignals:\n    void addCommands(const QVector<Command> &commands);\n\nprivate:\n    void onLineEditFilterTextChanged(const QString &text);\n    void onListViewCommandsActivated();\n\n    Ui::AddCommandDialog *ui;\n    QSortFilterProxyModel *m_filterModel;\n};\n"
  },
  {
    "path": "src/gui/clipboardbrowser.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardbrowser.h\"\n\n#include \"common/common.h\"\n#include \"common/contenttype.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/temporaryfile.h\"\n#include \"common/textdata.h\"\n#include \"common/timer.h\"\n#include \"gui/pixelratio.h\"\n#include \"gui/theme.h\"\n#include \"item/indexes.h\"\n#include \"item/itemeditor.h\"\n#include \"item/itemeditorwidget.h\"\n#include \"item/itemfactory.h\"\n#include \"item/itemstore.h\"\n#include \"item/itemwidget.h\"\n#include \"item/persistentdisplayitem.h\"\n#include \"item/serialize.h\"\n\n#include <QApplication>\n#include <QDrag>\n#include <QElapsedTimer>\n#include <QKeyEvent>\n#include <QMimeData>\n#include <QMenu>\n#include <QMessageBox>\n#include <QPainter>\n#include <QScrollBar>\n#include <QTemporaryFile>\n#include <QUrl>\n\n#include <algorithm>\n#include <cmath>\n#include <cstdlib>\n#include <memory>\n\nnamespace {\n\nenum class MoveType {\n    Absolute,\n    Relative\n};\n\n/// Save drag'n'drop image data in temporary file (required by some applications).\nclass TemporaryDragAndDropImage final : public QObject {\npublic:\n    /// Return temporary image file for data or nullptr if file cannot be created.\n    static TemporaryDragAndDropImage *create(QMimeData *mimeData, QObject *parent)\n    {\n        if ( !mimeData->hasImage() || mimeData->hasFormat(mimeUriList) )\n            return nullptr;\n\n        return new TemporaryDragAndDropImage(mimeData, parent);\n    }\n\n    /// Remove temporary image file after an interval (allows target application to read all data).\n    void drop()\n    {\n        m_timerRemove.start();\n    }\n\n    ~TemporaryDragAndDropImage()\n    {\n        if ( m_filePath.isEmpty() )\n            QFile::remove(m_filePath);\n    }\n\nprivate:\n    TemporaryDragAndDropImage(QMimeData *mimeData, QObject *parent)\n        : QObject(parent)\n    {\n        // Save image as PNG.\n        const QImage image = mimeData->imageData().value<QImage>();\n\n        QTemporaryFile imageFile;\n        openTemporaryFile(&imageFile, \".png\");\n        image.save(&imageFile, \"PNG\");\n\n        m_filePath = imageFile.fileName();\n        imageFile.setAutoRemove(false);\n        imageFile.close();\n\n        // Add URI to temporary file to drag'n'drop data.\n        const QUrl url = QUrl::fromLocalFile(m_filePath);\n        const QByteArray localUrl = url.toString().toUtf8();\n        mimeData->setData( mimeUriList, localUrl );\n\n        // Set interval to wait before removing temporary file after data were dropped.\n        const int transferRateBytesPerSecond = 100000;\n        const int removeAfterDropSeconds = 5 + static_cast<int>(imageFile.size()) / transferRateBytesPerSecond;\n        initSingleShotTimer( &m_timerRemove, removeAfterDropSeconds * 1000, this, &TemporaryDragAndDropImage::deleteLater );\n    }\n\n    QTimer m_timerRemove;\n    QString m_filePath;\n};\n\nbool alphaSort(const QModelIndex &lhs, const QModelIndex &rhs)\n{\n    const QString lhsText = lhs.data(contentType::text).toString();\n    const QString rhsText = rhs.data(contentType::text).toString();\n    return lhsText.localeAwareCompare(rhsText) < 0;\n}\n\nbool reverseSort(const QModelIndex &lhs, const QModelIndex &rhs)\n{\n    return lhs.row() > rhs.row();\n}\n\nQModelIndex indexNear(const QListView *view, int offset)\n{\n    const int s = view->spacing();\n    QModelIndex ind = view->indexAt( QPoint(s, offset) );\n    if ( !ind.isValid() )\n        ind = view->indexAt( QPoint(s, offset + 2 * s) );\n\n    return ind;\n}\n\nvoid appendTextData(const QVariantMap &data, const QString &mime, QByteArray *lines)\n{\n    const QString text = getTextData(data, mime);\n\n    if (text.isEmpty())\n        return;\n\n    if ( !lines->isEmpty() )\n        lines->append('\\n');\n    lines->append(text.toUtf8());\n}\n\nvoid moveIndexes(QList<QPersistentModelIndex> &indexesToMove, int targetRow, ClipboardModel *model, MoveType moveType)\n{\n    if ( indexesToMove.isEmpty() )\n        return;\n\n    const auto minMaxPair = std::minmax_element( std::begin(indexesToMove), std::end(indexesToMove) );\n    const auto start = minMaxPair.first->row();\n    const auto end = minMaxPair.second->row();\n\n    if (moveType == MoveType::Relative) {\n        if (targetRow < 0 && start == 0)\n            targetRow = model->rowCount();\n        else if (targetRow > 0 && end == model->rowCount() - 1)\n            targetRow = 0;\n        else if (targetRow < 0)\n            targetRow += start;\n        else\n            targetRow += end + 1;\n    }\n\n    if (start < targetRow)\n        std::sort( std::begin(indexesToMove), std::end(indexesToMove) );\n    else if (targetRow < end)\n        std::sort( std::begin(indexesToMove), std::end(indexesToMove),\n                   [](const QModelIndex &lhs, const QModelIndex &rhs) {\n                       return lhs.row() >= rhs.row();\n                   });\n    else\n        return;\n\n    // Move ranges of rows instead of a single rows.\n    for (auto it = std::begin(indexesToMove); it != std::end(indexesToMove); ) {\n        if ( it->isValid() ) {\n            const auto row = it->row();\n            auto rowCount = 0;\n\n            for ( ++it, ++rowCount; it != std::end(indexesToMove)\n                  && it->isValid()\n                  && std::abs(it->row() - row) == rowCount; ++it, ++rowCount ) {}\n\n            if (row < targetRow)\n                model->moveRows(QModelIndex(), row, rowCount, QModelIndex(), targetRow);\n            else\n                model->moveRows(QModelIndex(), row - rowCount + 1, rowCount, QModelIndex(), targetRow);\n        } else {\n            ++it;\n        }\n    }\n}\n\nvoid moveIndexes(const QModelIndexList &indexesToMove, int targetRow, ClipboardModel *model, MoveType moveType)\n{\n    auto indexesToMove2 = toPersistentModelIndexList(indexesToMove);\n    moveIndexes(indexesToMove2, targetRow, model, moveType);\n}\n\n} // namespace\n\nClipboardBrowser::ClipboardBrowser(\n        const QString &tabName,\n        const ClipboardBrowserSharedPtr &sharedData,\n        QWidget *parent)\n    : QListView(parent)\n    , m_itemSaver(nullptr)\n    , m_tabName(tabName)\n    , m_maxItemCount(sharedData->maxItems)\n    , m(this)\n    , d(this, sharedData)\n    , m_editor(nullptr)\n    , m_sharedData(sharedData)\n    , m_dragTargetRow(-1)\n    , m_dragStartPosition()\n{\n    setObjectName(\"ClipboardBrowser\");\n\n    setLayoutMode(QListView::Batched);\n    setBatchSize(1);\n    setFrameShape(QFrame::NoFrame);\n    setTabKeyNavigation(false);\n    setSelectionMode(QAbstractItemView::ExtendedSelection);\n    setWrapping(false);\n    setLayoutMode(QListView::SinglePass);\n    setEditTriggers(QAbstractItemView::NoEditTriggers);\n    setAlternatingRowColors(true);\n\n    initSingleShotTimer( &m_timerSave, 0, this, &ClipboardBrowser::saveItems );\n    initSingleShotTimer( &m_timerEmitItemCount, 0, this, &ClipboardBrowser::emitItemCount );\n    initSingleShotTimer( &m_timerUpdateSizes, 0, this, &ClipboardBrowser::updateSizes );\n    initSingleShotTimer( &m_timerUpdateCurrent, 0, this, &ClipboardBrowser::updateCurrent );\n    initSingleShotTimer( &m_timerPreload, 0, this, &ClipboardBrowser::preloadCurrentPage );\n\n    m_timerDragDropScroll.setInterval(20);\n    connect( &m_timerDragDropScroll, &QTimer::timeout,\n             this, &ClipboardBrowser::dragDropScroll );\n\n    // ScrollPerItem doesn't work well with hidden items\n    setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);\n\n    setAttribute(Qt::WA_MacShowFocusRect, false);\n\n    setAcceptDrops(true);\n\n    connectModelAndDelegate();\n\n    m_sharedData->theme.decorateBrowser(this);\n    updateItemMaximumSize();\n}\n\nClipboardBrowser::~ClipboardBrowser()\n{\n    delete m_editor.data();\n    saveUnsavedItems();\n}\n\nbool ClipboardBrowser::moveToTop(uint itemHash)\n{\n    const int row = m.findItem(itemHash);\n    if (row < 0)\n        return false;\n\n    moveToTop( index(row) );\n    return true;\n}\n\nvoid ClipboardBrowser::closeExternalEditor(QObject *editor, const QModelIndex &index)\n{\n    editor->disconnect(this);\n    disconnect(editor);\n    editor->deleteLater();\n\n    Q_ASSERT(m_externalEditorsOpen > 0);\n    --m_externalEditorsOpen;\n\n    if ( index.isValid() && !isInternalEditorOpen() ) {\n        selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);\n        emit requestShow(this);\n    }\n\n    maybeEmitEditingFinished();\n}\n\nvoid ClipboardBrowser::emitItemCount()\n{\n    if (isLoaded())\n        emit itemCountChanged( tabName(), length() );\n}\n\nbool ClipboardBrowser::isFiltered(int row) const\n{\n    const auto filter = d.itemFilter();\n    if ( !filter || filter->matchesAll() || !m_itemSaver)\n        return false;\n\n    if ( filter->matchesNone() )\n        return true;\n\n    const QModelIndex ind = m.index(row);\n    return m_sharedData->itemFactory\n            && !m_sharedData->itemFactory->matches(ind, *filter);\n}\n\nbool ClipboardBrowser::hideFiltered(int row)\n{\n    const bool hide = isFiltered(row);\n    setRowHidden(row, hide);\n    return hide;\n}\n\nbool ClipboardBrowser::startEditor(QObject *editor)\n{\n    connect( editor, SIGNAL(fileModified(QByteArray,QString,QModelIndex)),\n             this, SLOT(itemModified(QByteArray,QString,QModelIndex)) );\n\n    connect( editor, SIGNAL(closed(QObject*,QModelIndex)),\n             this, SLOT(closeExternalEditor(QObject*,QModelIndex)) );\n\n    connect( editor, SIGNAL(error(QString)),\n             this, SIGNAL(error(QString)) );\n\n    connect( this, &ClipboardBrowser::closeExternalEditors,\n             editor, &QObject::deleteLater );\n\n    bool retVal = false;\n    bool result = QMetaObject::invokeMethod( editor, \"start\", Qt::DirectConnection,\n                                             Q_RETURN_ARG(bool, retVal) );\n\n    if (!retVal || !result) {\n        closeExternalEditor(editor, QModelIndex());\n        return false;\n    }\n\n    ++m_externalEditorsOpen;\n\n    return true;\n}\n\nvoid ClipboardBrowser::setEditorWidget(ItemEditorWidget *editor, bool changeClipboard)\n{\n    bool active = editor != nullptr;\n\n    if (m_editor != editor) {\n        if (m_editor) {\n            focusEditedIndex();\n            m_editor->hide();\n            m_editor->deleteLater();\n        }\n\n        m_editor = editor;\n        if (active) {\n            emit searchHideRequest();\n            connect( editor, &ItemEditorWidget::save,\n                     this, &ClipboardBrowser::onEditorSave );\n            if (changeClipboard) {\n                connect( editor, &ItemEditorWidget::save,\n                         this, &ClipboardBrowser::setClipboardFromEditor );\n            }\n            connect( editor, &ItemEditorWidget::cancel,\n                     this, &ClipboardBrowser::onEditorCancel );\n            connect( editor, &ItemEditorWidget::invalidate,\n                     this, &ClipboardBrowser::onEditorInvalidate );\n            connect( editor, &ItemEditorWidget::searchRequest,\n                     this, &ClipboardBrowser::searchRequest );\n            updateEditorGeometry();\n            editor->show();\n            editor->setFocus();\n        } else {\n            setFocus();\n            maybeEmitEditingFinished();\n            const auto filter = d.itemFilter();\n            if ( !filter || filter->matchesAll() )\n                emit searchHideRequest();\n            else\n                emit searchShowRequest(filter->searchString());\n        }\n\n        emit internalEditorStateChanged(this);\n    }\n\n    clearFocus();\n    setFocusProxy(m_editor);\n    setFocus();\n\n    setAcceptDrops(!active);\n\n    // Hide scrollbars while editing.\n    const auto scrollbarPolicy = active\n            ? Qt::ScrollBarAlwaysOff\n            : m_sharedData->theme.scrollbarPolicy();\n    setVerticalScrollBarPolicy(scrollbarPolicy);\n    setHorizontalScrollBarPolicy(scrollbarPolicy);\n}\n\nvoid ClipboardBrowser::editItem(\n    const QModelIndex &index, const QString &format, bool changeClipboard)\n{\n    if (!index.isValid())\n        return;\n\n    ItemEditorWidget *editor = d.createCustomEditor(this, index, format);\n    if (editor != nullptr && editor->isValid() ) {\n        setEditorWidget(editor, changeClipboard);\n    } else {\n        delete editor;\n        openEditor(index, format);\n    }\n}\n\nvoid ClipboardBrowser::updateEditorGeometry()\n{\n    if ( isInternalEditorOpen() ) {\n        const QRect contents = viewport()->contentsRect();\n        const QMargins margins = contentsMargins();\n        m_editor->parentWidget()->setGeometry( contents.translated(margins.left(), margins.top()) );\n    }\n}\n\nvoid ClipboardBrowser::updateCurrentItem()\n{\n    const QModelIndex current = currentIndex();\n    if ( !current.isValid() )\n        return;\n\n    d.setCurrentRow( current.row(), hasFocus() );\n}\n\nQModelIndex ClipboardBrowser::indexNear(int offset) const\n{\n    return ::indexNear(this, offset);\n}\n\nint ClipboardBrowser::getDropRow(QPoint position)\n{\n    const QModelIndex index = indexNear( position.y() );\n    return index.isValid() ? index.row() : length();\n}\n\nvoid ClipboardBrowser::connectModelAndDelegate()\n{\n    Q_ASSERT(&m != model());\n\n    // set new model\n    QAbstractItemModel *oldModel = model();\n    setModel(&m);\n    delete oldModel;\n\n    // delegate for rendering and editing items\n    setItemDelegate(&d);\n\n    // Delegate receives model signals first to update internal item list.\n    connect( &m, &QAbstractItemModel::rowsInserted,\n             &d, &ItemDelegate::rowsInserted );\n    connect( &m, &QAbstractItemModel::rowsAboutToBeRemoved,\n             &d, &ItemDelegate::rowsRemoved );\n    connect( &m, &QAbstractItemModel::rowsAboutToBeMoved,\n             &d, &ItemDelegate::rowsMoved );\n    connect( &m, &QAbstractItemModel::dataChanged,\n             &d, &ItemDelegate::dataChanged );\n\n    connect( &m, &QAbstractItemModel::rowsInserted,\n             this, &ClipboardBrowser::onRowsInserted);\n\n    // Item count change\n    connect( &m, &QAbstractItemModel::rowsInserted,\n             this, &ClipboardBrowser::onItemCountChanged );\n    connect( &m, &QAbstractItemModel::rowsRemoved,\n             this, &ClipboardBrowser::onItemCountChanged );\n\n    // Save on change\n    connect( &m, &QAbstractItemModel::rowsInserted,\n             this, [this]() { delayedSaveItems(m_sharedData->saveDelayMsOnItemAdded); } );\n    connect( &m, &QAbstractItemModel::rowsRemoved,\n             this, [this]() { delayedSaveItems(m_sharedData->saveDelayMsOnItemRemoved); } );\n    connect( &m, &QAbstractItemModel::rowsMoved,\n             this, [this]() { delayedSaveItems(m_sharedData->saveDelayMsOnItemMoved); } );\n    connect( &m, &QAbstractItemModel::dataChanged,\n             this, [this]() { delayedSaveItems(m_sharedData->saveDelayMsOnItemModified); } );\n\n    connect( &d, &ItemDelegate::itemWidgetCreated,\n             this, &ClipboardBrowser::itemWidgetCreated );\n\n    connect( &d, &ItemDelegate::sizeHintChanged,\n             this, [this](){ m_timerPreload.start(); } );\n}\n\nvoid ClipboardBrowser::updateItemMaximumSize()\n{\n    const int viewWidth = viewport()->contentsRect().width();\n    if (viewWidth > 0)\n        d.setItemSizes(m_sharedData->textWrap ? viewWidth : 2048, viewWidth);\n}\n\nvoid ClipboardBrowser::processDragAndDropEvent(QDropEvent *event)\n{\n    acceptDrag(event);\n    m_dragTargetRow = getDropRow(event->pos());\n    dragDropScroll();\n}\n\nvoid ClipboardBrowser::dropIndexes(const QModelIndexList &indexes)\n{\n    const QPersistentModelIndex current = currentIndex();\n    const int first = ::dropIndexes(indexes, &m);\n\n    // If current item was removed, select next visible.\n    if ( !current.isValid() )\n        setCurrent( findVisibleRowFrom(first) );\n}\n\nvoid ClipboardBrowser::dropIndexes(QList<QPersistentModelIndex> &indexes)\n{\n    const QPersistentModelIndex current = currentIndex();\n    const int first = ::dropIndexes(indexes, &m);\n\n    // If current item was removed, select next visible.\n    if ( !current.isValid() )\n        setCurrent( findVisibleRowFrom(first) );\n}\n\nvoid ClipboardBrowser::focusEditedIndex()\n{\n    if ( !isInternalEditorOpen() )\n        return;\n\n    const auto index = m_editor->index();\n    if ( index.isValid() )\n        selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);\n}\n\nint ClipboardBrowser::findNextVisibleRow(int row)\n{\n    while ( row < length() && isRowHidden(row) ) { ++row; }\n    return row < length() ? row : -1;\n}\n\nint ClipboardBrowser::findPreviousVisibleRow(int row)\n{\n    while ( row >= 0 && isRowHidden(row) ) { --row; }\n    return row >= 0 ? row : -1;\n}\n\nint ClipboardBrowser::findVisibleRowFrom(int row)\n{\n    const int visibleRow = findNextVisibleRow(row);\n    if (visibleRow != -1)\n        return visibleRow;\n    return findPreviousVisibleRow(row);\n}\n\nvoid ClipboardBrowser::preloadCurrentPage()\n{\n    if ( !viewport()->isVisible() )\n        return;\n\n    if ( m_timerUpdateSizes.isActive() )\n        updateSizes();\n\n    executeDelayedItemsLayout();\n    m_timerPreload.stop();\n\n    const QRect rect = viewport()->contentsRect();\n    const int top = rect.top();\n    const auto firstVisibleIndex = indexNear(top);\n    preload(rect.height(), 1, firstVisibleIndex);\n}\n\nvoid ClipboardBrowser::preload(int pixels, int direction, const QModelIndex &start)\n{\n    if ( !start.isValid() )\n        return;\n\n    const int s = spacing();\n    int y = -d.sizeHint(start).height();\n    for ( QModelIndex ind = start;\n          ind.isValid() && y < pixels;\n          ind = index(ind.row() + direction) )\n    {\n        if ( isIndexHidden(ind) )\n            continue;\n\n        d.createItemWidget(ind);\n        y += d.sizeHint(ind).height() + 2 * s;\n    }\n}\n\nvoid ClipboardBrowser::moveToTop(const QModelIndex &index)\n{\n    if ( !index.isValid() || !isLoaded() )\n        return;\n\n    if ( m_itemSaver->canMoveItems(QList<QModelIndex>() << index) )\n        m.moveRow(QModelIndex(), index.row(), QModelIndex(), 0);\n}\n\nvoid ClipboardBrowser::maybeEmitEditingFinished()\n{\n    if ( !isInternalEditorOpen() && !isExternalEditorOpen() )\n        emit editingFinished();\n}\n\nQModelIndex ClipboardBrowser::firstUnpinnedIndex() const\n{\n    if (!m_itemSaver)\n        return QModelIndex();\n\n    auto indexes = QModelIndexList() << QModelIndex();\n    for (int row = 0; row < length(); ++row) {\n        indexes[0] = index(row);\n        if ( m_itemSaver->canMoveItems(indexes) )\n            return indexes[0];\n    }\n\n    return QModelIndex();\n}\n\nvoid ClipboardBrowser::dragDropScroll()\n{\n    if (m_dragTargetRow == -1) {\n        m_timerDragDropScroll.stop();\n        return;\n    }\n\n    if (!m_timerDragDropScroll.isActive()) {\n        m_timerDragDropScroll.start();\n        return;\n    }\n\n    const auto y = mapFromGlobal(QCursor::pos()).y();\n    const auto h = viewport()->contentsRect().height();\n    const auto diff = h / 4;\n    const auto scrollAmount =\n            (h < y + diff) ? (y + diff - h) / 4\n          : (y < diff) ? -(diff - y) / 4\n          : 0;\n\n    if (scrollAmount != 0) {\n        QScrollBar *v = verticalScrollBar();\n        v->setValue(v->value() + scrollAmount);\n    } else {\n        m_timerDragDropScroll.stop();\n    }\n}\n\nQVariantMap ClipboardBrowser::copyIndex(const QModelIndex &index) const\n{\n    auto data = index.data(contentType::data).toMap();\n    return m_itemSaver ? m_itemSaver->copyItem(m, data) : data;\n}\n\nQVariantMap ClipboardBrowser::copyIndexes(const QModelIndexList &indexes) const\n{\n    if (indexes.size() == 1)\n        return copyIndex( indexes.first() );\n\n    QByteArray bytes;\n    QByteArray text;\n    QByteArray uriList;\n    QVariantMap data;\n    QSet<QString> usedFormats;\n\n    {\n        QDataStream stream(&bytes, QIODevice::WriteOnly);\n\n        for (const auto &index : indexes) {\n            auto itemData = index.data(contentType::data).toMap();\n            itemData = m_itemSaver ? m_itemSaver->copyItem(m, itemData) : itemData;\n\n            stream << itemData;\n\n            appendTextData(itemData, mimeText, &text);\n            appendTextData(itemData, mimeUriList, &uriList);\n\n            for (auto it = itemData.constBegin(); it != itemData.constEnd(); ++it) {\n                const auto &format = it.key();\n                if ( usedFormats.contains(format) ) {\n                    if ( format.startsWith(COPYQ_MIME_PREFIX) )\n                        data[format].clear();\n                    else\n                        data.remove(format);\n                } else {\n                    data[format] = it.value();\n                    usedFormats.insert(format);\n                }\n            }\n        }\n    }\n\n    data.insert(mimeItems, bytes);\n\n    if ( !text.isNull() ) {\n        data.insert(mimeText, text);\n        data.remove(mimeHtml);\n    }\n\n    if ( !uriList.isNull() )\n        data.insert(mimeUriList, uriList);\n\n    return data;\n}\n\nvoid ClipboardBrowser::removeIndexes(const QModelIndexList &indexes, QString *error)\n{\n    Q_ASSERT(m_itemSaver);\n\n    if ( indexes.isEmpty() ) {\n        if (error)\n            *error = \"No valid rows specified\";\n    }\n\n    if ( !canRemoveItems(indexes, error) )\n        return;\n\n    auto toRemove = toPersistentModelIndexList(indexes);\n    std::sort( std::begin(toRemove), std::end(toRemove) );\n\n    QPointer<QObject> self(this);\n    bool canRemove = true;\n    emit runOnRemoveItemsHandler(toRemove, &canRemove);\n    if (!canRemove) {\n        COPYQ_LOG(\"Item removal cancelled from script\");\n        return;\n    }\n    if (!self)\n        return;\n\n    m_itemSaver->itemsRemovedByUser(toRemove);\n\n    dropIndexes(toRemove);\n}\n\nbool ClipboardBrowser::canRemoveItems(const QModelIndexList &indexes, QString *error)\n{\n    Q_ASSERT(m_itemSaver);\n\n    return m_itemSaver->canRemoveItems(indexes, error);\n}\n\nQPixmap ClipboardBrowser::renderItemPreview(const QModelIndexList &indexes, int maxWidth, int maxHeight)\n{\n    int h = 0;\n    const int s = spacing();\n    for (const auto &index : indexes) {\n        if ( !isIndexHidden(index) )\n            h += visualRect(index).height() + s;\n    }\n\n    if (h == 0)\n        return QPixmap();\n\n    const auto ratio = pixelRatio(this);\n    const int frameLineWidth = static_cast<int>( std::ceil(2 * ratio) );\n\n    const auto height = qMin(maxHeight, h + s + 2 * frameLineWidth);\n    const auto width = qMin(maxWidth, viewport()->contentsRect().width() + 2 * frameLineWidth);\n    const QSize size(width, height);\n\n    QPixmap pix(size * ratio);\n    pix.setDevicePixelRatio(ratio);\n\n    QPainter p(&pix);\n\n    h = frameLineWidth;\n    const QPoint pos = viewport()->pos();\n    for (const auto &index : indexes) {\n        if ( isIndexHidden(index) )\n            continue;\n        const QPoint position(frameLineWidth, h);\n        const auto rect = visualRect(index).translated(pos).adjusted(-s, -s, 2 * s, 2 * s);\n        render(&p, position, rect);\n        h += visualRect(index).height() + s;\n        if ( h > height )\n            break;\n    }\n\n    p.setBrush(Qt::NoBrush);\n\n    const auto x = frameLineWidth / 2;\n    const QRect rect(x / 2, x / 2, width - x, height - x);\n\n    QPen pen(Qt::black, x, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);\n    p.setPen(pen);\n    p.drawRect(rect);\n\n    pen.setColor(Qt::white);\n    p.setPen(pen);\n    p.drawRect( rect.adjusted(x, x, -x, -x) );\n\n    return pix;\n}\n\nvoid ClipboardBrowser::onRowsInserted(const QModelIndex &, int first, int last)\n{\n    QModelIndex current;\n    QItemSelection selection;\n\n    // Select new items only if explicitly asked for\n    // or select new top item when not actively using the item list.\n    const bool select = m_selectNewItems\n        || !currentIndex().isValid()\n        || (first == 0\n            && !isInternalEditorOpen()\n            && (currentIndex().row() == last + 1\n                || !isVisible()\n                || !isActiveWindow()));\n\n    // Avoid selecting multiple items if not requested.\n    if (!m_selectNewItems)\n        last = first;\n\n    for (int row = first; row <= last; ++row) {\n        if ( !hideFiltered(row) ) {\n            const auto newIndex = index(row);\n            if ( !current.isValid() )\n                current = newIndex;\n            if (select)\n                selection.select(newIndex, newIndex);\n        }\n    }\n\n    if ( !selection.isEmpty() ) {\n        setCurrentIndex(current);\n        selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect);\n    }\n}\n\nvoid ClipboardBrowser::onItemCountChanged()\n{\n    if (!m_timerEmitItemCount.isActive())\n        m_timerEmitItemCount.start();\n}\n\nvoid ClipboardBrowser::onEditorSave()\n{\n    Q_ASSERT(!m_editor.isNull());\n\n    if ( m_editor && m_editor->hasChanges() ) {\n        const QVariantMap data = m_editor->data();\n        if ( m_sharedData->itemFactory->setData(data, m_editor->index(), &m) )\n            m_editor->setHasChanges(false);\n    }\n\n    focusEditedIndex();\n    delayedSaveItems(m_sharedData->saveDelayMsOnItemEdited);\n}\n\nvoid ClipboardBrowser::onEditorCancel()\n{\n    if ( isInternalEditorOpen() && m_editor->hasFocus() ) {\n        maybeCloseEditors();\n    } else {\n        emit searchHideRequest();\n    }\n}\n\nvoid ClipboardBrowser::onEditorInvalidate()\n{\n    setEditorWidget(nullptr);\n}\n\nvoid ClipboardBrowser::setClipboardFromEditor()\n{\n    QModelIndex index = m_editor->index();\n    if (index.isValid())\n        emit changeClipboard( copyIndex(index) );\n}\n\nvoid ClipboardBrowser::onEditorNeedsChangeClipboard(const QByteArray &bytes, const QString &mime)\n{\n    emit changeClipboard(createDataMap(mime, bytes));\n}\n\nvoid ClipboardBrowser::contextMenuEvent(QContextMenuEvent *event)\n{\n    if ( isInternalEditorOpen() || selectedIndexes().isEmpty() )\n        return;\n\n    QPoint pos = event->globalPos();\n    emit showContextMenu(pos);\n}\n\nvoid ClipboardBrowser::resizeEvent(QResizeEvent *event)\n{\n    // WORKAROUND: Omit calling resizeEvent() recursively.\n    if (!m_resizeEvent) {\n        m_resizeEvent = true;\n        QListView::resizeEvent(event);\n        m_resizeEvent = false;\n    }\n\n    m_timerUpdateSizes.start();\n    m_timerPreload.start();\n}\n\nvoid ClipboardBrowser::showEvent(QShowEvent *event)\n{\n    preloadCurrentPage();\n    QListView::showEvent(event);\n}\n\nvoid ClipboardBrowser::currentChanged(const QModelIndex &current, const QModelIndex &previous)\n{\n    QListView::currentChanged(current, previous);\n\n    if (previous.isValid())\n        d.setItemWidgetCurrent(previous, false);\n\n    m_timerUpdateCurrent.start();\n}\n\nvoid ClipboardBrowser::selectionChanged(const QItemSelection &selected,\n                                        const QItemSelection &deselected)\n{\n    QListView::selectionChanged(selected, deselected);\n    for ( auto index : selected.indexes() )\n        d.setItemWidgetSelected(index, true);\n    for ( auto index : deselected.indexes() )\n        d.setItemWidgetSelected(index, false);\n    emit itemSelectionChanged(this);\n}\n\nvoid ClipboardBrowser::focusInEvent(QFocusEvent *event)\n{\n    // Always focus active editor instead of list.\n    if (isInternalEditorOpen()) {\n        focusNextChild();\n    } else {\n        if ( !currentIndex().isValid() )\n            setCurrent(0);\n        QListView::focusInEvent(event);\n        updateCurrentItem();\n    }\n\n    if (m_itemSaver)\n        m_itemSaver->setFocus(true);\n}\n\nvoid ClipboardBrowser::focusOutEvent(QFocusEvent *event)\n{\n    QListView::focusOutEvent(event);\n\n    if (m_itemSaver)\n        m_itemSaver->setFocus(false);\n}\n\nvoid ClipboardBrowser::dragEnterEvent(QDragEnterEvent *event)\n{\n    dragMoveEvent(event);\n}\n\nvoid ClipboardBrowser::dragLeaveEvent(QDragLeaveEvent *event)\n{\n    QListView::dragLeaveEvent(event);\n    m_dragTargetRow = -1;\n    update();\n}\n\nvoid ClipboardBrowser::dragMoveEvent(QDragMoveEvent *event)\n{\n    // Ignore unknown data from Qt widgets.\n    const QStringList formats = event->mimeData()->formats();\n    if ( formats.size() == 1 && formats[0].startsWith(\"application/x-q\") )\n        return;\n\n    processDragAndDropEvent(event);\n    update();\n}\n\nvoid ClipboardBrowser::dropEvent(QDropEvent *event)\n{\n    processDragAndDropEvent(event);\n\n    if (event->dropAction() == Qt::MoveAction && event->source() == this)\n        return; // handled in mouseMoveEvent()\n\n    const QVariantMap data = cloneData( event->mimeData() );\n    addAndSelect(data, m_dragTargetRow);\n    m_dragTargetRow = -1;\n}\n\nvoid ClipboardBrowser::paintEvent(QPaintEvent *e)\n{\n    QListView::paintEvent(e);\n\n    // If dragging an item into list, draw indicator for dropping items.\n    if (m_dragTargetRow != -1) {\n        const int s = spacing();\n\n        QModelIndex pointedIndex = index(m_dragTargetRow);\n\n        QRect rect;\n        if ( pointedIndex.isValid() ) {\n            rect = visualRect(pointedIndex);\n            rect.translate(0, -s);\n        } else if ( length() > 0 ){\n            rect = visualRect( index(length() - 1) );\n            rect.translate(0, rect.height() + s);\n        } else {\n            rect = viewport()->rect();\n            rect.translate(0, s);\n        }\n\n        rect.adjust(8, 0, -8, 0);\n\n        QPainter p(viewport());\n        p.setPen( QPen(QColor(255, 255, 255, 150), s) );\n        p.setCompositionMode(QPainter::CompositionMode_Difference);\n        p.drawLine( rect.topLeft(), rect.topRight() );\n    }\n}\n\nvoid ClipboardBrowser::mousePressEvent(QMouseEvent *event)\n{\n    if ( event->button() == Qt::LeftButton\n         && (event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) == 0\n         && indexNear( event->pos().y() ).isValid() )\n    {\n        m_dragStartPosition = event->pos();\n    }\n\n    QListView::mousePressEvent(event);\n}\n\nvoid ClipboardBrowser::mouseReleaseEvent(QMouseEvent *event)\n{\n    m_dragStartPosition = QPoint();\n    QListView::mouseReleaseEvent(event);\n}\n\nvoid ClipboardBrowser::mouseMoveEvent(QMouseEvent *event)\n{\n    if ( m_dragStartPosition.isNull() ) {\n        // WORKAROUND: After double-click, if window is hidden while mouse button is pressed,\n        //             release button event is received after window is show which can result\n        //             in items being selected.\n        if (m_ignoreMouseMoveWithButtonPressed) {\n            if ( QApplication::mouseButtons() & Qt::LeftButton )\n                return;\n            m_ignoreMouseMoveWithButtonPressed = false;\n        }\n\n        QListView::mouseMoveEvent(event);\n        return;\n    }\n\n    if ( (event->pos() - m_dragStartPosition).manhattanLength() < QApplication::startDragDistance() )\n         return;\n\n    QModelIndex targetIndex = indexNear( m_dragStartPosition.y() );\n    if ( !targetIndex.isValid() )\n        return;\n\n    QModelIndexList selected = selectedIndexes();\n    if ( !selected.contains(targetIndex) ) {\n        setCurrentIndex(targetIndex);\n        selected.clear();\n        selected.append(targetIndex);\n    }\n\n    QVariantMap data = copyIndexes(selected);\n\n    m_dragStartPosition = QPoint();\n    auto drag = new QDrag(this);\n    drag->setMimeData( createMimeData(data) );\n    drag->setPixmap( renderItemPreview(selected, 150, 150) );\n\n    TemporaryDragAndDropImage *temporaryImage =\n            TemporaryDragAndDropImage::create(drag->mimeData(), this);\n\n    // Save persistent indexes so after the items are dropped (and added) these indexes remain valid.\n    auto indexesToRemove = toPersistentModelIndexList(selected);\n\n    // Start dragging (doesn't block event loop).\n    // Default action is \"copy\" which works for most apps,\n    // \"move\" action is used only in item list by default.\n    Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);\n\n    if (dropAction == Qt::MoveAction) {\n        selected.clear();\n\n        for (const auto &index : indexesToRemove)\n            selected.append(index);\n\n        QWidget *target = qobject_cast<QWidget*>(drag->target());\n\n        QPointer<QObject> self(this);\n\n        // Move items only if target is this app.\n        if (target == this || target == viewport()) {\n            moveIndexes(indexesToRemove, m_dragTargetRow, &m, MoveType::Absolute);\n        } else if ( target && target->window() == window()\n                    && m_itemSaver->canRemoveItems(selected, nullptr) )\n        {\n            removeIndexes(selected);\n        }\n\n        if (!self)\n            return;\n    }\n\n    // Clear drag indicator.\n    m_dragTargetRow = -1;\n    update();\n\n    event->accept();\n\n    if (temporaryImage)\n        temporaryImage->drop();\n}\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nvoid ClipboardBrowser::enterEvent(QEnterEvent *event)\n#else\nvoid ClipboardBrowser::enterEvent(QEvent *event)\n#endif\n{\n    m_ignoreMouseMoveWithButtonPressed = true;\n    QListView::enterEvent(event);\n}\n\nvoid ClipboardBrowser::scrollContentsBy(int dx, int dy)\n{\n    QListView::scrollContentsBy(dx, dy);\n    if ( !m_timerPreload.isActive() )\n        preloadCurrentPage();\n}\n\nvoid ClipboardBrowser::doItemsLayout()\n{\n    // Keep visible current item (or the first one visible)\n    // on the same position visually after relayout.\n\n    // FIXME: Virtual method QListView::doItemsLayout() is undocumented\n    //        so other way should be used instead.\n\n    m_timerPreload.start();\n\n    const auto current = currentIndex();\n    const auto currentRect = visualRect(current);\n    const auto viewRect = viewport()->contentsRect();\n\n    const bool currentIsNotVisible =\n            viewRect.bottom() < currentRect.top()\n            || currentRect.bottom() < viewRect.top();\n    const auto index = currentIsNotVisible ? indexNear(0) : current;\n\n    const auto rectBefore = visualRect(index);\n\n    QListView::doItemsLayout();\n\n    const auto rectAfter = visualRect(index);\n    const auto offset = rectAfter.top() - rectBefore.top();\n    if (offset != 0) {\n        QScrollBar *v = verticalScrollBar();\n        v->setValue(v->value() + offset);\n        d.updateAllRows();\n    }\n}\n\nbool ClipboardBrowser::openEditor()\n{\n    const QModelIndexList selected = selectionModel()->selectedRows();\n    return (selected.size() == 1) ? openEditor( selected.first(), mimeText )\n                                  : openEditor( {}, mimeText, selectedText().toUtf8() );\n}\n\nbool ClipboardBrowser::openEditor(\n    const QModelIndex &index, const QString &format, const QByteArray &content, bool changeClipboard)\n{\n    if ( !isLoaded() )\n        return false;\n\n    if ( m_sharedData->editor.isEmpty() )\n        return false;\n\n    auto editor = new ItemEditor(content, format, m_sharedData->editor, this);\n    editor->setIndex(index);\n    if ( !startEditor(editor) )\n        return false;\n\n    if (changeClipboard) {\n        connect( editor, SIGNAL(fileModified(QByteArray,QString,QModelIndex)),\n                 this, SLOT(onEditorNeedsChangeClipboard(QByteArray,QString)) );\n    }\n\n    return true;\n}\n\nbool ClipboardBrowser::openEditor(const QModelIndex &index, const QString &format)\n{\n    if ( !isLoaded() )\n        return false;\n\n    const auto data = m_sharedData->itemFactory->data(index);\n    if ( data.isEmpty() )\n        return false;\n\n    QObject *editor = m_sharedData->itemFactory->createExternalEditor(index, data, this);\n    if ( editor != nullptr && startEditor(editor) )\n        return true;\n\n    if ( !m_sharedData->editor.trimmed().isEmpty() ) {\n        const QString text = getTextData(data);\n        if ( !text.isNull() ) {\n            auto itemEditor = new ItemEditor( text.toUtf8(), format, m_sharedData->editor, this );\n            itemEditor->setIndex(index);\n            if ( startEditor(itemEditor) )\n                return true;\n        }\n    }\n\n    return false;\n}\n\nvoid ClipboardBrowser::editNotes()\n{\n    QModelIndex ind = currentIndex();\n    if ( !ind.isValid() )\n        return;\n\n    scrollTo(ind, PositionAtCenter);\n    emit requestShow(this);\n\n    editItem(ind, mimeItemNotes);\n}\n\nvoid ClipboardBrowser::itemModified(const QByteArray &bytes, const QString &mime, const QModelIndex &index)\n{\n    // add new item\n    if ( !bytes.isEmpty() ) {\n        const QVariantMap dataMap = createDataMap(mime, bytes);\n        if (index.isValid())\n            m_sharedData->itemFactory->setData(dataMap, index, &m);\n        else\n            add(dataMap);\n    }\n}\n\nvoid ClipboardBrowser::filterItems(const ItemFilterPtr &filter)\n{\n    // Search in editor if open.\n    if ( isInternalEditorOpen() ) {\n        m_editor->search(filter);\n        return;\n    }\n\n    // Do nothing if same regexp was already set.\n    // FIXME: Compare other options.\n    const auto oldFilter = d.itemFilter();\n    const auto oldSearch = oldFilter ? oldFilter->searchString() : QString();\n    const auto newSearch = filter ? filter->searchString() : QString();\n    if (oldSearch == newSearch)\n        return;\n\n    d.setItemFilter(filter);\n\n    if ( filter && !filter->matchesAll() ) {\n        // Hide all rows first, then start filtering rows in batches\n        // while processing events regularly to keep UI responsive.\n        for ( int row = 0; row < length(); ++row )\n            setRowHidden(row, true);\n\n        const int currentRow = currentRowFromSearch(newSearch);\n        if (currentRow != -1)\n            setCurrent(currentRow);\n\n        filterBatch(++m_lastFilterId, index(0));\n    } else {\n        // Show all items if filter is cleared or invalid.\n        for ( int row = 0; row < length(); ++row )\n            setRowHidden(row, false);\n        scrollTo(currentIndex(), PositionAtCenter);\n        emit filterProgressChanged(100);\n    }\n\n    d.updateAllRows();\n}\n\nvoid ClipboardBrowser::filterBatch(int filterId, const QPersistentModelIndex &lastIndex)\n{\n    if (filterId != m_lastFilterId)\n        return;\n\n    if ( !lastIndex.isValid() ) {\n        const QModelIndex first = index(0);\n        if (first.isValid())\n            filterBatch(filterId, first);\n        return;\n    }\n\n    QElapsedTimer timer;\n    timer.start();\n\n    const QModelIndex current = currentIndex();\n    bool noCurrent = !current.isValid() || isRowHidden(current.row());\n    const int filterID = ++m_lastFilterId;\n    int row = lastIndex.row();\n    for ( ; row < length(); ++row ) {\n        const bool shown = !isRowHidden(row) || !hideFiltered(row);\n        if (shown && noCurrent) {\n            noCurrent = false;\n            setCurrent(row);\n        }\n        if (timer.elapsed() > 20) {\n            const QPersistentModelIndex nextIndex = index(row + 1);\n            QTimer::singleShot(0, this, [this, filterID, nextIndex]() {\n                filterBatch(filterID, nextIndex);\n            });\n            break;\n        }\n    }\n\n    const int percentCompleted = (row * 100) / length();\n    emit filterProgressChanged(percentCompleted);\n}\n\nint ClipboardBrowser::currentRowFromSearch(const QString &search)\n{\n    if (m_sharedData->numberSearch)\n        return -1;\n\n    // If search string is a number, highlight item in that row.\n    bool ok;\n    int maybeRow = search.toInt(&ok);\n    if (!ok)\n        return -1;\n\n    if (m_sharedData->rowIndexFromOne)\n        --maybeRow;\n\n    if (maybeRow < 0 || maybeRow >= m.rowCount())\n        return -1;\n\n    setRowHidden(maybeRow, false);\n    return maybeRow;\n}\n\nvoid ClipboardBrowser::moveToClipboard(const QModelIndex &ind)\n{\n    if ( ind.isValid() )\n        moveToClipboard(QModelIndexList() << ind);\n}\n\nvoid ClipboardBrowser::moveToClipboard(const QModelIndexList &indexes)\n{\n    const auto data = copyIndexes(indexes);\n\n    if ( m_sharedData->moveItemOnReturnKey\n         && m_itemSaver && m_itemSaver->canMoveItems(indexes) )\n    {\n        moveIndexes(indexes, 0, &m, MoveType::Absolute);\n        scrollTo( currentIndex() );\n    }\n\n    emit changeClipboard(data);\n}\n\nvoid ClipboardBrowser::editNew(const QString &format, const QByteArray &content, bool changeClipboard)\n{\n    if ( !isLoaded() )\n        return;\n\n    emit searchHideRequest();\n    filterItems(nullptr);\n\n    m_selectNewItems = true;\n    const bool added = add( createDataMap(format, content) );\n    m_selectNewItems = false;\n\n    if (added)\n        editItem(currentIndex(), format, changeClipboard);\n}\n\nvoid ClipboardBrowser::keyPressEvent(QKeyEvent *event)\n{\n    // ignore any input if editing an item\n    if ( isInternalEditorOpen() )\n        return;\n\n    const Qt::KeyboardModifiers mods = event->modifiers();\n\n    if (mods == Qt::AltModifier)\n        return; // Handled by filter completion popup.\n\n    const int key = event->key();\n\n    // WORKAROUND: Avoid triggering search with Ctrl+Space toggle selection action.\n    if (mods.testFlag(Qt::ControlModifier) && key == Qt::Key_Space) {\n        const QModelIndex current = currentIndex();\n        if (!edit(current, AnyKeyPressed, event)) {\n            selectionModel()->select(current, selectionCommand(current, event));\n            event->accept();\n            return;\n        }\n    }\n\n    // This fixes few issues with default navigation and item selections.\n    switch (key) {\n    case Qt::Key_Up:\n    case Qt::Key_Down:\n    case Qt::Key_Home:\n    case Qt::Key_End:\n    case Qt::Key_PageDown:\n    case Qt::Key_PageUp: {\n        event->accept();\n\n        const QModelIndex current = currentIndex();\n        const int h = viewport()->contentsRect().height();\n        const int s = spacing();\n        const int space = 2 * s + 1;\n        const int direction =\n            (key == Qt::Key_Down || key == Qt::Key_PageDown || key == Qt::Key_End) ? 1 : -1;\n        int row = current.row();\n\n        if (key == Qt::Key_PageDown || key == Qt::Key_PageUp) {\n            const int offset = verticalOffset();\n            const QRect currentRect = rectForIndex(current);\n            if (currentRect.bottom() < offset || currentRect.top() > offset + h\n                || (key == Qt::Key_PageDown\n                    ? currentRect.bottom() > offset + h\n                    : currentRect.top() < offset))\n            {\n                QScrollBar *v = verticalScrollBar();\n                v->setValue( v->value() + direction * v->pageStep() );\n                break;\n            }\n\n            QModelIndex ind = indexNear(s + 1);\n            row = ind.row();\n            int y;\n            if (key == Qt::Key_PageDown)\n                y = rectForIndex(ind).top() - offset - h;\n            else\n                y = offset - rectForIndex(ind).top() + s - h;\n\n            for ( ; ind.isValid(); row += direction, ind = index(row) ) {\n                if ( isIndexHidden(ind) )\n                    continue;\n\n                d.createItemWidget(ind);\n                y += d.sizeHint(ind).height() + 2 * s;\n                if (y > space)\n                    break;\n            }\n\n            if (row == current.row())\n                row += direction;\n            else if (row != current.row() + direction)\n                row -= direction;\n        } else if (key == Qt::Key_Up || key == Qt::Key_Down) {\n            preload(space, direction, current);\n            row += direction;\n        } else {\n            row = (key == Qt::Key_Home) ? 0 : model()->rowCount() - 1;\n            preload(h, -direction, index(row));\n            for ( ; row != current.row() && hideFiltered(row); row -= direction ) {}\n        }\n\n        executeDelayedItemsLayout();\n\n        const QItemSelectionModel::SelectionFlags flags = selectionCommand(index(row), event);\n        const bool setCurrentOnly = flags.testFlag(QItemSelectionModel::NoUpdate);\n        const bool keepSelection = setCurrentOnly || flags.testFlag(QItemSelectionModel::SelectCurrent);\n\n        setCurrent(row, keepSelection, setCurrentOnly);\n\n        if (key == Qt::Key_PageDown || key == Qt::Key_PageUp)\n            scrollTo(index(row), PositionAtTop);\n\n        break;\n    }\n\n    default:\n        // allow user defined shortcuts\n        QListView::keyPressEvent(event);\n        // search\n        event->ignore();\n        break;\n    }\n\n    d.updateIfNeeded();\n}\n\nvoid ClipboardBrowser::setCurrent(int row, bool keepSelection, bool setCurrentOnly)\n{\n    if ( m.rowCount() == 0 )\n        return;\n\n    QModelIndex prev = currentIndex();\n    int cur = prev.row();\n\n    const int direction = cur <= row ? 1 : -1;\n\n    // select first visible\n    int toSelect = std::clamp(row, 0, m.rowCount() - 1);\n    toSelect = direction == 1\n        ? findNextVisibleRow(toSelect)\n        : findPreviousVisibleRow(toSelect);\n    if (toSelect == -1)\n        return;\n\n    if (keepSelection) {\n        auto sel = selectionModel();\n        const bool currentSelected = sel->isSelected(prev);\n        for ( int j = prev.row(); j != toSelect + direction; j += direction ) {\n            const auto ind = index(j);\n            if ( !ind.isValid() )\n                break;\n            if ( isRowHidden(j) )\n                continue;\n\n            if (!setCurrentOnly) {\n                if ( currentIndex() != ind && sel->isSelected(ind) && sel->isSelected(prev) )\n                    sel->setCurrentIndex(currentIndex(), QItemSelectionModel::Deselect);\n                sel->setCurrentIndex(ind, QItemSelectionModel::Select);\n            }\n            prev = ind;\n        }\n\n        if (setCurrentOnly)\n            sel->setCurrentIndex(prev, QItemSelectionModel::NoUpdate);\n        else if (!currentSelected)\n            sel->setCurrentIndex(prev, QItemSelectionModel::Deselect);\n    } else {\n        setCurrentIndex( index(toSelect) );\n    }\n}\n\nvoid ClipboardBrowser::editSelected()\n{\n    if ( selectedIndexes().size() > 1 ) {\n        editNew( mimeText, selectedText().toUtf8() );\n    } else {\n        QModelIndex ind = currentIndex();\n        if ( ind.isValid() ) {\n            emit requestShow(this);\n            editItem(ind);\n        }\n    }\n}\n\nvoid ClipboardBrowser::remove()\n{\n    const QModelIndexList toRemove = selectedIndexes();\n    removeIndexes(toRemove);\n}\n\nvoid ClipboardBrowser::sortItems(const QModelIndexList &indexes)\n{\n    m.sortItems(indexes, &alphaSort);\n}\n\nvoid ClipboardBrowser::sortItems(const QList<QPersistentModelIndex> &sorted)\n{\n    m.sortItems(sorted);\n}\n\nvoid ClipboardBrowser::reverseItems(const QModelIndexList &indexes)\n{\n    m.sortItems(indexes, &reverseSort);\n}\n\nbool ClipboardBrowser::allocateSpaceForNewItems(int newItemCount)\n{\n    const auto targetRowCount = m_maxItemCount - newItemCount;\n    const auto toRemove = m.rowCount() - targetRowCount;\n    if (toRemove <= 0)\n        return true;\n\n    QModelIndexList indexesToRemove;\n    for (int row = m.rowCount() - 1; row >= 0 && indexesToRemove.size() < toRemove; --row) {\n        const auto index = m.index(row);\n        if ( m_itemSaver->canDropItem(index) )\n            indexesToRemove.append(index);\n    }\n\n    if (indexesToRemove.size() < toRemove) {\n        log( QString(\"Cannot add new items. Tab \\\"%1\\\" reached the maximum number of items.\")\n             .arg(m_tabName), LogWarning );\n        emit error(\n            tr(\"Cannot add new items to tab %1. Please remove items manually to make space.\")\n            .arg(quoteString(m_tabName)) );\n        return false;\n    }\n\n    dropIndexes(indexesToRemove);\n    return true;\n}\n\nbool ClipboardBrowser::add(const QString &txt, int row)\n{\n    return add( createDataMap(mimeText, txt), row );\n}\n\nbool ClipboardBrowser::add(const QVariantMap &data, int row)\n{\n    if ( !isLoaded() )\n        return false;\n\n    const int newRow = row < 0 ? m.rowCount() : qMin(row, m.rowCount());\n\n    if ( data.contains(mimeItems) ) {\n        const QByteArray bytes = data[mimeItems].toByteArray();\n        QDataStream stream(bytes);\n\n        QVector<QVariantMap> dataList;\n        while ( !stream.atEnd() ) {\n            QVariantMap dataMap;\n            stream >> dataMap;\n            dataList.append(dataMap);\n        }\n\n        if ( !allocateSpaceForNewItems(dataList.size()) )\n            return false;\n\n        m.insertItems(dataList, newRow);\n    } else {\n        if ( !allocateSpaceForNewItems(1) )\n            return false;\n\n        m.insertItem(data, newRow);\n    }\n\n    return true;\n}\n\nbool ClipboardBrowser::addReversed(const QVector<QVariantMap> &dataList, int row)\n{\n    if ( !isLoaded() )\n        return false;\n\n    const int newRow = row < 0 ? m.rowCount() : qMin(row, m.rowCount());\n\n    QVector<QVariantMap> items;\n    items.reserve(dataList.size());\n    for (auto it = std::rbegin(dataList); it != std::rend(dataList); ++it) {\n        if ( it->contains(mimeItems) ) {\n            const QByteArray bytes = (*it)[mimeItems].toByteArray();\n            QDataStream stream(bytes);\n\n            while ( !stream.atEnd() ) {\n                QVariantMap dataMap;\n                stream >> dataMap;\n                items.append(dataMap);\n            }\n        } else {\n            items.append(*it);\n        }\n    }\n\n    if ( !allocateSpaceForNewItems(items.size()) )\n        return false;\n\n    m.insertItems(items, newRow);\n    return true;\n}\n\nbool ClipboardBrowser::addAndSelect(const QVariantMap &data, int row)\n{\n    m_selectNewItems = true;\n    bool added = add(data, row);\n    m_selectNewItems = false;\n    return added;\n}\n\nvoid ClipboardBrowser::addUnique(const QVariantMap &data, ClipboardMode mode)\n{\n    if ( moveToTop(hash(data)) ) {\n        COPYQ_LOG(\"New item: Moving existing to top\");\n        return;\n    }\n\n    // When selecting text under X11, clipboard data may change whenever selection changes.\n    // Instead of adding item for each selection change, this updates previously added item.\n    // Also update previous item if the same selected text is copied to clipboard afterwards.\n    if ( data.contains(mimeText) ) {\n        const auto firstIndex = firstUnpinnedIndex();\n        const QVariantMap previousData = firstIndex.data(contentType::data).toMap();\n\n        if ( firstIndex.isValid()\n             && previousData.contains(mimeText)\n             // Don't update edited item.\n             && (!isInternalEditorOpen() || currentIndex() != firstIndex) )\n        {\n            const auto newText = getTextData(data);\n            const auto oldText = getTextData(previousData);\n            if ( (mode == ClipboardMode::Clipboard)\n                 ? (newText == oldText)\n                 : (newText.startsWith(oldText) || newText.endsWith(oldText)) )\n            {\n                COPYQ_LOG(\"New item: Merging with top item\");\n\n                auto newData = previousData;\n                for (auto it = data.constBegin(); it != data.constEnd(); ++it)\n                    newData.insert(it.key(), it.value());\n\n                m.setData(firstIndex, newData, contentType::data);\n\n                return;\n            }\n        }\n    }\n\n    COPYQ_LOG(\"New item: Adding\");\n\n    add(data);\n}\n\nvoid ClipboardBrowser::setItemsData(const QMap<QPersistentModelIndex, QVariantMap> &itemsData)\n{\n    if ( isLoaded() )\n        m.setItemsData(itemsData);\n}\n\nbool ClipboardBrowser::loadItems(const QByteArray &itemData)\n{\n    if ( isLoaded() )\n        return true;\n\n    m_timerSave.stop();\n\n    m.blockSignals(true);\n    m_itemSaver = ::loadItems(m_tabName, m, m_sharedData->itemFactory, m_maxItemCount);\n    m.blockSignals(false);\n\n    if ( !isLoaded() )\n        return false;\n\n    if ( !itemData.isEmpty() ) {\n        QDataStream stream(itemData);\n        deserializeData(&m, &stream);\n    }\n\n    d.rowsInserted(QModelIndex(), 0, m.rowCount());\n    if ( hasFocus() )\n        setCurrent(0);\n    onItemCountChanged();\n\n    return true;\n}\n\nbool ClipboardBrowser::saveItems()\n{\n    m_timerSave.stop();\n\n    if ( !isLoaded() || m_tabName.isEmpty() )\n        return false;\n\n    if (!m_storeItems)\n        return true;\n\n    return ::saveItems(m_tabName, m, m_itemSaver);\n}\n\nvoid ClipboardBrowser::moveToClipboard()\n{\n    moveToClipboard( selectionModel()->selectedIndexes() );\n}\n\nvoid ClipboardBrowser::delayedSaveItems(int ms)\n{\n    if ( !isLoaded() || tabName().isEmpty() || ms < 0 )\n        return;\n\n    if ( !m_timerSave.isActive() || ms < m_timerSave.remainingTime() )\n        m_timerSave.start(ms);\n\n    emit itemsChanged(this);\n}\n\nvoid ClipboardBrowser::updateSizes()\n{\n    if (m_resizing) {\n        m_timerUpdateSizes.start();\n        return;\n    }\n\n    m_timerUpdateSizes.stop();\n\n    m_resizing = true;\n    updateItemMaximumSize();\n    updateEditorGeometry();\n    m_resizing = false;\n}\n\nvoid ClipboardBrowser::updateCurrent()\n{\n    if ( !updatesEnabled() ) {\n        m_timerUpdateCurrent.start();\n        return;\n    }\n\n    const auto current = currentIndex();\n    if ( current.isValid() )\n        d.setItemWidgetCurrent(current, true);\n}\n\nvoid ClipboardBrowser::saveUnsavedItems()\n{\n    if ( m_timerSave.isActive() )\n        saveItems();\n}\n\nconst QString ClipboardBrowser::selectedText() const\n{\n    QString result;\n\n    for ( const auto &ind : selectionModel()->selectedIndexes() )\n        result += ind.data(Qt::EditRole).toString() + QString('\\n');\n    result.chop(1);\n\n    return result;\n}\n\nbool ClipboardBrowser::setTabName(const QString &tabName)\n{\n    const QString oldTabName = m_tabName;\n\n    m_tabName = tabName;\n    if ( saveItems() )\n        return true;\n\n    m_tabName = oldTabName;\n    return false;\n}\n\nvoid ClipboardBrowser::setMaxItemCount(int count)\n{\n    m_maxItemCount = count;\n}\n\nvoid ClipboardBrowser::setStoreItems(bool store)\n{\n    m_storeItems = store;\n    if (!m_storeItems)\n        ::removeItems(m_tabName);\n}\n\nvoid ClipboardBrowser::editRow(int row, const QString &format)\n{\n    editItem( index(row), format );\n}\n\nvoid ClipboardBrowser::move(int key)\n{\n    if (key == Qt::Key_Home)\n        moveIndexes( selectedIndexes(), 0, &m, MoveType::Absolute );\n    else if (key == Qt::Key_End)\n        moveIndexes( selectedIndexes(), m.rowCount(), &m, MoveType::Absolute );\n    else if (key == Qt::Key_Down)\n        moveIndexes( selectedIndexes(), 1, &m, MoveType::Relative );\n    else if (key == Qt::Key_Up)\n        moveIndexes( selectedIndexes(), -1, &m, MoveType::Relative );\n    scrollTo( currentIndex() );\n}\n\nvoid ClipboardBrowser::move(const QModelIndexList &indexes, int targetRow)\n{\n    moveIndexes( indexes, targetRow, &m, MoveType::Absolute );\n}\n\nQWidget *ClipboardBrowser::currentItemPreview(QWidget *parent)\n{\n    if (!isLoaded())\n        return nullptr;\n\n    const QModelIndex index = currentIndex();\n    const auto data = index.data(contentType::data).toMap();\n    return d.createPreview(data, parent);\n}\n\nvoid ClipboardBrowser::findNext()\n{\n    if (isInternalEditorOpen())\n        m_editor->findNext();\n}\n\nvoid ClipboardBrowser::findPrevious()\n{\n    if (isInternalEditorOpen())\n        m_editor->findPrevious();\n}\n\nbool ClipboardBrowser::isInternalEditorOpen() const\n{\n    return !m_editor.isNull();\n}\n\nbool ClipboardBrowser::isExternalEditorOpen() const\n{\n    return m_externalEditorsOpen > 0;\n}\n\nbool ClipboardBrowser::isLoaded() const\n{\n    return !m_sharedData->itemFactory || m_itemSaver || tabName().isEmpty();\n}\n\nbool ClipboardBrowser::maybeCloseEditors()\n{\n    if ( (isInternalEditorOpen() && m_editor->hasChanges())\n         || isExternalEditorOpen() )\n    {\n        const int answer = QMessageBox::question( this,\n                    tr(\"Discard Changes?\"),\n                    tr(\"Do you really want to <strong>discard changes</strong>?\"),\n                    QMessageBox::No | QMessageBox::Yes,\n                    QMessageBox::No );\n        if (answer == QMessageBox::No)\n            return false;\n    }\n\n    setEditorWidget(nullptr);\n\n    emit closeExternalEditors();\n\n    return true;\n}\n\nvoid ClipboardBrowser::keyboardSearch(const QString &text)\n{\n    emit searchShowRequest(text);\n}\n"
  },
  {
    "path": "src/gui/clipboardbrowser.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n#include \"gui/clipboardbrowsershared.h\"\n#include \"item/clipboardmodel.h\"\n#include \"item/itemdelegate.h\"\n#include \"item/itemfilter.h\"\n#include \"item/itemwidget.h\"\n\n#include <QListView>\n#include <QPointer>\n#include <QTimer>\n#include <QVariantMap>\n#include <QVector>\n\nclass ItemEditorWidget;\nclass ItemFactory;\nclass PersistentDisplayItem;\nclass QPersistentModelIndex;\nclass QProgressBar;\nclass QPushButton;\n\n/** List view of clipboard items. */\nclass ClipboardBrowser final : public QListView\n{\n    Q_OBJECT\n\n    public:\n        ClipboardBrowser(\n                const QString &tabName,\n                const ClipboardBrowserSharedPtr &sharedData,\n                QWidget *parent = nullptr);\n\n        /** Close all external editors and save items if needed. */\n        ~ClipboardBrowser();\n\n        /**\n         * Move item with given @a hash to the top of the list.\n         *\n         * @return true only if item exists\n         */\n        bool moveToTop(uint itemHash);\n\n        /** Sort selected items. */\n        void sortItems(const QModelIndexList &indexes);\n        void sortItems(const QList<QPersistentModelIndex> &sorted);\n\n        /** Reverse order of selected items. */\n        void reverseItems(const QModelIndexList &indexes);\n\n        /** Index of item in given row. */\n        QModelIndex index(int i) const { return m.index(i,0); }\n\n        /** Returns concatenation of selected items. */\n        const QString selectedText() const;\n\n        /**\n         * Set tab name.\n         *\n         * This is ID used for saving items.\n         *\n         * If ID is empty saving is disabled.\n         */\n        bool setTabName(const QString &tabName);\n        const QString &tabName() const { return m_tabName; }\n\n        void setMaxItemCount(int count);\n        void setStoreItems(bool store);\n\n        /**\n         * Return true only if the internal editor widget is open.\n         */\n        bool isInternalEditorOpen() const;\n\n        /**\n         * Return true only if an external editor is open.\n         */\n        bool isExternalEditorOpen() const;\n\n        /**\n         * Close internal and external editor\n         * unless user don't want to discard changed (show message box).\n         *\n         * @return true only if editors were closed\n         */\n        bool maybeCloseEditors();\n\n        /**\n         * Override to disable default QAbstractItemView search.\n         */\n        void keyboardSearch(const QString &text) override;\n\n        QVariantMap copyIndex(const QModelIndex &index) const;\n\n        QVariantMap copyIndexes(const QModelIndexList &indexes) const;\n\n        void removeIndexes(const QModelIndexList &indexes, QString *error = nullptr);\n\n        bool canRemoveItems(const QModelIndexList &indexes, QString *error = nullptr);\n\n        /** Render preview image with items. */\n        QPixmap renderItemPreview(const QModelIndexList &indexes, int maxWidth, int maxHeight);\n\n        /** Removes items from end of list without notifying plugins. */\n        bool allocateSpaceForNewItems(int newItemCount);\n\n        /** Add new item to the browser. */\n        bool add(\n                const QString &txt, //!< Text of new item.\n                int row = 0 //!< Target row for the new item (negative to append item).\n                );\n\n        /**\n         * Add new item to the browser.\n         * @a item is automatically deleted after it's no longer needed.\n         */\n        bool add(\n                const QVariantMap &data, //!< Data for new item.\n                int row = 0 //!< Target row for the new item (negative to append item).\n                );\n\n        bool addReversed(const QVector<QVariantMap> &dataList, int row);\n\n        bool addAndSelect(const QVariantMap &data, int row);\n\n        /**\n         * Add item and remove duplicates.\n         */\n        void addUnique(const QVariantMap &data, ClipboardMode mode);\n\n        void setItemsData(const QMap<QPersistentModelIndex, QVariantMap> &itemsData);\n\n        /** Number of items in list. */\n        int length() const { return m.rowCount(); }\n\n        /** Receive key event. */\n        void keyEvent(QKeyEvent *event) { keyPressEvent(event); }\n        /** Move item to clipboard. */\n        void moveToClipboard(const QModelIndex &ind);\n        /** Move items to clipboard. */\n        void moveToClipboard(const QModelIndexList &indexes);\n        /** Show only items matching the regular expression. */\n        void filterItems(const ItemFilterPtr &filter);\n        /** Open editor. */\n        bool openEditor(const QModelIndex &index, const QString &format, const QByteArray &content, bool changeClipboard = false);\n        /** Open editor for an item. */\n        bool openEditor(const QModelIndex &index, const QString &format);\n\n        /** Set current item. */\n        void setCurrent(int row, bool keepSelection = false, bool setCurrentOnly = false);\n\n        /**\n         * Save items to configuration if needed.\n         */\n        void saveUnsavedItems();\n\n        /**\n         * Create and edit new item.\n         */\n        void editNew(\n            const QString &format, const QByteArray &content, bool changeClipboard = false);\n\n        /** Edit item in given @a row. */\n        void editRow(int row, const QString &format);\n\n        void move(int key);\n\n        void move(const QModelIndexList &indexes, int targetRow);\n\n        QWidget *currentItemPreview(QWidget *parent);\n\n        void findNext();\n\n        void findPrevious();\n\n        /**\n         * Load items from configuration.\n         * This function does nothing if model is disabled (e.g. loading failed previously).\n         * @see setID, saveItems\n         */\n        bool loadItems(const QByteArray &itemData = QByteArray());\n\n        /**\n         * Return true only if row is filtered and should be hidden.\n         */\n        bool isFiltered(int row) const;\n\n        bool isLoaded() const;\n\n        /**\n         * Save items to configuration.\n         * @see setID, loadItems\n         */\n        bool saveItems();\n\n        /** Move current item to clipboard. */\n        void moveToClipboard();\n\n        /** Edit selected unhidden items. */\n        void editSelected();\n\n        /** Edit notes for current item. */\n        void editNotes();\n\n        /** Open editor with text of all selected items or for single selected item. */\n        bool openEditor();\n\n        /** Remove selected unhidden items. */\n        void remove();\n\n        /** Show content of current item. */\n        void showItemContent();\n\n        void emitItemCount();\n\n        using QListView::isIndexHidden;\n        using QListView::isRowHidden;\n        using QListView::verticalOffset;\n\n    signals:\n        void runOnRemoveItemsHandler(const QList<QPersistentModelIndex> &indexes, bool *canRemove);\n\n        /** Show list request. */\n        void requestShow(const ClipboardBrowser *self);\n        /** Request clipboard change. */\n        void changeClipboard(const QVariantMap &data);\n\n        /** Emitted on error. */\n        void error(const QString &errorString);\n\n        void editingFinished();\n\n        void itemCountChanged(const QString &tabName, int count);\n\n        void showContextMenu(const QPoint &position);\n\n        void itemsChanged(const ClipboardBrowser *self);\n\n        void itemSelectionChanged(const ClipboardBrowser *self);\n\n        void internalEditorStateChanged(const ClipboardBrowser *self);\n\n        void searchRequest();\n        void searchHideRequest();\n        void searchShowRequest(const QString &pattern);\n\n        void closeExternalEditors();\n\n        void itemWidgetCreated(const PersistentDisplayItem &selection);\n\n        void filterProgressChanged(int percent);\n\n    protected:\n        void keyPressEvent(QKeyEvent *event) override;\n        void contextMenuEvent(QContextMenuEvent *) override;\n        void resizeEvent(QResizeEvent *event) override;\n        void showEvent(QShowEvent *event) override;\n        void currentChanged(const QModelIndex &current, const QModelIndex &previous) override;\n        void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override;\n        void focusInEvent(QFocusEvent *event) override;\n        void focusOutEvent(QFocusEvent *event) override;\n\n        void dragEnterEvent(QDragEnterEvent *event) override;\n        void dragLeaveEvent(QDragLeaveEvent *event) override;\n        void dragMoveEvent(QDragMoveEvent *event) override;\n        void dropEvent(QDropEvent *event) override;\n\n        void paintEvent(QPaintEvent *e) override;\n\n        void mousePressEvent(QMouseEvent *event) override;\n        void mouseReleaseEvent(QMouseEvent *event) override;\n        void mouseMoveEvent(QMouseEvent *event) override;\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n        void enterEvent(QEnterEvent *event) override;\n#else\n        void enterEvent(QEvent *event) override;\n#endif\n\n        void scrollContentsBy(int dx, int dy) override;\n\n        void doItemsLayout() override;\n\n    private slots:\n        void itemModified(const QByteArray &bytes, const QString &mime, const QModelIndex &index);\n\n        void onEditorNeedsChangeClipboard(const QByteArray &bytes, const QString &mime);\n\n        void closeExternalEditor(QObject *editor, const QModelIndex &index);\n\n    private:\n        void onRowsInserted(const QModelIndex &parent, int first, int last);\n\n        void onItemCountChanged();\n\n        void onEditorSave();\n\n        void onEditorCancel();\n\n        void onEditorInvalidate();\n\n        void setClipboardFromEditor();\n\n        /**\n         * Save items to configuration after an interval.\n         */\n        void delayedSaveItems(int ms);\n\n        /**\n         * Update item and editor sizes.\n         */\n        void updateSizes();\n\n        void updateCurrent();\n\n        /**\n         * Hide row if filtered out, otherwise show.\n         * @return true only if hidden\n         */\n        bool hideFiltered(int row);\n\n        /**\n         * Connects signals and starts external editor.\n         */\n        bool startEditor(QObject *editor);\n\n        void setEditorWidget(ItemEditorWidget *editor, bool changeClipboard = false);\n\n        void editItem(const QModelIndex &index, const QString &format = QString(), bool changeClipboard = false);\n\n        void updateEditorGeometry();\n\n        void updateCurrentItem();\n\n        /**\n         * Get index near given @a point.\n         * If space between items is at the @a point, return next item.\n         */\n        QModelIndex indexNear(int offset) const;\n\n        int getDropRow(QPoint position);\n\n        void connectModelAndDelegate();\n\n        void disconnectModel();\n\n        void updateItemMaximumSize();\n\n        void processDragAndDropEvent(QDropEvent *event);\n\n        /// Removes indexes without notifying or asking plugins.\n        void dropIndexes(const QModelIndexList &indexes);\n        void dropIndexes(QList<QPersistentModelIndex> &indexes);\n\n        void focusEditedIndex();\n\n        int findNextVisibleRow(int row);\n        int findPreviousVisibleRow(int row);\n        int findVisibleRowFrom(int row);\n\n        void preloadCurrentPage();\n        void preload(int pixels, int direction, const QModelIndex &start);\n\n        void updateCurrentIndex();\n\n        void moveToTop(const QModelIndex &index);\n\n        void maybeEmitEditingFinished();\n\n        QModelIndex firstUnpinnedIndex() const;\n\n        void dragDropScroll();\n\n        int currentRowFromSearch(const QString &search);\n\n        void filterBatch(int filterId, const QPersistentModelIndex &lastIndex);\n\n        ItemSaverPtr m_itemSaver;\n\n        QString m_tabName;\n        int m_maxItemCount = 200;\n        bool m_storeItems = true;\n\n        ClipboardModel m;\n        ItemDelegate d;\n        QTimer m_timerSave;\n        QTimer m_timerEmitItemCount;\n        QTimer m_timerUpdateSizes;\n        QTimer m_timerUpdateCurrent;\n        QTimer m_timerDragDropScroll;\n        QTimer m_timerPreload;\n        bool m_ignoreMouseMoveWithButtonPressed = false;\n        bool m_resizing = false;\n        bool m_resizeEvent = false;\n\n        QPointer<ItemEditorWidget> m_editor;\n        int m_externalEditorsOpen = 0;\n\n        ClipboardBrowserSharedPtr m_sharedData;\n\n        int m_dragTargetRow;\n        QPoint m_dragStartPosition;\n\n        bool m_selectNewItems = false;\n\n        int m_lastFilterId = 0;\n};\n"
  },
  {
    "path": "src/gui/clipboardbrowserplaceholder.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardbrowserplaceholder.h\"\n\n#include \"common/common.h\"\n#include \"common/log.h\"\n#include \"common/timer.h\"\n#include \"gui/passwordprompt.h\"\n#include \"item/itemstore.h\"\n#include \"item/serialize.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n\n#include <QApplication>\n#include <QDataStream>\n#include <QLoggingCategory>\n#include <QIODevice>\n#include <QPointer>\n#include <QProgressBar>\n#include <QPushButton>\n#include <QVBoxLayout>\n#include <QWidget>\n\n#include <memory>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.config\")\n\n} // namespace\n\nClipboardBrowserPlaceholder::ClipboardBrowserPlaceholder(\n        const QString &tabName, const ClipboardBrowserSharedPtr &shared, QWidget *parent)\n    : QWidget(parent)\n    , m_tabName(tabName)\n    , m_sharedData(shared)\n{\n    auto layout = new QVBoxLayout(this);\n    layout->setContentsMargins(0, 0, 0, 0);\n    layout->setSpacing(0);\n\n    initSingleShotTimer( &m_timerExpire, 0, this, &ClipboardBrowserPlaceholder::expire );\n    initSingleShotTimer( &m_timerPasswordExpire, 0, this, &ClipboardBrowserPlaceholder::restartPasswordExpiry);\n}\n\nClipboardBrowser *ClipboardBrowserPlaceholder::createBrowser(AskPassword askPassword)\n{\n    if (m_browser)\n        return m_browser;\n\n    if (m_loadButton)\n        return nullptr;\n\n    if (m_sharedData->tabsEncrypted && !m_sharedData->encryptionKey.isValid()) {\n        qCDebug(logCategory) << \"Locking tab (password not provided):\" << m_tabName;\n        createLoadButton();\n        return nullptr;\n    }\n\n    if (askPassword == AskPassword::IfNeeded && shouldPromptForLockedTabPassword()) {\n        QPointer<ClipboardBrowserPlaceholder> self(this);\n        qCDebug(logCategory) << \"Prompting for password for tab:\" << m_tabName;\n        const auto key = m_sharedData->passwordPrompt->prompt(\n            PasswordSource::IgnoreEnvAndKeychain);\n\n        if (!self)\n            return nullptr;\n\n        if (m_browser)\n            return m_browser;\n\n        if (m_loadButton)\n            return nullptr;\n\n        if (!key.isValid()) {\n            qCDebug(logCategory) << \"Locking tab:\" << m_tabName;\n            createLoadButton();\n            return nullptr;\n        }\n        qCDebug(logCategory) << \"Unlocking tab:\" << m_tabName;\n    }\n\n    qCDebug(logCategory) << \"Loading tab:\" << m_tabName;\n\n    std::unique_ptr<ClipboardBrowser> c( new ClipboardBrowser(m_tabName, m_sharedData, this) );\n\n    c->setStoreItems(m_storeItems);\n    c->setMaxItemCount(m_maxItemCount);\n\n    if ( !c->loadItems(m_data) ) {\n        createLoadButton();\n        return nullptr;\n    }\n\n    connect( c.get(), &ClipboardBrowser::itemSelectionChanged,\n             this, &ClipboardBrowserPlaceholder::restartExpiring);\n    connect( c.get(), &ClipboardBrowser::itemsChanged,\n             this, &ClipboardBrowserPlaceholder::restartExpiring);\n    connect( c.get(), &ClipboardBrowser::filterProgressChanged,\n             this, &ClipboardBrowserPlaceholder::onFilterProgressChanged);\n    connect( c.get(), &ClipboardBrowser::editingFinished,\n             this, &ClipboardBrowserPlaceholder::restartPasswordExpiry );\n\n    m_browser = c.release();\n\n    emit browserCreated(m_browser);\n    if (!m_browser)\n        return nullptr;\n\n    setActiveWidget(m_browser);\n\n    restartExpiring();\n    restartPasswordExpiry();\n\n    emit browserLoaded(m_browser);\n    return m_browser;\n}\n\nbool ClipboardBrowserPlaceholder::setTabName(const QString &tabName)\n{\n    if ( isEditorOpen() ) {\n        if ( !m_browser->setTabName(tabName) )\n            return false;\n        reloadBrowser();\n    } else if (m_storeItems) {\n        unloadBrowser();\n        if ( !moveItems(m_tabName, tabName) ) {\n            if ( isVisible() )\n                createBrowser(AskPassword::Avoid);\n            return false;\n        }\n    }\n\n    ::removeItems(m_tabName);\n    m_tabName = tabName;\n\n    if ( isVisible() )\n        createBrowser(AskPassword::Avoid);\n\n    return true;\n}\n\nvoid ClipboardBrowserPlaceholder::setMaxItemCount(int count)\n{\n    m_maxItemCount = count;\n    if (m_browser)\n        m_browser->setMaxItemCount(count);\n}\n\nvoid ClipboardBrowserPlaceholder::setStoreItems(bool store)\n{\n    m_storeItems = store;\n    if (m_browser)\n        m_browser->setStoreItems(store);\n}\n\nvoid ClipboardBrowserPlaceholder::setEncryptedExpireSeconds(int seconds)\n{\n    if (shouldPromptForLockedTabPassword()) {\n        m_passwordExpiredAt = std::chrono::steady_clock::now();\n    }\n    m_encryptedExpireSeconds = seconds;\n    restartPasswordExpiry();\n}\n\nvoid ClipboardBrowserPlaceholder::removeItems()\n{\n    unloadBrowser();\n\n    ::removeItems(m_tabName);\n}\n\nbool ClipboardBrowserPlaceholder::isDataLoaded() const\n{\n    return m_browser != nullptr;\n}\n\nClipboardBrowser *ClipboardBrowserPlaceholder::createBrowserAgain()\n{\n    if (m_sharedData->tabsEncrypted && m_sharedData->passwordPrompt && !m_sharedData->encryptionKey.isValid()) {\n        QPointer<ClipboardBrowserPlaceholder> self(this);\n        qCDebug(logCategory) << \"Prompting for initial password for tab:\" << m_tabName;\n        m_sharedData->passwordPrompt->prompt(\n            PasswordSource::IgnoreEnvAndKeychain,\n            [self](const Encryption::EncryptionKey &key){\n                if (self && key.isValid())\n                    self->m_sharedData->encryptionKey = key;\n            });\n\n        if (!self || !m_sharedData->encryptionKey.isValid())\n            return nullptr;\n    }\n\n    if (m_loadButton) {\n        m_loadButton->hide();\n        m_loadButton->deleteLater();\n        m_loadButton = nullptr;\n    }\n\n    return createBrowser();\n}\n\nvoid ClipboardBrowserPlaceholder::reloadBrowser()\n{\n    if ( isEditorOpen() ) {\n        connect( m_browser, &ClipboardBrowser::editingFinished,\n                 this, &ClipboardBrowserPlaceholder::reloadBrowser, Qt::UniqueConnection );\n    } else {\n        unloadBrowser();\n        if ( isVisible() )\n            createBrowser(AskPassword::Avoid);\n    }\n}\n\nvoid ClipboardBrowserPlaceholder::showEvent(QShowEvent *event)\n{\n    qCDebug(logCategory) << \"Showing tab:\" << m_tabName;\n    QWidget::showEvent(event);\n    QTimer::singleShot(0, this, [this](){\n        if ( isVisible() )\n            createBrowser();\n    });\n}\n\nvoid ClipboardBrowserPlaceholder::hideEvent(QHideEvent *event)\n{\n    qCDebug(logCategory) << \"Hiding tab:\" << m_tabName;\n    restartExpiring();\n    restartPasswordExpiry();\n    QWidget::hideEvent(event);\n}\n\nbool ClipboardBrowserPlaceholder::event(QEvent *event)\n{\n    if (event->type() == QEvent::WindowActivate && isVisible()) {\n        if (!m_browser && !m_loadButton)\n            createBrowser();\n    } else if (event->type() == QEvent::WindowDeactivate && isVisible()) {\n        restartPasswordExpiry();\n    }\n    return QWidget::event(event);\n}\n\nbool ClipboardBrowserPlaceholder::expire()\n{\n    if (!m_browser)\n        return true;\n\n    if (canExpire()) {\n        qCDebug(logCategory) << \"Expired tab:\" << m_tabName;\n        unloadBrowser();\n        return true;\n    }\n\n    restartExpiring();\n    return false;\n}\n\nvoid ClipboardBrowserPlaceholder::setActiveWidget(QWidget *widget)\n{\n    layout()->addWidget(widget);\n    setFocusProxy(widget);\n    widget->show();\n    if (isVisible())\n        widget->setFocus();\n}\n\nvoid ClipboardBrowserPlaceholder::createLoadButton()\n{\n    if (m_loadButton)\n        return;\n\n    qCDebug(logCategory) << \"Creating reload button for tab:\" << m_tabName;\n\n    m_loadButton = new QPushButton(this);\n    m_loadButton->setObjectName(\"ClipboardBrowserRefreshButton\");\n    m_loadButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);\n    m_loadButton->setFlat(true);\n\n    const QIcon icon( getIcon(\"\", IconRotateRight) );\n    m_loadButton->setIconSize( QSize(64, 64) );\n    m_loadButton->setIcon(icon);\n\n    connect( m_loadButton, &QAbstractButton::clicked,\n             this, &ClipboardBrowserPlaceholder::createBrowserAgain );\n\n    setActiveWidget(m_loadButton);\n}\n\nvoid ClipboardBrowserPlaceholder::unloadBrowser()\n{\n    if (!m_browser)\n        return;\n\n    qCDebug(logCategory) << \"Unloading tab:\" << m_tabName;\n\n    // Keep unsaved items in memory until expiration.\n    m_data.clear();\n    if ( !m_storeItems && m_browser->isLoaded() ) {\n        QDataStream stream(&m_data, QIODevice::WriteOnly);\n        if ( !serializeData(*m_browser->model(), &stream, -1, &m_sharedData->encryptionKey) )\n            m_data.clear();\n    }\n\n    // WORKAROUND: This is needed on macOS, to fix refocusing correct widget later.\n    m_browser->clearFocus();\n\n    m_browser->hide();\n    m_browser->saveUnsavedItems();\n    m_browser->deleteLater();\n    m_browser = nullptr;\n\n    if (m_filterProgressBar)\n        m_filterProgressBar->hide();\n    m_timerPasswordExpire.stop();\n\n    emit browserDestroyed();\n}\n\nbool ClipboardBrowserPlaceholder::canExpire() const\n{\n    return m_browser\n            && m_storeItems\n            && !isVisible()\n            && !isEditorOpen();\n}\n\nbool ClipboardBrowserPlaceholder::hasActiveFocus() const\n{\n    return isVisible() && qApp->applicationState() == Qt::ApplicationActive;\n}\n\nvoid ClipboardBrowserPlaceholder::restartExpiring()\n{\n    const int expireTimeoutMs = 60000 * m_sharedData->minutesToExpire;\n    if (expireTimeoutMs > 0)\n        m_timerExpire.start(expireTimeoutMs);\n    else\n        m_timerExpire.stop();\n}\n\nint ClipboardBrowserPlaceholder::encryptedExpireRemainingMs() const\n{\n    if (!m_sharedData->passwordPrompt)\n        return -1;\n\n    const int timeoutSeconds = m_encryptedExpireSeconds;\n    if (timeoutSeconds <= 0)\n        return -1;\n\n    const auto lastPrompt = m_sharedData->passwordPrompt->lastSuccessfulPasswordPromptTime();\n    const auto now = std::chrono::steady_clock::now();\n    const auto elapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastPrompt).count();\n    const qint64 timeoutMs = static_cast<qint64>(timeoutSeconds) * 1000;\n    return qMax<qint64>(0, timeoutMs - elapsedMs);\n}\n\nbool ClipboardBrowserPlaceholder::shouldPromptForLockedTabPassword() const\n{\n    if (!m_sharedData->tabsEncrypted || !m_sharedData->passwordPrompt || !m_sharedData->encryptionKey.isValid())\n        return false;\n\n    if (m_passwordExpiredAt > m_sharedData->passwordPrompt->lastSuccessfulPasswordPromptTime())\n        return true;\n\n    const int remainingMs = encryptedExpireRemainingMs();\n    return remainingMs == 0;\n}\n\nvoid ClipboardBrowserPlaceholder::restartPasswordExpiry()\n{\n    m_timerPasswordExpire.stop();\n    if (!m_browser || !m_sharedData->tabsEncrypted)\n        return;\n\n    if (isEditorOpen() || hasActiveFocus())\n        return;  // will check later on a signal\n\n    const int remainingMs = encryptedExpireRemainingMs();\n    if (remainingMs < 0)\n        return;\n\n    if (remainingMs == 0) {\n        qCDebug(logCategory) << \"Expired tab (password required):\" << m_tabName;\n        unloadBrowser();\n        return;\n    }\n\n    m_timerPasswordExpire.start(static_cast<int>(remainingMs));\n}\n\nbool ClipboardBrowserPlaceholder::isEditorOpen() const\n{\n    return m_browser && (\n                m_browser->isInternalEditorOpen()\n                || m_browser->isExternalEditorOpen() );\n}\n\nvoid ClipboardBrowserPlaceholder::onFilterProgressChanged(int percent)\n{\n    if (percent >= 100) {\n        if (m_filterProgressBar)\n            m_filterProgressBar->hide();\n        return;\n    }\n\n    if (m_filterProgressBar == nullptr) {\n        m_filterProgressBar = new QProgressBar(this);\n        m_filterProgressBar->setObjectName(\"ClipboardBrowserFilterProgressBar\");\n        m_filterProgressBar->setContentsMargins({});\n        m_filterProgressBar->setTextVisible(false);\n        layout()->addWidget(m_filterProgressBar);\n    }\n\n    m_filterProgressBar->setValue(percent);\n    m_filterProgressBar->show();\n}\n"
  },
  {
    "path": "src/gui/clipboardbrowserplaceholder.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/clipboardbrowsershared.h\"\n\n#include <QByteArray>\n#include <QString>\n#include <QTimer>\n#include <QWidget>\n\nclass ClipboardBrowser;\nclass QProgressBar;\nclass QPushButton;\n\nclass ClipboardBrowserPlaceholder final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    enum class AskPassword {\n        IfNeeded, Avoid\n    };\n    ClipboardBrowserPlaceholder(\n            const QString &tabName, const ClipboardBrowserSharedPtr &shared, QWidget *parent);\n\n    /// Returns browser (nullptr if not yet created).\n    ClipboardBrowser *browser() const { return m_browser; }\n\n    ClipboardBrowser *createBrowser(AskPassword askPassword = AskPassword::IfNeeded);\n\n    bool setTabName(const QString &tabName);\n    QString tabName() const { return m_tabName; }\n\n    void setMaxItemCount(int count);\n    void setStoreItems(bool store);\n    void setEncryptedExpireSeconds(int seconds);\n\n    void removeItems();\n\n    bool isDataLoaded() const;\n\n    /// Create browser if it doesn't exist and even if it previously failed.\n    ClipboardBrowser *createBrowserAgain();\n\n    /// Unload and reload (when needed) browser and settings.\n    void reloadBrowser();\n\n    /// Unload browser and data.\n    bool expire();\n\n    void unloadBrowser();\n\n    void createLoadButton();\n\nsignals:\n    void browserCreated(ClipboardBrowser *browser);\n    void browserLoaded(ClipboardBrowser *browser);\n    void browserDestroyed();\n\nprotected:\n    void showEvent(QShowEvent *event) override;\n    void hideEvent(QHideEvent *event) override;\n    bool event(QEvent *event) override;\n\nprivate:\n    void setActiveWidget(QWidget *widget);\n\n    bool canExpire() const;\n    bool hasActiveFocus() const;\n    int encryptedExpireRemainingMs() const;\n    bool shouldPromptForLockedTabPassword() const;\n    void restartPasswordExpiry();\n\n    void restartExpiring();\n\n    bool isEditorOpen() const;\n\n    void onFilterProgressChanged(int percent);\n\n    ClipboardBrowser *m_browser = nullptr;\n    QPushButton *m_loadButton = nullptr;\n    QProgressBar *m_filterProgressBar = nullptr;\n\n    QString m_tabName;\n    int m_maxItemCount = 200;\n    bool m_storeItems = true;\n    int m_encryptedExpireSeconds = 0;\n    ClipboardBrowserSharedPtr m_sharedData;\n\n    QTimer m_timerExpire;\n    QTimer m_timerPasswordExpire;\n    QByteArray m_data;\n    std::chrono::steady_clock::time_point m_passwordExpiredAt;\n};\n"
  },
  {
    "path": "src/gui/clipboardbrowsershared.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n\n#include \"common/navigationstyle.h\"\n#include \"common/encryption.h\"\n#include \"gui/menuitems.h\"\n#include \"gui/theme.h\"\n\n#include <QString>\n\n#include <memory>\n\nclass ActionHandler;\nclass ItemFactory;\nclass NotificationDaemon;\nclass PasswordPrompt;\n\nstruct ClipboardBrowserShared {\n    QString editor;\n    int maxItems = 100;\n    bool textWrap = true;\n    NavigationStyle navigationStyle = NavigationStyle::Default;\n    bool saveOnReturnKey = false;\n    bool moveItemOnReturnKey = false;\n    bool showSimpleItems = false;\n    bool numberSearch = false;\n    int minutesToExpire = 0;\n    int encryptedExpireSeconds = 0;\n    bool tabsEncrypted = false;\n    int saveDelayMsOnItemAdded = 0;\n    int saveDelayMsOnItemModified = 0;\n    int saveDelayMsOnItemRemoved = 0;\n    int saveDelayMsOnItemMoved = 0;\n    int saveDelayMsOnItemEdited = 0;\n    bool rowIndexFromOne = true;\n    ItemFactory *itemFactory = nullptr;\n    ActionHandler *actions = nullptr;\n    NotificationDaemon *notifications = nullptr;\n    PasswordPrompt *passwordPrompt = nullptr;\n    Theme theme;\n    MenuItems menuItems;\n    Encryption::EncryptionKey encryptionKey;\n};\n\nusing ClipboardBrowserSharedPtr = std::shared_ptr<ClipboardBrowserShared>;\n"
  },
  {
    "path": "src/gui/clipboarddialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboarddialog.h\"\n#include \"ui_clipboarddialog.h\"\n\n#include \"common/common.h\"\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/shortcuts.h\"\n#include \"common/timer.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/windowgeometryguard.h\"\n#include \"platform/platformclipboard.h\"\n\n#include <QBuffer>\n#include <QListWidgetItem>\n#include <QMimeData>\n#include <QMovie>\n#include <QScrollBar>\n#include <QUrl>\n\nnamespace {\n\n// Limit number of characters to load at once - performance reasons.\nconstexpr int batchLoadCharacters = 4096;\nconstexpr int priorityHigh = 100;\nconstexpr int priorityMedium = priorityHigh / 2;\nconstexpr int priorityLow = priorityMedium / 2;\nconstexpr int priorityLower = priorityLow / 2;\nconstexpr int priorityLowest = 0;\n\nint formatSortPriority(const QString &format)\n{\n    if (format == mimeText)\n        return priorityHigh + 2;\n\n    if (format == mimeHtml)\n        return priorityHigh + 1;\n\n    if ( format.startsWith(\"text/\") )\n        return priorityHigh;\n\n    if ( format.startsWith(\"application/\") )\n        return priorityLow;\n\n    if ( format.contains(\"/x-\") )\n        return priorityLower;\n\n    if ( format.isEmpty() || format[0].isUpper() )\n        return priorityLowest;\n\n    return priorityMedium;\n}\n\n} // namespace\n\nClipboardDialog::ClipboardDialog(QWidget *parent)\n    : QDialog(parent)\n    , m_clipboard(platformNativeInterface()->clipboard())\n{\n    init();\n\n    const QMimeData *clipData = m_clipboard->mimeData(ClipboardMode::Clipboard);\n    if (clipData) {\n        m_dataFromClipboard = true;\n        for (const auto &format : clipData->formats()) {\n            m_data.insert(format, QVariant());\n        }\n        setData(m_data);\n    }\n\n    ui->listWidgetFormats->setCurrentRow(0);\n}\n\nClipboardDialog::ClipboardDialog(\n        const QPersistentModelIndex &index, QAbstractItemModel *model, QWidget *parent)\n    : QDialog(parent)\n    , m_model(model)\n    , m_index(index)\n{\n    init();\n\n    setWindowTitle( tr(\"Item Content\") );\n    connect( m_model.data(), &QAbstractItemModel::dataChanged,\n             this, &ClipboardDialog::onDataChanged );\n    onDataChanged(m_index, m_index);\n\n    ui->listWidgetFormats->setCurrentRow(0);\n}\n\nClipboardDialog::~ClipboardDialog()\n{\n    delete ui;\n}\n\nvoid ClipboardDialog::onListWidgetFormatsCurrentItemChanged(\n        QListWidgetItem *current, QListWidgetItem *)\n{\n    ui->actionRemove_Format->setEnabled(current != nullptr);\n\n    const QString mime = current ? current->text() : QString();\n    const bool hasImage = mime.startsWith(QLatin1String(\"image\")) ;\n    const QByteArray animationFormat =\n            QString(mime).remove(QRegularExpression(QLatin1String(\"^image/\"))).toUtf8();\n    const bool hasAnimation = QMovie::supportedFormats().contains(animationFormat);\n\n    ui->textEdit->clear();\n    ui->textEdit->setVisible(!hasImage);\n    ui->scrollAreaImage->setVisible(hasImage);\n\n    if (hasImage)\n        ui->labelContent->setBuddy(ui->scrollAreaImage);\n    else\n        ui->labelContent->setBuddy(ui->textEdit);\n\n    QVariant value = m_data.value(mime);\n    if ( m_dataFromClipboard && !value.isValid() ) {\n        const auto data = m_clipboard->mimeData(ClipboardMode::Clipboard);\n        value = m_data[mime] = data ? data->data(mime) : QByteArray();\n    }\n\n    const QByteArray bytes = value.toByteArray();\n\n    m_timerTextLoad.stop();\n\n    if (hasAnimation) {\n        if (m_animation)\n            m_animation->deleteLater();\n\n        if (m_animationBuffer)\n            m_animationBuffer->deleteLater();\n\n        m_animationBuffer = new QBuffer(this);\n        m_animationBuffer->open(QIODevice::ReadWrite);\n        m_animationBuffer->write(bytes);\n        m_animationBuffer->seek(0);\n\n        m_animation = new QMovie(this);\n        m_animation->setDevice(m_animationBuffer);\n        m_animation->setFormat(animationFormat);\n        ui->labelImage->setMovie(m_animation);\n        m_animation->start();\n    } else if (hasImage) {\n        QPixmap pix;\n        pix.loadFromData( bytes, mime.toLatin1() );\n        ui->labelImage->setPixmap(pix);\n    } else {\n        m_textToShow = dataToText(bytes, mime);\n        addText();\n    }\n\n    if (current) {\n        ui->labelProperties->setText(\n                tr(\"<strong>Size:</strong> %1 bytes\", \"Size of clipboard/item data in bytes\")\n                .arg(bytes.size()) );\n    } else {\n        ui->labelProperties->setText(QString());\n    }\n}\n\nvoid ClipboardDialog::onActionRemoveFormatTriggered()\n{\n     QListWidgetItem *item = ui->listWidgetFormats->currentItem();\n     if (item) {\n         const QString mimeToRemove = item->text();\n         m_data.remove(mimeToRemove);\n         delete item;\n\n         if (m_model)\n             m_model->setData(m_index, mimeToRemove, contentType::removeFormats);\n         else\n             emit changeClipboard(m_data);\n     }\n}\n\nvoid ClipboardDialog::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)\n{\n    if (m_index.isValid()\n            && topLeft.row() <= m_index.row()\n            && m_index.row() <= bottomRight.row())\n    {\n        setData( m_index.data(contentType::data).toMap() );\n    }\n}\n\nvoid ClipboardDialog::addText()\n{\n    const int scrollValue = ui->textEdit->verticalScrollBar()->value();\n\n    ui->textEdit->appendPlainText( m_textToShow.left(batchLoadCharacters) );\n    m_textToShow.remove(0, batchLoadCharacters);\n\n    if ( !m_textToShow.isEmpty() )\n        m_timerTextLoad.start();\n\n    ui->textEdit->verticalScrollBar()->setValue(scrollValue);\n}\n\nvoid ClipboardDialog::init()\n{\n    Q_ASSERT(!ui);\n\n    ui = new Ui::ClipboardDialog;\n    ui->setupUi(this);\n\n    connect(ui->listWidgetFormats, &QListWidget::currentItemChanged,\n            this, &ClipboardDialog::onListWidgetFormatsCurrentItemChanged);\n    connect(ui->actionRemove_Format, &QAction::triggered,\n            this, &ClipboardDialog::onActionRemoveFormatTriggered);\n\n    setWindowIcon(appIcon());\n\n    ui->horizontalLayout->setStretchFactor(1, 1);\n\n    WindowGeometryGuard::create(this);\n\n    ui->actionRemove_Format->setIcon( getIcon(\"list-remove\", IconTrash) );\n    ui->actionRemove_Format->setShortcut(shortcutToRemove());\n    ui->listWidgetFormats->addAction(ui->actionRemove_Format);\n\n    onListWidgetFormatsCurrentItemChanged(nullptr, nullptr);\n\n    ui->listWidgetFormats->setFocus(Qt::ActiveWindowFocusReason);\n}\n\nvoid ClipboardDialog::setData(const QVariantMap &data)\n{\n    const QString currentFormat = ui->listWidgetFormats->currentIndex().data().toString();\n    ui->listWidgetFormats->clear();\n    m_data = data;\n\n    QStringList formats = data.keys();\n    std::sort( std::begin(formats), std::end(formats), [](const QString &lhs, const QString &rhs) {\n        const int lhsPriority = formatSortPriority(lhs);\n        const int rhsPriority = formatSortPriority(rhs);\n        return lhsPriority == rhsPriority ? lhs < rhs : lhsPriority > rhsPriority;\n    } );\n    for (const QString &format : formats) {\n        ui->listWidgetFormats->addItem(format);\n        if (format == currentFormat) {\n            ui->listWidgetFormats->setCurrentRow(\n                        ui->listWidgetFormats->count() - 1);\n        }\n    }\n\n    initSingleShotTimer(&m_timerTextLoad, 10, this, &ClipboardDialog::addText);\n}\n"
  },
  {
    "path": "src/gui/clipboarddialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n#include <QPersistentModelIndex>\n#include <QPointer>\n#include <QVariantMap>\n#include <QTimer>\n\n#include \"platform/platformnativeinterface.h\"\n\nclass QBuffer;\nclass QListWidgetItem;\nclass QMovie;\n\nnamespace Ui {\n    class ClipboardDialog;\n}\n\nclass ClipboardDialog final : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    /**\n     * Create dialog with clipboard data.\n     */\n    explicit ClipboardDialog(QWidget *parent = nullptr);\n\n    /**\n     * Create dialog with item data.\n     */\n    explicit ClipboardDialog(const QPersistentModelIndex &index, QAbstractItemModel *model, QWidget *parent = nullptr);\n\n    ~ClipboardDialog();\n\nsignals:\n    void changeClipboard(const QVariantMap &data);\n\nprivate:\n    void onListWidgetFormatsCurrentItemChanged(\n            QListWidgetItem *current, QListWidgetItem *previous);\n\n    void onActionRemoveFormatTriggered();\n\n    void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);\n\n    void addText();\n\n    void init();\n\n    void setData(const QVariantMap &data);\n\n    Ui::ClipboardDialog *ui = nullptr;\n    QPointer<QAbstractItemModel> m_model;\n    QPersistentModelIndex m_index;\n    QVariantMap m_data;\n    bool m_dataFromClipboard = false;\n    QString m_textToShow;\n    QTimer m_timerTextLoad;\n\n    QBuffer *m_animationBuffer = nullptr;\n    QMovie *m_animation = nullptr;\n\n    PlatformClipboardPtr m_clipboard;\n};\n"
  },
  {
    "path": "src/gui/clipboardspy.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardspy.h\"\n\n#include \"common/common.h\"\n#include \"common/mimetypes.h\"\n\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QApplication>\n#include <QTimer>\n\nClipboardSpy::ClipboardSpy(ClipboardMode mode, const QByteArray &owner)\n    : m_mode(mode)\n    , m_clipboard(platformNativeInterface()->clipboard())\n{\n    m_oldOwnerData = owner.isEmpty() ? currentOwnerData() : owner;\n}\n\nvoid ClipboardSpy::wait(int ms, int checkIntervalMs)\n{\n    if (m_stopped)\n        return;\n\n    if (m_mode == ClipboardMode::Selection && !m_clipboard->isSelectionSupported())\n        return;\n\n    QEventLoop loop;\n    connect( this, &ClipboardSpy::changed, &loop, &QEventLoop::quit );\n    connect( this, &ClipboardSpy::stopped, &loop, &QEventLoop::quit );\n    connect( QCoreApplication::instance(), &QCoreApplication::aboutToQuit, &loop, &QEventLoop::quit );\n\n    QTimer timerStop;\n    if (ms >= 0) {\n        timerStop.setInterval(ms);\n        connect( &timerStop, &QTimer::timeout, &loop, &QEventLoop::quit );\n        timerStop.start();\n    }\n\n    QTimer timerCheck;\n    timerCheck.setInterval(checkIntervalMs);\n    connect( &timerCheck, &QTimer::timeout, this, &ClipboardSpy::emitChangeIfChanged );\n    timerCheck.start();\n\n    loop.exec();\n}\n\nbool ClipboardSpy::setClipboardData(const QVariantMap &data)\n{\n    m_settingClipboard = true;\n    m_oldOwnerData = currentOwnerData();\n\n    if (!m_connection) {\n        const auto mode = m_mode == ClipboardMode::Clipboard\n            ? ClipboardModeFlag::Clipboard\n            : ClipboardModeFlag::Selection;\n        m_connection = m_clipboard->createConnection(QStringList(mimeOwner), mode);\n        connect(m_connection.get(), &ClipboardConnection::changed,\n                this, &ClipboardSpy::emitChangeIfChanged);\n    }\n\n    m_clipboard->setData(m_mode, data);\n    wait();\n    m_oldOwnerData = data.value(mimeOwner).toByteArray();\n    m_settingClipboard = false;\n    return m_oldOwnerData == currentOwnerData();\n}\n\nQByteArray ClipboardSpy::currentOwnerData() const\n{\n    return m_clipboard->data(m_mode, QStringList(mimeOwner)).value(mimeOwner).toByteArray();\n}\n\nvoid ClipboardSpy::stop()\n{\n    m_stopped = true;\n    emit stopped();\n}\n\nvoid ClipboardSpy::emitChangeIfChanged()\n{\n    const auto newOwner = currentOwnerData();\n    if (m_oldOwnerData != newOwner) {\n        emit changed();\n    } else if (!m_settingClipboard && m_oldOwnerData.isEmpty() && newOwner.isEmpty()) {\n        emit changed();\n    }\n}\n"
  },
  {
    "path": "src/gui/clipboardspy.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QObject>\n\nclass ClipboardSpy final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit ClipboardSpy(ClipboardMode mode, const QByteArray &owner);\n\n    /// Actively wait for clipboard/selection to change.\n    void wait(int ms = 2000, int checkIntervalMs = 8000);\n\n    bool setClipboardData(const QVariantMap &data);\n\n    QByteArray currentOwnerData() const;\n\n    void stop();\n\n\nsignals:\n    void changed();\n    void stopped();\n\nprivate:\n    void emitChangeIfChanged();\n\n    ClipboardMode m_mode;\n    PlatformClipboardPtr m_clipboard;\n    ClipboardConnectionPtr m_connection;\n    QByteArray m_oldOwnerData;\n    bool m_settingClipboard = false;\n    bool m_stopped = false;\n};\n"
  },
  {
    "path": "src/gui/commandaction.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandaction.h\"\n\n#include \"common/common.h\"\n#include \"common/mimetypes.h\"\n#include \"common/shortcuts.h\"\n#include \"common/textdata.h\"\n#include \"gui/iconfactory.h\"\n\n#include <QMenu>\n#include <QShortcutEvent>\n\nCommandAction::CommandAction(\n        const Command &command,\n        const QString &name,\n        QMenu *parentMenu)\n    : QAction(parentMenu)\n    , m_command(command)\n{\n    setText( elideText(name, parentMenu->font(), QString()) );\n\n    setIcon( iconFromFile(m_command.icon) );\n    if (m_command.icon.size() == 1)\n        setProperty( \"CopyQ_icon_id\", m_command.icon[0].unicode() );\n\n    connect(this, &QAction::triggered, this, &CommandAction::onTriggered);\n\n    parentMenu->addAction(this);\n}\n\nconst Command &CommandAction::command() const\n{\n    return m_command;\n}\n\nbool CommandAction::event(QEvent *event)\n{\n    if (event->type() == QEvent::Shortcut) {\n        QShortcutEvent *shortcutEvent = static_cast<QShortcutEvent*>(event);\n        m_triggeredShortcut = portableShortcutText(shortcutEvent->key());\n    }\n\n    return QAction::event(event);\n}\n\nvoid CommandAction::onTriggered()\n{\n    const auto triggeredShortcut = m_triggeredShortcut;\n    m_triggeredShortcut.clear();\n    emit triggerCommand(this, triggeredShortcut);\n}\n"
  },
  {
    "path": "src/gui/commandaction.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/command.h\"\n\n#include <QAction>\n#include <QPointer>\n\nclass CommandAction final : public QAction\n{\n    Q_OBJECT\npublic:\n    CommandAction(const Command &command,\n            const QString &name,\n            QMenu *parentMenu = nullptr);\n\n    const Command &command() const;\n\nsignals:\n    void triggerCommand(CommandAction *self, const QString &triggeredShortcut);\n\nprotected:\n    bool event(QEvent *event) override;\n\nprivate:\n    void onTriggered();\n    void onChanged();\n\n    Command m_command;\n    QString m_triggeredShortcut;\n};\n"
  },
  {
    "path": "src/gui/commandcompleter.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandcompleter.h\"\n#include \"commandsyntaxhighlighter.h\"\n#include \"commandcompleterdocumentation.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/timer.h\"\n\n#include <QAbstractItemView>\n#include <QCompleter>\n#include <QCoreApplication>\n#include <QHash>\n#include <QHeaderView>\n#include <QKeyEvent>\n#include <QTableView>\n#include <QTimer>\n#include <QPlainTextEdit>\n#include <QScrollBar>\n#include <QStringListModel>\n#include <QShortcut>\n\nnamespace {\n\nconst QLatin1String tagObject(\"obj\");\nconst QLatin1String tagType(\"type\");\nconst QLatin1String tagProperty(\"prop\");\nconst QLatin1String tagFunction(\"fn\");\nconst QLatin1String tagKeyword(\"kw\");\n\nclass CommandCompleterModel final : public QStringListModel {\npublic:\n    explicit CommandCompleterModel(QObject *parent)\n        : QStringListModel(parent)\n    {\n        for (const QString &name : scriptableObjects()) {\n            if (name.size() > 1 && name[0].isUpper() && name[1].isLower())\n                m_doc[name].tag = tagType;\n            else\n                m_doc[name].tag = tagObject;\n        }\n\n        for (const auto &name : scriptableProperties())\n            m_doc[name].tag = tagProperty;\n\n        for (const auto &name : scriptableFunctions())\n            m_doc[name].tag = tagFunction;\n\n        for (const auto &name : scriptableKeywords())\n            m_doc[name].tag = tagKeyword;\n\n        addDocumentation();\n\n        QStringList completionItems = m_doc.keys();\n        std::sort(std::begin(completionItems), std::end(completionItems));\n        setStringList(completionItems);\n    }\n\n    int columnCount(const QModelIndex &) const override\n    {\n        return 3;\n    }\n\n    QVariant data(const QModelIndex &index, int role) const override\n    {\n        const int row = index.row();\n\n        if (index.column() == 1) {\n            if (role == Qt::DisplayRole || role == Qt::EditRole)\n                return documentationForRow(row).tag;\n\n            if (role == Qt::ForegroundRole)\n                return QColor(Qt::gray);\n\n            return QVariant();\n        }\n\n        if (index.column() == 2) {\n            if (role == Qt::DisplayRole || role == Qt::EditRole)\n                return documentationForRow(row).doc;\n\n            return QVariant();\n        }\n\n        if (role == Qt::ToolTipRole)\n            return typeForRow(row);\n\n        return QStringListModel::data(index, role);\n    }\n\nprivate:\n    struct ScriptableDocumentation {\n        QString tag;\n        QString doc;\n    };\n\n    void addDocumentation()\n    {\n        ::addDocumentation(\n            [this](const QString &name, const QString &api, const QString &documentation) {\n                auto &doc = m_doc[name].doc;\n                if (!doc.isEmpty())\n                    doc.append(\"\\n\");\n                doc.append(api + \"\\n    \" + documentation);\n            });\n    }\n\n    ScriptableDocumentation documentationForRow(int row) const\n    {\n        const auto index2 = this->index(row, 0);\n        const auto text = QStringListModel::data(index2, Qt::EditRole).toString();\n        return m_doc.value(text);\n    }\n\n    QString typeForRow(int row) const\n    {\n        const auto tagText = documentationForRow(row).tag;\n        if (tagText == tagObject)\n            return QStringLiteral(\"object\");\n        if (tagText == tagType)\n            return QStringLiteral(\"type\");\n        if (tagText == tagProperty)\n            return QStringLiteral(\"property\");\n        if (tagText == tagFunction)\n            return QStringLiteral(\"function\");\n        if (tagText == tagKeyword)\n            return QStringLiteral(\"keyword\");\n        return tagText;\n    }\n\n    QHash<QString, ScriptableDocumentation> m_doc;\n};\n\nvoid setUpHeader(QHeaderView *header)\n{\n    header->hide();\n    header->setSectionResizeMode(QHeaderView::ResizeToContents);\n}\n\nclass CommandCompleterPopup final : public QTableView {\npublic:\n    explicit CommandCompleterPopup(QWidget *parent)\n        : QTableView(parent)\n    {\n        setUpHeader(horizontalHeader());\n        setUpHeader(verticalHeader());\n        setShowGrid(false);\n        setContentsMargins(0, 0, 0, 0);\n        setSelectionBehavior(QAbstractItemView::SelectRows);\n        setAlternatingRowColors(true);\n\n        initSingleShotTimer(&m_timerResize, 10, this, &CommandCompleterPopup::updateSize);\n    }\n\nprotected:\n    void showEvent(QShowEvent *event) override\n    {\n        QTableView::showEvent(event);\n        m_timerResize.start();\n    }\n\nprivate:\n    void updateSize()\n    {\n        if (!model())\n            return;\n\n        const auto margins = contentsMargins();\n        const int w = columnsWidth()\n                + (verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0)\n                + margins.left() + margins.right();\n        const int h = rowsHeight(8)\n                + (horizontalScrollBar()->isVisible() ? verticalScrollBar()->height() : 0)\n                + margins.top() + margins.bottom();\n        resize(w, h);\n    }\n\n    int columnsWidth() const\n    {\n        int width = 0;\n        for ( int column = 0; column < model()->columnCount(); ++column )\n            width += columnWidth(column);\n        return width;\n    }\n\n    int rowsHeight(int maxRows) const\n    {\n        int height = 0;\n        for ( int row = 0; row < qMin(maxRows, model()->rowCount()); ++row )\n            height += rowHeight(row);\n        return height;\n    }\n\n    QTimer m_timerResize;\n};\n\n} // namespace\n\nCommandCompleter::CommandCompleter(QPlainTextEdit *editor)\n    : QObject(editor)\n    , m_editor(editor)\n    , m_completer(new QCompleter(new CommandCompleterModel(this), this))\n{\n    setObjectName(\"CommandCompleter\");\n\n    m_completer->setWidget(m_editor);\n    m_completer->setCompletionMode(QCompleter::PopupCompletion);\n    m_completer->setCaseSensitivity(Qt::CaseInsensitive);\n\n    m_completer->setPopup(new CommandCompleterPopup(m_editor));\n    m_completer->popup()->installEventFilter(this);\n\n    connect( m_completer, static_cast<void (QCompleter::*)(const QString&)>(&QCompleter::activated),\n             this, &CommandCompleter::insertCompletion );\n\n    connect( m_editor, &QPlainTextEdit::textChanged,\n             this, &CommandCompleter::onTextChanged );\n    connect( m_editor, &QPlainTextEdit::cursorPositionChanged,\n             m_completer->popup(), &QWidget::hide );\n\n    auto shortcut = new QShortcut(tr(\"Ctrl+Space\", \"Shortcut to show completion menu\"), editor);\n    connect( shortcut, &QShortcut::activated,\n             this, &CommandCompleter::showCompletion );\n}\n\nbool CommandCompleter::eventFilter(QObject *, QEvent *event)\n{\n    if (event->type() != QEvent::KeyPress)\n        return false;\n\n    QKeyEvent *e = static_cast<QKeyEvent*>(event);\n    QAbstractItemView *popup = m_completer->popup();\n\n    switch (e->key()) {\n    case Qt::Key_Enter:\n    case Qt::Key_Return:\n    case Qt::Key_Tab:\n    case Qt::Key_Backtab:\n        m_completer->setCurrentRow( popup->currentIndex().row() );\n        insertCompletion( m_completer->currentCompletion() );\n        popup->hide();\n        return true;\n\n    case Qt::Key_Escape:\n        popup->hide();\n        return true;\n\n    default:\n        return false;\n    }\n}\n\nQWidget *CommandCompleter::popup() const\n{\n    return m_completer->popup();\n}\n\nvoid CommandCompleter::onTextChanged()\n{\n    updateCompletion(false);\n}\n\nvoid CommandCompleter::updateCompletion(bool forceShow)\n{\n    const QString completionPrefix = textUnderCursor();\n\n    QAbstractItemView *popup = m_completer->popup();\n\n    if ( !forceShow && completionPrefix.length() < 3 ) {\n        popup->hide();\n    } else {\n        // Don't auto-complete if it's disabled in configuration.\n        if ( !forceShow && !AppConfig().option<Config::autocompletion>() )\n            return;\n\n        if (completionPrefix != m_completer->completionPrefix()) {\n            m_completer->setCompletionPrefix(completionPrefix);\n            popup->setCurrentIndex(m_completer->completionModel()->index(0, 0));\n        }\n\n        const auto rect = m_editor->cursorRect();\n        m_completer->complete(rect);\n    }\n}\n\nvoid CommandCompleter::insertCompletion(const QString &completion)\n{\n    QTextCursor tc = m_editor->textCursor();\n    tc.movePosition(QTextCursor::Left);\n    tc.movePosition(QTextCursor::StartOfWord);\n    tc.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);\n    tc.insertText(completion);\n    m_editor->setTextCursor(tc);\n}\n\nvoid CommandCompleter::showCompletion()\n{\n    updateCompletion(true);\n}\n\nQString CommandCompleter::textUnderCursor() const\n{\n    auto tc = m_editor->textCursor();\n    tc.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor);\n    tc.select(QTextCursor::WordUnderCursor);\n    const auto text = tc.selectedText();\n    return text;\n}\n"
  },
  {
    "path": "src/gui/commandcompleter.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QObject>\n\nclass QCompleter;\nclass QPlainTextEdit;\n\nclass CommandCompleter final : public QObject {\n    Q_OBJECT\n    Q_PROPERTY(QWidget* popup READ popup)\n\npublic:\n    explicit CommandCompleter(QPlainTextEdit *editor);\n\n    bool eventFilter(QObject *watched, QEvent *event) override;\n\n    QWidget *popup() const;\n\nprivate:\n    void onTextChanged();\n    void updateCompletion(bool forceShow);\n    void insertCompletion(const QString &completion);\n    void showCompletion();\n\n    QString textUnderCursor() const;\n\n    QPlainTextEdit *m_editor;\n    QCompleter *m_completer;\n};\n"
  },
  {
    "path": "src/gui/commandcompleterdocumentation.h",
    "content": "// Generated by \"utils/script_docs_to_cpp.py\" from \"docs/scripting-api.rst\".\n#pragma once\n\ntemplate <typename AddDocumentationCallback>\nvoid addDocumentation(AddDocumentationCallback addDocumentation)\n{\n\n    addDocumentation(\"version\", \"version() -> string\", \"Returns version string.\");\n    addDocumentation(\"help\", \"help() -> string\", \"Returns help string.\");\n    addDocumentation(\"help\", \"help(searchString, ...) -> string\", \"Returns help for matched commands.\");\n    addDocumentation(\"show\", \"show()\", \"Shows main window.\");\n    addDocumentation(\"show\", \"show(tabName)\", \"Shows tab.\");\n    addDocumentation(\"showAt\", \"showAt(x, y, [width, height])\", \"Shows main window with given geometry.\");\n    addDocumentation(\"showAt\", \"showAt()\", \"Shows main window under mouse cursor.\");\n    addDocumentation(\"showAt\", \"showAt(x, y, width, height, tabName)\", \"Shows tab with given geometry.\");\n    addDocumentation(\"hide\", \"hide()\", \"Hides main window.\");\n    addDocumentation(\"toggle\", \"toggle() -> bool\", \"Shows or hides main window.\");\n    addDocumentation(\"menu\", \"menu()\", \"Opens context menu.\");\n    addDocumentation(\"menu\", \"menu(tabName, [maxItemCount, [x, y]])\", \"Shows context menu for given tab.\");\n    addDocumentation(\"exit\", \"exit()\", \"Exits server.\");\n    addDocumentation(\"disable\", \"disable()\", \"Disables or enables clipboard content storing.\");\n    addDocumentation(\"monitoring\", \"monitoring() -> bool\", \"Returns true only if clipboard storing is enabled.\");\n    addDocumentation(\"visible\", \"visible() -> bool\", \"Returns true only if main window is visible.\");\n    addDocumentation(\"focused\", \"focused() -> bool\", \"Returns true only if main window has focus.\");\n    addDocumentation(\"focusPrevious\", \"focusPrevious()\", \"Activates window that was focused before the main window.\");\n    addDocumentation(\"preview\", \"preview([true|false])\", \"Shows/hides item preview and returns true only if preview was visible.\");\n    addDocumentation(\"filter\", \"filter() -> string\", \"Returns the current text for filtering items in main window.\");\n    addDocumentation(\"filter\", \"filter(filterText)\", \"Sets text for filtering items in main window.\");\n    addDocumentation(\"ignore\", \"ignore()\", \"Ignores current clipboard content (used for automatic commands).\");\n    addDocumentation(\"clipboard\", \"clipboard([mimeType]) -> `ByteArray`\", \"Returns clipboard data for MIME type (default is text).\");\n    addDocumentation(\"selection\", \"selection([mimeType]) -> `ByteArray`\", \"Same as `clipboard()` for `primary selection`_.\");\n    addDocumentation(\"hasClipboardFormat\", \"hasClipboardFormat(mimeType) -> bool\", \"Returns true only if clipboard contains MIME type.\");\n    addDocumentation(\"hasSelectionFormat\", \"hasSelectionFormat(mimeType) -> bool\", \"Same as `hasClipboardFormat()` for `primary selection`_.\");\n    addDocumentation(\"isClipboard\", \"isClipboard() -> bool\", \"Returns true only in automatic command triggered by clipboard change.\");\n    addDocumentation(\"copy\", \"copy(text)\", \"Sets clipboard plain text.\");\n    addDocumentation(\"copy\", \"copy(mimeType, data, [mimeType, data]...)\", \"Sets clipboard data.\");\n    addDocumentation(\"copy\", \"copy(Item)\", \"Function override with an item argument.\");\n    addDocumentation(\"copy\", \"copy()\", \"Sends `Ctrl+C` to the current application or window to trigger a copy operation.\");\n    addDocumentation(\"copySelection\", \"copySelection(text)\", \"Sets primary selection plain text.\");\n    addDocumentation(\"copySelection\", \"copySelection(mimeType, data, [mimeType, data]...)\", \"Sets primary selection data.\");\n    addDocumentation(\"copySelection\", \"copySelection(Item)\", \"Sets primary selection from an item.\");\n    addDocumentation(\"paste\", \"paste()\", \"Sends `Shift+Insert` (or `Ctrl+V`) to the current application or window to trigger a paste operation.\");\n    addDocumentation(\"tab\", \"tab() -> array of strings\", \"Returns tab names.\");\n    addDocumentation(\"tab\", \"tab(tabName)\", \"Sets current tab for the script.\");\n    addDocumentation(\"removeTab\", \"removeTab(tabName)\", \"Removes tab.\");\n    addDocumentation(\"renameTab\", \"renameTab(tabName, newTabName)\", \"Renames tab.\");\n    addDocumentation(\"tabIcon\", \"tabIcon(tabName) -> string\", \"Returns path to icon for tab.\");\n    addDocumentation(\"tabIcon\", \"tabIcon(tabName, iconPath)\", \"Sets icon for tab.\");\n    addDocumentation(\"unload\", \"unload([tabNames...]) -> array of strings\", \"Unload tabs (i.e. items from memory).\");\n    addDocumentation(\"forceUnload\", \"forceUnload([tabNames...])\", \"Force-unload tabs (i.e. items from memory).\");\n    addDocumentation(\"count\", \"count() -> int\", \"Returns amount of items in current tab.\");\n    addDocumentation(\"select\", \"select(row)\", \"Copies item in the row to clipboard.\");\n    addDocumentation(\"next\", \"next()\", \"Copies next item from current tab to clipboard.\");\n    addDocumentation(\"previous\", \"previous()\", \"Copies previous item from current tab to clipboard.\");\n    addDocumentation(\"add\", \"add(text|Item...)\", \"Same as `insert(0, ...)`.\");\n    addDocumentation(\"insert\", \"insert(row, text|Item...)\", \"Inserts new items to current tab.\");\n    addDocumentation(\"remove\", \"remove(row, ...)\", \"Removes items in current tab.\");\n    addDocumentation(\"move\", \"move(row)\", \"Moves selected items to given row in same tab.\");\n    addDocumentation(\"edit\", \"edit([row|text] ...)\", \"Edits items in the current tab.\");\n    addDocumentation(\"editItem\", \"editItem(row, [mimeType, [data]])\", \"Edits specific format for the item.\");\n    addDocumentation(\"read\", \"read([mimeType])\", \"Same as `clipboard()`.\");\n    addDocumentation(\"read\", \"read(mimeType, row, ...) -> `ByteArray`\", \"Returns concatenated data from items, or clipboard if row is negative.\");\n    addDocumentation(\"write\", \"write(row, mimeType, data, [mimeType, data]...)\", \"Inserts new item to current tab.\");\n    addDocumentation(\"write\", \"write(row, Item...)\", \"Function override with one or more item arguments.\");\n    addDocumentation(\"write\", \"write(row, Item[])\", \"Function override with item list argument.\");\n    addDocumentation(\"change\", \"change(row, mimeType, data, [mimeType, data]...)\", \"Changes data in item in current tab.\");\n    addDocumentation(\"change\", \"change(row, Item...)\", \"Function override with one or more item arguments.\");\n    addDocumentation(\"change\", \"change(row, Item[])\", \"Function override with item list argument.\");\n    addDocumentation(\"separator\", \"separator() -> string\", \"Returns item separator (used when concatenating item data).\");\n    addDocumentation(\"separator\", \"separator(separator)\", \"Sets item separator for concatenating item data.\");\n    addDocumentation(\"action\", \"action()\", \"Opens action dialog.\");\n    addDocumentation(\"action\", \"action([rows, ...], command, [outputItemSeparator])\", \"Runs command for items in current tab.\");\n    addDocumentation(\"popup\", \"popup(title, message, [time=8000])\", \"Shows popup message for given time in milliseconds.\");\n    addDocumentation(\"notification\", \"notification(...)\", \"Shows popup message with icon and buttons.\");\n    addDocumentation(\"exportTab\", \"exportTab(fileName)\", \"Exports current tab into file.\");\n    addDocumentation(\"importTab\", \"importTab(fileName)\", \"Imports items from file to a new tab.\");\n    addDocumentation(\"exportData\", \"exportData(fileName)\", \"Exports all tabs and configuration into file.\");\n    addDocumentation(\"importData\", \"importData(fileName)\", \"Imports all tabs and configuration from file.\");\n    addDocumentation(\"config\", \"config() -> string\", \"Returns help with list of available application options.\");\n    addDocumentation(\"config\", \"config(optionName) -> string\", \"Returns value of given application option.\");\n    addDocumentation(\"config\", \"config(optionName, value) -> string\", \"Sets application option and returns new value.\");\n    addDocumentation(\"config\", \"config(optionName, value, ...) -> string\", \"Sets multiple application options and return list with values in format `optionName=newValue`.\");\n    addDocumentation(\"toggleConfig\", \"toggleConfig(optionName) -> bool\", \"Toggles an option (true to false and vice versa) and returns the new value.\");\n    addDocumentation(\"info\", \"info([pathName]) -> string\", \"Returns paths and flags used by the application.\");\n    addDocumentation(\"eval\", \"eval(script)\", \"Evaluates script and returns result.\");\n    addDocumentation(\"source\", \"source(fileName)\", \"Evaluates script file and returns result of last expression in the script.\");\n    addDocumentation(\"currentPath\", \"currentPath() -> string\", \"Get current path.\");\n    addDocumentation(\"currentPath\", \"currentPath(path)\", \"Set current path.\");\n    addDocumentation(\"str\", \"str(value) -> string\", \"Converts a value to string.\");\n    addDocumentation(\"input\", \"input() -> `ByteArray`\", \"Returns standard input passed to the script.\");\n    addDocumentation(\"toUnicode\", \"toUnicode(ByteArray) -> string\", \"Returns string for bytes with encoding detected by checking Byte Order Mark (BOM).\");\n    addDocumentation(\"toUnicode\", \"toUnicode(ByteArray, encodingName) -> string\", \"Returns string for bytes with given encoding.\");\n    addDocumentation(\"fromUnicode\", \"fromUnicode(String, encodingName) -> `ByteArray`\", \"Returns encoded text.\");\n    addDocumentation(\"data\", \"data(mimeType) -> `ByteArray`\", \"Returns data for automatic commands or selected items.\");\n    addDocumentation(\"setData\", \"setData(mimeType, data) -> bool\", \"Set data for automatic and display commands, or the current item selection.\");\n    addDocumentation(\"removeData\", \"removeData(mimeType)\", \"Removes data for automatic and display commands, or the current item selection.\");\n    addDocumentation(\"dataFormats\", \"dataFormats() -> array of strings\", \"Returns formats available for `data()`.\");\n    addDocumentation(\"print\", \"print(value)\", \"Prints value to standard output.\");\n    addDocumentation(\"serverLog\", \"serverLog(value)\", \"Prints value to application log.\");\n    addDocumentation(\"logs\", \"logs() -> ByteArray\", \"Returns application logs.\");\n    addDocumentation(\"abort\", \"abort()\", \"Aborts script evaluation.\");\n    addDocumentation(\"fail\", \"fail()\", \"Aborts script evaluation with nonzero exit code.\");\n    addDocumentation(\"setCurrentTab\", \"setCurrentTab(tabName)\", \"Focus tab without showing main window.\");\n    addDocumentation(\"selectItems\", \"selectItems(row, ...)\", \"Selects items in current tab.\");\n    addDocumentation(\"selectedTab\", \"selectedTab() -> string\", \"Returns tab that was selected when script was executed.\");\n    addDocumentation(\"selectedItems\", \"selectedItems() -> array of ints\", \"Returns selected rows in current tab.\");\n    addDocumentation(\"selectedItemData\", \"selectedItemData(index) -> array of `Item`\", \"Returns data for given selected item.\");\n    addDocumentation(\"setSelectedItemData\", \"setSelectedItemData(index, Item) -> bool\", \"Set data for given selected item.\");\n    addDocumentation(\"selectedItemsData\", \"selectedItemsData() -> array of `Item`\", \"Returns data for all selected items.\");\n    addDocumentation(\"setSelectedItemsData\", \"setSelectedItemsData(Item[])\", \"Set data to all selected items.\");\n    addDocumentation(\"currentItem\", \"currentItem() -> int\", \"Returns current row in current tab.\");\n    addDocumentation(\"escapeHtml\", \"escapeHtml(text) -> string\", \"Returns text with special HTML characters escaped.\");\n    addDocumentation(\"unpack\", \"unpack(data) -> `Item`\", \"Returns deserialized object from serialized items.\");\n    addDocumentation(\"pack\", \"pack(Item) -> `ByteArray`\", \"Returns serialized item.\");\n    addDocumentation(\"getItem\", \"getItem(row) -> `Item`\", \"Returns an item in current tab.\");\n    addDocumentation(\"setItem\", \"setItem(row, text|Item)\", \"Inserts item to current tab.\");\n    addDocumentation(\"toBase64\", \"toBase64(data) -> string\", \"Returns base64-encoded data.\");\n    addDocumentation(\"fromBase64\", \"fromBase64(base64String) -> `ByteArray`\", \"Returns base64-decoded data.\");\n    addDocumentation(\"md5sum\", \"md5sum(data) -> `ByteArray`\", \"Returns MD5 checksum of data.\");\n    addDocumentation(\"sha1sum\", \"sha1sum(data) -> `ByteArray`\", \"Returns SHA1 checksum of data.\");\n    addDocumentation(\"sha256sum\", \"sha256sum(data) -> `ByteArray`\", \"Returns SHA256 checksum of data.\");\n    addDocumentation(\"sha512sum\", \"sha512sum(data) -> `ByteArray`\", \"Returns SHA512 checksum of data.\");\n    addDocumentation(\"open\", \"open(url, ...) -> bool\", \"Tries to open URLs in appropriate applications.\");\n    addDocumentation(\"execute\", \"execute(argument, ..., null, stdinData, ...) -> `FinishedCommand`\", \"Executes a command.\");\n    addDocumentation(\"playSound\", \"playSound(fileOrObject)\", \"Plays audio file.\");\n    addDocumentation(\"currentWindowTitle\", \"String currentWindowTitle() -> string\", \"Returns window title of currently focused window.\");\n    addDocumentation(\"currentClipboardOwner\", \"String currentClipboardOwner() -> string\", \"Returns name of the current clipboard owner.\");\n    addDocumentation(\"dialog\", \"dialog(...)\", \"Shows messages or asks user for input.\");\n    addDocumentation(\"menuItems\", \"menuItems(text...) -> string\", \"Opens menu with given items and returns selected item or an empty string.\");\n    addDocumentation(\"menuItems\", \"menuItems(items[]) -> int\", \"Opens menu with given items and returns index of selected item or -1.\");\n    addDocumentation(\"settings\", \"settings() -> array of strings\", \"Returns array with names of all custom user options.\");\n    addDocumentation(\"settings\", \"Value settings(optionName)\", \"Returns value for a custom user option.\");\n    addDocumentation(\"settings\", \"settings(optionName, value)\", \"Sets value for a new custom user option or overrides existing one.\");\n    addDocumentation(\"dateString\", \"dateString(format) -> string\", \"Returns text representation of current date and time.\");\n    addDocumentation(\"commands\", \"commands() -> array of `Command`\", \"Return list of all commands.\");\n    addDocumentation(\"setCommands\", \"setCommands(Command[])\", \"Clear previous commands and set new ones.\");\n    addDocumentation(\"importCommands\", \"Command[] importCommands(String) -> array of `Command`\", \"Return list of commands from exported commands text.\");\n    addDocumentation(\"exportCommands\", \"String exportCommands(Command[]) -> string\", \"Return exported command text.\");\n    addDocumentation(\"addCommands\", \"addCommands(Command[])\", \"Opens Command dialog, adds commands and waits for user to confirm the dialog.\");\n    addDocumentation(\"networkGet\", \"NetworkReply networkGet(url) -> `NetworkReply`\", \"Sends HTTP GET request.\");\n    addDocumentation(\"networkPost\", \"NetworkReply networkPost(url, postData) -> `NetworkReply`\", \"Sends HTTP POST request.\");\n    addDocumentation(\"networkGetAsync\", \"NetworkReply networkGetAsync(url) -> `NetworkReply`\", \"Same as `networkGet()` but the request is asynchronous.\");\n    addDocumentation(\"networkPostAsync\", \"NetworkReply networkPostAsync(url, postData) -> `NetworkReply`\", \"Same as `networkPost()` but the request is asynchronous.\");\n    addDocumentation(\"env\", \"env(name) -> `ByteArray`\", \"Returns value of environment variable with given name.\");\n    addDocumentation(\"setEnv\", \"setEnv(name, value) -> bool\", \"Sets environment variable with given name to given value.\");\n    addDocumentation(\"sleep\", \"sleep(time)\", \"Wait for given time in milliseconds.\");\n    addDocumentation(\"afterMilliseconds\", \"afterMilliseconds(time, function)\", \"Executes function after given time in milliseconds.\");\n    addDocumentation(\"screenNames\", \"screenNames() -> array of strings\", \"Returns list of available screen names.\");\n    addDocumentation(\"screenshot\", \"screenshot(format='png', [screenName]) -> `ByteArray`\", \"Returns image data with screenshot.\");\n    addDocumentation(\"screenshotSelect\", \"screenshotSelect(format='png', [screenName]) -> `ByteArray`\", \"Same as `screenshot()` but allows to select an area on screen.\");\n    addDocumentation(\"queryKeyboardModifiers\", \"queryKeyboardModifiers() -> array of strings\", \"Returns list of currently pressed keyboard modifiers which can be 'Ctrl', 'Shift', 'Alt', 'Meta'.\");\n    addDocumentation(\"pointerPosition\", \"pointerPosition() -> array of ints (with two elements)\", \"Returns current mouse pointer position (x, y coordinates on screen).\");\n    addDocumentation(\"setPointerPosition\", \"setPointerPosition(x, y)\", \"Moves mouse pointer to given coordinates on screen.\");\n    addDocumentation(\"iconColor\", \"iconColor() -> string\", \"Get current tray and window icon color name.\");\n    addDocumentation(\"iconColor\", \"iconColor(colorName)\", \"Set current tray and window icon color name (examples: 'orange', '#ffa500', '#09f').\");\n    addDocumentation(\"iconTag\", \"iconTag() -> string\", \"Get current tray and window icon tag text.\");\n    addDocumentation(\"iconTag\", \"iconTag(tag)\", \"Set current tray and window tag text.\");\n    addDocumentation(\"iconTagColor\", \"iconTagColor() -> string\", \"Get current tray and window tag color name.\");\n    addDocumentation(\"iconTagColor\", \"iconTagColor(colorName)\", \"Set current tray and window tag color name.\");\n    addDocumentation(\"loadTheme\", \"loadTheme(path)\", \"Loads theme from an INI file.\");\n    addDocumentation(\"onClipboardChanged\", \"onClipboardChanged()\", \"Called when clipboard or `primary selection`_ changes and is not set by CopyQ, is not marked as hidden nor secret (see the other callbacks).\");\n    addDocumentation(\"onOwnClipboardChanged\", \"onOwnClipboardChanged()\", \"Called when clipboard or `primary selection`_ is set by CopyQ and is not marked as hidden nor secret (see the other callbacks).\");\n    addDocumentation(\"onHiddenClipboardChanged\", \"onHiddenClipboardChanged()\", \"Called when clipboard or `primary selection`_ changes and is marked as hidden but not secret (see the other callbacks).\");\n    addDocumentation(\"onSecretClipboardChanged\", \"onSecretClipboardChanged()\", \"Called if the clipboard or `primary selection`_ changes and contains a password or other secret (for example, copied from clipboard manager).\");\n    addDocumentation(\"onClipboardUnchanged\", \"onClipboardUnchanged()\", \"Called when clipboard or `primary selection`_ changes but data remained the same.\");\n    addDocumentation(\"onStart\", \"onStart()\", \"Called when application starts.\");\n    addDocumentation(\"onExit\", \"onExit()\", \"Called just before application exists.\");\n    addDocumentation(\"runAutomaticCommands\", \"runAutomaticCommands() -> bool\", \"Executes automatic commands on current data.\");\n    addDocumentation(\"clearClipboardData\", \"clearClipboardData()\", \"Clear clipboard visibility in GUI.\");\n    addDocumentation(\"updateTitle\", \"updateTitle()\", \"Update main window title and tool tip from current data.\");\n    addDocumentation(\"updateClipboardData\", \"updateClipboardData()\", \"Sets current clipboard data for tray menu, window title and notification.\");\n    addDocumentation(\"setTitle\", \"setTitle([title])\", \"Set main window title and tool tip.\");\n    addDocumentation(\"synchronizeToSelection\", \"synchronizeToSelection(text)\", \"Synchronize current data from clipboard to `primary selection`_.\");\n    addDocumentation(\"synchronizeFromSelection\", \"synchronizeFromSelection(text)\", \"Synchronize current data from `primary selection`_ to clipboard.\");\n    addDocumentation(\"provideClipboard\", \"provideClipboard()\", \"Starts a process provides a data for clipboard.\");\n    addDocumentation(\"provideSelection\", \"provideSelection()\", \"Starts a process that provides a data for `primary selection`_.\");\n    addDocumentation(\"monitorClipboard\", \"monitorClipboard()\", \"Starts a clipboard monitor process.\");\n    addDocumentation(\"clipboardFormatsToSave\", \"clipboardFormatsToSave() -> array of strings\", \"Returns list of clipboard format to save automatically.\");\n    addDocumentation(\"saveData\", \"saveData()\", \"Save current data (depends on `mimeOutputTab`).\");\n    addDocumentation(\"hasData\", \"hasData() -> bool\", \"Returns true only if some non-empty data can be returned by data().\");\n    addDocumentation(\"showDataNotification\", \"showDataNotification()\", \"Show notification for current data.\");\n    addDocumentation(\"hideDataNotification\", \"hideDataNotification()\", \"Hide notification for current data.\");\n    addDocumentation(\"setClipboardData\", \"setClipboardData()\", \"Sets clipboard data for menu commands.\");\n    addDocumentation(\"styles\", \"styles() -> array of strings\", \"List available styles for `style` option.\");\n    addDocumentation(\"stats\", \"stats() -> string\", \"Get runtime diagnostics and statistics about the application state.\");\n    addDocumentation(\"onItemsAdded\", \"onItemsAdded()\", \"Called when items are added to a tab.\");\n    addDocumentation(\"onItemsRemoved\", \"onItemsRemoved()\", \"Called when items are being removed from a tab.\");\n    addDocumentation(\"onItemsChanged\", \"onItemsChanged()\", \"Called when data in items change.\");\n    addDocumentation(\"onTabSelected\", \"onTabSelected()\", \"Called when another tab is opened.\");\n    addDocumentation(\"onItemsLoaded\", \"onItemsLoaded()\", \"Called when all items are loaded into a tab.\");\n    addDocumentation(\"ByteArray\", \"ByteArray\", \"Wrapper for QByteArray Qt class.\");\n    addDocumentation(\"File\", \"File\", \"Wrapper for QFile Qt class.\");\n    addDocumentation(\"Dir\", \"Dir\", \"Wrapper for QDir Qt class.\");\n    addDocumentation(\"TemporaryFile\", \"TemporaryFile\", \"Wrapper for QTemporaryFile Qt class.\");\n    addDocumentation(\"Settings\", \"Settings\", \"Reads and writes INI configuration files. Wrapper for QSettings Qt class.\");\n    addDocumentation(\"Item\", \"Item\", \"Object with MIME types of an item.\");\n    addDocumentation(\"ItemSelection\", \"ItemSelection\", \"List of items from given tab.\");\n    addDocumentation(\"FinishedCommand\", \"FinishedCommand\", \"Properties of finished command.\");\n    addDocumentation(\"NetworkRequest\", \"NetworkRequest\", \"Make HTTP requests.\");\n    addDocumentation(\"NetworkReply\", \"NetworkReply\", \"Received network reply object.\");\n    addDocumentation(\"Command\", \"Command\", \"Wrapper for a command (from Command dialog).\");\n    addDocumentation(\"arguments\", \"arguments\", \"Array for accessing arguments passed to current function or the script (`arguments[0]` is the script itself).\");\n    addDocumentation(\"global\", \"global\", \"Object allowing to modify global scope which contains all functions like `copy()` or `add()`.\");\n    addDocumentation(\"console\", \"console\", \"Allows some logging and debugging.\");\n    addDocumentation(\"mimeText\", \"mimeText\", \"Data contains plain text content. Value: 'text/plain'.\");\n    addDocumentation(\"mimeHtml\", \"mimeHtml\", \"Data contains HTML content. Value: 'text/html'.\");\n    addDocumentation(\"mimeUriList\", \"mimeUriList\", \"Data contains list of links to files, web pages etc. Value: 'text/uri-list'.\");\n    addDocumentation(\"mimeWindowTitle\", \"mimeWindowTitle\", \"Current window title for copied clipboard. Value: 'application/x-copyq-owner-window-title'.\");\n    addDocumentation(\"mimeItems\", \"mimeItems\", \"Serialized items. Value: 'application/x-copyq-item'.\");\n    addDocumentation(\"mimeItemNotes\", \"mimeItemNotes\", \"Data contains notes for item. Value: 'application/x-copyq-item-notes'.\");\n    addDocumentation(\"mimeIcon\", \"mimeIcon\", \"Data contains icon for item. Value: 'application/x-copyq-item-icon'.\");\n    addDocumentation(\"mimeOwner\", \"mimeOwner\", \"If available, the clipboard was set from CopyQ (from script or copied items). Value: 'application/x-copyq-owner'.\");\n    addDocumentation(\"mimeClipboardMode\", \"mimeClipboardMode\", \"Contains `selection` if data is from `primary selection`_. Value: 'application/x-copyq-clipboard-mode'.\");\n    addDocumentation(\"mimeCurrentTab\", \"mimeCurrentTab\", \"Current tab name when invoking command from main window. Value: 'application/x-copyq-current-tab'.\");\n    addDocumentation(\"mimeSelectedItems\", \"mimeSelectedItems\", \"Selected items when invoking command from main window. Value: 'application/x-copyq-selected-items'.\");\n    addDocumentation(\"mimeCurrentItem\", \"mimeCurrentItem\", \"Current item when invoking command from main window. Value: 'application/x-copyq-current-item'.\");\n    addDocumentation(\"mimeHidden\", \"mimeHidden\", \"If set to `1`, the clipboard or item content will be hidden in GUI. Value: 'application/x-copyq-hidden'.\");\n    addDocumentation(\"mimeSecret\", \"mimeSecret\", \"If set to `1`, the clipboard contains a password or other secret (for example, copied from clipboard manager).\");\n    addDocumentation(\"mimeShortcut\", \"mimeShortcut\", \"Application or global shortcut which activated the command. Value: 'application/x-copyq-shortcut'.\");\n    addDocumentation(\"mimeColor\", \"mimeColor\", \"Item color (same as the one used by themes). Value: 'application/x-copyq-color'.\");\n    addDocumentation(\"mimeOutputTab\", \"mimeOutputTab\", \"Name of the tab where to store new item. Value: 'application/x-copyq-output-tab'.\");\n    addDocumentation(\"mimeDisplayItemInMenu\", \"mimeDisplayItemInMenu\", \"Indicates if display commands run for a menu. Value: 'application/x-copyq-display-item-in-menu'.\");\n    addDocumentation(\"plugins.itemsync.selectedTabPath\", \"plugins.itemsync.selectedTabPath()\", \"Returns synchronization path for current tab (mimeCurrentTab).\");\n    addDocumentation(\"plugins.itemsync.tabPaths\", \"plugins.itemsync.tabPaths\", \"Object that maps tab name to synchronization path.\");\n    addDocumentation(\"plugins.itemsync.mimeBaseName\", \"plugins.itemsync.mimeBaseName\", \"MIME type for accessing base name (without full path).\");\n    addDocumentation(\"plugins.itemtags.userTags\", \"plugins.itemtags.userTags\", \"List of user-defined tags.\");\n    addDocumentation(\"plugins.itemtags.tags\", \"plugins.itemtags.tags(row, ...)\", \"List of tags for items in given rows.\");\n    addDocumentation(\"plugins.itemtags.tag\", \"plugins.itemtags.tag(tagName, [rows, ...])\", \"Add given tag to items in given rows or selected items.\");\n    addDocumentation(\"plugins.itemtags.untag\", \"plugins.itemtags.untag(tagName, [rows, ...])\", \"Remove given tag from items in given rows or selected items.\");\n    addDocumentation(\"plugins.itemtags.clearTags\", \"plugins.itemtags.clearTags([rows, ...])\", \"Remove all tags from items in given rows or selected items.\");\n    addDocumentation(\"plugins.itemtags.hasTag\", \"plugins.itemtags.hasTag(tagName, [rows, ...])\", \"Return true if given tag is present in any of items in given rows or selected items.\");\n    addDocumentation(\"plugins.itemtags.mimeTags\", \"plugins.itemtags.mimeTags\", \"MIME type for accessing list of tags.\");\n    addDocumentation(\"plugins.itempinned.isPinned\", \"plugins.itempinned.isPinned(rows, ...)\", \"Returns true only if any item in given rows is pinned.\");\n    addDocumentation(\"plugins.itempinned.pin\", \"plugins.itempinned.pin(rows, ...)\", \"Pin items in given rows or selected items or new item created from clipboard (if called from automatic command).\");\n    addDocumentation(\"plugins.itempinned.unpin\", \"plugins.itempinned.unpin(rows, ...)\", \"Unpin items in given rows or selected items.\");\n    addDocumentation(\"plugins.itempinned.mimePinned\", \"plugins.itempinned.mimePinned\", \"Presence of the format in an item indicates that it is pinned.\");\n}\n"
  },
  {
    "path": "src/gui/commanddialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/commanddialog.h\"\n#include \"ui_commanddialog.h\"\n\n#include \"common/command.h\"\n#include \"common/commandstore.h\"\n#include \"common/common.h\"\n#include \"common/mimetypes.h\"\n#include \"common/settings.h\"\n#include \"common/textdata.h\"\n#include \"gui/addcommanddialog.h\"\n#include \"gui/commandwidget.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/fromiconid.h\"\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QAction>\n#include <QFileDialog>\n#include <QMenu>\n#include <QMessageBox>\n#include <QMimeData>\n#include <QPainter>\n\nnamespace {\n\nconst QIcon iconLoadCommands() { return getIcon(\"document-open\", IconFolderOpen); }\nconst QIcon iconSaveCommands() { return getIcon(\"document-save\", IconFloppyDisk); }\nconst QIcon iconCopyCommands() { return getIcon(\"edit-copy\", IconCopy); }\nconst QIcon iconPasteCommands() { return getIcon(\"edit-paste\", IconPaste); }\n\nQIcon getCommandIcon(const QString &iconString, int commandType)\n{\n    const auto icon =\n            commandType & CommandType::Automatic ? IconClipboard\n          : commandType & CommandType::GlobalShortcut ? IconKeyboard\n          : commandType & CommandType::Script ? IconGear\n          : commandType & CommandType::Display ? IconEye\n          : commandType & CommandType::Menu ? IconBars\n          : IconTriangleExclamation;\n    const auto color =\n            commandType & CommandType::Disabled ? QColor(Qt::lightGray)\n          : commandType & CommandType::Automatic ? QColor(240,220,200)\n          : commandType & CommandType::GlobalShortcut ? QColor(100,255,150)\n          : commandType & CommandType::Script ? QColor(255,220,100)\n          : commandType & CommandType::Display ? QColor(100,220,255)\n          : commandType & CommandType::Menu ? QColor(100,220,255)\n          : QColor(255,100,100);\n\n    return iconFromFile(iconString, fromIconId(icon), color);\n}\n\nbool hasCommandsToPaste(const QString &text)\n{\n    return text.startsWith(\"[Command]\") || text.startsWith(\"[Commands]\");\n}\n\n} // namespace\n\nclass CommandItem final : public ItemOrderList::Item {\npublic:\n    CommandItem(const Command &command, const QStringList &formats, CommandDialog *cmdDialog)\n        : m_command(command)\n        , m_cmdDialog(cmdDialog)\n        , m_formats(formats)\n    {\n    }\n\n    QVariant data() const override { return QVariant::fromValue(m_command); }\n\nprivate:\n    QWidget *createWidget(QWidget *parent) override\n    {\n        auto cmdWidget = new CommandWidget(parent);\n        cmdWidget->setFormats(m_formats);\n        cmdWidget->setCommand(m_command);\n\n        QObject::connect( cmdWidget, &CommandWidget::iconChanged,\n                          m_cmdDialog, &CommandDialog::onCurrentCommandWidgetIconChanged );\n        QObject::connect( cmdWidget, &CommandWidget::nameChanged,\n                          m_cmdDialog, &CommandDialog::onCurrentCommandWidgetNameChanged );\n        QObject::connect( cmdWidget, &CommandWidget::commandTextChanged,\n                          m_cmdDialog, &CommandDialog::onCommandTextChanged );\n\n        return cmdWidget;\n    }\n\n    Command m_command;\n    CommandDialog *m_cmdDialog;\n    QStringList m_formats;\n};\n\nCommandDialog::CommandDialog(\n        const Commands &pluginCommands, const QStringList &formats, QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::CommandDialog)\n    , m_pluginCommands(pluginCommands)\n    , m_formats(formats)\n{\n    ui->setupUi(this);\n\n    connect(ui->itemOrderListCommands, &ItemOrderList::addButtonClicked,\n            this, &CommandDialog::onItemOrderListCommandsAddButtonClicked);\n    connect(ui->itemOrderListCommands, &ItemOrderList::itemSelectionChanged,\n            this, &CommandDialog::onItemOrderListCommandsItemSelectionChanged);\n    connect(ui->pushButtonLoadCommands, &QPushButton::clicked,\n            this, &CommandDialog::onPushButtonLoadCommandsClicked);\n    connect(ui->pushButtonSaveCommands, &QPushButton::clicked,\n            this, &CommandDialog::onPushButtonSaveCommandsClicked);\n    connect(ui->pushButtonCopyCommands, &QPushButton::clicked,\n            this, &CommandDialog::onPushButtonCopyCommandsClicked);\n    connect(ui->pushButtonPasteCommands, &QPushButton::clicked,\n            this, &CommandDialog::onPushButtonPasteCommandsClicked);\n    connect(ui->lineEditFilterCommands, &QLineEdit::textChanged,\n            this, &CommandDialog::onLineEditFilterCommandsTextChanged);\n    connect(ui->buttonBox, &QDialogButtonBox::clicked,\n            this, &CommandDialog::onButtonBoxClicked);\n\n    ui->pushButtonLoadCommands->setIcon(iconLoadCommands());\n    ui->pushButtonSaveCommands->setIcon(iconSaveCommands());\n    ui->pushButtonCopyCommands->setIcon(iconCopyCommands());\n    ui->pushButtonPasteCommands->setIcon(iconPasteCommands());\n    ui->itemOrderListCommands->setWiderIconsEnabled(true);\n    ui->itemOrderListCommands->setEditable(true);\n    ui->itemOrderListCommands->setItemsMovable(true);\n\n    addCommandsWithoutSave(loadAllCommands(), -1);\n    if ( ui->itemOrderListCommands->itemCount() != 0 )\n        ui->itemOrderListCommands->setCurrentItem(0);\n\n    auto act = new QAction(ui->itemOrderListCommands);\n    ui->itemOrderListCommands->addAction(act);\n    act->setShortcut(QKeySequence::Paste);\n    connect(act, &QAction::triggered, this, &CommandDialog::tryPasteCommandFromClipboard);\n\n    act = new QAction(ui->itemOrderListCommands);\n    ui->itemOrderListCommands->addAction(act);\n    act->setShortcut(QKeySequence::Copy);\n    connect(act, &QAction::triggered, this, &CommandDialog::copySelectedCommandsToClipboard);\n\n    ui->itemOrderListCommands->setDragAndDropValidator(QRegularExpression(\"\\\\[Commands?\\\\]\"));\n    connect( ui->itemOrderListCommands, &ItemOrderList::dropped,\n             this, &CommandDialog::onCommandDropped );\n\n    connect( ui->itemOrderListCommands, &ItemOrderList::itemCheckStateChanged,\n             this, &CommandDialog::onCommandEnabledDisabled );\n\n    connect(this, &QDialog::finished, this, &CommandDialog::onFinished);\n\n    m_savedCommands = currentCommands();\n}\n\nCommandDialog::~CommandDialog()\n{\n    delete ui;\n}\n\nvoid CommandDialog::addCommands(const Commands &commands)\n{\n    addCommandsWithoutSave(commands, 0);\n}\n\nvoid CommandDialog::apply()\n{\n    const auto cmds = currentCommands();\n    saveCommands(cmds);\n    m_savedCommands = cmds;\n    emit commandsSaved();\n}\n\nbool CommandDialog::maybeClose(QWidget *saveMessageBoxParent)\n{\n    if ( hasUnsavedChanges() ) {\n        const QMessageBox::StandardButton button = QMessageBox::warning(\n                    saveMessageBoxParent,\n                    tr(\"Unsaved Changes\"), tr(\"Command dialog has unsaved changes.\"),\n                    QMessageBox::Save |  QMessageBox::Discard | QMessageBox::Cancel);\n\n        if (button == QMessageBox::Cancel)\n            return false;\n\n        if (button == QMessageBox::Save)\n            apply();\n    }\n\n    QDialog::reject();\n    return true;\n}\n\nvoid CommandDialog::reject()\n{\n    maybeClose(this);\n}\n\nvoid CommandDialog::tryPasteCommandFromClipboard()\n{\n    const QString text = commandsToPaste();\n    if (!text.isEmpty())\n        onCommandDropped( text, ui->itemOrderListCommands->currentRow() );\n}\n\nvoid CommandDialog::copySelectedCommandsToClipboard()\n{\n    const auto commands = serializeSelectedCommands();\n    auto clipboard = platformNativeInterface()->clipboard();\n    clipboard->setData( ClipboardMode::Clipboard, createDataMap(mimeText, commands) );\n}\n\nvoid CommandDialog::onCommandDropped(const QString &text, int row)\n{\n    const auto commands = importCommandsFromText(text);\n    addCommandsWithoutSave(commands, row);\n}\n\nvoid CommandDialog::onCommandEnabledDisabled(int row)\n{\n    updateIcon(row);\n}\n\nvoid CommandDialog::onCurrentCommandWidgetIconChanged()\n{\n    const auto row = ui->itemOrderListCommands->currentRow();\n    updateIcon(row);\n}\n\nvoid CommandDialog::onCurrentCommandWidgetNameChanged(const QString &name)\n{\n    ui->itemOrderListCommands->setCurrentItemLabel(name);\n}\n\nvoid CommandDialog::onFinished(int result)\n{\n    if (result == QDialog::Accepted)\n        apply();\n}\n\nvoid CommandDialog::onItemOrderListCommandsAddButtonClicked()\n{\n    AddCommandDialog addCommandDialog(m_pluginCommands, this);\n    connect(&addCommandDialog, &AddCommandDialog::addCommands, this, &CommandDialog::onAddCommands);\n    addCommandDialog.exec();\n}\n\nvoid CommandDialog::onItemOrderListCommandsItemSelectionChanged()\n{\n    bool hasSelection = !ui->itemOrderListCommands->selectedRows().isEmpty();\n    ui->pushButtonSaveCommands->setEnabled(hasSelection);\n    ui->pushButtonCopyCommands->setEnabled(hasSelection);\n}\n\nvoid CommandDialog::onPushButtonLoadCommandsClicked()\n{\n    const QStringList fileNames =\n            QFileDialog::getOpenFileNames(this, tr(\"Open Files with Commands\"),\n                                          QString(), tr(\"Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)\"));\n\n    for (const auto &fileName : fileNames) {\n        const auto commands = importCommandsFromFile(fileName);\n        addCommandsWithoutSave(commands, -1);\n    }\n}\n\nvoid CommandDialog::onPushButtonSaveCommandsClicked()\n{\n    QString fileName =\n            QFileDialog::getSaveFileName(this, tr(\"Save Selected Commands\"),\n                                          QString(), tr(\"Commands (*.ini)\"));\n    if ( !fileName.isEmpty() ) {\n        if ( !fileName.endsWith(\".ini\") )\n            fileName.append(\".ini\");\n\n        QFile ini(fileName);\n        if ( !ini.open(QIODevice::WriteOnly) ) {\n            QMessageBox::warning(\n                    this, tr(\"Save Commands\"),\n                    tr(\"Failed to save commands to file \\\"%1\\\": %2\")\n                    .arg(fileName, ini.errorString()) );\n            return;\n        }\n        ini.write(serializeSelectedCommands().toUtf8());\n    }\n}\n\nvoid CommandDialog::onPushButtonCopyCommandsClicked()\n{\n    copySelectedCommandsToClipboard();\n}\n\nvoid CommandDialog::onPushButtonPasteCommandsClicked()\n{\n    tryPasteCommandFromClipboard();\n}\n\nvoid CommandDialog::onLineEditFilterCommandsTextChanged(const QString &text)\n{\n    // Omit pasting commands accidentally to filter text field.\n    if (hasCommandsToPaste(text)) {\n        ui->lineEditFilterCommands->clear();\n        onCommandDropped( text, ui->itemOrderListCommands->currentRow() );\n        return;\n    }\n\n    for (int i = 0; i < ui->itemOrderListCommands->itemCount(); ++i) {\n        const Command c = ui->itemOrderListCommands->data(i).value<Command>();\n        bool show = text.isEmpty() || QString(c.name).remove('&').contains(text, Qt::CaseInsensitive)\n                || c.cmd.contains(text, Qt::CaseInsensitive);\n        ui->itemOrderListCommands->setItemWidgetVisible(i, show);\n    }\n}\n\nvoid CommandDialog::onButtonBoxClicked(QAbstractButton *button)\n{\n    switch( ui->buttonBox->buttonRole(button) ) {\n    case QDialogButtonBox::ApplyRole:\n        apply();\n        break;\n    // Accept and reject roles are handled automatically.\n    case QDialogButtonBox::AcceptRole:\n        break;\n    case QDialogButtonBox::RejectRole:\n        break;\n    default:\n        break;\n    }\n}\n\nvoid CommandDialog::onAddCommands(const QVector<Command> &commands)\n{\n    const int targetRow = qMax( 0, ui->itemOrderListCommands->currentRow() );\n    addCommandsWithoutSave(commands, targetRow);\n}\n\nvoid CommandDialog::onCommandTextChanged(const QString &command)\n{\n    // Paste commands (starting with [Command] or [Commands]) correctly\n    // even if mistakenly pasted into text edit widget.\n    if ( hasCommandsToPaste(command) ) {\n        const int row = ui->itemOrderListCommands->currentRow();\n        ui->itemOrderListCommands->removeRow(row);\n        onCommandDropped(command, row);\n    }\n}\n\nCommand CommandDialog::currentCommand(int row) const\n{\n    Command c;\n\n    QWidget *w = ui->itemOrderListCommands->widget(row);\n    if (w) {\n        const CommandWidget *commandWidget = qobject_cast<const CommandWidget *>(w);\n        Q_ASSERT(commandWidget);\n        c = commandWidget->command();\n    } else {\n        c = ui->itemOrderListCommands->data(row).value<Command>();\n    }\n\n    c.enable = ui->itemOrderListCommands->isItemChecked(row);\n\n    return c;\n}\n\nCommands CommandDialog::currentCommands() const\n{\n    Commands commands;\n    commands.reserve( ui->itemOrderListCommands->itemCount() );\n\n    for (int i = 0; i < ui->itemOrderListCommands->itemCount(); ++i)\n        commands.append( currentCommand(i) );\n\n    return commands;\n}\n\nvoid CommandDialog::addCommandsWithoutSave(const Commands &commands, int targetRow)\n{\n    const int count = ui->itemOrderListCommands->rowCount();\n    int row = targetRow >= 0 ? targetRow : count;\n\n    QList<int> rowsToSelect;\n    rowsToSelect.reserve( commands.size() );\n\n    for (auto &command : commands) {\n        ItemOrderList::ItemPtr item(new CommandItem(command, m_formats, this));\n        const auto icon = getCommandIcon(command.icon, command.type());\n        const auto state = command.enable\n                ? ItemOrderList::Checked\n                : ItemOrderList::Unchecked;\n        ui->itemOrderListCommands->insertItem(\n                    command.name, icon, item, row, state);\n        rowsToSelect.append(row);\n        ++row;\n    }\n\n    ui->itemOrderListCommands->setSelectedRows(rowsToSelect);\n}\n\nCommands CommandDialog::selectedCommands() const\n{\n    const auto rows = ui->itemOrderListCommands->selectedRows();\n    const auto cmds = currentCommands();\n    Commands commandsToSave;\n    for (int row : rows) {\n        Q_ASSERT(row < cmds.size());\n        commandsToSave.append(cmds.value(row));\n    }\n\n    return commandsToSave;\n}\n\nQString CommandDialog::serializeSelectedCommands()\n{\n    const Commands commands = selectedCommands();\n    if ( commands.isEmpty() )\n        return QString();\n\n    return exportCommands(commands);\n}\n\nbool CommandDialog::hasUnsavedChanges() const\n{\n    return m_savedCommands != currentCommands();\n}\n\nvoid CommandDialog::updateIcon(int row)\n{\n    const auto command = currentCommand(row);\n    const auto icon = getCommandIcon(command.icon, command.type());\n    ui->itemOrderListCommands->setItemIcon(row, icon);\n}\n\nQString CommandDialog::commandsToPaste()\n{\n    auto clipboard = platformNativeInterface()->clipboard();\n    const QMimeData *data = clipboard->mimeData(ClipboardMode::Clipboard);\n    if (data && data->hasText()) {\n        const QString text = data->text().trimmed();\n        if (hasCommandsToPaste(text))\n            return text;\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "src/gui/commanddialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/command.h\"\n#include \"common/commandstore.h\"\n\n#include <QDialog>\n\nnamespace Ui {\nclass CommandDialog;\n}\n\nclass QAbstractButton;\n\nclass CommandDialog final : public QDialog\n{\n    Q_OBJECT\n\n    friend class CommandItem;\n\npublic:\n    CommandDialog(\n            const Commands &pluginCommands, const QStringList &formats,\n            QWidget *parent = nullptr);\n    ~CommandDialog();\n\n    /** Create new commands. */\n    void addCommands(const Commands &commands);\n\n    void apply();\n\n    bool maybeClose(QWidget *saveMessageBoxParent);\n\n    void reject() override;\n\nsignals:\n    void commandsSaved();\n\nprivate:\n    void tryPasteCommandFromClipboard();\n    void copySelectedCommandsToClipboard();\n    void onCommandDropped(const QString &text, int row);\n    void onCommandEnabledDisabled(int row);\n\n    void onCurrentCommandWidgetIconChanged();\n    void onCurrentCommandWidgetNameChanged(const QString &name);\n\n    void onFinished(int result);\n\n    void onAddCommands(const QVector<Command> &commands);\n\n    void onCommandTextChanged(const QString &command);\n\n    void onItemOrderListCommandsAddButtonClicked();\n    void onItemOrderListCommandsItemSelectionChanged();\n    void onPushButtonLoadCommandsClicked();\n    void onPushButtonSaveCommandsClicked();\n    void onPushButtonCopyCommandsClicked();\n    void onPushButtonPasteCommandsClicked();\n    void onLineEditFilterCommandsTextChanged(const QString &text);\n    void onButtonBoxClicked(QAbstractButton* button);\n\n    Command currentCommand(int row) const;\n    Commands currentCommands() const;\n\n    void addCommandsWithoutSave(const Commands &commands, int targetRow);\n    Commands selectedCommands() const;\n    QString serializeSelectedCommands();\n    bool hasUnsavedChanges() const;\n\n    void updateIcon(int row);\n\n    QString commandsToPaste();\n\n    Ui::CommandDialog *ui;\n    Commands m_savedCommands;\n\n    Commands m_pluginCommands;\n    QStringList m_formats;\n};\n"
  },
  {
    "path": "src/gui/commandedit.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandedit.h\"\n#include \"ui_commandedit.h\"\n\n#include \"gui/commandsyntaxhighlighter.h\"\n#include \"gui/commandcompleter.h\"\n\n#include <QRegularExpression>\n#include <QJSEngine>\n#include <QTextBlock>\n#include <QTextCursor>\n#include <QTextDocument>\n\nCommandEdit::CommandEdit(QWidget *parent)\n    : QWidget(parent)\n    , ui(new Ui::CommandEdit)\n{\n    ui->setupUi(this);\n\n    connect(ui->plainTextEditCommand, &QPlainTextEdit::textChanged,\n            this, &CommandEdit::onPlainTextEditCommandTextChanged);\n\n    ui->labelErrors->hide();\n\n    auto document = ui->plainTextEditCommand->document();\n    QTextCursor tc(document);\n    const QRect cursorRect = ui->plainTextEditCommand->cursorRect(tc);\n    const QMargins margins = ui->plainTextEditCommand->contentsMargins();\n    const int minimumHeight = 3 * cursorRect.height() / 2\n            + margins.top() + margins.bottom();\n    ui->plainTextEditCommand->setMinimumHeight(minimumHeight);\n\n    setFocusProxy(ui->plainTextEditCommand);\n\n    installCommandSyntaxHighlighter(ui->plainTextEditCommand);\n\n    new CommandCompleter(ui->plainTextEditCommand);\n}\n\nCommandEdit::~CommandEdit()\n{\n    delete ui;\n}\n\nvoid CommandEdit::setCommand(const QString &command) const\n{\n    ui->plainTextEditCommand->setPlainText(command);\n}\n\nQString CommandEdit::command() const\n{\n    return ui->plainTextEditCommand->toPlainText();\n}\n\nbool CommandEdit::isEmpty() const\n{\n    return ui->plainTextEditCommand->document()->characterCount() == 0;\n}\n\nvoid CommandEdit::setReadOnly(bool readOnly)\n{\n    ui->plainTextEditCommand->setReadOnly(readOnly);\n}\n\nvoid CommandEdit::onPlainTextEditCommandTextChanged()\n{\n    // TODO: Highlight syntax errors!\n    const QString command = ui->plainTextEditCommand->toPlainText();\n    emit changed();\n    emit commandTextChanged(command);\n}\n"
  },
  {
    "path": "src/gui/commandedit.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QWidget>\n\nnamespace Ui {\nclass CommandEdit;\n}\n\nclass CommandEdit final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit CommandEdit(QWidget *parent = nullptr);\n    ~CommandEdit();\n\n    void setCommand(const QString &command) const;\n    QString command() const;\n\n    bool isEmpty() const;\n\n    void setReadOnly(bool readOnly);\n\nsignals:\n    void changed();\n    void commandTextChanged(const QString &command);\n\nprivate:\n    void onPlainTextEditCommandTextChanged();\n\n    Ui::CommandEdit *ui;\n};\n"
  },
  {
    "path": "src/gui/commandhelpbutton.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandhelpbutton.h\"\n\n#include \"common/display.h\"\n#include \"common/textdata.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/windowgeometryguard.h\"\n#include \"scriptable/commandhelp.h\"\n\n#include <QDialog>\n#include <QDialogButtonBox>\n#include <QPalette>\n#include <QTextBrowser>\n#include <QTextDocument>\n#include <QToolButton>\n#include <QVBoxLayout>\n\nnamespace {\n\nconst auto htmlTemplate = R\"(\n<html>\n    <head>\n        <style type=\"text/css\">\n            .args{font-family:monospace}\n            .example{font-family:monospace; margin:1em}\n            .example-box{background:#777; padding-right:1em}\n            .example-margin{padding-right:.5em}\n            .description{margin: 0 2em 0 2em}\n        </style>\n    </head>\n    <body>\n        %1\n    </body>\n</html>)\";\n\nconst auto htmlExampleTemplate = R\"(\n<table class=\"example\"><tr>\n<td class=\"example-box\"></td>\n<td class=\"example-margin\"></td>\n<td>%1</td>\n</tr></table>\n)\";\n\nQString example(const QString &content)\n{\n    return QString(htmlExampleTemplate)\n            .arg( escapeHtml(content) );\n}\n\nQString help()\n{\n    auto help = QString()\n            + \"<p>\"\n            + escapeHtml( CommandHelpButton::tr(\n                              \"Command contains list of programs with arguments which will be executed. For example:\") )\n            + example(\"copyq add \\\"1 + 2 = 3\\\"; copyq show\\ncopyq popup \\\"1 + 2\\\" \\\"= 3\\\"\")\n            + \" \"\n            + escapeHtml( CommandHelpButton::tr(\n                              \"Program argument %1 will be substituted for item text.\") )\n            + \"</p>\"\n            + \"<p>\"\n            + escapeHtml( CommandHelpButton::tr(\n                              \"Character %1 can be used to pass standard output to the next program.\") )\n            .arg(\"<b>|</b>\")\n            + \"</p>\"\n\n            + \"<p>\"\n            + escapeHtml( CommandHelpButton::tr(\n                              \"Following syntax can be used to pass rest of the command as single parameter.\") )\n            + example(\"perl:\\nprint(\\\"1 + 2 = \\\", 1 + 2);\\nprint(\\\"; 3 * 4 = \\\", 3 * 4);\")\n            + escapeHtml( CommandHelpButton::tr(\n                              \"This gives same output as %1 but is more useful for longer commands.\") )\n            .arg( example(\"perl -e 'print(\\\"1 + 2 = \\\", 1 + 2); print(\\\"; 3 * 4 = \\\", 3 * 4);'\") )\n            + \"</p>\"\n            ;\n\n    help.append( \"<p>\" + escapeHtml(\n                     CommandHelpButton::tr(\"Functions listed below can be used as in following commands.\")) + \"</p>\" );\n    const QString tabName = CommandHelpButton::tr(\"&clipboard\", \"Example tab name\");\n    help.append( example(\"copyq show '\" + tabName + \"'\") );\n    help.append( example(\"copyq eval 'show(\\\"\" + tabName + \"\\\")'\") );\n    help.append( example(\"copyq: show('\" + tabName + \"')\") );\n\n    for (const auto &hlp : commandHelp()) {\n        if ( !hlp.cmd.isNull() ) {\n            help.append( QString(\"<p><b>%1</b>\"\n                                 \"&nbsp;<span class='args'>%2</span>\"\n                                 \"<div class='description'>%3</div></p>\").arg(\n                             escapeHtml(hlp.cmd),\n                             escapeHtml(hlp.args),\n                             escapeHtml(hlp.desc.trimmed())) );\n        }\n    }\n\n    return QString(htmlTemplate).arg(help);\n}\n\nQVBoxLayout *createLayout(QWidget *parent)\n{\n    auto layout = new QVBoxLayout(parent);\n    layout->setContentsMargins(0, 0, 0, 0);\n    layout->setSpacing(0);\n    return layout;\n}\n\n} // namespace\n\nCommandHelpButton::CommandHelpButton(QWidget *parent)\n    : QWidget(parent)\n    , m_button(new QToolButton(this))\n    , m_help(nullptr)\n{\n    m_button->setToolTip( tr(\"Show command help (F1)\") );\n    m_button->setShortcut(QKeySequence(Qt::Key_F1));\n\n    const int x = smallIconSize();\n    m_button->setIconSize(QSize(x, x));\n    m_button->setIcon( getIcon(\"help-faq\", IconCircleInfo) );\n\n    connect( m_button, &QAbstractButton::clicked,\n             this, &CommandHelpButton::showHelp );\n\n    QVBoxLayout *layout = createLayout(this);\n    layout->addWidget(m_button);\n}\n\nvoid CommandHelpButton::showHelp()\n{\n    if (!m_help) {\n        m_help = new QDialog(this);\n        m_help->setObjectName(\"commandHelpDialog\");\n        WindowGeometryGuard::create(m_help);\n\n        auto browser = new QTextBrowser(this);\n        QVBoxLayout *layout = createLayout(m_help);\n        layout->addWidget(browser);\n\n        QDialogButtonBox *buttonBox = new QDialogButtonBox(\n                    QDialogButtonBox::Close, Qt::Horizontal, m_help);\n        layout->addWidget(buttonBox);\n        QObject::connect(buttonBox, &QDialogButtonBox::rejected, m_help, &QWidget::hide);\n\n        browser->setText(help());\n    }\n\n    m_help->show();\n}\n"
  },
  {
    "path": "src/gui/commandhelpbutton.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QWidget>\n\nclass QToolButton;\nclass QDialog;\n\nclass CommandHelpButton final : public QWidget\n{\n    Q_OBJECT\npublic:\n    explicit CommandHelpButton(QWidget *parent = nullptr);\n\npublic:\n    void showHelp();\n\nsignals:\n    void hidden();\n\nprivate:\n    QToolButton *m_button;\n    QDialog *m_help;\n};\n"
  },
  {
    "path": "src/gui/commandsyntaxhighlighter.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandsyntaxhighlighter.h\"\n\n#include \"gui/iconfactory.h\"\n#include \"scriptable/scriptable.h\"\n\n#include <QMetaMethod>\n#include <QMetaObject>\n#include <QPalette>\n#include <QRegularExpression>\n#include <QJSEngine>\n#include <QJSValue>\n#include <QJSValueIterator>\n#include <QStringList>\n#include <QSyntaxHighlighter>\n#include <QTextEdit>\n#include <QPlainTextEdit>\n\nnamespace {\n\nQString methodName(const QMetaMethod &method)\n{\n    auto name = QString::fromLatin1(method.methodSignature());\n    const int index = name.indexOf('(');\n\n    if (index <= 0)\n        return QString();\n\n    return name.remove(index, name.length() - index);\n}\n\nQRegularExpression commandLabelRegExp()\n{\n    return QRegularExpression(\n            \"\\\\bcopyq:\"\n            \"|\\\\bsh:\"\n            \"|\\\\bbash:\"\n            \"|\\\\bpowershell:\"\n            \"|\\\\bperl:\"\n            \"|\\\\bpython:\"\n            \"|\\\\bruby:\"\n                );\n}\n\nQRegularExpression createRegExp(const QStringList &list)\n{\n    QRegularExpression re;\n    re.setPattern(\"\\\\b\" + list.join(\"\\\\b|\\\\b\") + \"\\\\b\");\n    return re;\n}\n\nint mixColorComponent(int a, int b)\n{\n    return qMin(255, qMax(0, a + b));\n}\n\nQColor mixColor(const QColor &color, int r, int g, int b)\n{\n    return QColor(\n                mixColorComponent(color.red(), r),\n                mixColorComponent(color.green(), g),\n                mixColorComponent(color.blue(), b),\n                color.alpha()\n                );\n}\n\nclass CommandSyntaxHighlighter final : public QSyntaxHighlighter\n{\npublic:\n    explicit CommandSyntaxHighlighter(QWidget *editor, QTextDocument *parent)\n        : QSyntaxHighlighter(parent)\n        , m_editor(editor)\n        , m_reObjects(createRegExp(scriptableObjects()))\n        , m_reProperties(createRegExp(scriptableProperties()))\n        , m_reFunctions(createRegExp(scriptableFunctions()))\n        , m_reKeywords(createRegExp(scriptableKeywords()))\n        , m_reLabels(commandLabelRegExp())\n        , m_reConstants(R\"(\\b0x[0-9A-Fa-f](?:_?[0-9A-Fa-f])*|(?:\\b|%)\\d(?:_?\\d)*|\\btrue\\b|\\bfalse\\b)\")\n    {\n    }\n\nprotected:\n    void highlightBlock(const QString &text) override\n    {\n        m_bgColor = getDefaultIconColor(*m_editor);\n\n        QTextCharFormat objectsFormat;\n        objectsFormat.setForeground(mixColor(m_bgColor, 40, -60, 40));\n        objectsFormat.setToolTip(\"Object\");\n        highlight(text, m_reObjects, objectsFormat);\n\n        QTextCharFormat propertyFormat;\n        propertyFormat.setForeground(mixColor(m_bgColor, -60, 40, 40));\n        highlight(text, m_reProperties, propertyFormat);\n\n        QTextCharFormat functionFormat;\n        functionFormat.setForeground(mixColor(m_bgColor, -40, -40, 40));\n        highlight(text, m_reFunctions, functionFormat);\n\n        QTextCharFormat keywordFormat;\n        keywordFormat.setFontWeight(QFont::Bold);\n        highlight(text, m_reKeywords, keywordFormat);\n\n        QTextCharFormat labelsFormat;\n        labelsFormat.setFontWeight(QFont::Bold);\n        labelsFormat.setForeground(mixColor(m_bgColor, 40, 40, -40));\n        highlight(text, m_reLabels, labelsFormat);\n\n        QTextCharFormat constantFormat;\n        constantFormat.setForeground(mixColor(m_bgColor, 40, -40, -40));\n        highlight(text, m_reConstants, constantFormat);\n\n        highlightBlocks(text);\n    }\n\nprivate:\n    enum State {\n        Code,\n        SingleQuote,\n        DoubleQuote,\n        BackTick,\n        RegExp,\n        Comment\n    };\n\n    void highlight(const QString &text, QRegularExpression &re, const QTextCharFormat &format)\n    {\n        auto it = re.globalMatch(text);\n        while (it.hasNext()) {\n            const auto m = it.next();\n            setFormat(m.capturedStart(), m.capturedLength(), format);\n        }\n    }\n\n    void format(int a, int b)\n    {\n        QTextCharFormat format;\n        const int state = currentBlockState();\n        if (state == SingleQuote || state == DoubleQuote || state == BackTick) {\n            format.setForeground(mixColor(m_bgColor, -40, 40, -40));\n        } else if (state == Comment) {\n            const int x = m_bgColor.lightness() > 100 ? -40 : 40;\n            format.setForeground( mixColor(m_bgColor, x, x, x) );\n        } else if (state == RegExp) {\n            format.setForeground(mixColor(m_bgColor, 40, -40, -40));\n        } else {\n            return;\n        }\n\n        setFormat(a, b - a + 1, format);\n    }\n\n    bool peek(const QString &text, int i, const QString &what)\n    {\n        return text.mid(i, what.size()) == what;\n    }\n\n    void highlightBlocks(const QString &text)\n    {\n        bool escape = false;\n\n        setCurrentBlockState(previousBlockState());\n\n        int a = 0;\n\n        for (int i = 0; i < text.size(); ++i) {\n            const QChar c = text[i];\n            if (escape) {\n                escape = false;\n            } else if (c == '\\\\') {\n                escape = true;\n            } else if (currentBlockState() == SingleQuote) {\n                if (c == '\\'') {\n                    format(a, i);\n                    setCurrentBlockState(Code);\n                }\n            } else if (currentBlockState() == DoubleQuote) {\n                if (c == '\"') {\n                    format(a, i);\n                    setCurrentBlockState(Code);\n                }\n            } else if (currentBlockState() == BackTick) {\n                if (c == '`') {\n                    format(a, i);\n                    setCurrentBlockState(Code);\n                }\n            } else if (currentBlockState() == Comment) {\n                if ( peek(text, i, \"*/\") ) {\n                    ++i;\n                    format(a, i);\n                    setCurrentBlockState(Code);\n                }\n            } else if (currentBlockState() == RegExp) {\n                if (c == '/') {\n                    // Highlight paths outside code as regexps.\n                    i = text.indexOf(QRegularExpression(\"[^a-zA-Z0-9./_-]\"), i);\n                    if (i == -1)\n                        i = text.size();\n\n                    --i;\n                    format(a, i);\n\n                    setCurrentBlockState(Code);\n                } else if (c == '\\n' || i + 1 == text.size()) {\n                    // The '/' was not regex start, since there is no ending\n                    // '/' on the same line.\n                    i = a;\n                    setCurrentBlockState(Code);\n                }\n            } else if (c == '\\\\') {\n                escape = true;\n            } else if ( c == '#' || peek(text, i, \"//\") ) {\n                setCurrentBlockState(Comment);\n                format(i, text.size());\n                setCurrentBlockState(Code);\n                return;\n            } else if ( peek(text, i, \"/*\") ) {\n                a = i;\n                ++i;\n                setCurrentBlockState(Comment);\n            } else if (c == '\\'') {\n                a = i;\n                setCurrentBlockState(SingleQuote);\n            } else if (c == '\"') {\n                a = i;\n                setCurrentBlockState(DoubleQuote);\n            } else if (c == '`') {\n                a = i;\n                setCurrentBlockState(BackTick);\n            } else if (c == '/') {\n                a = i;\n                setCurrentBlockState(RegExp);\n            }\n        }\n\n        format(a, text.size());\n    }\n\n    QWidget *m_editor;\n    QRegularExpression m_reObjects;\n    QRegularExpression m_reProperties;\n    QRegularExpression m_reFunctions;\n    QRegularExpression m_reKeywords;\n    QRegularExpression m_reLabels;\n    QRegularExpression m_reConstants;\n    QColor m_bgColor;\n};\n\nbool isPublicName(const QString &name)\n{\n    return !name.startsWith('_');\n}\n\nQList<QString> getScriptableObjects()\n{\n    QJSEngine engine;\n    Scriptable scriptable(&engine, nullptr);\n\n    QJSValue globalObject = engine.globalObject();\n    QJSValueIterator it(globalObject);\n\n    QList<QString> result;\n    while (it.hasNext()) {\n        it.next();\n        if ( isPublicName(it.name()) )\n            result.append(it.name());\n    }\n\n    return result;\n}\n\n} // namespace\n\nQList<QString> scriptableKeywords()\n{\n    return {\n        QStringLiteral(\"arguments\"),\n        QStringLiteral(\"break\"),\n        QStringLiteral(\"case\"),\n        QStringLiteral(\"catch\"),\n        QStringLiteral(\"const\"),\n        QStringLiteral(\"continue\"),\n        QStringLiteral(\"debugger\"),\n        QStringLiteral(\"default\"),\n        QStringLiteral(\"delete\"),\n        QStringLiteral(\"do\"),\n        QStringLiteral(\"else\"),\n        QStringLiteral(\"finally\"),\n        QStringLiteral(\"for\"),\n        QStringLiteral(\"function\"),\n        QStringLiteral(\"if\"),\n        QStringLiteral(\"in\"),\n        QStringLiteral(\"instanceof\"),\n        QStringLiteral(\"let\"),\n        QStringLiteral(\"new\"),\n        QStringLiteral(\"of\"),\n        QStringLiteral(\"return\"),\n        QStringLiteral(\"switch\"),\n        QStringLiteral(\"this\"),\n        QStringLiteral(\"throw\"),\n        QStringLiteral(\"try\"),\n        QStringLiteral(\"typeof\"),\n        QStringLiteral(\"var\"),\n        QStringLiteral(\"void\"),\n        QStringLiteral(\"while\"),\n        QStringLiteral(\"with\"),\n    };\n}\n\nQList<QString> scriptableProperties()\n{\n    QList<QString> result;\n\n    QMetaObject scriptableMetaObject = Scriptable::staticMetaObject;\n    for (int i = 0; i < scriptableMetaObject.propertyCount(); ++i) {\n        QMetaProperty property = scriptableMetaObject.property(i);\n        if ( isPublicName(property.name()) )\n            result.append(property.name());\n    }\n\n    result.removeOne(\"objectName\");\n\n    return result;\n}\n\nQList<QString> scriptableFunctions()\n{\n    QList<QString> result;\n\n    QMetaObject scriptableMetaObject = Scriptable::staticMetaObject;\n    for (int i = 0; i < scriptableMetaObject.methodCount(); ++i) {\n        QMetaMethod method = scriptableMetaObject.method(i);\n\n        if (method.methodType() == QMetaMethod::Slot && method.access() == QMetaMethod::Public) {\n            const QString name = methodName(method);\n            if ( isPublicName(name) )\n                result.append(name);\n        }\n    }\n\n    result.removeOne(\"deleteLater\");\n\n    return result;\n}\n\nQList<QString> scriptableObjects()\n{\n    static const QList<QString> result = getScriptableObjects();\n    return result;\n}\n\nvoid installCommandSyntaxHighlighter(QTextEdit *editor)\n{\n    new CommandSyntaxHighlighter(editor, editor->document());\n}\n\nvoid installCommandSyntaxHighlighter(QPlainTextEdit *editor)\n{\n    new CommandSyntaxHighlighter(editor, editor->document());\n}\n"
  },
  {
    "path": "src/gui/commandsyntaxhighlighter.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QtContainerFwd>\n\nclass QPlainTextEdit;\nclass QTextEdit;\n\nQList<QString> scriptableKeywords();\nQList<QString> scriptableProperties();\nQList<QString> scriptableFunctions();\n/// Constructors and functions from ECMA specification supported by Qt plus ByteArray.\nQList<QString> scriptableObjects();\n\nvoid installCommandSyntaxHighlighter(QTextEdit *editor);\nvoid installCommandSyntaxHighlighter(QPlainTextEdit *editor);\n"
  },
  {
    "path": "src/gui/commandwidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandwidget.h\"\n#include \"ui_commandwidget.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/command.h\"\n#include \"common/mimetypes.h\"\n#include \"common/shortcuts.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/shortcutdialog.h\"\n#include \"gui/tabicons.h\"\n#include \"item/itemfactory.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QAction>\n#include <QFontMetrics>\n#include <QMenu>\n\nnamespace {\n\nconst QIcon iconClipboard() { return getIcon(\"\", IconClipboard); }\nconst QIcon iconMenu() { return getIcon(\"\", IconBars); }\nconst QIcon iconScript() { return getIcon(\"\", IconGear); }\nconst QIcon iconDisplay() { return getIcon(\"\", IconEye); }\n#ifdef COPYQ_GLOBAL_SHORTCUTS\nconst QIcon iconShortcut() { return getIcon(\"\", IconKeyboard); }\n#endif\n\nQStringList serializeShortcuts(const QList<QKeySequence> &shortcuts)\n{\n    if ( shortcuts.isEmpty() )\n        return QStringList();\n\n    QStringList shortcutTexts;\n    shortcutTexts.reserve( shortcuts.size() );\n\n    for (const auto &shortcut : shortcuts)\n        shortcutTexts.append(portableShortcutText(shortcut));\n\n    return shortcutTexts;\n}\n\nvoid deserializeShortcuts(\n        const QStringList &serializedShortcuts, ShortcutButton *shortcutButton)\n{\n    shortcutButton->resetShortcuts();\n\n    for (const auto &shortcutText : serializedShortcuts)\n        shortcutButton->addShortcut(shortcutText);\n}\n\n} // namespace\n\nCommandWidget::CommandWidget(QWidget *parent)\n    : QWidget(parent)\n    , ui(new Ui::CommandWidget)\n{\n    ui->setupUi(this);\n\n    connect(ui->lineEditName, &QLineEdit::textChanged,\n            this, &CommandWidget::onLineEditNameTextChanged);\n    connect(ui->buttonIcon, &IconSelectButton::currentIconChanged,\n            this, &CommandWidget::onButtonIconCurrentIconChanged);\n    connect(ui->checkBoxShowAdvanced, &QCheckBox::stateChanged,\n            this, &CommandWidget::onCheckBoxShowAdvancedStateChanged);\n\n    for (auto checkBox : findChildren<QCheckBox *>()) {\n        connect(checkBox, &QCheckBox::stateChanged,\n                this, &CommandWidget::updateWidgets);\n    }\n\n    for (auto button : findChildren<QToolButton *>()) {\n        connect(button, &QToolButton::toggled,\n                this, &CommandWidget::updateWidgets);\n    }\n\n    for (auto lineEdit : findChildren<QLineEdit *>()) {\n        connect(lineEdit, &QLineEdit::textEdited,\n                this, &CommandWidget::updateWidgets);\n    }\n\n    connect(ui->shortcutButtonGlobalShortcut, &ShortcutButton::shortcutAdded,\n            this, &CommandWidget::updateWidgets);\n    connect(ui->shortcutButtonGlobalShortcut, &ShortcutButton::shortcutRemoved,\n            this, &CommandWidget::updateWidgets);\n\n    connect(ui->commandEdit, &CommandEdit::changed,\n            this, &CommandWidget::updateWidgets);\n    connect(ui->commandEdit, &CommandEdit::commandTextChanged,\n            this, &CommandWidget::onCommandEditCommandTextChanged);\n\n    updateWidgets();\n\n#ifdef COPYQ_GLOBAL_SHORTCUTS\n    ui->toolButtonGlobalShortcut->setIcon(iconShortcut());\n#else\n    ui->toolButtonGlobalShortcut->hide();\n    ui->shortcutButtonGlobalShortcut->hide();\n#endif\n\n    ui->toolButtonAutomatic->setIcon(iconClipboard());\n    ui->toolButtonInMenu->setIcon(iconMenu());\n    ui->toolButtonIsScript->setIcon(iconScript());\n    ui->toolButtonDisplay->setIcon(iconDisplay());\n\n    // Add tab names to combo boxes.\n    initTabComboBox(ui->comboBoxCopyToTab);\n    initTabComboBox(ui->comboBoxOutputTab);\n\n    if ( !platformNativeInterface()->canGetWindowTitle() )\n        ui->lineEditWindow->hide();\n}\n\nCommandWidget::~CommandWidget()\n{\n    delete ui;\n}\n\nCommand CommandWidget::command() const\n{\n    Command c;\n    c.name   = ui->lineEditName->text();\n    c.re     = QRegularExpression( ui->lineEditMatch->text() );\n    c.wndre  = QRegularExpression( ui->lineEditWindow->text() );\n    c.matchCmd = ui->lineEditMatchCmd->command();\n    c.cmd    = ui->commandEdit->command();\n    c.sep    = ui->lineEditSeparator->text();\n    c.input  = ui->comboBoxInputFormat->currentText();\n    c.output = ui->comboBoxOutputFormat->currentText();\n    c.wait   = ui->checkBoxWait->isChecked();\n    c.automatic = ui->toolButtonAutomatic->isChecked();\n    c.display = ui->toolButtonDisplay->isChecked();\n    c.inMenu  = ui->toolButtonInMenu->isChecked();\n    c.isGlobalShortcut  = ui->toolButtonGlobalShortcut->isChecked();\n    c.isScript  = ui->toolButtonIsScript->isChecked();\n    c.transform = ui->checkBoxTransform->isChecked();\n    c.remove = ui->checkBoxIgnore->isChecked();\n    c.hideWindow = ui->checkBoxHideWindow->isChecked();\n    c.enable = true;\n    c.icon   = ui->buttonIcon->currentIcon();\n    c.shortcuts = serializeShortcuts( ui->shortcutButton->shortcuts() );\n    c.globalShortcuts = serializeShortcuts( ui->shortcutButtonGlobalShortcut->shortcuts() );\n    c.tab    = ui->comboBoxCopyToTab->currentText();\n    c.outputTab = ui->comboBoxOutputTab->currentText();\n    c.internalId = m_internalId;\n    c.nameLocalization = m_nameLocalization;\n\n    return c;\n}\n\nvoid CommandWidget::setCommand(const Command &c)\n{\n    m_internalId = c.internalId;\n    const bool isEditable = !m_internalId.startsWith(QLatin1String(\"copyq_\"));\n\n    m_nameLocalization = c.nameLocalization;\n\n    ui->scrollAreaWidgetContents->setEnabled(isEditable);\n    ui->commandEdit->setReadOnly(!isEditable);\n    ui->lineEditName->setReadOnly(!isEditable);\n    ui->lineEditName->setText(c.name);\n    ui->lineEditMatch->setText( c.re.pattern() );\n    ui->lineEditWindow->setText( c.wndre.pattern() );\n    ui->lineEditMatchCmd->setCommand(c.matchCmd);\n    ui->commandEdit->setCommand(c.cmd);\n    ui->lineEditSeparator->setText(c.sep);\n    ui->comboBoxInputFormat->setEditText(c.input);\n    ui->comboBoxOutputFormat->setEditText(c.output);\n    ui->checkBoxWait->setChecked(c.wait);\n    ui->toolButtonAutomatic->setChecked(c.automatic);\n    ui->toolButtonDisplay->setChecked(c.display);\n    ui->toolButtonInMenu->setChecked(c.inMenu);\n    ui->toolButtonGlobalShortcut->setChecked(c.isGlobalShortcut);\n    ui->toolButtonIsScript->setChecked(c.isScript);\n    ui->checkBoxTransform->setChecked(c.transform);\n    ui->checkBoxIgnore->setChecked(c.remove);\n    ui->checkBoxHideWindow->setChecked(c.hideWindow);\n    ui->buttonIcon->setCurrentIcon(c.icon);\n    deserializeShortcuts(c.shortcuts, ui->shortcutButton);\n    deserializeShortcuts(\n                c.globalShortcuts,\n                ui->shortcutButtonGlobalShortcut);\n    ui->comboBoxCopyToTab->setEditText(c.tab);\n    ui->comboBoxOutputTab->setEditText(c.outputTab);\n\n    if (c.cmd.isEmpty())\n        ui->tabWidget->setCurrentWidget(ui->tabAdvanced);\n}\n\nvoid CommandWidget::setFormats(const QStringList &formats)\n{\n    setComboBoxItems(ui->comboBoxInputFormat, formats);\n    setComboBoxItems(ui->comboBoxOutputFormat, formats);\n}\n\nvoid CommandWidget::showEvent(QShowEvent *event)\n{\n    const AppConfig appConfig;\n    const bool showAdvanced = appConfig.option<Config::show_advanced_command_settings>();\n    ui->checkBoxShowAdvanced->setChecked(showAdvanced);\n\n    QWidget::showEvent(event);\n}\n\nvoid CommandWidget::onLineEditNameTextChanged(const QString &text)\n{\n    emit nameChanged(text);\n}\n\nvoid CommandWidget::onButtonIconCurrentIconChanged()\n{\n    emitIconChanged();\n}\n\nvoid CommandWidget::onCheckBoxShowAdvancedStateChanged(int state)\n{\n    setShowAdvanced(state == Qt::Checked);\n}\n\nvoid CommandWidget::onCommandEditCommandTextChanged(const QString &command)\n{\n    emit commandTextChanged(command);\n}\n\nvoid CommandWidget::updateWidgets()\n{\n    const bool isScript = ui->toolButtonIsScript->isChecked();\n    const bool isAutomatic = !isScript\n            && (ui->toolButtonAutomatic->isChecked() || ui->toolButtonDisplay->isChecked());\n    const bool inMenu = !isScript && ui->toolButtonInMenu->isChecked();\n    const bool isGlobalShortcut = !isScript && ui->toolButtonGlobalShortcut->isChecked();\n    const bool copyOrExecute = inMenu || isAutomatic;\n\n    ui->toolButtonAutomatic->setVisible(!isScript);\n    ui->toolButtonDisplay->setVisible(!isScript);\n    ui->toolButtonInMenu->setVisible(!isScript);\n    ui->toolButtonGlobalShortcut->setVisible(!isScript);\n    ui->toolButtonIsScript->setVisible(!isAutomatic && !inMenu && !isGlobalShortcut);\n\n    ui->widgetGlobalShortcut->setVisible(isGlobalShortcut);\n    ui->widgetMenuShortcut->setVisible(inMenu);\n\n    ui->groupBoxMatchItems->setVisible(copyOrExecute);\n    ui->groupBoxAction->setVisible(copyOrExecute);\n    ui->groupBoxInMenu->setVisible(inMenu);\n    ui->groupBoxCommandOptions->setHidden(!copyOrExecute || ui->commandEdit->isEmpty());\n\n    ui->labelDescription->setText(description());\n\n    updateShowAdvanced();\n\n    emitIconChanged();\n}\n\nvoid CommandWidget::updateShowAdvanced()\n{\n    ui->widgetCommandType->setVisible(m_showAdvanced);\n    ui->tabWidget->setVisible(m_showAdvanced);\n    ui->labelDescription->setVisible(m_showAdvanced);\n\n    // Hide the Advanced tab if there are no visible widgets.\n    const auto advancedTabWidgets = ui->tabAdvanced->findChildren<QGroupBox*>();\n    const auto showAdvancedTab = std::any_of(\n        std::begin(advancedTabWidgets), std::end(advancedTabWidgets), [](const QGroupBox *w) {\n            return !w->isHidden();\n        });\n    ui->tabWidget->setTabEnabled(1, showAdvancedTab);\n}\n\nvoid CommandWidget::setShowAdvanced(bool showAdvanced)\n{\n    if (m_showAdvanced == showAdvanced)\n        return;\n\n    m_showAdvanced = showAdvanced;\n    AppConfig appConfig;\n    appConfig.setOption(Config::show_advanced_command_settings::name(), showAdvanced);\n    updateShowAdvanced();\n}\n\nvoid CommandWidget::emitIconChanged()\n{\n    emit iconChanged();\n}\n\nQString CommandWidget::description() const\n{\n    const Command cmd = command();\n\n    if (cmd.type() & CommandType::Script)\n        return \"<b>Extends scripting</b> or command line.\";\n\n    if (cmd.type() & CommandType::Display)\n        return \"Changes <b>visual</b> item representation.\";\n\n    QString description(\"<table><tr><td>\");\n\n    if (cmd.type() & CommandType::Automatic) {\n        description.append(\"On <b>clipboard change</b>\");\n    } else if (cmd.type() & CommandType::GlobalShortcut) {\n        description.append(\"On <b>global shortcut</b>\");\n    } else if (cmd.type() & CommandType::Menu) {\n        description.append(\"On <b>menu item or application shortcut</b>\");\n    }\n\n    if ( !(cmd.type() & CommandType::GlobalShortcut) ) {\n        if (cmd.input.isEmpty() || cmd.input == mimeText)\n            description.append( QLatin1String(\"<div><b>input format:</b> text</div>\") );\n        else if (cmd.input == \"!OUTPUT\")\n            description.append( QString::fromLatin1(\"<div><b>input format NOT:</b> %1</div>\").arg(cmd.output) );\n        else\n            description.append( QString::fromLatin1(\"<div><b>input format:</b> %1</div>\").arg(cmd.input) );\n    }\n\n    description.append(\"</td><td width=15></td><td>\");\n\n    const bool isAutomaticOrMenu = cmd.type() & (CommandType::Automatic | CommandType::Menu);\n\n    if ( !cmd.re.pattern().isEmpty() && isAutomaticOrMenu ) {\n        description.append(\n            QString::fromLatin1(\"<div>if text matches <b>/%1/</b></div>\").arg(cmd.re.pattern()) );\n    }\n\n    if ( !cmd.wndre.pattern().isEmpty() && cmd.type() & CommandType::Automatic ) {\n        description.append(\n            QString::fromLatin1(\"<div>if current window title matches <b>/%1/</b></div>\").arg(cmd.wndre.pattern()) );\n    }\n\n    if ( !cmd.matchCmd.isEmpty() && isAutomaticOrMenu )\n        description.append(\"<div>if <b>filter</b> command succeeds</div>\");\n\n    description.append(\"</td><td width=15></td><td>\");\n\n    if (cmd.wait) {\n        description.append(\"<div><b>shows action dialog</b></div>\");\n    } else if ( !cmd.cmd.isEmpty() && isAutomaticOrMenu ) {\n        if ( !cmd.output.isEmpty() )\n            description.append( QString::fromLatin1(\"<div><b>output format:</b> %1</div>\").arg(cmd.output) );\n        if ( !cmd.outputTab.isEmpty() )\n            description.append( QString::fromLatin1(\"<div><b>output tab:</b> %1</div>\").arg(cmd.outputTab) );\n    }\n\n    if ( !cmd.tab.isEmpty() && cmd.type() & CommandType::Automatic )\n        description.append( QString::fromLatin1(\"<div>saves clipboard in tab <b>%1</b></div>\").arg(cmd.tab) );\n\n    if (cmd.remove) {\n        if ( cmd.type() & CommandType::Automatic )\n            description.append(\"<div><b>ignores clipboard</b></div>\");\n        else if ( cmd.type() & CommandType::Menu )\n            description.append(\"<div><b>removes</b> items</div>\");\n    } else if (cmd.transform) {\n        if ( cmd.type() & CommandType::Automatic )\n            description.append(\"<div><b>replaces data</b></div>\");\n        else if ( cmd.type() & CommandType::Menu )\n            description.append(\"<div><b>replaces selected items</b></div>\");\n    }\n\n    if (cmd.hideWindow && cmd.type() & CommandType::Menu )\n        description.append(\"<br/><b>closes</b> main window\");\n\n    description.append(\"</td></tr></table>\");\n\n    return description;\n}\n"
  },
  {
    "path": "src/gui/commandwidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QMap>\n#include <QWidget>\n\nnamespace Ui {\nclass CommandWidget;\n}\n\nclass QComboBox;\nstruct Command;\n\n/** Widget (set of widgets) for creating or modifying Command object. */\nclass CommandWidget final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit CommandWidget(QWidget *parent = nullptr);\n    ~CommandWidget();\n\n    /** Return command for the widget. */\n    Command command() const;\n\n    /** Set current command. */\n    void setCommand(const Command &c);\n\n    /** Set formats for format selection combo boxes. */\n    void setFormats(const QStringList &formats);\n\nsignals:\n    void iconChanged();\n\n    void nameChanged(const QString &name);\n\n    void commandTextChanged(const QString &command);\n\nprotected:\n    void showEvent(QShowEvent *event) override;\n\nprivate:\n    void onLineEditNameTextChanged(const QString &text);\n\n    void onButtonIconCurrentIconChanged();\n\n    void onCheckBoxShowAdvancedStateChanged(int state);\n\n    void onCommandEditCommandTextChanged(const QString &command);\n\n    void init();\n\n    void updateWidgets();\n\n    void updateShowAdvanced();\n\n    void setShowAdvanced(bool showAdvanced);\n\n    void emitIconChanged();\n\n    QString description() const;\n\n    Ui::CommandWidget *ui;\n    bool m_showAdvanced = true;\n    QString m_internalId;\n    QMap<QString, QString> m_nameLocalization;\n};\n"
  },
  {
    "path": "src/gui/configtabappearance.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/configtabappearance.h\"\n#include \"ui_configtabappearance.h\"\n\n#include \"common/contenttype.h\"\n#include \"common/display.h\"\n#include \"common/mimetypes.h\"\n#include \"common/option.h\"\n#include \"common/temporarysettings.h\"\n#include \"common/temporaryfile.h\"\n#include \"common/textdata.h\"\n#include \"common/timer.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/clipboardbrowsershared.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/pixelratio.h\"\n#include \"gui/theme.h\"\n#include \"item/itemdelegate.h\"\n#include \"item/itemeditor.h\"\n#include \"item/itemfilter.h\"\n\n#include <QAbstractScrollArea>\n#include <QAction>\n#include <QColorDialog>\n#include <QFileDialog>\n#include <QFontDialog>\n#include <QMessageBox>\n#include <QPainter>\n#include <QScrollBar>\n#include <QSettings>\n#include <QTextCursor>\n#include <QTextDocument>\n#include <QTextEdit>\n#include <QTemporaryFile>\n\n#include <memory>\n\nnamespace {\n\nclass ItemFilterSimple final : public ItemFilter {\npublic:\n    explicit ItemFilterSimple(const QString &text) noexcept\n        : m_text(text)\n    {\n    }\n\n    QString searchString() const override { return m_text; }\n    bool matchesAll() const override { return false; }\n    bool matchesNone() const override { return false; }\n    bool matches(const QString &) const override { return true; }\n    bool matchesIndex(const QModelIndex &) const override { return true; }\n\n    void highlight(QTextEdit *edit, const QTextCharFormat &format) const override\n    {\n        QTextCursor cur = edit->document()->find(m_text);\n        if ( !cur.hasSelection() )\n            return;\n\n        QTextEdit::ExtraSelection selection{cur, format};\n        edit->setExtraSelections({selection});\n        edit->update();\n    }\n\n    void search(QTextEdit *, bool) const override {}\n\nprivate:\n    QString m_text;\n};\n\n} // namespace\n\nConfigTabAppearance::ConfigTabAppearance(QWidget *parent)\n    : QWidget(parent)\n    , ui(new Ui::ConfigTabAppearance)\n    , m_theme(ui)\n    , m_editor()\n{\n    ui->setupUi(this);\n\n    connect(ui->pushButtonLoadTheme, &QPushButton::clicked,\n            this, &ConfigTabAppearance::onPushButtonLoadThemeClicked);\n    connect(ui->pushButtonSaveTheme, &QPushButton::clicked,\n            this, &ConfigTabAppearance::onPushButtonSaveThemeClicked);\n    connect(ui->pushButtonResetTheme, &QPushButton::clicked,\n            this, &ConfigTabAppearance::onPushButtonResetThemeClicked);\n    connect(ui->pushButtonEditTheme, &QPushButton::clicked,\n            this, &ConfigTabAppearance::onPushButtonEditThemeClicked);\n\n    connect(ui->checkBoxShowNumber, &QCheckBox::stateChanged,\n            this, &ConfigTabAppearance::onCheckBoxShowNumberStateChanged);\n    connect(ui->checkBoxScrollbars, &QCheckBox::stateChanged,\n            this, &ConfigTabAppearance::onCheckBoxScrollbarsStateChanged);\n    connect(ui->checkBoxAntialias, &QCheckBox::stateChanged,\n            this, &ConfigTabAppearance::onCheckBoxAntialiasStateChanged);\n\n    connect(ui->comboBoxThemes, &QComboBox::textActivated,\n            this, &ConfigTabAppearance::onComboBoxThemesActivated);\n\n    initSingleShotTimer(&m_timerPreview, 0, this, &ConfigTabAppearance::decoratePreviewNow);\n\n    // Connect signals from theme buttons.\n    for (auto button : ui->scrollAreaTheme->findChildren<QPushButton *>()) {\n        if (button->objectName().endsWith(\"Font\"))\n            connect(button, &QPushButton::clicked, this, &ConfigTabAppearance::onFontButtonClicked);\n        else if (button->objectName().startsWith(\"pushButtonColor\"))\n            connect(button, &QPushButton::clicked, this, &ConfigTabAppearance::onColorButtonClicked);\n    }\n\n    m_theme.resetTheme();\n}\n\nvoid ConfigTabAppearance::showEvent(QShowEvent *event)\n{\n    updateThemes();\n    updateStyle();\n    ui->scrollAreaTheme->setMinimumWidth( ui->scrollAreaThemeContents->minimumSizeHint().width()\n                                          + ui->scrollAreaTheme->verticalScrollBar()->width() + 8);\n    QWidget::showEvent(event);\n}\n\nConfigTabAppearance::~ConfigTabAppearance()\n{\n    delete ui;\n}\n\nvoid ConfigTabAppearance::loadTheme(const QSettings &settings)\n{\n    m_theme.loadTheme(settings);\n    updateStyle();\n}\n\nvoid ConfigTabAppearance::saveTheme(QSettings *settings)\n{\n    m_theme.saveTheme(settings);\n    settings->sync();\n    updateThemes();\n}\n\nvoid ConfigTabAppearance::createPreview(ItemFactory *itemFactory)\n{\n    m_itemFactory = itemFactory;\n    decoratePreview();\n}\n\nvoid ConfigTabAppearance::onFontButtonClicked()\n{\n    Q_ASSERT(sender() != nullptr);\n    fontButtonClicked(sender());\n}\n\nvoid ConfigTabAppearance::onColorButtonClicked()\n{\n    Q_ASSERT(sender() != nullptr);\n    colorButtonClicked(sender());\n}\n\nvoid ConfigTabAppearance::onPushButtonLoadThemeClicked()\n{\n    const QString filename = QFileDialog::getOpenFileName(this, tr(\"Open Theme File\"),\n                                                          defaultUserThemePath(), QLatin1String(\"*.ini\"));\n    if ( !filename.isNull() ) {\n        QSettings settings(filename, QSettings::IniFormat);\n        loadTheme(settings);\n    }\n}\n\nvoid ConfigTabAppearance::onPushButtonSaveThemeClicked()\n{\n    QString filename = QFileDialog::getSaveFileName(this, tr(\"Save Theme File As\"),\n                                                    defaultUserThemePath(), QLatin1String(\"*.ini\"));\n    if ( !filename.isNull() ) {\n        if ( !filename.endsWith(\".ini\") )\n            filename.append(\".ini\");\n        QSettings settings(filename, QSettings::IniFormat);\n        saveTheme(&settings);\n    }\n}\n\nvoid ConfigTabAppearance::onPushButtonResetThemeClicked()\n{\n    m_theme.resetTheme();\n    updateStyle();\n}\n\nvoid ConfigTabAppearance::onPushButtonEditThemeClicked()\n{\n    if (m_editor.isEmpty()) {\n        QMessageBox::warning( this, tr(\"No External Editor\"),\n                              tr(\"Set external editor command first!\") );\n        return;\n    }\n\n    TemporarySettings settings({});\n    saveTheme(settings.settings());\n\n    QByteArray data = settings.content();\n    // keep ini file user friendly\n    data.replace(\"\\\\n\",\n#ifdef Q_OS_WIN\n                 \"\\r\\n\"\n#else\n                 \"\\n\"\n#endif\n                 );\n\n    ItemEditor *editor = new ItemEditor(data, COPYQ_MIME_PREFIX \"theme\", m_editor, this);\n\n    connect( editor, &ItemEditor::fileModified,\n             this, &ConfigTabAppearance::onThemeModified );\n\n    connect( editor, &ItemEditor::closed,\n             editor, &QObject::deleteLater );\n\n    if ( !editor->start() )\n        delete editor;\n}\n\nvoid ConfigTabAppearance::onCheckBoxShowNumberStateChanged(int)\n{\n    decoratePreview();\n}\n\nvoid ConfigTabAppearance::onCheckBoxScrollbarsStateChanged(int)\n{\n    decoratePreview();\n}\n\nvoid ConfigTabAppearance::onCheckBoxAntialiasStateChanged(int)\n{\n    updateFontButtons();\n    decoratePreview();\n}\n\nvoid ConfigTabAppearance::onComboBoxThemesActivated(const QString &text)\n{\n    if ( text.isEmpty() )\n        return;\n\n    const QString fileName = findThemeFile(text + \".ini\");\n    QSettings settings(fileName, QSettings::IniFormat);\n    loadTheme(settings);\n}\n\nvoid ConfigTabAppearance::onThemeModified(const QByteArray &bytes)\n{\n    QTemporaryFile tmpfile;\n    if ( !openTemporaryFile(&tmpfile, \".ini\") )\n        return;\n\n    tmpfile.write(bytes);\n    tmpfile.flush();\n\n    QSettings settings(tmpfile.fileName(), QSettings::IniFormat);\n    loadTheme(settings);\n}\n\nvoid ConfigTabAppearance::updateThemes()\n{\n    // Add themes in combo box.\n    ui->comboBoxThemes->clear();\n    ui->comboBoxThemes->addItem(QString());\n\n    for (const QString &path : themePaths())\n        addThemes(path);\n}\n\nvoid ConfigTabAppearance::addThemes(const QString &path)\n{\n    const QDir::Filters filters = QDir::Files | QDir::Readable;\n    const QStringList nameFilters(\"*.ini\");\n\n    QDir dir(path);\n    for ( const auto &fileInfo :\n              dir.entryInfoList(nameFilters, filters, QDir::Name) )\n    {\n        const QString name = fileInfo.baseName();\n        if ( ui->comboBoxThemes->findText(name) == -1 ) {\n            const QIcon icon = createThemeIcon( dir.absoluteFilePath(fileInfo.fileName()) );\n            ui->comboBoxThemes->addItem(icon, name);\n        }\n    }\n}\n\nvoid ConfigTabAppearance::updateStyle()\n{\n    if ( !isVisible() )\n        return;\n\n    updateColorButtons();\n    updateFontButtons();\n    decoratePreview();\n}\n\nvoid ConfigTabAppearance::fontButtonClicked(QObject *button)\n{\n    QFont font = m_theme.themeFontFromString( button->property(\"VALUE\").toString() );\n    QFontDialog dialog(this);\n    dialog.setOption(QFontDialog::DontUseNativeDialog);\n    // WORKAROUND: DontUseNativeDialog must be set before current font (QTBUG-79637).\n    dialog.setCurrentFont(font);\n    if ( dialog.exec() == QDialog::Accepted ) {\n        font = dialog.selectedFont();\n        button->setProperty( \"VALUE\", font.toString() );\n        decoratePreview();\n        updateFontButtons();\n    }\n}\n\nvoid ConfigTabAppearance::colorButtonClicked(QObject *button)\n{\n    QColor color = evalColor( button->property(\"VALUE\").toString(), m_theme );\n    QColorDialog dialog(this);\n    dialog.setOptions(dialog.options() | QColorDialog::ShowAlphaChannel | QColorDialog::DontUseNativeDialog);\n    dialog.setCurrentColor(color);\n\n    if ( dialog.exec() == QDialog::Accepted ) {\n        color = dialog.selectedColor();\n        button->setProperty( \"VALUE\", serializeColor(color) );\n        decoratePreview();\n\n        const QSize iconSize = button->property(\"iconSize\").toSize();\n        QPixmap pix(iconSize);\n        pix.fill(color);\n        button->setProperty(\"icon\", QIcon(pix));\n\n        updateFontButtons();\n    }\n}\n\nvoid ConfigTabAppearance::updateColorButtons()\n{\n    if ( !isVisible() )\n        return;\n\n    /* color indicating icons for color buttons */\n    const QSize iconSize = ui->pushButtonColorFg->iconSize();\n    QPixmap pix(iconSize);\n\n    QList<QPushButton *> buttons =\n            ui->scrollAreaTheme->findChildren<QPushButton *>(QRegularExpression(\"^pushButtonColor\"));\n\n    for (auto button : buttons) {\n        QColor color = evalColor( button->property(\"VALUE\").toString(), m_theme );\n        pix.fill(color);\n        button->setIcon(pix);\n        button->setIconSize(pix.size());\n    }\n}\n\nvoid ConfigTabAppearance::updateFontButtons()\n{\n    if ( !isVisible() )\n        return;\n\n    const int iconExtent = pointsToPixels(12, this);\n    const QSize iconSize(iconExtent * 2, iconExtent);\n\n    const auto ratio = pixelRatio(ui->scrollAreaTheme);\n    QPixmap pix(iconSize * ratio);\n    pix.setDevicePixelRatio(ratio);\n\n    const QRect textRect( QPoint(0, 0), iconSize );\n\n    const QRegularExpression re(\"^pushButton(.*)Font$\");\n    QList<QPushButton *> buttons = ui->scrollAreaTheme->findChildren<QPushButton *>(re);\n\n    for (auto button : buttons) {\n        const auto m = re.match(button->objectName());\n        Q_ASSERT(m.hasMatch());\n\n        const QString colorButtonName = \"pushButtonColor\" + m.captured(1);\n\n        QPushButton *buttonFg = ui->scrollAreaTheme->findChild<QPushButton *>(colorButtonName + \"Fg\");\n        QColor colorFg = (buttonFg == nullptr) ? m_theme.color(\"fg\")\n                                            : evalColor( buttonFg->property(\"VALUE\").toString(), m_theme );\n\n        QPushButton *buttonBg = ui->scrollAreaTheme->findChild<QPushButton *>(colorButtonName + \"Bg\");\n        QColor colorBg = (buttonBg == nullptr) ? m_theme.color(\"bg\")\n                                            : evalColor( buttonBg->property(\"VALUE\").toString(), m_theme );\n\n        pix.fill(colorBg);\n\n        QPainter painter(&pix);\n        painter.setPen(colorFg);\n\n        QFont font = m_theme.themeFontFromString( button->property(\"VALUE\").toString() );\n        painter.setFont(font);\n        painter.drawText( textRect, Qt::AlignCenter,\n                          tr(\"Abc\", \"Preview text for font settings in appearance dialog\") );\n\n        button->setIcon(pix);\n        button->setIconSize(iconSize);\n    }\n}\n\nQIcon ConfigTabAppearance::createThemeIcon(const QString &fileName)\n{\n    QSettings settings(fileName, QSettings::IniFormat);\n    Theme theme(settings);\n\n    QPixmap pix(16, 16);\n    pix.fill(Qt::black);\n\n    QPainter p(&pix);\n\n    QRect rect(1, 1, 14, 5);\n    p.setPen(Qt::NoPen);\n    p.setBrush( theme.color(\"sel_bg\") );\n    p.drawRect(rect);\n\n    rect.translate(0, 5);\n    p.setBrush( theme.color(\"bg\") );\n    p.drawRect(rect);\n\n    rect.translate(0, 5);\n    p.setBrush( theme.color(\"alt_bg\") );\n    p.drawRect(rect);\n\n    QLine line;\n\n    line = QLine(2, 3, 14, 3);\n    QPen pen;\n    p.setOpacity(0.6);\n\n    pen.setColor( theme.color(\"sel_fg\") );\n    pen.setDashPattern(QVector<qreal>() << 2 << 1 << 1 << 1 << 3 << 1 << 2 << 10);\n    p.setPen(pen);\n    p.drawLine(line);\n\n    line.translate(0, 5);\n    pen.setColor( theme.color(\"fg\") );\n    pen.setDashPattern(QVector<qreal>() << 2 << 1 << 4 << 10);\n    p.setPen(pen);\n    p.drawLine(line);\n\n    line.translate(0, 5);\n    pen.setDashPattern(QVector<qreal>() << 3 << 1 << 2 << 1);\n    p.setPen(pen);\n    p.drawLine(line);\n\n    return pix;\n}\n\nvoid ConfigTabAppearance::decoratePreview()\n{\n    m_timerPreview.start();\n}\n\nvoid ConfigTabAppearance::decoratePreviewNow()\n{\n    if ( !m_itemFactory || !isVisible() )\n        return;\n\n    if (m_preview) {\n        delete m_preview;\n        m_preview = nullptr;\n    }\n\n    m_theme.updateTheme();\n\n    const auto sharedData = std::make_shared<ClipboardBrowserShared>();\n    sharedData->itemFactory = m_itemFactory;\n    sharedData->theme = m_theme;\n\n    auto c = new ClipboardBrowser(QString(), sharedData, this);\n    m_preview = c;\n    m_theme.decorateBrowser(c);\n\n    ui->browserParentLayout->addWidget(c);\n\n    const QString searchFor = tr(\"item\", \"Search expression in preview in Appearance tab.\");\n\n    c->add( tr(\"Search string is %1.\").arg(quoteString(searchFor)) );\n    c->add( tr(\"Select an item and\\npress F2 to edit.\") );\n    for (int i = 1; i <= 20; ++i)\n        c->add( tr(\"Example item %1\").arg(i), -1 );\n\n    QAbstractItemModel *model = c->model();\n    QModelIndex index = model->index(0, 0);\n    QVariantMap dataMap;\n    dataMap.insert( mimeItemNotes, tr(\"Some random notes (Shift+F2 to edit)\").toUtf8() );\n    model->setData(index, dataMap, contentType::updateData);\n\n    // Highlight found text but don't filter out any items.\n    c->filterItems(std::make_shared<ItemFilterSimple>(searchFor));\n\n    QAction *act;\n\n    act = new QAction(c);\n    act->setShortcut( QKeySequence(QLatin1String(\"Shift+F2\")) );\n    connect(act, &QAction::triggered, c, &ClipboardBrowser::editNotes);\n    c->addAction(act);\n\n    act = new QAction(c);\n    act->setShortcut( QKeySequence(QLatin1String(\"F2\")) );\n    connect(act, &QAction::triggered, c, &ClipboardBrowser::editSelected);\n    c->addAction(act);\n}\n"
  },
  {
    "path": "src/gui/configtabappearance.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/theme.h\"\n\n#include <QWidget>\n#include <QTimer>\n\nnamespace Ui {\nclass ConfigTabAppearance;\n}\n\nclass ItemDelegate;\nclass ItemFactory;\nclass Option;\nclass QAbstractScrollArea;\nclass QSettings;\n\nclass ConfigTabAppearance final : public QWidget\n{\n    Q_OBJECT\npublic:\n    explicit ConfigTabAppearance(QWidget *parent = nullptr);\n    ~ConfigTabAppearance();\n\n    /** Load theme from settings file. */\n    void loadTheme(const QSettings &settings);\n    /** Save theme to settings file. */\n    void saveTheme(QSettings *settings);\n\n    void setEditor(const QString &editor) { m_editor = editor; }\n\n    void createPreview(ItemFactory *itemFactory);\n\nprotected:\n    void showEvent(QShowEvent *event) override;\n\nprivate:\n    void onFontButtonClicked();\n    void onColorButtonClicked();\n\n    void onPushButtonLoadThemeClicked();\n    void onPushButtonSaveThemeClicked();\n    void onPushButtonResetThemeClicked();\n    void onPushButtonEditThemeClicked();\n\n    void onCheckBoxShowNumberStateChanged(int);\n    void onCheckBoxScrollbarsStateChanged(int);\n    void onCheckBoxAntialiasStateChanged(int);\n\n    void onComboBoxThemesActivated(const QString &text);\n\n    void onThemeModified(const QByteArray &bytes);\n\n    void updateThemes();\n    void addThemes(const QString &path);\n    void updateStyle();\n\n    void fontButtonClicked(QObject *button);\n    void colorButtonClicked(QObject *button);\n\n    void updateColorButtons();\n    void updateFontButtons();\n\n    QIcon createThemeIcon(const QString &fileName);\n\n    void decoratePreview();\n    void decoratePreviewNow();\n\n    Ui::ConfigTabAppearance *ui;\n    Theme m_theme;\n    QString m_editor;\n\n    QWidget *m_preview = nullptr;\n    ItemFactory *m_itemFactory = nullptr;\n\n    QTimer m_timerPreview;\n};\n"
  },
  {
    "path": "src/gui/configtabtabs.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"configtabtabs.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/tabs.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/itemorderlist.h\"\n#include \"gui/tabicons.h\"\n#include \"gui/tabpropertieswidget.h\"\n\n#include <QSettings>\n#include <QVBoxLayout>\n\nQ_DECLARE_METATYPE(TabProperties)\n\nnamespace {\n\nclass TabItem final : public ItemOrderList::Item {\npublic:\n    TabItem(const TabProperties &tab, ItemOrderList *parentList)\n        : m_tabProperties(tab)\n        , m_parentList(parentList)\n    {\n    }\n\n    QVariant data() const override\n    {\n        return QVariant::fromValue(m_tabProperties);\n    }\n\nprivate:\n    QWidget *createWidget(QWidget *parent) override\n    {\n        auto widget = new TabPropertiesWidget(parent);\n\n        widget->setTabName(m_tabProperties.name);\n        widget->setIconName(m_tabProperties.iconName);\n        widget->setMaxItemCount(m_tabProperties.maxItemCount);\n        widget->setStoreItems(m_tabProperties.storeItems);\n        widget->setEncryptedExpireSeconds(m_tabProperties.encryptedExpireSeconds);\n\n        QObject::connect( widget, &TabPropertiesWidget::iconNameChanged,\n                          [&](const QString &icon) { m_tabProperties.iconName = icon; } );\n        QObject::connect( widget, &TabPropertiesWidget::maxItemCountChanged,\n                          [&](int count) { m_tabProperties.maxItemCount = count; } );\n        QObject::connect( widget, &TabPropertiesWidget::storeItemsChanged,\n                          [&](bool store) { m_tabProperties.storeItems = store; } );\n        QObject::connect( widget, &TabPropertiesWidget::encryptedExpireSecondsChanged,\n                          [&](int seconds) { m_tabProperties.encryptedExpireSeconds = seconds; } );\n\n        QObject::connect(\n            widget, &TabPropertiesWidget::iconNameChanged,\n            m_parentList, [&] (const QString &iconName) {\n                const auto row = m_parentList->currentRow();\n                const auto icon = iconName.isEmpty() ? QIcon() : iconFromFile(iconName);\n                m_parentList->setItemIcon(row, icon);\n            }\n        );\n\n        return widget;\n    }\n\n    TabProperties m_tabProperties;\n    ItemOrderList *m_parentList;\n};\n\n} // namespace\n\nConfigTabTabs::ConfigTabTabs(QWidget *parent)\n    : QWidget(parent)\n    , m_list(new ItemOrderList(this))\n{\n    m_list->setItemsMovable(true);\n\n    auto layout = new QVBoxLayout(this);\n    layout->setContentsMargins(0, 0, 0, 0);\n    layout->addWidget(m_list);\n\n    const Tabs tabs;\n    for (const auto &name : AppConfig().option<Config::tabs>()) {\n        const auto icon = getIconForTabName(name);\n        ItemOrderList::ItemPtr item(new TabItem(tabs.tabProperties(name), m_list));\n        m_list->appendItem(name, icon, item);\n    }\n}\n\nvoid ConfigTabTabs::saveTabs(QSettings *settings)\n{\n    Tabs tabs;\n    QStringList tabList;\n    for (int row = 0; row < m_list->itemCount(); ++row) {\n        const auto name = m_list->itemLabel(row);\n        if (name.isEmpty())\n            continue;\n\n        tabList.append(name);\n        tabs.setTabProperties( m_list->data(row).value<TabProperties>() );\n    }\n\n    tabs.save(settings, tabList);\n\n    AppConfig().setOption(\"tabs\", tabList);\n}\n"
  },
  {
    "path": "src/gui/configtabtabs.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QWidget>\n\nclass ItemOrderList;\nclass QSettings;\n\nclass ConfigTabTabs final : public QWidget\n{\n    Q_OBJECT\npublic:\n    explicit ConfigTabTabs(QWidget *parent = nullptr);\n\n    void saveTabs(QSettings *settings);\n\nprivate:\n    ItemOrderList *m_list;\n};\n"
  },
  {
    "path": "src/gui/configurationmanager.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"configurationmanager.h\"\n#include \"ui_configurationmanager.h\"\n\n#include \"ui_configtabgeneral.h\"\n#include \"ui_configtabhistory.h\"\n#include \"ui_configtablayout.h\"\n#include \"ui_configtabnotifications.h\"\n#include \"ui_configtabtray.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/command.h\"\n#include \"common/common.h\"\n#include \"common/config.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/option.h\"\n#include \"common/settings.h\"\n#include \"gui/clipboardbrowsershared.h\"\n#include \"gui/configtabappearance.h\"\n#include \"gui/configtabtabs.h\"\n#include \"gui/encryptionpassword.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/passwordprompt.h\"\n#include \"gui/pluginwidget.h\"\n#include \"gui/shortcutswidget.h\"\n#include \"gui/tabicons.h\"\n#include \"gui/windowgeometryguard.h\"\n#include \"item/clipboardmodel.h\"\n#include \"item/itemdelegate.h\"\n#include \"item/itemfactory.h\"\n#include \"item/itemwidget.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QDir>\n#include <QFile>\n#include <QMessageBox>\n#include <QMimeData>\n#include <QScrollArea>\n#include <QTranslator>\n\nnamespace {\n\nclass TabItem final : public ItemOrderList::Item {\npublic:\n    explicit TabItem(QWidget *widget) noexcept\n        : m_widget(widget)\n    {\n        m_widget->hide();\n    }\n\n    QVariant data() const override { return QVariant(); }\n\nprivate:\n    QWidget *createWidget(QWidget *) override\n    {\n        return m_widget;\n    }\n\n    QWidget *m_widget;\n};\n\ntemplate <typename Ui>\nItemOrderList::ItemPtr makeTab(std::shared_ptr<Ui> &ui, QWidget *parent)\n{\n    Q_ASSERT(!ui);\n    auto widget = new QScrollArea(parent);\n    ui = std::make_shared<Ui>();\n    ui->setupUi(widget);\n    return std::make_shared<TabItem>(widget);\n}\n\ntemplate <typename Widget>\nItemOrderList::ItemPtr makeTab(Widget **widget, QWidget *parent)\n{\n    Q_ASSERT(!*widget);\n    *widget = new Widget(parent);\n    return std::make_shared<TabItem>(*widget);\n}\n\nclass PluginItem final : public ItemOrderList::Item {\npublic:\n    explicit PluginItem(const ItemLoaderPtr &loader)\n        : m_loader(loader)\n    {\n    }\n\n    QVariant data() const override { return m_loader->id(); }\n\nprivate:\n    QWidget *createWidget(QWidget *parent) override\n    {\n        return new PluginWidget(m_loader, parent);\n    }\n\n    ItemLoaderPtr m_loader;\n};\n\nQString nativeLanguageName(const QString &localeName)\n{\n    // Traditional Chinese\n    if (localeName == \"zh_TW\")\n        return QString::fromUtf8(\"\\xe6\\xad\\xa3\\xe9\\xab\\x94\\xe4\\xb8\\xad\\xe6\\x96\\x87\");\n\n    // Simplified Chinese\n    if (localeName == \"zh_CN\")\n        return QString::fromUtf8(\"\\xe7\\xae\\x80\\xe4\\xbd\\x93\\xe4\\xb8\\xad\\xe6\\x96\\x87\");\n\n    return QLocale(localeName).nativeLanguageName();\n}\n\n} // namespace\n\nConfigurationManager::ConfigurationManager(const ClipboardBrowserSharedPtr &sharedData, QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::ConfigurationManager)\n    , m_sharedData(sharedData)\n{\n    ui->setupUi(this);\n    initTabIcons();\n    connectSlots();\n    setWindowIcon(appIcon());\n\n    m_tabHistory->spinBoxItems->setMaximum(Config::maxItems);\n\n    ItemFactory *itemFactory = m_sharedData ? m_sharedData->itemFactory : nullptr;\n    if ( itemFactory && itemFactory->hasLoaders() )\n        initPluginWidgets(itemFactory);\n\n    initOptions();\n\n    if (itemFactory)\n        m_tabAppearance->createPreview(itemFactory);\n\n    AppConfig appConfig;\n    loadSettings(&appConfig);\n\n    if (itemFactory)\n        m_tabShortcuts->addCommands( itemFactory->commands() );\n}\n\nConfigurationManager::ConfigurationManager()\n    : ui(new Ui::ConfigurationManager)\n{\n    ui->setupUi(this);\n    initTabIcons();\n    connectSlots();\n    initOptions();\n}\n\nConfigurationManager::~ConfigurationManager()\n{\n    delete ui;\n}\n\nvoid ConfigurationManager::initTabIcons()\n{\n    ItemOrderList *list = ui->itemOrderList;\n    list->setItemsMovable(false);\n    list->appendItem( tr(\"General\"), getIcon(\"\", IconWrench), makeTab(m_tabGeneral, this) );\n    list->appendItem( tr(\"Layout\"), getIcon(\"\", IconTableColumns), makeTab(m_tabLayout, this) );\n    list->appendItem( tr(\"History\"), getIcon(\"\", IconList), makeTab(m_tabHistory, this) );\n    list->appendItem( tr(\"Tray\"), getIcon(\"\", IconInbox), makeTab(m_tabTray, this) );\n    list->appendItem( tr(\"Notifications\"), getIcon(\"\", IconCircleInfo), makeTab(m_tabNotifications, this) );\n    list->appendItem( tr(\"Tabs\"), getIconFromResources(\"tab_rename\"), makeTab(&m_tabTabs, this) );\n    list->appendItem( tr(\"Items\"), getIcon(\"\", IconList), makeTab(&m_tabItems, this) );\n    list->appendItem( tr(\"Shortcuts\"), getIcon(\"\", IconKeyboard), makeTab(&m_tabShortcuts, this) );\n    list->appendItem( tr(\"Appearance\"), getIcon(\"\", IconImage), makeTab(&m_tabAppearance, this) );\n}\n\nvoid ConfigurationManager::initPluginWidgets(ItemFactory *itemFactory)\n{\n    m_tabItems->clearItems();\n    m_tabItems->setItemsMovable(true);\n\n    for ( const auto &loader : itemFactory->loaders() ) {\n        if ( loader->name().isEmpty() )\n            continue;\n\n        ItemOrderList::ItemPtr pluginItem(new PluginItem(loader));\n        const QIcon icon = getIcon(loader->icon());\n        const auto state = loader->isEnabled()\n                ? ItemOrderList::Checked\n                : ItemOrderList::Unchecked;\n        m_tabItems->appendItem( loader->name(), icon, pluginItem, state );\n    }\n}\n\nvoid ConfigurationManager::initLanguages()\n{\n    m_tabGeneral->comboBoxLanguage->addItem(\"English\");\n    m_tabGeneral->comboBoxLanguage->setItemData(0, \"en\");\n\n    const QString currentLocale = QLocale().name();\n    bool currentLocaleFound = false; // otherwise not found or partial match (\"uk\" partially matches locale \"uk_UA\")\n    QSet<QString> languages;\n\n    for ( const auto &path : qApp->property(\"CopyQ_translation_directories\").toStringList() ) {\n        for ( const auto &item : QDir(path).entryList(QStringList(\"copyq_*.qm\")) ) {\n            const int i = item.indexOf('_');\n            const QString locale = item.mid(i + 1, item.lastIndexOf('.') - i - 1);\n            const QString language = nativeLanguageName(locale);\n\n            if (!language.isEmpty()) {\n                languages.insert(language);\n                const int index = m_tabGeneral->comboBoxLanguage->count();\n                m_tabGeneral->comboBoxLanguage->addItem(language);\n                m_tabGeneral->comboBoxLanguage->setItemData(index, locale);\n\n                if (!currentLocaleFound) {\n                    currentLocaleFound = (locale == currentLocale);\n                    if (currentLocaleFound || currentLocale.startsWith(locale + \"_\"))\n                        m_tabGeneral->comboBoxLanguage->setCurrentIndex(index);\n                }\n            }\n        }\n    }\n\n    m_tabGeneral->comboBoxLanguage->setSizeAdjustPolicy(QComboBox::AdjustToContents);\n}\n\nvoid ConfigurationManager::updateOptionsVisibility()\n{\n    auto platform = platformNativeInterface();\n    m_tabGeneral->checkBoxAutostart->setVisible( platform->canAutostart() );\n    m_tabGeneral->checkBoxPreventScreenCapture->setVisible(\n        platform->canPreventScreenCapture() );\n\n#ifdef WITH_QCA_ENCRYPTION\n    m_tabGeneral->checkBoxEncryptTabs->setVisible(true);\n    const bool passwordWasSet = m_sharedData\n        && !Encryption::loadWrappedDEK().isEmpty()\n        && !Encryption::loadKEKSalt().isEmpty();\n    m_tabGeneral->pushButtonChangeEncryptionPassword->setVisible(passwordWasSet);\n#else\n    m_tabGeneral->checkBoxEncryptTabs->setVisible(false);\n    m_tabGeneral->pushButtonChangeEncryptionPassword->setVisible(false);\n    m_tabHistory->labelEncryptedExpireSeconds->hide();\n    m_tabHistory->spinBoxExpireEncryptedTabSeconds->hide();\n#endif\n\n#ifdef WITH_KEYCHAIN\n    m_tabGeneral->checkBoxUseKeychain->setVisible(true);\n#else\n    m_tabGeneral->checkBoxUseKeychain->setVisible(false);\n#endif\n}\n\nvoid ConfigurationManager::setAutostartEnable(AppConfig *appConfig)\n{\n    auto platform = platformNativeInterface();\n    platform->setAutostartEnabled( appConfig->option<Config::autostart>() );\n}\n\nvoid ConfigurationManager::initOptions()\n{\n    /* general options */\n    bind<Config::autostart>(m_tabGeneral->checkBoxAutostart);\n    bind<Config::prevent_screen_capture>(m_tabGeneral->checkBoxPreventScreenCapture);\n    bind<Config::encrypt_tabs>(m_tabGeneral->checkBoxEncryptTabs);\n    bind<Config::use_key_store>(m_tabGeneral->checkBoxUseKeychain);\n    bind<Config::clipboard_tab>(m_tabHistory->comboBoxClipboardTab->lineEdit());\n    bind<Config::maxitems>(m_tabHistory->spinBoxItems);\n    bind<Config::expire_tab>(m_tabHistory->spinBoxExpireTab);\n    bind<Config::expire_encrypted_tab_seconds>(m_tabHistory->spinBoxExpireEncryptedTabSeconds);\n    bind<Config::editor>(m_tabHistory->lineEditEditor);\n    bind<Config::item_popup_interval>(m_tabNotifications->spinBoxNotificationPopupInterval);\n    bind<Config::notification_position>(m_tabNotifications->comboBoxNotificationPosition);\n    bind<Config::clipboard_notification_lines>(m_tabNotifications->spinBoxClipboardNotificationLines);\n    bind<Config::notification_horizontal_offset>(m_tabNotifications->spinBoxNotificationHorizontalOffset);\n    bind<Config::notification_vertical_offset>(m_tabNotifications->spinBoxNotificationVerticalOffset);\n    bind<Config::notification_maximum_width>(m_tabNotifications->spinBoxNotificationMaximumWidth);\n    bind<Config::notification_maximum_height>(m_tabNotifications->spinBoxNotificationMaximumHeight);\n    bind<Config::native_notifications>(m_tabNotifications->checkBoxUseNativeNotifications);\n    bind<Config::edit_ctrl_return>(m_tabHistory->checkBoxEditCtrlReturn);\n    bind<Config::show_simple_items>(m_tabHistory->checkBoxShowSimpleItems);\n    bind<Config::number_search>(m_tabHistory->checkBoxNumberSearch);\n    bind<Config::move>(m_tabHistory->checkBoxMove);\n    bind<Config::check_clipboard>(m_tabGeneral->checkBoxClip);\n    bind<Config::confirm_exit>(m_tabGeneral->checkBoxConfirmExit);\n    bind<Config::navigation_style>(m_tabGeneral->comboBoxNavigationStyle);\n    bind<Config::save_filter_history>(m_tabGeneral->checkBoxSaveFilterHistory);\n    bind<Config::autocompletion>(m_tabGeneral->checkBoxAutocompleteCommands);\n    bind<Config::always_on_top>(m_tabGeneral->checkBoxAlwaysOnTop);\n    bind<Config::close_on_unfocus>(m_tabGeneral->checkBoxCloseOnUnfocus);\n    bind<Config::open_windows_on_current_screen>(m_tabGeneral->checkBoxOpenWindowsOnCurrentScreen);\n    bind<Config::transparency_focused>(m_tabLayout->spinBoxTransparencyFocused);\n    bind<Config::transparency>(m_tabLayout->spinBoxTransparencyUnfocused);\n    bind<Config::hide_tabs>(m_tabLayout->checkBoxHideTabs);\n    bind<Config::hide_toolbar>(m_tabLayout->checkBoxHideToolbar);\n    bind<Config::hide_toolbar_labels>(m_tabLayout->checkBoxHideToolbarLabels);\n    bind<Config::disable_tray>(m_tabTray->checkBoxDisableTray);\n    bind<Config::hide_main_window>(m_tabLayout->checkBoxHideWindow);\n    bind<Config::tab_tree>(m_tabLayout->checkBoxTabTree);\n    bind<Config::show_tab_item_count>(m_tabLayout->checkBoxShowTabItemCount);\n    bind<Config::text_wrap>(m_tabGeneral->checkBoxTextWrap);\n\n    bind<Config::activate_item_with_single_click>(m_tabHistory->checkBoxSingleClickActivate);\n\n    bind<Config::activate_closes>(m_tabHistory->checkBoxActivateCloses);\n    bind<Config::activate_focuses>(m_tabHistory->checkBoxActivateFocuses);\n    bind<Config::activate_pastes>(m_tabHistory->checkBoxActivatePastes);\n\n    bind<Config::tray_items>(m_tabTray->spinBoxTrayItems);\n    bind<Config::tray_item_paste>(m_tabTray->checkBoxPasteMenuItem);\n    bind<Config::tray_commands>(m_tabTray->checkBoxTrayShowCommands);\n    bind<Config::tray_tab_is_current>(m_tabTray->checkBoxMenuTabIsCurrent);\n    bind<Config::tray_images>(m_tabTray->checkBoxTrayImages);\n    bind<Config::tray_tab>(m_tabTray->comboBoxMenuTab->lineEdit());\n\n    /* other options */\n    bind<Config::item_data_threshold>();\n    bind<Config::command_history_size>();\n#ifdef HAS_MOUSE_SELECTIONS\n    /* X11 clipboard selection monitoring and synchronization */\n    bind<Config::check_selection>(m_tabGeneral->checkBoxSel);\n    bind<Config::copy_clipboard>(m_tabGeneral->checkBoxCopyClip);\n    bind<Config::copy_selection>(m_tabGeneral->checkBoxCopySel);\n    bind<Config::run_selection>(m_tabGeneral->checkBoxRunSel);\n#else\n    m_tabGeneral->checkBoxCopySel->hide();\n    m_tabGeneral->checkBoxSel->hide();\n    m_tabGeneral->checkBoxCopyClip->hide();\n    m_tabGeneral->checkBoxRunSel->hide();\n#endif\n\n    bind<Config::hide_main_window_in_task_bar>();\n    bind<Config::max_process_manager_rows>();\n    bind<Config::show_advanced_command_settings>();\n    bind<Config::text_tab_width>();\n\n    bind<Config::save_delay_ms_on_item_added>();\n    bind<Config::save_delay_ms_on_item_modified>();\n    bind<Config::save_delay_ms_on_item_removed>();\n    bind<Config::save_delay_ms_on_item_moved>();\n    bind<Config::save_delay_ms_on_item_edited>();\n    bind<Config::save_on_app_deactivated>();\n    bind<Config::tray_menu_open_on_left_click>();\n\n    bind<Config::filter_regular_expression>();\n    bind<Config::filter_case_insensitive>();\n\n    bind<Config::native_menu_bar>();\n    bind<Config::native_tray_menu>();\n\n    bind<Config::script_paste_delay_ms>();\n\n    bind<Config::window_paste_with_ctrl_v_regex>();\n    bind<Config::window_wait_before_raise_ms>();\n    bind<Config::window_wait_raised_ms>();\n    bind<Config::window_wait_after_raised_ms>();\n    bind<Config::window_key_press_time_ms>();\n    bind<Config::window_wait_for_modifier_released_ms>();\n\n    bind<Config::update_clipboard_owner_delay_ms>();\n\n    bind<Config::style>();\n\n    bind<Config::row_index_from_one>();\n\n    bind<Config::tabs>();\n\n    bind<Config::restore_geometry>();\n\n    bind<Config::close_on_unfocus_delay_ms>();\n    bind<Config::close_on_unfocus_extra_delay_ms>();\n\n    bind<Config::frameless_window>();\n\n    bind<Config::terminate_action_timeout_ms>();\n}\n\ntemplate <typename Config, typename Widget>\nvoid ConfigurationManager::bind(Widget *obj)\n{\n    bind(Config::name(), obj, Config::defaultValue());\n}\n\ntemplate <typename Config>\nvoid ConfigurationManager::bind()\n{\n    bind(Config::name(), QVariant::fromValue(Config::defaultValue()), Config::description());\n}\n\nvoid ConfigurationManager::bind(const QString &optionKey, QCheckBox *obj, bool defaultValue)\n{\n    m_options[optionKey] = Option(defaultValue, \"checked\", obj);\n}\n\nvoid ConfigurationManager::bind(const QString &optionKey, QSpinBox *obj, int defaultValue)\n{\n    m_options[optionKey] = Option(defaultValue, \"value\", obj);\n}\n\nvoid ConfigurationManager::bind(const QString &optionKey, QLineEdit *obj, const QString &defaultValue)\n{\n    m_options[optionKey] = Option(defaultValue, \"text\", obj);\n}\n\nvoid ConfigurationManager::bind(const QString &optionKey, QComboBox *obj, int defaultValue)\n{\n    m_options[optionKey] = Option(defaultValue, \"currentIndex\", obj);\n}\n\nvoid ConfigurationManager::bind(const QString &optionKey, QComboBox *obj, NavigationStyle defaultValue)\n{\n    m_options[optionKey] = Option(static_cast<int>(defaultValue), \"currentIndex\", obj);\n}\n\nvoid ConfigurationManager::bind(const QString &optionKey, const QVariant &defaultValue, const char *description)\n{\n    m_options[optionKey] = Option(defaultValue, description);\n}\n\nvoid ConfigurationManager::updateTabComboBoxes()\n{\n    initTabComboBox(m_tabHistory->comboBoxClipboardTab);\n    initTabComboBox(m_tabTray->comboBoxMenuTab);\n}\n\nQStringList ConfigurationManager::options() const\n{\n    QStringList options;\n    for (auto it = m_options.constBegin(); it != m_options.constEnd(); ++it) {\n        const auto &option = it.key();\n        if ( it.value().value().canConvert(QVariant::String) )\n            options.append(option);\n        else if ( it.value().value().canConvert(QVariant::StringList) )\n            options.append(option);\n    }\n\n    return options;\n}\n\nQVariant ConfigurationManager::optionValue(const QString &name) const\n{\n    return m_options.value(name).value();\n}\n\nbool ConfigurationManager::setOptionValue(const QString &name, const QVariant &value, AppConfig *appConfig)\n{\n    if ( !m_options.contains(name) )\n        return false;\n\n    const QString oldValue = optionValue(name).toString();\n    Option &option = m_options[name];\n    option.setValue(value);\n    if ( option.value() == oldValue )\n        return false;\n\n    appConfig->setOption(name, option.value());\n    option.setValue(appConfig->option(name));\n    return option.value() != oldValue;\n}\n\nQString ConfigurationManager::optionToolTip(const QString &name) const\n{\n    return m_options[name].tooltip();\n}\n\nvoid ConfigurationManager::loadSettings(AppConfig *appConfig)\n{\n    Settings &settings = appConfig->settings();\n\n    settings.beginGroup(\"Options\");\n    for (auto it = m_options.begin(); it != m_options.end(); ++it) {\n        const auto &option = it.key();\n        auto &value = it.value();\n        if ( settings.contains(option) ) {\n            const auto newValue = settings.value(option);\n            if ( !newValue.isValid() || !value.setValue(newValue) )\n                log( tr(\"Invalid value for option \\\"%1\\\"\").arg(option), LogWarning );\n        } else {\n            value.reset();\n        }\n    }\n    settings.endGroup();\n\n    settings.beginGroup(\"Shortcuts\");\n    m_tabShortcuts->loadShortcuts(settings);\n    settings.endGroup();\n\n    settings.beginGroup(\"Theme\");\n    m_tabAppearance->loadTheme(settings);\n    settings.endGroup();\n\n    m_tabAppearance->setEditor( appConfig->option<Config::editor>() );\n\n    onCheckBoxMenuTabIsCurrentStateChanged( m_tabTray->checkBoxMenuTabIsCurrent->checkState() );\n\n    updateTabComboBoxes();\n\n    updateOptionsVisibility();\n}\n\nvoid ConfigurationManager::onButtonBoxClicked(QAbstractButton* button)\n{\n    int answer;\n\n    switch( ui->buttonBox->buttonRole(button) ) {\n    case QDialogButtonBox::ApplyRole: {\n        AppConfig appConfig;\n        apply(&appConfig);\n        emit configurationChanged(&appConfig);\n        break;\n    }\n    case QDialogButtonBox::AcceptRole:\n        accept();\n        break;\n    case QDialogButtonBox::RejectRole:\n        reject();\n        break;\n    case QDialogButtonBox::ResetRole:\n        // ask before resetting values\n        answer = QMessageBox::question(\n                    this,\n                    tr(\"Reset preferences?\"),\n                    tr(\"This action will reset all your preferences (in all tabs) to default values.<br /><br />\"\n                       \"Do you really want to <strong>reset all preferences</strong>?\"),\n                    QMessageBox::Yes | QMessageBox::No,\n                    QMessageBox::Yes);\n        if (answer == QMessageBox::Yes) {\n            for (auto it = m_options.begin(); it != m_options.end(); ++it)\n                it.value().reset();\n        }\n        break;\n    default:\n        return;\n    }\n}\n\nvoid ConfigurationManager::setVisible(bool visible)\n{\n    QDialog::setVisible(visible);\n\n    if (visible) {\n        initLanguages();\n    }\n}\n\nvoid ConfigurationManager::connectSlots()\n{\n    connect(ui->buttonBox, &QDialogButtonBox::clicked,\n            this, &ConfigurationManager::onButtonBoxClicked);\n    connect(m_tabTray->checkBoxMenuTabIsCurrent, &QCheckBox::stateChanged,\n            this, &ConfigurationManager::onCheckBoxMenuTabIsCurrentStateChanged);\n    connect(m_tabTray->spinBoxTrayItems, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),\n            this, &ConfigurationManager::onSpinBoxTrayItemsValueChanged);\n    connect(m_tabGeneral->pushButtonChangeEncryptionPassword, &QPushButton::clicked,\n            this, &ConfigurationManager::onPushButtonChangeEncryptionPasswordClicked);\n}\n\nvoid ConfigurationManager::apply(AppConfig *appConfig)\n{\n    Settings &settings = appConfig->settings();\n\n    settings.beginGroup(\"Options\");\n    for (auto it = m_options.constBegin(); it != m_options.constEnd(); ++it)\n        settings.setValue( it.key(), it.value().value() );\n    settings.endGroup();\n\n    m_tabTabs->saveTabs(&settings);\n\n    // Save configuration without command line alternatives only if option widgets are initialized\n    // (i.e. clicked OK or Apply in configuration dialog).\n    settings.beginGroup(\"Shortcuts\");\n    m_tabShortcuts->saveShortcuts(&settings);\n    settings.endGroup();\n\n    settings.beginGroup(\"Theme\");\n    m_tabAppearance->saveTheme(&settings);\n    settings.endGroup();\n\n    // Save settings for each plugin.\n    settings.beginGroup(\"Plugins\");\n\n    QStringList pluginPriority;\n    pluginPriority.reserve( m_tabItems->itemCount() );\n\n    for (int i = 0; i < m_tabItems->itemCount(); ++i) {\n        const QString loaderId = m_tabItems->data(i).toString();\n        if ( loaderId.isEmpty() )\n            continue;\n\n        pluginPriority.append(loaderId);\n\n        settings.beginGroup(loaderId);\n\n        QWidget *w = m_tabItems->widget(i);\n        if (w) {\n            PluginWidget *pluginWidget = qobject_cast<PluginWidget *>(w);\n            const auto &loader = pluginWidget->loader();\n            loader->applySettings(settings);\n        }\n\n        const bool isPluginEnabled = m_tabItems->isItemChecked(i);\n        settings.setValue(\"enabled\", isPluginEnabled);\n\n        settings.endGroup();\n    }\n\n    settings.endGroup();\n\n    if (!pluginPriority.isEmpty())\n        settings.setValue(\"plugin_priority\", pluginPriority);\n\n    m_tabAppearance->setEditor( appConfig->option<Config::editor>() );\n\n    setAutostartEnable(appConfig);\n\n    // Language changes after restart.\n    const int newLocaleIndex = m_tabGeneral->comboBoxLanguage->currentIndex();\n    const QString newLocaleName = m_tabGeneral->comboBoxLanguage->itemData(newLocaleIndex).toString();\n    QString oldLocaleName = settings.value(\"Options/language\").toString();\n    if (oldLocaleName.isEmpty())\n        oldLocaleName = \"en\";\n    const QLocale oldLocale;\n\n    settings.setValue(\"Options/language\", newLocaleName);\n\n    if (QLocale(newLocaleName).name() != oldLocale.name() && newLocaleName != oldLocaleName) {\n        QMessageBox::information( this, tr(\"Restart Required\"),\n                                  tr(\"Language will be changed after application is restarted.\") );\n    }\n}\n\nvoid ConfigurationManager::done(int result)\n{\n    if (result == QDialog::Accepted) {\n        AppConfig appConfig;\n        apply(&appConfig);\n        emit configurationChanged(&appConfig);\n    }\n\n    QDialog::done(result);\n}\n\nvoid ConfigurationManager::onCheckBoxMenuTabIsCurrentStateChanged(int state)\n{\n    m_tabTray->comboBoxMenuTab->setEnabled(state == Qt::Unchecked);\n}\n\nvoid ConfigurationManager::onSpinBoxTrayItemsValueChanged(int value)\n{\n    m_tabTray->checkBoxPasteMenuItem->setEnabled(value > 0);\n}\n\nvoid ConfigurationManager::onPushButtonChangeEncryptionPasswordClicked()\n{\n    if (!m_sharedData || !m_sharedData->passwordPrompt)\n        return;\n\n    // Always verify old password\n    QPointer<ConfigurationManager> self(this);\n    m_sharedData->passwordPrompt->prompt(\n        PasswordSource::IgnoreEnvAndKeychain,\n        [self](const Encryption::EncryptionKey &currentKey){\n            if (!self || !currentKey.isValid())\n                return;\n\n            const auto key = promptForEncryptionPasswordChange(currentKey, self);\n            if (key.isValid())\n                self->m_sharedData->encryptionKey = key;\n        });\n}\n"
  },
  {
    "path": "src/gui/configurationmanager.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"item/itemwidget.h\"\n\n#include <QDialog>\n#include <QHash>\n\n#include <memory>\n\nnamespace Ui {\n    class ConfigTabGeneral;\n    class ConfigTabHistory;\n    class ConfigTabLayout;\n    class ConfigTabNotifications;\n    class ConfigTabTray;\n    class ConfigurationManager;\n}\n\nnamespace Encryption {\n    class EncryptionKey;\n}\n\nclass AppConfig;\nclass ConfigTabAppearance;\nclass ConfigTabTabs;\nclass ItemFactory;\nclass ItemOrderList;\nclass Option;\nclass ShortcutsWidget;\nclass QAbstractButton;\nclass QCheckBox;\nclass QComboBox;\nclass QLineEdit;\nclass QListWidgetItem;\nclass QSpinBox;\nenum class NavigationStyle;\n\nstruct ClipboardBrowserShared;\nusing ClipboardBrowserSharedPtr = std::shared_ptr<ClipboardBrowserShared>;\n\n/**\n * Configuration dialog.\n */\nclass ConfigurationManager final : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ConfigurationManager(const ClipboardBrowserSharedPtr &sharedData, QWidget *parent = nullptr);\n\n    /// Simple version of dialog for accessing and settings options from API.\n    ConfigurationManager();\n\n    ~ConfigurationManager();\n\n    /** Return list of options that can be set or view using command line. */\n    QStringList options() const;\n\n    /** Return value of an option. */\n    QVariant optionValue(const QString &name) const;\n\n    /** Set value of an option and returns true only if the value changes. */\n    bool setOptionValue(const QString &name, const QVariant &value, AppConfig *appConfig);\n\n    /** Return tooltip text for option with given @a name. */\n    QString optionToolTip(const QString &name) const;\n\n    void setVisible(bool visible) override;\n\n    /** Load settings from default file. */\n    void loadSettings(AppConfig *appConfig);\n\n    /** Enable/disable autostarting the application. */\n    void setAutostartEnable(AppConfig *appConfig);\n\n    void done(int result) override;\n\nsignals:\n    /** Emitted if configuration changes (after saveSettings() call). */\n    void configurationChanged(AppConfig *appConfig);\n\n    void error(const QString &error);\n\nprivate:\n    void connectSlots();\n\n    void apply(AppConfig *appConfig);\n    void onButtonBoxClicked(QAbstractButton* button);\n\n    void onCheckBoxMenuTabIsCurrentStateChanged(int);\n    void onSpinBoxTrayItemsValueChanged(int value);\n    void onPushButtonChangeEncryptionPasswordClicked();\n\n    void updateCommandItem(QListWidgetItem *item);\n    void shortcutButtonClicked(QObject *button);\n\n    void initTabIcons();\n\n    void initPluginWidgets(ItemFactory *itemFactory);\n\n    void initLanguages();\n\n    void updateOptionsVisibility();\n\n    void initOptions();\n\n    template <typename Config, typename Widget>\n    void bind(Widget *obj);\n\n    template <typename Config>\n    void bind();\n\n    void bind(const QString &optionKey, QCheckBox *obj, bool defaultValue);\n    void bind(const QString &optionKey, QSpinBox  *obj, int defaultValue);\n    void bind(const QString &optionKey, QLineEdit *obj, const QString &defaultValue);\n    void bind(const QString &optionKey, QComboBox *obj, int defaultValue);\n    void bind(const QString &optionKey, QComboBox *obj, NavigationStyle defaultValue);\n    void bind(const QString &optionKey, const QVariant &defaultValue, const char *description);\n\n    void updateTabComboBoxes();\n\n    Ui::ConfigurationManager *ui;\n\n    ClipboardBrowserSharedPtr m_sharedData;\n\n    ConfigTabAppearance *m_tabAppearance = nullptr;\n    ConfigTabTabs *m_tabTabs = nullptr;\n    ItemOrderList *m_tabItems = nullptr;\n    ShortcutsWidget *m_tabShortcuts = nullptr;\n    std::shared_ptr<Ui::ConfigTabGeneral> m_tabGeneral;\n    std::shared_ptr<Ui::ConfigTabHistory> m_tabHistory;\n    std::shared_ptr<Ui::ConfigTabLayout> m_tabLayout;\n    std::shared_ptr<Ui::ConfigTabNotifications> m_tabNotifications;\n    std::shared_ptr<Ui::ConfigTabTray> m_tabTray;\n\n    QHash<QString, Option> m_options;\n};\n"
  },
  {
    "path": "src/gui/encryptionpassword.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"encryptionpassword.h\"\n\n#ifdef WITH_QCA_ENCRYPTION\n#include \"common/common.h\"\n#include \"common/config.h\"\n#include \"common/encryption.h\"\n#include \"common/keychainaccess.h\"\n#include \"common/log.h\"\n#include \"common/textdata.h\"\n#include \"item/clipboardmodel.h\"\n#include \"item/itemfactory.h\"\n#include \"item/itemstore.h\"\n#include \"item/itemwidget.h\"\n#include \"item/serialize.h\"\n#include \"gui/clipboardbrowsershared.h\"\n\n#include <QCoreApplication>\n#include <QInputDialog>\n#include <QIODevice>\n#include <QLineEdit>\n#include <QLoggingCategory>\n#include <QMessageBox>\n#include <QProgressDialog>\n#include <QWidget>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.passwd\")\n\nconstexpr int maxPasswordAttempts = 3;\n\nQString keychainServiceName()\n{\n    return QStringLiteral(\"com.github.hluk.copyq\");\n}\n\nQString keychainPasswordKey()\n{\n    const QString sessionName = qApp->property(\"CopyQ_session_name\").toString();\n    if (sessionName.isEmpty())\n        return QStringLiteral(\"Password\");\n    return QStringLiteral(\"PasswordForSession-%1\").arg(sessionName);\n}\n\nbool savePasswordToKeychain(const Encryption::SecureArray &password)\n{\n    qCInfo(logCategory) << \"Saving password from system keychain\";\n    const Encryption::Cleared<QByteArray> ba = password.toByteArray();\n    const bool result = KeychainAccess::writePassword(\n        keychainServiceName(), keychainPasswordKey(), ba.value());\n\n    if (!result)\n        return false;\n\n    qCInfo(logCategory) << \"Password saved to system keychain\";\n    return true;\n}\n\nQByteArray loadPasswordFromKeychain()\n{\n    qCInfo(logCategory) << \"Loading password from system keychain\";\n    const QByteArray result = KeychainAccess::readPassword(\n        keychainServiceName(), keychainPasswordKey());\n\n    if (result.isEmpty())\n        return {};\n\n    qCDebug(logCategory) << \"Password loaded from system keychain\";\n    return result;\n}\n\nvoid activateWindow(QWidget *parent)\n{\n    parent->show();\n    parent->activateWindow();\n    parent->raise();\n}\n\nEncryption::EncryptionKey setUpPassword(const Encryption::SecureArray &password, PasswordSource prompt)\n{\n    Encryption::EncryptionKey key;\n    if ( !key.generateRandomDEK() ) {\n        log(\"Failed to generate random DEK\", LogError);\n        return {};\n    }\n\n    const Encryption::EncryptionKey newKey = Encryption::saveKey(key, password);\n    if (prompt == PasswordSource::UseEnvAndKeychain && newKey.isValid())\n        savePasswordToKeychain(password);\n\n    return newKey;\n}\n\nEncryption::SecureArray getStoredPassword(PasswordSource prompt)\n{\n    if (prompt == PasswordSource::UseEnvAndKeychain || prompt == PasswordSource::UseEnvOnly) {\n        const Encryption::Cleared<QByteArray> ba = qgetenv(\"COPYQ_PASSWORD\");\n        if ( !ba.isEmpty() ) {\n            qCInfo(logCategory) << \"Encryption password loaded from env variable COPYQ_PASSWORD\";\n            return Encryption::SecureArray(ba.value());\n        }\n    }\n\n    if (prompt == PasswordSource::UseEnvAndKeychain) {\n        const Encryption::Cleared<QByteArray> ba = loadPasswordFromKeychain();\n        if ( !ba.isEmpty() ) {\n            qCInfo(logCategory) << \"Encryption password loaded from system keychain\";\n            return Encryption::SecureArray(ba.value());\n        }\n    }\n\n    return {};\n}\n\nEncryption::SecureArray getPassword(\n    QWidget *parent, const QString &title, const QString &label, bool *ok = nullptr)\n{\n    const Encryption::Cleared<QString> str = QInputDialog::getText(\n        parent, title, label, QLineEdit::Password, QString(), ok);\n    const Encryption::Cleared<QByteArray> ba(str.value().toUtf8());\n    return Encryption::SecureArray(ba.value());\n}\n\nvoid getPasswordAsync(\n    QWidget *parent,\n    const QString &title,\n    const QString &label,\n    std::function<void(const Encryption::SecureArray &, bool)> callback)\n{\n    auto *dialog = new QInputDialog(parent);\n    dialog->setAttribute(Qt::WA_DeleteOnClose);\n    dialog->setWindowTitle(title);\n    dialog->setLabelText(label);\n    dialog->setTextEchoMode(QLineEdit::Password);\n    dialog->setTextValue(QString());\n    dialog->setModal(true);\n    dialog->setWindowModality(Qt::ApplicationModal);\n    QObject::connect(dialog, &QInputDialog::finished, dialog, [dialog, callback = std::move(callback)](int result) mutable {\n        const Encryption::Cleared<QByteArray> ba(dialog->textValue().toUtf8());\n        callback(Encryption::SecureArray(ba.value()), result == QDialog::Accepted);\n    });\n    dialog->open();\n}\n\nvoid promptForNewDefaultPasswordAttemptAsync(\n    QWidget *parent,\n    int attempts,\n    std::function<void(const Encryption::SecureArray &password)> callback)\n{\n    getPasswordAsync(\n        parent,\n        QObject::tr(\"New Tab Encryption Password\"),\n        attempts == 0\n            ? QObject::tr(\"Enter new password:\")\n            : QObject::tr(\"Passwords did not match. Please try again (%1/%2):\")\n                  .arg(attempts + 1)\n                  .arg(maxPasswordAttempts),\n        [=](const Encryption::SecureArray &password1, bool ok) mutable {\n            if (!ok) {\n                log(\"New password input cancelled by user\", LogNote);\n                callback({});\n                return;\n            }\n\n            if (password1.isEmpty()) {\n                QMessageBox::warning(\n                    parent,\n                    QObject::tr(\"Change Password\"),\n                    QObject::tr(\"New password cannot be empty.\"));\n                if (attempts >= maxPasswordAttempts - 1) {\n                    log(\"Maximum password setup attempts exceeded\");\n                    QMessageBox::critical(\n                        parent,\n                        QObject::tr(\"Password Setup Failed\"),\n                        QObject::tr(\"Maximum password attempts exceeded.\"));\n                    callback({});\n                    return;\n                }\n                promptForNewDefaultPasswordAttemptAsync(parent, attempts + 1, std::move(callback));\n                return;\n            }\n\n            getPasswordAsync(\n                parent,\n                QObject::tr(\"Confirm Encryption Password\"),\n                QObject::tr(\"Re-enter password to confirm:\"),\n                [=](const Encryption::SecureArray &password2, bool ok2) mutable {\n                    if (!ok2) {\n                        log(\"Password confirmation cancelled by user\", LogNote);\n                        callback({});\n                        return;\n                    }\n\n                    if (password1 == password2) {\n                        callback(password1);\n                        return;\n                    }\n\n                    if (attempts >= maxPasswordAttempts - 1) {\n                        log(\"Maximum password setup attempts exceeded\");\n                        QMessageBox::critical(\n                            parent,\n                            QObject::tr(\"Password Setup Failed\"),\n                            QObject::tr(\"Maximum password attempts exceeded.\"));\n                        callback({});\n                        return;\n                    }\n                    promptForNewDefaultPasswordAttemptAsync(parent, attempts + 1, std::move(callback));\n                });\n        });\n}\n\nvoid promptForEncryptionPasswordAttemptAsync(\n    QWidget *parent,\n    PasswordSource prompt,\n    Encryption::SecureArray wrappedDEK,\n    Encryption::Salt kekSalt,\n    int attempts,\n    std::function<void(const Encryption::EncryptionKey &key, bool passwordEnteredManually)> callback)\n{\n    getPasswordAsync(\n        parent,\n        QObject::tr(\"Current Tab Encryption Password\"),\n        attempts == 0\n            ? QObject::tr(\"Enter current password for encrypting tab data:\")\n            : QObject::tr(\"Invalid password. Please try again (%1/%2):\")\n                  .arg(attempts + 1)\n                  .arg(maxPasswordAttempts),\n        [=](const Encryption::SecureArray &password, bool ok) mutable {\n            if (!ok || password.isEmpty()) {\n                log(\"Tab encryption password required but not provided\", LogWarning);\n                callback({}, true);\n                return;\n            }\n\n            const Encryption::EncryptionKey key(password, wrappedDEK, kekSalt);\n            if (!key.isValid()) {\n                if (attempts >= maxPasswordAttempts - 1) {\n                    log(\"Maximum password attempts exceeded\", LogError);\n                    QMessageBox::critical(\n                        parent,\n                        QObject::tr(\"Password Verification Failed\"),\n                        QObject::tr(\"Maximum password attempts exceeded.\"));\n                    callback({}, true);\n                    return;\n                }\n                promptForEncryptionPasswordAttemptAsync(\n                    parent, prompt, std::move(wrappedDEK), std::move(kekSalt), attempts + 1, std::move(callback));\n                return;\n            }\n\n            if (prompt == PasswordSource::UseEnvAndKeychain)\n                savePasswordToKeychain(password);\n\n            callback(key, true);\n        });\n}\n\nEncryption::SecureArray promptForNewDefaultPassword(QWidget *parent)\n{\n    return promptForNewPassword(\n        QObject::tr(\"New Tab Encryption Password\"),\n        QObject::tr(\"Enter new password:\"),\n        PasswordPromptType::OnlyNonEmpty,\n        parent);\n}\n\nvoid promptForNewDefaultPasswordAsync(\n    QWidget *parent,\n    std::function<void(const Encryption::SecureArray &password)> callback)\n{\n    activateWindow(parent);\n    promptForNewDefaultPasswordAttemptAsync(parent, 0, std::move(callback));\n}\n\nvoid firstPasswordSetupAsync(\n    QWidget *parent,\n    PasswordSource prompt,\n    std::function<void(const Encryption::EncryptionKey &key, bool passwordEnteredManually)> callback)\n{\n    qCInfo(logCategory) << \"Setting up encryption for the first time\";\n\n    const Encryption::SecureArray storedPassword = getStoredPassword(prompt);\n    if (!storedPassword.isEmpty()) {\n        callback(setUpPassword(storedPassword, prompt), false);\n        return;\n    }\n\n    promptForNewDefaultPasswordAsync(parent, [prompt, callback = std::move(callback)](const Encryption::SecureArray &newPassword) mutable {\n        if (newPassword.isEmpty()) {\n            callback({}, true);\n            return;\n        }\n        callback(setUpPassword(newPassword, prompt), true);\n    });\n}\n\n} // namespace\n\nEncryption::SecureArray promptForNewPassword(\n    const QString &title, const QString &label, PasswordPromptType pwType, QWidget *parent)\n{\n    if ( !Encryption::initialize() ) {\n        log(\"Failed to initialize encryption system\", LogWarning);\n        return {};\n    }\n\n    activateWindow(parent);\n    int attempts = 0;\n    while (attempts < maxPasswordAttempts) {\n        bool ok;\n        const auto password1 = getPassword(\n            parent,\n            title,\n            attempts == 0\n                ? label\n                : QObject::tr(\"Passwords did not match. Please try again (%1/%2):\").arg(attempts + 1).arg(maxPasswordAttempts),\n            &ok\n        );\n\n        if (!ok) {\n            log(\"New password input cancelled by user\", LogNote);\n            return {};\n        }\n\n        if (pwType == PasswordPromptType::AskOnce)\n            return password1;\n\n        if (password1.isEmpty()) {\n            if (pwType == PasswordPromptType::AllowEmpty)\n                return {};\n            QMessageBox::warning(\n                parent,\n                QObject::tr(\"Change Password\"),\n                QObject::tr(\"New password cannot be empty.\")\n            );\n            attempts++;\n            continue;\n        }\n\n        // Ask for password confirmation\n        const auto password2 = getPassword(\n            parent,\n            QObject::tr(\"Confirm Encryption Password\"),\n            QObject::tr(\"Re-enter password to confirm:\"),\n            &ok\n        );\n\n        if (!ok) {\n            log(\"Password confirmation cancelled by user\", LogNote);\n            return {};\n        }\n\n        // Check if passwords match\n        if (password1 != password2) {\n            attempts++;\n            continue;\n        }\n\n        return password1;\n    }\n\n    log(\"Maximum password setup attempts exceeded\");\n    QMessageBox::critical(\n        parent,\n        QObject::tr(\"Password Setup Failed\"),\n        QObject::tr(\"Maximum password attempts exceeded.\")\n    );\n    return {};\n}\n\nvoid promptForEncryptionPasswordAsync(\n    QWidget *parent,\n    PasswordSource prompt,\n    std::function<void(const Encryption::EncryptionKey &key, bool passwordEnteredManually)> callback)\n{\n    if ( !Encryption::initialize() ) {\n        log(\"Failed to initialize encryption system\", LogWarning);\n        callback({}, true);\n        return;\n    }\n\n    const Encryption::SecureArray wrappedDEK = Encryption::loadWrappedDEK();\n    const Encryption::Salt kekSalt = Encryption::loadKEKSalt();\n\n    const bool isFirstSetup = wrappedDEK.isEmpty() && kekSalt.isEmpty();\n    if (isFirstSetup) {\n        firstPasswordSetupAsync(parent, prompt, std::move(callback));\n        return;\n    }\n\n    if (wrappedDEK.isEmpty() || kekSalt.isEmpty()) {\n        log(\"Encryption key files are missing or corrupted; refusing to unlock encrypted tabs in strict mode\", LogError);\n        QMessageBox::critical(\n            parent,\n            QObject::tr(\"Encryption Files Corrupted\"),\n            QObject::tr(\n                \"Encryption files are missing or corrupted. \"\n                \"Strict mode cannot recover encrypted tabs automatically.\"));\n        callback({}, true);\n        return;\n    }\n\n    const Encryption::SecureArray storedPassword = getStoredPassword(prompt);\n    if (!storedPassword.isEmpty()) {\n        const Encryption::EncryptionKey key(storedPassword, wrappedDEK, kekSalt);\n        if (key.isValid()) {\n            callback(key, false);\n            return;\n        }\n        log(\"Loaded password does not unlock wrapped key\", LogWarning);\n    }\n\n    activateWindow(parent);\n    promptForEncryptionPasswordAttemptAsync(\n        parent, prompt, wrappedDEK, kekSalt, 0, std::move(callback));\n}\n\nEncryption::EncryptionKey promptForEncryptionPasswordChange(\n    const Encryption::EncryptionKey &currentKey, QWidget *parent)\n{\n    const Encryption::SecureArray newPassword = promptForNewDefaultPassword(parent);\n    if (newPassword.isEmpty())\n        return {};\n\n    log(\"Attempting to change password...\", LogNote);\n\n    const Encryption::EncryptionKey key = Encryption::saveKey(currentKey, newPassword);\n    if (!key.isValid()) {\n        log(\"Password change failed\", LogError);\n        QMessageBox::critical(\n            parent,\n            QObject::tr(\"Change Password Failed\"),\n            QObject::tr(\"Failed to change password. Your old password is still active. Please check the logs for details.\")\n        );\n        return {};\n    }\n\n    log(\"Password changed successfully\", LogNote);\n    QMessageBox::information(\n        parent,\n        QObject::tr(\"Change Password Successful\"),\n        QObject::tr(\"Password has been changed successfully.\")\n    );\n\n    return key;\n}\n\nbool reencryptTabs(\n    const QStringList &tabNames,\n    ClipboardBrowserShared *sharedData,\n    const Encryption::EncryptionKey &oldKey,\n    const Encryption::EncryptionKey &newKey,\n    int maxItems,\n    QWidget *parent)\n{\n    QProgressDialog progress(\n        QObject::tr(\"Re-encrypting tabs...\"),\n        QObject::tr(\"Cancel\"),\n        0,\n        tabNames.size() * 2,\n        parent\n    );\n    progress.setWindowModality(Qt::WindowModal);\n    progress.setMinimumDuration(500);  // Show after 500ms if not done\n    progress.setValue(0);\n\n    // Skip plugins that do not support encryption\n    ItemLoaderList skipLoaders;\n    for (auto &loader : sharedData->itemFactory->loaders()) {\n        if (loader->isEnabled() && !loader->supportsEncryption()) {\n            skipLoaders.append(loader);\n            loader->setEnabled(false);\n        }\n    }\n\n    QStringList failedTabs;\n\n    for (int i = 0; i < tabNames.size(); ++i) {\n        if (progress.wasCanceled()) {\n            log(\"Tab re-encryption cancelled by user\", LogWarning);\n            break;\n        }\n\n        const QString &tabName = tabNames[i];\n\n        progress.setLabelText(\n            QObject::tr(\"Re-encrypting tab %1 of %2: %3\")\n                .arg(i + 1)\n                .arg(tabNames.size())\n                .arg(quoteString(tabName))\n        );\n        progress.setValue(i * 2);\n        QCoreApplication::processEvents();\n\n        COPYQ_LOG(QStringLiteral(\"Re-encrypting tab: %1\").arg(tabName));\n\n        // Temporary model to hold the tab's items\n        ClipboardModel model;\n\n        // Set old encryption key temporarily and load items\n        sharedData->encryptionKey = oldKey;\n        ItemSaverPtr saver = loadItems(tabName, model, sharedData->itemFactory, maxItems);\n        sharedData->encryptionKey = newKey;\n\n        if (!saver) {\n            COPYQ_LOG(QStringLiteral(\"Skipping encryption on unsupported tab: %1\").arg(tabName));\n            continue;\n        }\n\n        progress.setValue(i * 2 + 1);\n        QCoreApplication::processEvents();\n\n        const int itemCount = model.rowCount();\n        COPYQ_LOG(QStringLiteral(\"Loaded %1 items from tab: %2\").arg(itemCount).arg(tabName));\n\n        if (!saveItems(tabName, model, saver)) {\n            log(QStringLiteral(\"Failed to re-encrypt tab: %1\").arg(tabName), LogError);\n            failedTabs.append(tabName);\n            continue;\n        }\n\n        COPYQ_LOG(QStringLiteral(\"Successfully re-encrypted tab: %1\").arg(tabName));\n    }\n\n    for (auto &loader : skipLoaders)\n        loader->setEnabled(true);\n\n    progress.setValue(tabNames.size());\n\n    if (!failedTabs.isEmpty()) {\n        log(QStringLiteral(\"Failed to re-encrypt %1 out of %2 tabs\")\n            .arg(failedTabs.size())\n            .arg(tabNames.size()), LogError);\n\n        const QString errorMsg = QObject::tr(\n            \"Failed to encrypt the following tabs:\\n\\n%1\\n\\n\"\n            \"Please check the logs for details.\"\n        ).arg(failedTabs.join(\"\\n\"));\n        QMessageBox::critical(parent, QObject::tr(\"Encryption Failed\"), errorMsg);\n        return false;\n    }\n\n    log(\"Successfully re-encrypted tabs\");\n    return true;\n}\n\nvoid removePasswordFromKeychain()\n{\n    KeychainAccess::deletePassword(keychainServiceName(), keychainPasswordKey());\n}\n\n#else // !WITH_QCA_ENCRYPTION\n\nEncryption::SecureArray promptForNewPassword(\n    const QString &, const QString &, PasswordPromptType , QWidget *)\n{\n    return {};\n}\n\nvoid promptForEncryptionPasswordAsync(\n    QWidget *,\n    PasswordSource,\n    std::function<void(const Encryption::EncryptionKey &key, bool passwordEnteredManually)> callback)\n{\n    callback({}, true);\n}\n\nEncryption::EncryptionKey promptForEncryptionPasswordChange(\n    const Encryption::EncryptionKey &, QWidget *)\n{\n    return {};\n}\n\nbool reencryptTabs(\n    const QStringList &,\n    ClipboardBrowserShared *,\n    const Encryption::EncryptionKey &,\n    const Encryption::EncryptionKey &,\n    int,\n    QWidget *)\n{\n    return false;\n}\n\nvoid removePasswordFromKeychain()\n{\n}\n\n#endif // WITH_QCA_ENCRYPTION\n"
  },
  {
    "path": "src/gui/encryptionpassword.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include \"common/encryption.h\"\n\n#include <functional>\n\nstruct ClipboardBrowserShared;\nclass QWidget;\nclass QAbstractItemModel;\nclass QIODevice;\nclass ItemFactory;\nclass QProgressDialog;\n\n#include <QtContainerFwd>\n\nenum class PasswordSource {\n    UseEnvOnly,\n    UseEnvAndKeychain,\n    IgnoreEnvAndKeychain\n};\n\nenum class PasswordPromptType {\n    OnlyNonEmpty,\n    AllowEmpty,\n    AskOnce\n};\n\nEncryption::SecureArray promptForNewPassword(\n    const QString &title, const QString &label, PasswordPromptType pwType, QWidget *parent);\n\n/**\n * Prompt for encryption password and derive encryption key.\n * This function handles loading password from environment or keyring,\n * prompting the user for password (with confirmation on first setup),\n * and verifying against stored hash.\n */\nvoid promptForEncryptionPasswordAsync(\n    QWidget *parent,\n    PasswordSource prompt,\n    std::function<void(const Encryption::EncryptionKey &key, bool passwordEnteredManually)> callback);\n\n/**\n * Change encryption password with user dialogs for verification and confirmation.\n */\nEncryption::EncryptionKey promptForEncryptionPasswordChange(\n    const Encryption::EncryptionKey &currentKey, QWidget *parent);\n\n/**\n * Re-encrypt tabs when enabling or disabling encryption.\n * This function iterates through tabs and re-saves them with the new encryption key.\n */\nbool reencryptTabs(\n    const QStringList &tabNames,\n    ClipboardBrowserShared *sharedData,\n    const Encryption::EncryptionKey &oldKey,\n    const Encryption::EncryptionKey &newKey,\n    int maxItems,\n    QWidget *parent\n);\n\nvoid removePasswordFromKeychain();\n"
  },
  {
    "path": "src/gui/execmenu.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).\n** Contact: http://www.qt-project.org/legal\n**\n** This file is part of Qt Creator.\n**\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and Digia.  For licensing terms and\n** conditions see http://www.qt.io/licensing.  For further information\n** use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 or version 3 as published by the Free\n** Software Foundation and appearing in the file LICENSE.LGPLv21 and\n** LICENSE.LGPLv3 included in the packaging of this file.  Please review the\n** following information to ensure the GNU Lesser General Public License\n** requirements will be met: https://www.gnu.org/licenses/lgpl.html and\n** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n**\n** In addition, as a special exception, Digia gives you certain additional\n** rights.  These rights are described in the Digia Qt LGPL Exception\n** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n**\n****************************************************************************/\n\n#include \"execmenu.h\"\n\n#include \"gui/screen.h\"\n\n#include <QApplication>\n#include <QMenu>\n#include <QPoint>\n#include <QRect>\n#include <QSize>\n#include <QWidget>\n\nnamespace Utils {\n\n/*!\n * Opens \\a menu at the specified \\a widget position.\n * This function computes the position where to show the menu, and opens it with\n * QMenu::exec().\n */\nQAction *execMenuAtWidget(QMenu *menu, QWidget *widget)\n{\n    QPoint p;\n    QRect screen = screenAvailableGeometry(*widget);\n    QSize sh = menu->sizeHint();\n    QRect rect = widget->rect();\n    if (widget->isRightToLeft()) {\n        if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height())\n            p = widget->mapToGlobal(rect.bottomRight());\n        else\n            p = widget->mapToGlobal(rect.topRight() - QPoint(0, sh.height()));\n        p.rx() -= sh.width();\n    } else {\n        if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height())\n            p = widget->mapToGlobal(rect.bottomLeft());\n        else\n            p = widget->mapToGlobal(rect.topLeft() - QPoint(0, sh.height()));\n    }\n    p.rx() = qMax(screen.left(), qMin(p.x(), screen.right() - sh.width()));\n    p.ry() += 1;\n\n    return menu->exec(p);\n}\n\n} // namespace Utils\n"
  },
  {
    "path": "src/gui/execmenu.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).\n** Contact: http://www.qt-project.org/legal\n**\n** This file is part of Qt Creator.\n**\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and Digia.  For licensing terms and\n** conditions see http://www.qt.io/licensing.  For further information\n** use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 or version 3 as published by the Free\n** Software Foundation and appearing in the file LICENSE.LGPLv21 and\n** LICENSE.LGPLv3 included in the packaging of this file.  Please review the\n** following information to ensure the GNU Lesser General Public License\n** requirements will be met: https://www.gnu.org/licenses/lgpl.html and\n** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n**\n** In addition, as a special exception, Digia gives you certain additional\n** rights.  These rights are described in the Digia Qt LGPL Exception\n** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n**\n****************************************************************************/\n#pragma once\n\nclass QAction;\nclass QMenu;\nclass QWidget;\n\nnamespace Utils {\n\nQAction *execMenuAtWidget(QMenu *menu, QWidget *widget);\n\n} // namespace Utils\n"
  },
  {
    "path": "src/gui/fancylineedit.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2016 The Qt Company Ltd.\n** Contact: https://www.qt.io/licensing/\n**\n** This file is part of Qt Creator.\n**\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see https://www.qt.io/terms-conditions. For further\n** information use the contact form at https://www.qt.io/contact-us.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3 as published by the Free Software\n** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT\n** included in the packaging of this file. Please review the following\n** information to ensure the GNU General Public License requirements will\n** be met: https://www.gnu.org/licenses/gpl-3.0.html.\n**\n****************************************************************************/\n\n#include \"execmenu.h\"\n#include \"fancylineedit.h\"\n\n#include \"common/common.h\"\n#include \"gui/iconfactory.h\"\n\n#include <QAbstractItemView>\n#include <QKeyEvent>\n#include <QMenu>\n#include <QStylePainter>\n#include <QStyle>\n\n/*!\n    The FancyLineEdit class is an enhanced line edit with several\n    opt-in features.\n\n    A FancyLineEdit instance can have:\n\n    - An embedded pixmap on one side that is connected to a menu.\n\n    - A grayed hintText (like \"Type Here to\")\n    when not focused and empty. When connecting to the changed signals and\n    querying text, one has to be aware that the text is set to that hint\n    text if isShowingHintText() returns true (that is, does not contain\n    valid user input).\n */\n\nnamespace Utils {\n\n// --------- FancyLineEditPrivate\nclass FancyLineEditPrivate final : public QObject\n{\npublic:\n    explicit FancyLineEditPrivate(FancyLineEdit *parent);\n\n    bool eventFilter(QObject *obj, QEvent *event) override;\n\n    FancyLineEdit *m_lineEdit;\n    QString m_oldText;\n    QMenu *m_menu[2]{};\n    bool m_menuTabFocusTrigger[2]{};\n    IconButton *m_iconbutton[2]{};\n    bool m_iconEnabled[2]{};\n};\n\n\nFancyLineEditPrivate::FancyLineEditPrivate(FancyLineEdit *parent) :\n    QObject(parent),\n    m_lineEdit(parent)\n{\n    for (int i = 0; i < 2; ++i) {\n        m_menu[i] = nullptr;\n        m_menuTabFocusTrigger[i] = false;\n        m_iconbutton[i] = new IconButton(parent);\n        m_iconbutton[i]->installEventFilter(this);\n        m_iconbutton[i]->hide();\n        m_iconEnabled[i] = false;\n    }\n}\n\nbool FancyLineEditPrivate::eventFilter(QObject *obj, QEvent *event)\n{\n    int buttonIndex = -1;\n    for (int i = 0; i < 2; ++i) {\n        if (obj == m_iconbutton[i]) {\n            buttonIndex = i;\n            break;\n        }\n    }\n\n    if (buttonIndex == -1)\n        return QObject::eventFilter(obj, event);\n\n    if ( event->type() == QEvent::FocusIn\n         && m_menuTabFocusTrigger[buttonIndex]\n         && m_menu[buttonIndex])\n    {\n        m_lineEdit->setFocus();\n        execMenuAtWidget(m_menu[buttonIndex], m_iconbutton[buttonIndex]);\n        return true;\n    }\n\n    return QObject::eventFilter(obj, event);\n}\n\n\n// --------- FancyLineEdit\nFancyLineEdit::FancyLineEdit(QWidget *parent) :\n    QLineEdit(parent),\n    d(new FancyLineEditPrivate(this))\n{\n    ensurePolished();\n    updateMargins();\n\n    connect(d->m_iconbutton[Left], &QAbstractButton::clicked,\n            this, &FancyLineEdit::iconClicked);\n    connect(d->m_iconbutton[Right], &QAbstractButton::clicked,\n            this, &FancyLineEdit::iconClicked);\n}\n\nFancyLineEdit::~FancyLineEdit() = default;\n\nvoid FancyLineEdit::setButtonVisible(Side side, bool visible)\n{\n    d->m_iconbutton[side]->setVisible(visible);\n    d->m_iconEnabled[side] = visible;\n    updateMargins();\n}\n\nbool FancyLineEdit::isButtonVisible(Side side) const\n{\n    return d->m_iconEnabled[side];\n}\n\nQAbstractButton *FancyLineEdit::button(FancyLineEdit::Side side) const\n{\n    return d->m_iconbutton[side];\n}\n\nvoid FancyLineEdit::iconClicked()\n{\n    IconButton *button = qobject_cast<IconButton *>(sender());\n    int index = -1;\n    for (int i = 0; i < 2; ++i)\n        if (d->m_iconbutton[i] == button)\n            index = i;\n    if (index == -1)\n        return;\n    if (d->m_menu[index]) {\n        execMenuAtWidget(d->m_menu[index], button);\n    } else {\n        emit buttonClicked(static_cast<Side>(index));\n        if (index == Left)\n            emit leftButtonClicked();\n        else if (index == Right)\n            emit rightButtonClicked();\n    }\n}\n\nvoid FancyLineEdit::updateMargins()\n{\n    bool leftToRight = (layoutDirection() == Qt::LeftToRight);\n    Side realLeft = (leftToRight ? Left : Right);\n    Side realRight = (leftToRight ? Right : Left);\n\n    const auto buttonExtent = height();\n    auto leftMargin = static_cast<int>( buttonExtent + 8 );\n    auto rightMargin = static_cast<int>( buttonExtent + 8 );\n    // Note KDE does not reserve space for the highlight color\n    if (style()->inherits(\"OxygenStyle\")) {\n        leftMargin = qMax(24, leftMargin);\n        rightMargin = qMax(24, rightMargin);\n    }\n\n    QMargins margins((d->m_iconEnabled[realLeft] ? leftMargin : 0), 0,\n                     (d->m_iconEnabled[realRight] ? rightMargin : 0), 0);\n\n    setTextMargins(margins);\n}\n\nvoid FancyLineEdit::updateButtonPositions()\n{\n    QRect contentRect = rect();\n    for (int i = 0; i < 2; ++i) {\n        Side iconpos = static_cast<Side>(i);\n        if (layoutDirection() == Qt::RightToLeft)\n            iconpos = (iconpos == Left ? Right : Left);\n\n        IconButton *button = d->m_iconbutton[i];\n        const auto margin = 8 - (button->hasMenu() ? 3 : 0);\n        if (iconpos == FancyLineEdit::Right) {\n            const int iconoffset = textMargins().right() - margin;\n            button->setGeometry(contentRect.adjusted(contentRect.width() - iconoffset, 0, 0, 0));\n        } else {\n            const int iconoffset = textMargins().left() - margin;\n            button->setGeometry(contentRect.adjusted(0, 0, -contentRect.width() + iconoffset, 0));\n        }\n    }\n}\n\nvoid FancyLineEdit::resizeEvent(QResizeEvent *)\n{\n    updateMargins();\n    updateButtonPositions();\n}\n\nvoid FancyLineEdit::setButtonIcon(Side side, const QIcon &icon)\n{\n    d->m_iconbutton[side]->setIcon(icon);\n}\n\nvoid FancyLineEdit::setButtonMenu(Side side, QMenu *buttonMenu)\n{\n     d->m_menu[side] = buttonMenu;\n     d->m_iconbutton[side]->setHasMenu(buttonMenu != nullptr);\n }\n\nQMenu *FancyLineEdit::buttonMenu(Side side) const\n{\n    return  d->m_menu[side];\n}\n\nbool FancyLineEdit::hasMenuTabFocusTrigger(Side side) const\n{\n    return d->m_menuTabFocusTrigger[side];\n}\n\nvoid FancyLineEdit::setMenuTabFocusTrigger(Side side, bool v)\n{\n    if (d->m_menuTabFocusTrigger[side] == v)\n        return;\n\n    d->m_menuTabFocusTrigger[side] = v;\n    d->m_iconbutton[side]->setFocusPolicy(v ? Qt::TabFocus : Qt::NoFocus);\n}\n\nvoid FancyLineEdit::setButtonToolTip(Side side, const QString &tip)\n{\n    d->m_iconbutton[side]->setToolTip(tip);\n}\n\nvoid FancyLineEdit::setButtonFocusPolicy(Side side, Qt::FocusPolicy policy)\n{\n    d->m_iconbutton[side]->setFocusPolicy(policy);\n}\n\n\n//\n// IconButton - helper class to represent a clickable icon\n//\n\nIconButton::IconButton(QWidget *parent)\n    : QAbstractButton(parent)\n    , m_hasMenu(false)\n{\n    setCursor(Qt::PointingHandCursor);\n    setFocusPolicy(Qt::NoFocus);\n}\n\nvoid IconButton::paintEvent(QPaintEvent *)\n{\n    const auto m = 3;\n    auto pixmapRect = contentsRect().adjusted(m, m, -m, -m);\n    if (m_hasMenu)\n        pixmapRect.setWidth( pixmapRect.width() - 2 );\n\n    QStylePainter painter(this);\n    m_icon.paint(&painter, pixmapRect);\n\n    if (m_hasMenu) {\n        // small triangle next to icon to indicate menu\n        QPolygon triangle;\n        triangle.append(QPoint(0, 0));\n        triangle.append(QPoint(6, 0));\n        triangle.append(QPoint(3, 3));\n\n        const QColor c = getDefaultIconColor(*this);\n        painter.save();\n        painter.translate(pixmapRect.bottomRight() + QPoint(0, -4));\n        painter.setBrush(c);\n        painter.setPen(Qt::NoPen);\n        painter.drawPolygon(triangle);\n        painter.restore();\n    }\n\n    if (hasFocus()) {\n        QStyleOptionFocusRect focusOption;\n        focusOption.initFrom(this);\n        focusOption.rect = pixmapRect;\n#ifdef Q_OS_MAC\n        focusOption.rect.adjust(-4, -4, 4, 4);\n        painter.drawControl(QStyle::CE_FocusFrame, focusOption);\n#endif\n        painter.drawPrimitive(QStyle::PE_FrameFocusRect, focusOption);\n    }\n}\n\nvoid IconButton::keyPressEvent(QKeyEvent *ke)\n{\n    QAbstractButton::keyPressEvent(ke);\n    if (!ke->modifiers() && (ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return))\n        click();\n    // do not forward to line edit\n    ke->accept();\n}\n\nvoid IconButton::keyReleaseEvent(QKeyEvent *ke)\n{\n    QAbstractButton::keyReleaseEvent(ke);\n    // do not forward to line edit\n    ke->accept();\n}\n\n} // namespace Utils\n"
  },
  {
    "path": "src/gui/fancylineedit.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).\n** Contact: http://www.qt-project.org/legal\n**\n** This file is part of Qt Creator.\n**\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and Digia.  For licensing terms and\n** conditions see http://www.qt.io/licensing.  For further information\n** use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 or version 3 as published by the Free\n** Software Foundation and appearing in the file LICENSE.LGPLv21 and\n** LICENSE.LGPLv3 included in the packaging of this file.  Please review the\n** following information to ensure the GNU Lesser General Public License\n** requirements will be met: https://www.gnu.org/licenses/lgpl.html and\n** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n**\n** In addition, as a special exception, Digia gives you certain additional\n** rights.  These rights are described in the Digia Qt LGPL Exception\n** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n**\n****************************************************************************/\n#pragma once\n\n#include <QAbstractButton>\n#include <QLineEdit>\n\nclass QEvent;\n\nnamespace Utils {\n\nclass FancyLineEditPrivate;\n\nclass IconButton final : public QAbstractButton\n{\n    Q_OBJECT\npublic:\n    explicit IconButton(QWidget *parent = nullptr);\n    void paintEvent(QPaintEvent *event) override;\n    void setIcon(const QIcon &icon) { m_icon = icon; update(); }\n    void setHasMenu(bool hasMenu) { m_hasMenu = hasMenu; update(); }\n    bool hasMenu() const { return m_hasMenu; }\n\nprotected:\n    void keyPressEvent(QKeyEvent *ke) override;\n    void keyReleaseEvent(QKeyEvent *ke) override;\n\nprivate:\n    QIcon m_icon;\n    bool m_hasMenu;\n};\n\nclass FancyLineEdit : public QLineEdit\n{\n    Q_OBJECT\n\npublic:\n    enum Side {Left = 0, Right = 1};\n    Q_ENUM(Side)\n\n    explicit FancyLineEdit(QWidget *parent = nullptr);\n    ~FancyLineEdit();\n\n    void setButtonIcon(Side side, const QIcon &icon);\n\n    QMenu *buttonMenu(Side side) const;\n    void setButtonMenu(Side side, QMenu *buttonMenu);\n\n    void setButtonVisible(Side side, bool visible);\n    bool isButtonVisible(Side side) const;\n    QAbstractButton *button(Side side) const;\n\n    void setButtonToolTip(Side side, const QString &);\n    void setButtonFocusPolicy(Side side, Qt::FocusPolicy policy);\n\n    // Set whether tabbing in will trigger the menu.\n    void setMenuTabFocusTrigger(Side side, bool v);\n    bool hasMenuTabFocusTrigger(Side side) const;\n\nsignals:\n    void buttonClicked(Utils::FancyLineEdit::Side side);\n    void leftButtonClicked();\n    void rightButtonClicked();\n\nprotected:\n    void resizeEvent(QResizeEvent *e) override;\n\nprivate:\n    void iconClicked();\n\n    void updateMargins();\n    void updateButtonPositions();\n    friend class FancyLineEditPrivate;\n\n    FancyLineEditPrivate *d;\n};\n\n} // namespace Utils\n"
  },
  {
    "path": "src/gui/filedialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"filedialog.h\"\n\n#include <QFileDialog>\n#include <QFileInfo>\n#include <QWidget>\n\nFileDialog::FileDialog(QWidget *parent, const QString &caption, const QString &fileName)\n    : QObject(parent)\n    , m_parent(parent)\n    , m_caption(caption)\n    , m_defaultPath(QFileInfo(fileName).absoluteFilePath())\n{\n}\n\nvoid FileDialog::exec()\n{\n    const QString fileName =\n            QFileDialog::getSaveFileName(\n                m_parent, m_caption, m_defaultPath,\n                /* filter = */ QString(), /* selectedFilter = */ nullptr,\n                QFileDialog::DontConfirmOverwrite | QFileDialog::ReadOnly);\n    if (!fileName.isEmpty())\n        emit fileSelected(fileName);\n}\n"
  },
  {
    "path": "src/gui/filedialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QObject>\n#include <QString>\n\nclass QWidget;\n\n/**\n * Opens native file dialog (unlike QFileDialog).\n */\nclass FileDialog final : public QObject\n{\n    Q_OBJECT\npublic:\n    FileDialog(QWidget *parent, const QString &caption, const QString &fileName);\n\n    void exec();\n\nsignals:\n    void fileSelected(const QString &fileName);\n\nprivate:\n    QWidget *m_parent;\n    QString m_caption;\n    QString m_defaultPath;\n};\n"
  },
  {
    "path": "src/gui/filtercompleter.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"filtercompleter.h\"\n\n#include <QAbstractListModel>\n#include <QApplication>\n#include <QAction>\n#include <QEvent>\n#include <QLineEdit>\n#include <QMoveEvent>\n\nnamespace {\n\nconst int maxCompletionItems = 100;\n\nclass CompletionModel final : public QAbstractListModel\n{\npublic:\n    explicit CompletionModel(QObject *parent)\n        : QAbstractListModel(parent)\n    {\n    }\n\n    int rowCount(const QModelIndex &parent = QModelIndex()) const override\n    {\n        return parent.isValid() ? 0 : m_items.size();\n    }\n\n    QVariant data(const QModelIndex &index, int role) const override\n    {\n        if (index.isValid() && (role == Qt::EditRole || role == Qt::DisplayRole))\n            return m_items[index.row()];\n\n        return QVariant();\n    }\n\n    bool setData(const QModelIndex &index, const QVariant &value, int role) override\n    {\n        if (!index.isValid() && role == Qt::EditRole) {\n            const QString text = value.toString();\n            removeAll(text);\n            crop(maxCompletionItems - 1);\n            prepend(text);\n        }\n\n        return false;\n    }\n\n    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override\n    {\n        const auto end = row + count;\n        if ( parent.isValid() || row < 0 || end > rowCount() )\n            return false;\n\n        beginRemoveRows(QModelIndex(), row, end);\n        m_items.erase( m_items.begin() + row, m_items.begin() + end );\n        endRemoveRows();\n\n        return true;\n    }\n\nprivate:\n    void prepend(const QString &text)\n    {\n        beginInsertRows(QModelIndex(), 0, 0);\n        m_items.prepend(text);\n        endInsertRows();\n    }\n\n    void removeAll(const QString &text)\n    {\n        for ( int row = m_items.indexOf(text);\n              row != -1;\n              row = m_items.indexOf(text, row) )\n        {\n            removeRows(row, 1);\n        }\n    }\n\n    void crop(int maxItems)\n    {\n        const int itemCount = m_items.size();\n        if (itemCount > maxItems)\n            removeRows(maxItems, itemCount - maxItems);\n    }\n\n    QStringList m_items;\n};\n\n} // namespace\n\nvoid FilterCompleter::installCompleter(QLineEdit *lineEdit)\n{\n    Q_ASSERT(lineEdit);\n    new FilterCompleter(lineEdit);\n}\n\nvoid FilterCompleter::removeCompleter(QLineEdit *lineEdit)\n{\n    lineEdit->setCompleter(nullptr);\n}\n\nQStringList FilterCompleter::history() const\n{\n    QStringList history;\n\n    for (int i = 0; i < model()->rowCount(); ++i) {\n        const QModelIndex index = model()->index(i, 0);\n        history.append( index.data(Qt::EditRole).toString() );\n    }\n\n    return history;\n}\n\nvoid FilterCompleter::setHistory(const QStringList &history)\n{\n    model()->removeRows( 0, model()->rowCount() );\n    for (int i = history.size() - 1; i >= 0; --i)\n        prependItem(history[i]);\n}\n\nbool FilterCompleter::eventFilter(QObject *obj, QEvent *event)\n{\n    // Close popup menu if mouse wheel scrolls and mouse pointer is outside the menu.\n    if (event->type() == QEvent::Wheel) {\n        auto popup = qobject_cast<QWidget*>(obj);\n        if (popup && !popup->underMouse())\n            popup->hide();\n        return true;\n    }\n\n    return QCompleter::eventFilter(obj, event);\n}\n\nvoid FilterCompleter::onTextEdited(const QString &text)\n{\n    m_lastText = text;\n    setUnfiltered(false);\n}\n\nvoid FilterCompleter::onEditingFinished()\n{\n    prependItem(m_lastText);\n    m_lastText.clear();\n\n    setUnfiltered(false);\n}\n\nvoid FilterCompleter::onComplete()\n{\n    if (m_lineEdit->text().isEmpty()) {\n        setUnfiltered(true);\n        const QModelIndex firstIndex = model()->index(0, 0);\n        const QString text = model()->data(firstIndex, Qt::EditRole).toString();\n        m_lineEdit->setText(text);\n    } else {\n        complete();\n    }\n}\n\nFilterCompleter::FilterCompleter(QLineEdit *lineEdit)\n    : QCompleter(lineEdit)\n    , m_lineEdit(lineEdit)\n{\n    setModel(new CompletionModel(this));\n    setWrapAround(true);\n    setUnfiltered(false);\n\n    QWidget *window = lineEdit->window();\n    if (window) {\n        auto act = new QAction(this);\n        act->setShortcut(tr(\"Alt+Down\", \"Filter completion shortcut\"));\n        connect(act, &QAction::triggered, this, &FilterCompleter::onComplete);\n        window->addAction(act);\n    }\n\n    // Postpone prepending item to completion list because incorrect\n    // item will be completed otherwise (prepending shifts rows).\n    connect( lineEdit, &QLineEdit::editingFinished,\n             this, &FilterCompleter::onEditingFinished, Qt::QueuedConnection );\n    connect( lineEdit, &QLineEdit::textEdited,\n             this, &FilterCompleter::onTextEdited );\n\n    lineEdit->setCompleter(this);\n}\n\nvoid FilterCompleter::setUnfiltered(bool unfiltered)\n{\n    setCompletionMode(unfiltered ? QCompleter::UnfilteredPopupCompletion\n                                 : QCompleter::PopupCompletion);\n}\n\nvoid FilterCompleter::prependItem(const QString &item)\n{\n    if ( !item.isEmpty() )\n        model()->setData(QModelIndex(), item);\n}\n"
  },
  {
    "path": "src/gui/filtercompleter.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QCompleter>\n#include <QStringList>\n\nclass QLineEdit;\n\nclass FilterCompleter final : public QCompleter\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList history READ history WRITE setHistory)\npublic:\n    static void installCompleter(QLineEdit *lineEdit);\n    static void removeCompleter(QLineEdit *lineEdit);\n\n    QStringList history() const;\n    void setHistory(const QStringList &history);\n\nprotected:\n    bool eventFilter(QObject *obj, QEvent *event) override;\n\nprivate:\n    void onTextEdited(const QString &text);\n    void onEditingFinished();\n    void onComplete();\n\n    explicit FilterCompleter(QLineEdit *lineEdit);\n    void setUnfiltered(bool unfiltered);\n    void prependItem(const QString &item);\n\n    QLineEdit *m_lineEdit;\n    QString m_lastText;\n};\n"
  },
  {
    "path": "src/gui/filterlineedit.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).\n** Contact: http://www.qt-project.org/legal\n**\n** This file is part of Qt Creator.\n**\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and Digia.  For licensing terms and\n** conditions see http://qt.digia.com/licensing.  For further information\n** use the contact form at http://qt.digia.com/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n**\n** In addition, as a special exception, Digia gives you certain additional\n** rights.  These rights are described in the Digia Qt LGPL Exception\n** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n**\n****************************************************************************/\n\n#include \"filterlineedit.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/config.h\"\n#include \"common/contenttype.h\"\n#include \"common/regexp.h\"\n#include \"common/textdata.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/filtercompleter.h\"\n\n#include <QKeyEvent>\n#include <QMenu>\n#include <QModelIndex>\n#include <QPainter>\n#include <QRegularExpression>\n#include <QSettings>\n#include <QTextCursor>\n#include <QTextDocument>\n#include <QTextEdit>\n#include <QTimer>\n\nnamespace {\n\n// Refuse to highlight larger documents - it could be slow\nconstexpr int highlightMaxCharacters = 100'000;\n\nconst QLatin1String optionFilterHistory(\"filter_history\");\n\nclass BaseItemFilter : public ItemFilter {\npublic:\n    explicit BaseItemFilter(const QString &searchString)\n        : m_searchString(searchString)\n    {\n    }\n\n    QString searchString() const override\n    {\n        return m_searchString;\n    }\n\n    void highlight(QTextEdit *edit, const QTextCharFormat &format) const override\n    {\n        QTextDocument *doc = edit->document();\n        if ( doc->characterCount() > highlightMaxCharacters )\n            return;\n\n        QList<QTextEdit::ExtraSelection> selections = this->selections(doc, format);\n\n        // If there are no matches, try to match document without accents/diacritics.\n        if (selections.isEmpty()) {\n            QTextDocument tmpDoc;\n            tmpDoc.setPlainText(accentsRemoved(doc->toPlainText()));\n            selections = this->selections(&tmpDoc, format);\n            for (QTextEdit::ExtraSelection &selection : selections) {\n                const auto pos = selection.cursor.position();\n                const auto anchor = selection.cursor.anchor();\n                selection.cursor = QTextCursor(doc);\n                selection.cursor.setPosition(pos);\n                selection.cursor.setPosition(anchor, QTextCursor::KeepAnchor);\n            }\n        }\n\n        edit->setExtraSelections(selections);\n        edit->update();\n    }\n\n    bool matchesAll() const override\n    {\n        return m_searchString.isEmpty();\n    }\n\n    bool matchesIndex(const QModelIndex &index) const override\n    {\n        // Match formats if the filter expression contains single '/'.\n        if ( m_searchString.count('/') != 1 )\n            return false;\n\n        const auto re2 = anchoredRegExp(m_searchString);\n        const QVariantMap data = index.data(contentType::data).toMap();\n        return std::any_of(data.keyBegin(), data.keyEnd(), [&re2](const QString &key) {\n            return key.contains(re2);\n        });\n    }\n\nprivate:\n    virtual QList<QTextEdit::ExtraSelection> selections(QTextDocument *doc, const QTextCharFormat &format) const = 0;\n\n    QString m_searchString;\n};\n\nclass ItemFilterRegExp final : public BaseItemFilter {\npublic:\n    ItemFilterRegExp(const QRegularExpression &re, const QString &searchString)\n        : BaseItemFilter(searchString)\n        , m_re(re)\n    {\n    }\n\n    bool matchesNone() const override\n    {\n        return !m_re.isValid();\n    }\n\n    bool matches(const QString &text) const override\n    {\n        return text.contains(m_re);\n    }\n\n    void search(QTextEdit *edit, bool backwards) const override\n    {\n        if ( matchesAll() )\n            return;\n\n        auto tc = edit->textCursor();\n        if ( tc.isNull() )\n            return;\n\n        QTextDocument::FindFlags flags;\n        if (backwards)\n            flags = QTextDocument::FindBackward;\n\n        auto tc2 = tc.document()->find(m_re, tc, flags);\n        if (tc2.isNull()) {\n            tc2 = tc;\n            if (backwards)\n                tc2.movePosition(QTextCursor::End);\n            else\n                tc2.movePosition(QTextCursor::Start);\n            tc2 = tc.document()->find(m_re, tc2, flags);\n        }\n\n        if (!tc2.isNull())\n            edit->setTextCursor(tc2);\n    }\n\nprivate:\n    QList<QTextEdit::ExtraSelection> selections(QTextDocument *doc, const QTextCharFormat &format) const override\n    {\n        QList<QTextEdit::ExtraSelection> selections;\n\n        if ( m_re.isValid() && !matchesAll() ) {\n            QTextCursor cur = doc->find(m_re);\n            int a = cur.position();\n            while ( !cur.isNull() ) {\n                if ( cur.hasSelection() ) {\n                    selections.append({cur, format});\n                } else {\n                    cur.movePosition(QTextCursor::NextCharacter);\n                }\n                cur = doc->find(m_re, cur);\n                int b = cur.position();\n                if (a == b) {\n                    cur.movePosition(QTextCursor::NextCharacter);\n                    cur = doc->find(m_re, cur);\n                    b = cur.position();\n                    if (a == b) break;\n                }\n                a = b;\n            }\n        }\n\n        return selections;\n    }\n\n    QRegularExpression m_re;\n};\n\nclass ItemFilterFixedStrings final : public BaseItemFilter {\npublic:\n    ItemFilterFixedStrings(const QString &searchString, Qt::CaseSensitivity caseSensitivity)\n        : BaseItemFilter(searchString)\n        , m_needles( searchString.split(QRegularExpression(\"\\\\s+\"), Qt::SkipEmptyParts) )\n        , m_caseSensitivity(caseSensitivity)\n    {\n    }\n\n    bool matchesNone() const override\n    {\n        return false;\n    }\n\n    bool matches(const QString &text) const override\n    {\n        return std::all_of(std::begin(m_needles), std::end(m_needles),\n            [&text, this](const QString &needle) {\n                return text.contains(needle, m_caseSensitivity);\n            });\n    }\n\n    void search(QTextEdit *edit, bool backwards) const override\n    {\n        if ( matchesAll() )\n            return;\n\n        auto tc = edit->textCursor();\n        if ( tc.isNull() )\n            return;\n\n        QTextDocument::FindFlags flags;\n        if (backwards)\n            flags = QTextDocument::FindBackward;\n        if (m_caseSensitivity == Qt::CaseSensitive)\n            flags = QTextDocument::FindCaseSensitively;\n\n        QTextCursor tc2;\n        int minDistance = std::numeric_limits<int>::max();\n        for ( const QString &needle : m_needles ) {\n            int distance = 0;\n            auto tc3 = tc.document()->find(needle, tc, flags);\n\n            // Wrap around.\n            if ( tc3.isNull() ) {\n                tc3 = tc;\n                tc3.movePosition(QTextCursor::End);\n                const int endPos = tc3.position();\n                if (!backwards)\n                    tc3.movePosition(QTextCursor::Start);\n                tc3 = tc.document()->find(needle, tc3, flags);\n                if ( tc3.isNull() )\n                    continue;\n                distance = backwards\n                    ? tc.selectionStart() + (endPos - tc3.selectionEnd())\n                    : endPos - tc.selectionStart() + tc3.selectionStart();\n            } else {\n                distance = backwards\n                    ? tc.selectionEnd() - tc3.selectionEnd()\n                    : tc3.selectionStart() - tc.selectionStart();\n            }\n\n            // Find longest selection closest to the text cursor.\n            if ( tc2.isNull()\n                 || distance < minDistance\n                 || tc3.selectedText().size() > tc2.selectedText().size() )\n            {\n                minDistance = distance;\n                tc2 = tc3;\n            }\n        }\n\n        if ( !tc2.isNull() )\n            edit->setTextCursor(tc2);\n    }\n\nprivate:\n    QList<QTextEdit::ExtraSelection> selections(QTextDocument *doc, const QTextCharFormat &format) const override\n    {\n        QList<QTextEdit::ExtraSelection> selections;\n\n        QTextDocument::FindFlags flags;\n        if (m_caseSensitivity == Qt::CaseSensitive)\n            flags = QTextDocument::FindCaseSensitively;\n\n        for ( const QString &needle : m_needles ) {\n            QTextCursor cur = doc->find(needle, 0, flags);\n            int a = cur.position();\n            while ( !cur.isNull() ) {\n                if ( cur.hasSelection() ) {\n                    selections.append({cur, format});\n                } else {\n                    cur.movePosition(QTextCursor::NextCharacter);\n                }\n                cur = doc->find(needle, cur, flags);\n                int b = cur.position();\n                if (a == b) {\n                    cur.movePosition(QTextCursor::NextCharacter);\n                    cur = doc->find(needle, cur, flags);\n                    b = cur.position();\n                    if (a == b) break;\n                }\n                a = b;\n            }\n        }\n\n        return selections;\n    }\n\n    QStringList m_needles;\n    Qt::CaseSensitivity m_caseSensitivity;\n};\n\nclass FilterHistory final {\npublic:\n    FilterHistory()\n        : m_settings( getConfigurationFilePath(\"-filter.ini\"), QSettings::IniFormat )\n    {\n    }\n\n    QStringList history() const\n    {\n        return m_settings.value(optionFilterHistory).toStringList();\n    }\n\n    void setHistory(const QStringList &history)\n    {\n        m_settings.setValue(optionFilterHistory, history);\n    }\n\nprivate:\n    QSettings m_settings;\n};\n\n// Compatibility with version 2.5.0 and below\nvoid restoreOldFilterHistory()\n{\n    const QVariant oldHistoryValue = AppConfig().option(optionFilterHistory);\n    if (oldHistoryValue.isValid()) {\n        const QStringList oldHistory = oldHistoryValue.toStringList();\n        if (!oldHistory.isEmpty()) {\n            FilterHistory filterHistory;\n            QStringList newHistory = filterHistory.history() + oldHistory;\n            newHistory.removeDuplicates();\n            filterHistory.setHistory(newHistory);\n        }\n        AppConfig().removeOption(optionFilterHistory);\n    }\n}\n\n} // namespace\n\n/*!\n    The FilterLineEdit class is a fancy line edit customized for\n    filtering purposes with a clear button.\n*/\n\nnamespace Utils {\n\nFilterLineEdit::FilterLineEdit(QWidget *parent)\n   : FancyLineEdit(parent)\n   , m_timerSearch( new QTimer(this) )\n{\n    setButtonVisible(Left, true);\n    setButtonVisible(Right, true);\n    connect(this, &FancyLineEdit::rightButtonClicked, this, &QLineEdit::clear);\n\n    // search timer\n    m_timerSearch->setSingleShot(true);\n    m_timerSearch->setInterval(200);\n\n    connect( m_timerSearch, &QTimer::timeout,\n             this, &FilterLineEdit::filterChanged );\n    connect( this, &QLineEdit::textChanged,\n             this, &FilterLineEdit::onTextChanged );\n\n    // menu\n    auto menu = new QMenu(this);\n    setButtonMenu(Left, menu);\n    connect( menu, &QMenu::triggered,\n             this, &FilterLineEdit::onMenuAction );\n\n    m_actionRe = menu->addAction(tr(\"Regular Expression\"));\n    m_actionRe->setCheckable(true);\n\n    m_actionCaseInsensitive = menu->addAction(tr(\"Case Insensitive\"));\n    m_actionCaseInsensitive->setCheckable(true);\n}\n\nItemFilterPtr FilterLineEdit::filter() const\n{\n    const QString pattern = text();\n    if (m_actionRe->isChecked()) {\n        const auto sensitivity =\n            m_actionCaseInsensitive->isChecked()\n            ? QRegularExpression::CaseInsensitiveOption\n            : QRegularExpression::NoPatternOption;\n        return std::make_shared<ItemFilterRegExp>(QRegularExpression(pattern, sensitivity), pattern);\n    }\n\n    const auto sensitivity = m_actionCaseInsensitive->isChecked()\n        ? Qt::CaseInsensitive : Qt::CaseSensitive;\n    return std::make_shared<ItemFilterFixedStrings>(pattern, sensitivity);\n}\n\nvoid FilterLineEdit::loadSettings()\n{\n    AppConfig appConfig;\n\n    const bool filterRegEx = appConfig.option<Config::filter_regular_expression>();\n    m_actionRe->setChecked(filterRegEx);\n\n    const bool filterCaseSensitive = appConfig.option<Config::filter_case_insensitive>();\n    m_actionCaseInsensitive->setChecked(filterCaseSensitive);\n\n    const QIcon icon1 = getIcon(\"edit-clear\", IconXmark);\n    setButtonIcon(Right, icon1);\n\n    const QIcon icon2 = getIcon(\"edit-find\", IconMagnifyingGlass);\n    setButtonIcon(Left, icon2);\n\n    if ( appConfig.option<Config::save_filter_history>() ) {\n        if ( !completer() ) {\n            FilterCompleter::installCompleter(this);\n            restoreOldFilterHistory();\n            completer()->setProperty( \"history\", FilterHistory().history() );\n        }\n    } else {\n        FilterCompleter::removeCompleter(this);\n        FilterHistory().setHistory(QStringList());\n    }\n}\n\nvoid FilterLineEdit::keyPressEvent(QKeyEvent *ke)\n{\n    // Up/Down arrow keys should be passed to the item list\n    // (on OS X this moves text cursor to the beginning/end).\n    if (ke->key() == Qt::Key_Down || ke->key() == Qt::Key_Up) {\n        ke->ignore();\n        return;\n    }\n\n    // If no text is selected, pass copy actions to the item list.\n    if ( selectionLength() == 0 && ke->matches(QKeySequence::Copy) ) {\n        ke->ignore();\n        return;\n    }\n\n    FancyLineEdit::keyPressEvent(ke);\n}\n\nvoid FilterLineEdit::hideEvent(QHideEvent *event)\n{\n    FancyLineEdit::hideEvent(event);\n\n    if (completer()) {\n        const QStringList history = completer()->property(\"history\").toStringList();\n        FilterHistory().setHistory(history);\n    }\n}\n\nvoid FilterLineEdit::focusInEvent(QFocusEvent *event)\n{\n    FancyLineEdit::focusInEvent(event);\n}\n\nvoid FilterLineEdit::focusOutEvent(QFocusEvent *event)\n{\n    FancyLineEdit::focusOutEvent(event);\n\n    if ( m_timerSearch->isActive() ) {\n        m_timerSearch->stop();\n        onTextChanged();\n    }\n}\n\nvoid FilterLineEdit::onTextChanged()\n{\n    if ( hasFocus() )\n        m_timerSearch->start();\n    else\n        emit filterChanged();\n}\n\nvoid FilterLineEdit::onMenuAction()\n{\n    AppConfig appConfig;\n    appConfig.setOption(\"filter_regular_expression\", m_actionRe->isChecked());\n    appConfig.setOption(\"filter_case_insensitive\", m_actionCaseInsensitive->isChecked());\n\n    emit filterChanged();\n}\n\n} // namespace Utils\n"
  },
  {
    "path": "src/gui/filterlineedit.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).\n** Contact: http://www.qt-project.org/legal\n**\n** This file is part of Qt Creator.\n**\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and Digia.  For licensing terms and\n** conditions see http://qt.digia.com/licensing.  For further information\n** use the contact form at http://qt.digia.com/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n**\n** In addition, as a special exception, Digia gives you certain additional\n** rights.  These rights are described in the Digia Qt LGPL Exception\n** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n**\n****************************************************************************/\n#pragma once\n\n#include \"fancylineedit.h\"\n\n#include \"item/itemfilter.h\"\n\nclass QTimer;\n\nnamespace Utils {\n\nclass FilterLineEdit final : public FancyLineEdit\n{\n    Q_OBJECT\npublic:\n    explicit FilterLineEdit(QWidget *parent = nullptr);\n\n    ItemFilterPtr filter() const;\n\n    void loadSettings();\n\nsignals:\n    void filterChanged();\n\nprotected:\n    void keyPressEvent(QKeyEvent *ke) override;\n    void hideEvent(QHideEvent *event) override;\n    void focusInEvent(QFocusEvent *event) override;\n    void focusOutEvent(QFocusEvent *event) override;\n\nprivate:\n    void onTextChanged();\n    void onMenuAction();\n\n    QTimer *m_timerSearch = nullptr;\n    QAction *m_actionRe = nullptr;\n    QAction *m_actionCaseInsensitive = nullptr;\n};\n\n} // namespace Utils\n"
  },
  {
    "path": "src/gui/fix_icon_id.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/icons.h\"\n\n/// Backwards compatibility with old icon font.\n/// Returns icon ID in the new icon font for an ID from the old one.\ninline unsigned short fixIconId(unsigned short id)\n{\n    switch (id) {\n\n    // envelope-o, notification, support, e-mail, letter, mail, email\n    case 0xf003: return IconEnvelope; // notification, support, envelope, e-mail, letter, mail, message, email\n\n    // rating, favorite, star-o, score, award, night, achievement\n    case 0xf006: return IconStar; // rating, star, favorite, award, score, night, achievement\n\n    // hide, garbage, trash-o, remove, trash, delete\n    case 0xf014: return IconTrash; // trash, hide, garbage, remove, delete\n\n    // file-o, new, document, page, pdf\n    case 0xf016: return IconFile; // new, document, page, file, pdf\n\n    // download, arrow-circle-o-down\n    case 0xf01a: return IconDownload; // download, import\n\n    // arrow-circle-o-up\n    case 0xf01b: return IconCircleArrowUp; // arrow-alt-circle-up, arrow-circle-o-up\n\n    // play-circle-o\n    case 0xf01d: return IconCirclePlay;\n\n    // write, pencil, edit, update\n    case 0xf040: return IconPencil; // write, edit, pencil-alt, update, pencil\n\n    // send, share-square-o, arrow, social\n    case 0xf045: return IconUpRightFromSquare;\n\n    // ok, confirm, check-square-o, done, accept, todo, agree\n    case 0xf046: return IconSquareCheck; // ok, confirm, checkmark, accept, done, check-square, todo, agree\n\n    // move, arrows, reorder, resize\n    case 0xf047: return IconArrowsUpDownLeftRight; // fullscreen, move, arrows, enlarge, arrows-alt, resize, arrow, expand, bigger, reorder\n\n    // close, times-circle-o, exit, x\n    case 0xf05c: return IconCircleXmark; // close, times-circle, exit, x\n\n    // ok, confirm, accept, done, todo, agree, check-circle-o\n    case 0xf05d: return IconCircleCheck; // check-circle, ok, confirm, accept, done, todo, agree\n\n    // resize, arrows-v\n    case 0xf07d: return IconArrowsUpDown; // arrows-alt-v, resize, arrows-v\n\n    // arrows-h, resize\n    case 0xf07e: return IconArrowsLeftRight; // arrows-h, arrows-alt-h, resize\n\n    // thumbs-o-up, like, favorite, hand, approve, agree\n    case 0xf087: return IconThumbsUp; // thumbs-o-up, thumbs-up, like, favorite, hand, approve, agree\n\n    // disapprove, dislike, disagree, thumbs-o-down, hand\n    case 0xf088: return IconThumbsDown; // thumbs-down, thumbs-o-down, disagree, disapprove, hand, dislike\n\n    // love, heart-o, favorite, like\n    case 0xf08a: return IconHeart; // heart, favorite, like, love\n\n    // sign-out, log out, leave, logout, arrow, exit\n    case 0xf08b: return IconRightFromBracket; // sign-out, log out, leave, logout, arrow, exit, sign-out-alt\n\n    // new, open, external-link\n    case 0xf08e: return IconFileLines; // file-alt, file-text, new, pdf, document, page\n\n    // join, signup, enter, sign-in, signin, sign up, arrow, sign in, login, log in\n    case 0xf090: return IconRightToBracket; // sign-in-alt, join, signup, enter, sign-in, signin, sign up, arrow, sign in, login, log in\n\n    // box, square-o, square, block\n    case 0xf096: return IconSquare; // box, square, block\n\n    // bookmark-o, save\n    case 0xf097: return IconBookmark; // bookmark, save\n\n    // notification, reminder, bell-o, alert\n    case 0xf0a2: return IconBell; // notification, reminder, bell, alert\n\n    // purchase, buy, money, cash, checkout, payment\n    case 0xf0d6: return IconMoneyBill1; // money, money-bill-alt\n\n    // tachometer\n    case 0xf0e4: return IconGaugeHigh; // tachometer, tachometer-alt\n\n    // feedback, notification, sms, comment-o, note, conversation, speech, chat, texting, message, bubble\n    case 0xf0e5: return IconComment; // comment, feedback, notification, sms, note, conversation, speech, chat, texting, message, bubble\n\n    // feedback, notification, sms, note, conversation, speech, chat, texting, comments-o, message, bubble\n    case 0xf0e6: return IconComments; // feedback, notification, sms, comments, note, conversation, speech, chat, texting, message, bubble\n\n    // transfer, arrows, arrow, exchange\n    case 0xf0ec: return IconRightLeft; // transfer, arrows, exchange-alt, arrow, exchange\n\n    // import, cloud-download\n    case 0xf0ed: return IconCloudArrowDown; // cloud-download-alt, cloud-download\n\n    // import, cloud-upload\n    case 0xf0ee: return IconCloudArrowUp; // cloud-upload-alt, cloud-upload\n\n    // restaurant, food, spoon, cutlery, dinner, eat, knife\n    case 0xf0f5: return IconUtensils; // restaurant, food, spoon, cutlery, utensils, dinner, eat, knife\n\n    // file-text-o, document, page, new, pdf\n    case 0xf0f6: return IconFileLines; // file-alt, file-text, new, pdf, document, page\n\n    // apartment, business, office, company, work, building-o\n    case 0xf0f7: return IconBuilding; // building, apartment, business, office, company, work\n\n    // circle-o\n    case 0xf10c: return IconCircle;\n\n    // reply\n    case 0xf112: return IconReply; // reply\n\n    // folder-o\n    case 0xf114: return IconFolder;\n\n    // folder-open-o\n    case 0xf115: return IconFolderOpen;\n\n    // report, notification, flag-o\n    case 0xf11d: return IconFlag; // report, notification, flag, notify\n\n    // star-half-o, score, award, achievement, rating\n    case 0xf123: return IconStarHalf; // rating, star-half-empty, star-half-full, award, score, star-half, achievement\n\n    // security, winner, award, shield, achievement\n    case 0xf132: return IconShield; // shield, shield-alt\n\n    // movie, ticket, support, pass\n    case 0xf145: return IconTicketSimple; // ticket-alt, ticket\n\n    // hide, collapse, remove, minus-square-o, minify, trash, delete\n    case 0xf147: return IconSquareMinus; // hide, collapse, remove, minus-square, minify, trash, delete\n\n    // level-up, arrow\n    case 0xf148: return IconTurnUp; // level-up, level-up-alt\n\n    // level-down, arrow\n    case 0xf149: return IconTurnDown; // level-down, level-down-alt\n\n    // new, external-link-square, open\n    case 0xf14c: return IconSquareUpRight; // external-link-square-alt, external-link-square, open, new\n\n    // video, film, youtube-square\n    case 0xf166: return 0xf431;\n\n    // start, playing, youtube-play\n    case 0xf16a: return IconYoutube;\n\n    // long-arrow-down\n    case 0xf175: return IconDownLong; // long-arrow-down, long-arrow-alt-down\n\n    // long-arrow-up\n    case 0xf176: return IconUpLong; // long-arrow-alt-up, long-arrow-up\n\n    // long-arrow-left, back, previous\n    case 0xf177: return IconLeftLong; // long-arrow-alt-left, previous, back, long-arrow-left\n\n    // long-arrow-right\n    case 0xf178: return IconRightLong; // long-arrow-alt-right, long-arrow-right\n\n    // forward, arrow-circle-o-right, next\n    case 0xf18e: return IconCircleRight; // forward, next, arrow-circle-o-right, arrow-alt-circle-right\n\n    // arrow-circle-o-left, back, previous\n    case 0xf190: return IconCircleLeft; // arrow-circle-o-left, previous, back, arrow-alt-circle-left\n\n    // new, add, create, expand, plus-square-o\n    case 0xf196: return IconSquarePlus; // new, add, plus-square, create, expand\n\n    // spoon\n    case 0xf1b1: return IconSpoon; // spoon, utensil-spoon\n\n    // circle-thin\n    case 0xf1db: return IconCircle; // notification, circle, dot, circle-thin\n\n    // bell-slash-o\n    case 0xf1f7: return IconBellSlash;\n\n    // diamond, gemstone, gem\n    case 0xf219: return IconGem; // diamond, gem\n\n    // sticky-note-o\n    case 0xf24a: return IconNoteSticky;\n\n    // hourglass-o\n    case 0xf250: return IconHourglass;\n\n    // map-o\n    case 0xf278: return IconMap;\n\n    // commenting-o, feedback, sms, texting, note, conversation, speech, chat, notification, message, bubble\n    case 0xf27b: return IconComment; // commenting, feedback, notification, sms, note, conversation, speech, chat, texting, comment-alt, bubble, message\n\n    // purchase, buy, money, debit, credit card, checkout, payment, credit-card-alt\n    case 0xf283: return IconCreditCard; // purchase, buy, money, credit-card, debit, checkout, payment, credit-card-alt\n\n    // pause-circle-o\n    case 0xf28c: return IconCirclePause;\n\n    // stop-circle-o\n    case 0xf28e: return IconCircleStop;\n\n    // wheelchair-alt, handicap, person\n    case 0xf29b: return IconWheelchair; // handicap, person, wheelchair\n\n    // question-circle-o\n    case 0xf29c: return IconCircleQuestion;\n\n    // envelope-open-o\n    case 0xf2b7: return IconEnvelopeOpen;\n\n    // address-book-o\n    case 0xf2ba: return IconAddressBook;\n\n    // address-card-o\n    case 0xf2bc: return IconAddressCard;\n\n    // user-circle-o\n    case 0xf2be: return IconCircleUser;\n\n    // user-o\n    case 0xf2c0: return IconUser;\n\n    // id-card-o\n    case 0xf2c3: return IconIdCard;\n\n    // window-close\n    case 0xf2d3: return IconRectangleXmark; // window-close\n\n    // window-close-o\n    case 0xf2d4: return IconRectangleXmark;\n\n    default:\n        return id;\n    }\n}\n"
  },
  {
    "path": "src/gui/fromiconid.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QChar>\n#include <QString>\n\ninline QString fromIconId(int id) {\n    return QString(QChar(id));\n}\n"
  },
  {
    "path": "src/gui/geometry.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"geometry.h\"\n\n#include \"common/config.h\"\n#include \"gui/screen.h\"\n\n#include <QGuiApplication>\n#include <QLoggingCategory>\n#include <QScreen>\n#include <QSettings>\n#include <QVariant>\n#include <QWidget>\n#include <QWindow>\n\n#ifdef COPYQ_MOVE_TO_WORKSPACE\n#include \"platform/x11/x11info.h\"\n#include <X11/Xlib.h>\n#include <X11/Xatom.h>\n#endif\n\n#define GEOMETRY_LOG(window) \\\n    qCDebug(geometryCategory) << \"Window \\\"\" << window->objectName() << \"\\\": \"\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(geometryCategory)\nQ_LOGGING_CATEGORY(geometryCategory, \"copyq.geometry\")\n\nconst char propertyGeometryLockedUntilHide[] = \"CopyQ_geometry_locked_until_hide\";\n\nconstexpr int windowMinWidth = 50;\nconstexpr int windowMinHeight = 50;\n\nQSize frameSize(QWidget *widget) {\n    const QRect frame = widget->frameGeometry();\n    const QSize size = widget->size();\n    const int w = qMax(windowMinWidth, qMax(frame.width(), size.width()));\n    const int h = qMax(windowMinHeight, qMax(frame.height(), size.height()));\n    return QSize(w, h);\n}\n\nQString toString(const QRect &geometry)\n{\n    return QStringLiteral(\"%1x%2,%3,%4\")\n            .arg(geometry.width())\n            .arg(geometry.height())\n            .arg(geometry.x())\n            .arg(geometry.y());\n}\n\nint screenNumber(const QWidget &widget)\n{\n    QWindow *windowHandle = widget.windowHandle();\n    if (windowHandle) {\n        QScreen *screen = windowHandle->screen();\n        if (screen)\n            return QGuiApplication::screens().indexOf(screen);\n    }\n\n    return -1;\n}\n\nQString geometryOptionName(const QWidget &widget)\n{\n    return QStringLiteral(\"Options/%1_geometry\").arg(widget.objectName());\n}\n\nQString geometryOptionName(const QWidget &widget, bool openOnCurrentScreen)\n{\n    const QString baseGeometryName = geometryOptionName(widget);\n\n    if (!openOnCurrentScreen)\n        return QStringLiteral(\"%1_global\").arg(baseGeometryName);\n\n    const int n = screenNumber(widget);\n    if (n > 0)\n        return QStringLiteral(\"%1_screen_%2\").arg(baseGeometryName).arg(n);\n\n    return baseGeometryName;\n}\n\nQString getGeometryConfigurationFilePath()\n{\n    return getConfigurationFilePath(\"_geometry.ini\");\n}\n\nQString resolutionTagForScreen(int i)\n{\n    const QRect screenGeometry = ::screenGeometry(i);\n    return QStringLiteral(\"_%1x%2\")\n            .arg(screenGeometry.width())\n            .arg(screenGeometry.height());\n}\n\nQString resolutionTag(const QWidget &widget, bool openOnCurrentScreen)\n{\n    if (openOnCurrentScreen) {\n        const int i = screenNumber(widget);\n        if (i == -1)\n            return QString();\n        return resolutionTagForScreen(i);\n    }\n\n    QString tag;\n    for ( int i = 0; i < screenCount(); ++i )\n        tag.append( resolutionTagForScreen(i) );\n\n    return tag;\n}\n\nvoid ensureWindowOnScreen(QWidget *widget)\n{\n    const QSize frame  = frameSize(widget);\n    int x = widget->x();\n    int y = widget->y();\n    int w = qMax(windowMinWidth, frame.width());\n    int h = qMax(windowMinHeight, frame.height());\n\n    const QRect availableGeometry = screenAvailableGeometry(*widget);\n    if ( availableGeometry.isValid() ) {\n        // Ensure that the window fits the screen, otherwise it would be moved\n        // to a neighboring screen automatically.\n        w = qMin(w, availableGeometry.width());\n        h = qMin(h, availableGeometry.height());\n\n        if ( x + w > availableGeometry.right() )\n            x = availableGeometry.right() - w;\n\n        if ( x < availableGeometry.left() )\n            x = availableGeometry.left();\n\n        if ( y + h > availableGeometry.bottom() )\n            y = availableGeometry.bottom() - h;\n\n        if ( y < availableGeometry.top())\n            y = availableGeometry.top();\n    }\n\n    if ( frame != QSize(w, h) ) {\n        GEOMETRY_LOG(widget) << \"Resize window: \" << frame << \" -> \" << QSize(w, h);\n        widget->resize(w, h);\n    }\n\n    if ( widget->pos() != QPoint(x, y) ) {\n        GEOMETRY_LOG(widget) << \"Move window: \" << widget->pos() << QPoint(x, y);\n        widget->move(x, y);\n    }\n}\n\n} // namespace\n\nQVariant geometryOptionValue(const QString &optionName)\n{\n    const QSettings geometrySettings( getGeometryConfigurationFilePath(), QSettings::IniFormat );\n    return geometrySettings.value(optionName);\n}\n\nvoid setGeometryOptionValue(const QString &optionName, const QVariant &value)\n{\n    QSettings geometrySettings( getGeometryConfigurationFilePath(), QSettings::IniFormat );\n    geometrySettings.setValue(optionName, value);\n}\n\nvoid restoreWindowGeometry(QWidget *w, bool openOnCurrentScreen)\n{\n    const QString optionName = geometryOptionName(*w, openOnCurrentScreen);\n    const QString tag = resolutionTag(*w, openOnCurrentScreen);\n    QByteArray geometry = geometryOptionValue(optionName + tag).toByteArray();\n\n    // If geometry for screen resolution doesn't exist, use last saved one.\n    const bool restoreUntaggedGeometry = geometry.isEmpty();\n    if (restoreUntaggedGeometry) {\n        geometry = geometryOptionValue(optionName).toByteArray();\n\n        // If geometry for the screen doesn't exist, move window to the middle of the screen.\n        if (geometry.isEmpty()) {\n            const QRect availableGeometry = screenAvailableGeometry(*w);\n            if ( availableGeometry.isValid() ) {\n                const QPoint position = availableGeometry.center() - w->rect().center();\n                w->move(position);\n            }\n        }\n    }\n\n    const QRect oldGeometry = w->geometry();\n    if ( !geometry.isEmpty() )\n        w->restoreGeometry(geometry);\n\n    ensureWindowOnScreen(w);\n\n    GEOMETRY_LOG(w)\n        << (geometry.isEmpty() ? \"New\" : \"Restore\") << \" geometry \\\"\"\n        << optionName << (restoreUntaggedGeometry ? QString() : tag) << \"\\\": \"\n        << toString(oldGeometry) << \" -> \" << toString(w->geometry());\n}\n\nvoid saveWindowGeometry(QWidget *w, bool openOnCurrentScreen)\n{\n    const QString optionName = geometryOptionName(*w, openOnCurrentScreen);\n    const QString tag = resolutionTag(*w, openOnCurrentScreen);\n    QSettings geometrySettings( getGeometryConfigurationFilePath(), QSettings::IniFormat );\n    const auto geometry = w->saveGeometry();\n    geometrySettings.setValue(optionName + tag, geometry);\n    geometrySettings.setValue(optionName, geometry);\n    geometrySettings.setValue(geometryOptionName(*w), geometry);\n    GEOMETRY_LOG(w) << \"Save geometry \\\"\"\n        << optionName << tag << \"\\\": \" << toString(w->geometry());\n}\n\nQByteArray mainWindowState(const QString &mainWindowObjectName)\n{\n    const QString optionName = QStringLiteral(\"Options/%1_state\").arg(mainWindowObjectName);\n    return geometryOptionValue(optionName).toByteArray();\n}\n\nvoid saveMainWindowState(const QString &mainWindowObjectName, const QByteArray &state)\n{\n    const QString optionName = QStringLiteral(\"Options/%1_state\").arg(mainWindowObjectName);\n    setGeometryOptionValue(optionName, state);\n}\n\n#ifdef COPYQ_MOVE_TO_WORKSPACE\n/// Returns the value of a single-long CARDINAL X window property, or -1 on failure.\nstatic long getCardinalProperty(Display *display, Window window, Atom property)\n{\n    Atom type;\n    int format;\n    unsigned long nitems, bytes_after;\n    unsigned char *data = nullptr;\n\n    long value = -1;\n    if (XGetWindowProperty(display, window, property, 0, 1, False,\n                           XA_CARDINAL, &type, &format, &nitems, &bytes_after, &data) == Success) {\n        if (data) {\n            if (type == XA_CARDINAL && format == 32 && nitems == 1)\n                value = *reinterpret_cast<long*>(data);\n            XFree(data);\n        }\n    }\n\n    return value;\n}\n#endif\n\nvoid moveToCurrentWorkspace(QWidget *w)\n{\n#ifdef COPYQ_MOVE_TO_WORKSPACE\n    if (!w->isVisible())\n        return;\n\n    if (X11Info::isPlatformX11()) {\n        auto display = X11Info::display();\n        if (!display)\n            return;\n\n        const Window root = DefaultRootWindow(display);\n        const Window wid = w->winId();\n\n        static Atom atomCurrentDesktop = XInternAtom(display, \"_NET_CURRENT_DESKTOP\", False);\n        static Atom atomWmDesktop = XInternAtom(display, \"_NET_WM_DESKTOP\", False);\n\n        const long currentDesktop = getCardinalProperty(display, root, atomCurrentDesktop);\n        const long windowDesktop = getCardinalProperty(display, wid, atomWmDesktop);\n\n        // 0xFFFFFFFF means \"sticky\" (visible on all desktops) — no move needed\n        if (windowDesktop == currentDesktop\n            || currentDesktop < 0\n            || static_cast<unsigned long>(windowDesktop) == 0xFFFFFFFF) {\n            return;\n        }\n\n        GEOMETRY_LOG(w) << \"Move to current workspace\" << currentDesktop;\n\n        XClientMessageEvent e{};\n        e.type = ClientMessage;\n        e.display = display;\n        e.window = wid;\n        e.message_type = atomWmDesktop;\n        e.format = 32;\n        e.data.l[0] = currentDesktop;\n        // Source indication 2 (direct user action): CopyQ activates via global\n        // shortcut, so the WM should comply unconditionally.  Matches the\n        // source indication used in raise() for _NET_ACTIVE_WINDOW.\n        e.data.l[1] = 2;\n        XSendEvent(display, root, False,\n                   SubstructureNotifyMask | SubstructureRedirectMask,\n                   reinterpret_cast<XEvent*>(&e));\n        XFlush(display);\n    } else {\n        // Wayland: hide+show re-initializes the window in the compositor,\n        // allowing it to steal focus when shown by the caller.\n        GEOMETRY_LOG(w) << \"Move to current workspace (hide for re-show)\";\n        const bool blockUntilHide = isGeometryGuardBlockedUntilHidden(w);\n        w->hide();\n        if (blockUntilHide)\n            setGeometryGuardBlockedUntilHidden(w, true);\n    }\n#else\n    Q_UNUSED(w)\n#endif\n}\n\nvoid moveWindowOnScreen(QWidget *w, QPoint pos)\n{\n    w->move(pos);\n    ensureWindowOnScreen(w);\n    moveToCurrentWorkspace(w);\n}\n\nvoid setGeometryGuardBlockedUntilHidden(QWidget *w, bool blocked)\n{\n    GEOMETRY_LOG(w) << \"Geometry blocked until hidden: \" << blocked;\n    w->setProperty(propertyGeometryLockedUntilHide, blocked);\n}\n\nbool isGeometryGuardBlockedUntilHidden(const QWidget *w)\n{\n    return w->property(propertyGeometryLockedUntilHide).toBool();\n}\n"
  },
  {
    "path": "src/gui/geometry.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\nclass QByteArray;\nclass QPoint;\nclass QString;\nclass QVariant;\nclass QWidget;\n\nQVariant geometryOptionValue(const QString &optionName);\nvoid setGeometryOptionValue(const QString &optionName, const QVariant &value);\n\nvoid restoreWindowGeometry(QWidget *w, bool openOnCurrentScreen);\n\nvoid saveWindowGeometry(QWidget *w, bool openOnCurrentScreen);\n\nQByteArray mainWindowState(const QString &mainWindowObjectName);\n\nvoid saveMainWindowState(const QString &mainWindowObjectName, const QByteArray &state);\n\nvoid moveToCurrentWorkspace(QWidget *w);\n\nvoid moveWindowOnScreen(QWidget *w, QPoint pos);\n\nvoid setGeometryGuardBlockedUntilHidden(QWidget *w, bool blocked);\nbool isGeometryGuardBlockedUntilHidden(const QWidget *w);\n"
  },
  {
    "path": "src/gui/icon_list.h",
    "content": "// This file is generated with \"update_icon_font.py\" from FontAwesome's metadata.\n#pragma once\n\nstruct Icon {\n    unsigned short unicode;\n    bool isBrand;\n    const char *searchTerms;\n};\n\nconstexpr Icon iconList[] = {\n{0x30, false, \"0|Digit Zero|nada|none|zero|zilch\"},\n{0x31, false, \"1|Digit One|one\"},\n{0x32, false, \"2|Digit Two|two\"},\n{0x33, false, \"3|Digit Three|three\"},\n{0x34, false, \"4|Digit Four|four\"},\n{0x35, false, \"5|Digit Five|five\"},\n{0x36, false, \"6|Digit Six|six\"},\n{0x37, false, \"7|Digit Seven|seven\"},\n{0x38, false, \"8|Digit Eight|eight\"},\n{0x39, false, \"9|Digit Nine|nine\"},\n{0x41, false, \"a|Latin Capital Letter A|Latin Small Letter A|letter\"},\n{0xf2b9, false, \"address book|contact|directory|employee|index|little black book|portfolio|rolodex|uer|username\"},\n{0xf2bb, false, \"address card|about|contact|employee|id|identification|portfolio|postcard|profile|registration|uer|username\"},\n{0xf037, false, \"align center|format|middle|paragraph|text\"},\n{0xf039, false, \"align justify|format|paragraph|text\"},\n{0xf036, false, \"align left|format|paragraph|text\"},\n{0xf038, false, \"align right|format|paragraph|text\"},\n{0xf13d, false, \"anchor|anchor|berth|boat|dock|embed|link|maritime|moor|port|secure|ship|tool\"},\n{0xe4aa, false, \"anchor circle check|enable|marina|not affected|ok|okay|port|validate|working\"},\n{0xe4ab, false, \"anchor circle exclamation|affected|failed|marina|port\"},\n{0xe4ac, false, \"anchor circle xmark|destroy|marina|port|uncheck\"},\n{0xe4ad, false, \"anchor lock|closed|lockdown|marina|padlock|port|privacy|quarantine\"},\n{0xf107, false, \"angle down|Down Arrowhead|arrow|caret|download|expand|insert\"},\n{0xf104, false, \"angle left|Single Left-Pointing Angle Quotation Mark|arrow|back|caret|less|previous\"},\n{0xf105, false, \"angle right|Single Right-Pointing Angle Quotation Mark|arrow|care|forward|more|next\"},\n{0xf106, false, \"angle up|Up Arrowhead|arrow|caret|collapse|upgrade|upload\"},\n{0xf103, false, \"angles down|arrows|caret|download|expand\"},\n{0xf100, false, \"angles left|Left-Pointing Double Angle Quotation Mark|arrows|back|caret|laquo|previous|quote\"},\n{0xf101, false, \"angles right|Right-Pointing Double Angle Quotation Mark|arrows|caret|forward|more|next|quote|raquo\"},\n{0xf102, false, \"angles up|arrows|caret|collapse|upload\"},\n{0xf644, false, \"ankh|Ankh|amulet|copper|coptic christianity|copts|crux ansata|egypt|venus\"},\n{0xf5d1, false, \"apple whole|apple|fall|fruit|fuji|green|green apple|macintosh|orchard|red|red apple|seasonal|vegan\"},\n{0xf557, false, \"archway|arc|monument|road|street|tunnel\"},\n{0xf063, false, \"arrow down|Downwards Arrow|download\"},\n{0xf162, false, \"arrow down 1 9|arrange|filter|numbers|order|sort-numeric-asc\"},\n{0xf886, false, \"arrow down 9 1|arrange|filter|numbers|order|sort-numeric-asc\"},\n{0xf15d, false, \"arrow down a z|alphabetical|arrange|filter|order|sort-alpha-asc\"},\n{0xf175, false, \"arrow down long|download|long-arrow-down\"},\n{0xf884, false, \"arrow down short wide|arrange|filter|order|sort-amount-asc\"},\n{0xe4af, false, \"arrow down up across line|border|crossing|transfer\"},\n{0xe4b0, false, \"arrow down up lock|border|closed|crossing|lockdown|padlock|privacy|quarantine|transfer\"},\n{0xf160, false, \"arrow down wide short|arrange|filter|number|order|sort-amount-asc\"},\n{0xf881, false, \"arrow down z a|alphabetical|arrange|filter|order|sort-alpha-asc\"},\n{0xf060, false, \"arrow left|Leftwards Arrow|back|previous\"},\n{0xf177, false, \"arrow left long|back|long-arrow-left|previous\"},\n{0xf245, false, \"arrow pointer|arrow|cursor|select\"},\n{0xf061, false, \"arrow right|Rightwards Arrow|forward|next\"},\n{0xf0ec, false, \"arrow right arrow left|Rightwards Arrow Over Leftwards Arrow|arrow|arrows|reciprocate|return|swap|transfer\"},\n{0xf08b, false, \"arrow right from bracket|arrow|exit|leave|log out|logout\"},\n{0xf178, false, \"arrow right long|forward|long-arrow-right|next\"},\n{0xf090, false, \"arrow right to bracket|arrow|enter|insert|join|log in|login|sign in|sign up|sign-in|signin|signup\"},\n{0xe4b3, false, \"arrow right to city|building|city|exodus|insert|rural|urban\"},\n{0xf0e2, false, \"arrow rotate left|Anticlockwise Open Circle Arrow|back|control z|exchange|oops|return|rotate|swap\"},\n{0xf01e, false, \"arrow rotate right|Clockwise Open Circle Arrow|forward|refresh|reload|renew|repeat|retry\"},\n{0xe097, false, \"arrow trend down|line|stocks|trend\"},\n{0xe098, false, \"arrow trend up|line|stocks|trend\"},\n{0xf149, false, \"arrow turn down|arrow\"},\n{0xf148, false, \"arrow turn up|arrow\"},\n{0xf062, false, \"arrow up|Upwards Arrow|forward|upgrade|upload\"},\n{0xf163, false, \"arrow up 1 9|arrange|filter|numbers|order|sort-numeric-desc\"},\n{0xf887, false, \"arrow up 9 1|arrange|filter|numbers|order|sort-numeric-desc\"},\n{0xf15e, false, \"arrow up a z|alphabetical|arrange|filter|order|sort-alpha-desc\"},\n{0xe09a, false, \"arrow up from bracket|share|transfer|upgrade|upload\"},\n{0xe4b5, false, \"arrow up from ground water|groundwater|spring|upgrade|water supply|water table\"},\n{0xe4b6, false, \"arrow up from water pump|flood|groundwater|pump|submersible|sump pump|upgrade\"},\n{0xf176, false, \"arrow up long|long-arrow-up|upload\"},\n{0xe4b7, false, \"arrow up right dots|growth|increase|population|upgrade\"},\n{0xf08e, false, \"arrow up right from square|new|open|send|share|upgrade\"},\n{0xf885, false, \"arrow up short wide|arrange|filter|order|sort-amount-desc\"},\n{0xf161, false, \"arrow up wide short|arrange|filter|order|sort-amount-desc|upgrade\"},\n{0xf882, false, \"arrow up z a|alphabetical|arrange|filter|order|sort-alpha-desc\"},\n{0xe4b8, false, \"arrows down to line|insert|scale down|sink\"},\n{0xe4b9, false, \"arrows down to people|affected|focus|insert|targeted|together|uer\"},\n{0xf07e, false, \"arrows left right|expand|horizontal|landscape|resize|wide\"},\n{0xe4ba, false, \"arrows left right to line|analysis|expand|gap\"},\n{0xf021, false, \"arrows rotate|Clockwise Right and Left Semicircle Arrows|clockwise|exchange|modify|refresh|reload|renew|retry|rotate|swap\"},\n{0xe4bb, false, \"arrows spin|cycle|rotate|spin|whirl\"},\n{0xe4bc, false, \"arrows split up and left|agile|split\"},\n{0xe4bd, false, \"arrows to circle|center|concentrate|coordinate|coordination|focal point|focus|insert\"},\n{0xe4be, false, \"arrows to dot|assembly point|center|condense|focus|insert|minimize\"},\n{0xe4bf, false, \"arrows to eye|center|coordinated assessment|focus\"},\n{0xe4c0, false, \"arrows turn right|arrows\"},\n{0xe4c1, false, \"arrows turn to dots|destination|insert|nexus\"},\n{0xf07d, false, \"arrows up down|expand|portrait|resize|tall|vertical\"},\n{0xf047, false, \"arrows up down left right|arrow|arrows|bigger|enlarge|expand|fullscreen|move|position|reorder|resize\"},\n{0xe4c2, false, \"arrows up to line|rise|scale up|upgrade\"},\n{0x2a, false, \"asterisk|Asterisk|Heavy Asterisk|annotation|details|reference|required|star\"},\n{0x40, false, \"at|Commercial At|address|author|e-mail|email|fluctuate|handle\"},\n{0xf5d2, false, \"atom|atheism|atheist|atom|atom symbol|chemistry|electron|ion|isotope|knowledge|neutron|nuclear|proton|science\"},\n{0xf29e, false, \"audio description|blind|narration|video|visual\"},\n{0xe0a9, false, \"austral sign|Austral Sign|currency\"},\n{0xf559, false, \"award|guarantee|honor|praise|prize|recognition|ribbon|trophy|warranty\"},\n{0x42, false, \"b|Latin Capital Letter B|Latin Small Letter B|letter\"},\n{0xf77c, false, \"baby|uer|users-people\"},\n{0xf77d, false, \"baby carriage|buggy|carrier|infant|push|stroller|transportation|walk|wheels\"},\n{0xf04a, false, \"backward|arrow|double|fast reverse button|previous|rewind\"},\n{0xf049, false, \"backward fast|arrow|beginning|first|last track button|previous|previous scene|previous track|quick|rewind|start|triangle\"},\n{0xf048, false, \"backward step|beginning|first|previous|rewind|start\"},\n{0xf7e5, false, \"bacon|bacon|blt|breakfast|food|ham|lard|meat|pancetta|pork|rasher\"},\n{0xe059, false, \"bacteria|antibiotic|antibody|covid-19|health|organism|sick\"},\n{0xe05a, false, \"bacterium|antibiotic|antibody|covid-19|germ|health|organism|sick\"},\n{0xf290, false, \"bag shopping|buy|checkout|grocery|payment|purchase\"},\n{0xf666, false, \"bahai|bahai|bahá'í|star\"},\n{0xe0ac, false, \"baht sign|currency\"},\n{0xf05e, false, \"ban|404|abort|ban|block|cancel|delete|deny|disabled|entry|failed|forbidden|hide|no|not|not found|prohibit|prohibited|remove|stop|trash\"},\n{0xf54d, false, \"ban smoking|ban|cancel|deny|disabled|forbidden|no|no smoking|non-smoking|not|prohibited|smoking\"},\n{0xf462, false, \"bandage|adhesive bandage|bandage|boo boo|first aid|modify|ouch\"},\n{0xe2e6, false, \"bangladeshi taka sign|bdt|currency|tk\"},\n{0xf02a, false, \"barcode|info|laser|price|scan|upc\"},\n{0xf0c9, false, \"bars|checklist|drag|hamburger|list|menu|nav|navigation|ol|reorder|settings|todo|ul\"},\n{0xf828, false, \"bars progress|checklist|downloading|downloads|loading|poll|progress|project management|settings|to do\"},\n{0xf550, false, \"bars staggered|flow|list|timeline\"},\n{0xf433, false, \"baseball|ball|baseball|foul|glove|hardball|league|leather|mlb|softball|sport|underarm\"},\n{0xf432, false, \"baseball bat ball|bat|league|mlb|slugger|softball|sport\"},\n{0xf291, false, \"basket shopping|buy|checkout|grocery|payment|purchase\"},\n{0xf434, false, \"basketball|ball|basketball|dribble|dunk|hoop|nba\"},\n{0xf2cd, false, \"bath|bath|bathtub|clean|shower|tub|wash\"},\n{0xf244, false, \"battery empty|charge|dead|power|status\"},\n{0xf240, false, \"battery full|batter|battery|charge|power|status\"},\n{0xf242, false, \"battery half|charge|power|status\"},\n{0xf243, false, \"battery quarter|charge|low|power|status\"},\n{0xf241, false, \"battery three quarters|charge|power|status\"},\n{0xf236, false, \"bed|hospital|hotel|lodging|mattress|patient|person in bed|rest|sleep|travel|uer\"},\n{0xf487, false, \"bed pulse|EKG|bed|electrocardiogram|health|hospital|life|patient|vital\"},\n{0xf0fc, false, \"beer mug empty|alcohol|ale|bar|beverage|brew|brewery|drink|foam|lager|liquor|mug|stein\"},\n{0xf0f3, false, \"bell|alarm|alert|bel|bell|chime|notification|reminder|request\"},\n{0xf562, false, \"bell concierge|attention|bell|bellhop|bellhop bell|hotel|receptionist|request|service|support\"},\n{0xf1f6, false, \"bell slash|alert|bell|bell with slash|cancel|disabled|forbidden|mute|notification|off|quiet|reminder|silent\"},\n{0xf55b, false, \"bezier curve|curves|illustrator|lines|path|vector\"},\n{0xf206, false, \"bicycle|bicycle|bike|gears|pedal|transportation|vehicle\"},\n{0xf1e5, false, \"binoculars|glasses|inspection|magnifier|magnify|scenic|spyglass|view\"},\n{0xf780, false, \"biohazard|biohazard|covid-19|danger|dangerous|epidemic|hazmat|medical|pandemic|radioactive|sign|toxic|waste|zombie\"},\n{0xe0b4, false, \"bitcoin sign|Bitcoin Sign|currency\"},\n{0xf517, false, \"blender|cocktail|milkshake|mixer|puree|smoothie\"},\n{0xf6b6, false, \"blender phone|appliance|cocktail|fantasy|milkshake|mixer|puree|silly|smoothie\"},\n{0xf781, false, \"blog|journal|log|online|personal|post|web 2.0|wordpress|writing\"},\n{0xf032, false, \"bold|emphasis|format|text\"},\n{0xf0e7, false, \"bolt|charge|danger|electric|electricity|flash|high voltage|lightning|voltage|weather|zap\"},\n{0xe0b7, false, \"bolt lightning|electricity|flash|lightning|weather|zap\"},\n{0xf1e2, false, \"bomb|bomb|comic|error|explode|fuse|grenade|warning\"},\n{0xf5d7, false, \"bone|bone|calcium|dog|skeletal|skeleton|tibia\"},\n{0xf55c, false, \"bong|aparatus|cannabis|marijuana|pipe|smoke|smoking\"},\n{0xf02d, false, \"book|book|cover|decorated|diary|documentation|journal|knowledge|library|notebook|notebook with decorative cover|read|research|scholar\"},\n{0xf558, false, \"book atlas|book|directions|geography|globe|knowledge|library|map|research|travel|wayfinding\"},\n{0xf647, false, \"book bible|book|catholicism|christianity|god|holy\"},\n{0xe0bb, false, \"book bookmark|knowledge|library|research\"},\n{0xf66a, false, \"book journal whills|book|force|jedi|sith|star wars|yoda\"},\n{0xf7e6, false, \"book medical|diary|documentation|health|history|journal|library|read|record|research\"},\n{0xf518, false, \"book open|Book|book|flyer|knowledge|library|notebook|open|open book|pamphlet|reading|research\"},\n{0xf5da, false, \"book open reader|flyer|library|notebook|open book|pamphlet|reading|research\"},\n{0xf687, false, \"book quran|book|islam|muslim|religion\"},\n{0xf6b7, false, \"book skull|Dungeons & Dragons|crossbones|d&d|dark arts|death|dnd|documentation|evil|fantasy|halloween|holiday|library|necronomicon|read|research|skull|spell\"},\n{0xf827, false, \"book tanakh|book|jewish|judaism|religion\"},\n{0xf02e, false, \"bookmark|bookmark|favorite|library|mark|marker|read|remember|research|save\"},\n{0xf84c, false, \"border all|cell|grid|outline|stroke|table\"},\n{0xf850, false, \"border none|cell|grid|outline|stroke|table\"},\n{0xf853, false, \"border top left|cell|outline|stroke|table\"},\n{0xe4c3, false, \"bore hole|bore|bury|drill|hole\"},\n{0xe4c4, false, \"bottle droplet|alcohol|drink|oil|olive oil|wine\"},\n{0xe4c5, false, \"bottle water|h2o|plastic|water\"},\n{0xe4c6, false, \"bowl food|catfood|dogfood|food|rice\"},\n{0xe2eb, false, \"bowl rice|boiled|cooked|cooked rice|rice|steamed\"},\n{0xf436, false, \"bowling ball|alley|candlepin|gutter|lane|strike|tenpin\"},\n{0xf466, false, \"box|archive|box|container|package|parcel|storage\"},\n{0xf187, false, \"box archive|box|package|save|storage\"},\n{0xf49e, false, \"box open|archive|container|package|storage|unpack\"},\n{0xe05b, false, \"box tissue|cough|covid-19|kleenex|mucus|nose|sneeze|snot\"},\n{0xe4c7, false, \"boxes packing|archive|box|package|storage|supplies\"},\n{0xf468, false, \"boxes stacked|archives|inventory|storage|warehouse\"},\n{0xf2a1, false, \"braille|alphabet|blind|dots|raised|vision\"},\n{0xf5dc, false, \"brain|brain|cerebellum|gray matter|intellect|intelligent|knowledge|medulla oblongata|mind|noodle|scholar|wit\"},\n{0xe46c, false, \"brazilian real sign|brazilian real sign|currency\"},\n{0xf7ec, false, \"bread slice|bake|bakery|baking|dough|flour|gluten|grain|sandwich|sourdough|toast|wheat|yeast\"},\n{0xe4c8, false, \"bridge|bridge|road\"},\n{0xe4c9, false, \"bridge circle check|bridge|enable|not affected|ok|okay|road|validate|working\"},\n{0xe4ca, false, \"bridge circle exclamation|affected|bridge|failed|road\"},\n{0xe4cb, false, \"bridge circle xmark|bridge|destroy|road|uncheck\"},\n{0xe4cc, false, \"bridge lock|bridge|closed|lockdown|padlock|privacy|quarantine|road\"},\n{0xe4ce, false, \"bridge water|bridge|road\"},\n{0xf0b1, false, \"briefcase|bag|briefcas|briefcase|business|luggage|offer|office|portfolio|work\"},\n{0xf469, false, \"briefcase medical|doctor|emt|first aid|health\"},\n{0xf51a, false, \"broom|broom|clean|cleaning|firebolt|fly|halloween|nimbus 2000|quidditch|sweep|sweeping|witch\"},\n{0xf458, false, \"broom ball|ball|bludger|broom|golden snitch|harry potter|hogwarts|quaffle|sport|wizard\"},\n{0xf55d, false, \"brush|art|bristles|color|handle|maintenance|modify|paint\"},\n{0xe4cf, false, \"bucket|bucket|pail|sandcastle\"},\n{0xf188, false, \"bug|beetle|error|glitch|insect|repair|report\"},\n{0xe490, false, \"bug slash|beetle|disabled|fix|glitch|insect|optimize|repair|report|warning\"},\n{0xe4d0, false, \"bugs|bedbug|infestation|lice|plague|ticks\"},\n{0xf1ad, false, \"building|apartment|building|business|city|company|office|office building|urban|work\"},\n{0xe4d1, false, \"building circle arrow right|building|city|distribution center|office\"},\n{0xe4d2, false, \"building circle check|building|city|enable|not affected|office|ok|okay|validate|working\"},\n{0xe4d3, false, \"building circle exclamation|affected|building|city|failed|office\"},\n{0xe4d4, false, \"building circle xmark|building|city|destroy|office|uncheck\"},\n{0xf19c, false, \"building columns|bank|building|college|education|institution|museum|students\"},\n{0xe4d5, false, \"building flag|building|city|diplomat|embassy|flag|headquarters|united nations\"},\n{0xe4d6, false, \"building lock|building|city|closed|lock|lockdown|padlock|privacy|quarantine|secure\"},\n{0xe4d7, false, \"building ngo|building|city|non governmental organization|office\"},\n{0xe4d8, false, \"building shield|building|city|police|protect|safety\"},\n{0xe4d9, false, \"building un|building|city|office|united nations\"},\n{0xe4da, false, \"building user|apartment|building|city|employee|uer\"},\n{0xe4db, false, \"building wheat|agriculture|building|city|usda\"},\n{0xf0a1, false, \"bullhorn|Bullhorn|announcement|broadcast|loud|louder|loudspeaker|megaphone|public address|request|share\"},\n{0xf140, false, \"bullseye|archery|goal|objective|strategy|target\"},\n{0xf805, false, \"burger|bacon|beef|burger|burger king|cheeseburger|fast food|grill|ground beef|mcdonalds|sandwich\"},\n{0xe4dc, false, \"burst|boom|crash|explosion\"},\n{0xf207, false, \"bus|bus|oncoming|oncoming bus|public transportation|transportation|travel|vehicle\"},\n{0xf55e, false, \"bus simple|mta|public transportation|transportation|travel|vehicle\"},\n{0xf64a, false, \"business time|alarm|briefcase|business socks|clock|flight of the conchords|portfolio|reminder|wednesday\"},\n{0x43, false, \"c|Latin Capital Letter C|Latin Small Letter C|letter\"},\n{0xf7da, false, \"cable car|aerial tramway|cable|gondola|lift|mountain|mountain cableway|tram|tramway|trolley\"},\n{0xf1fd, false, \"cake candles|anniversary|bakery|birthday|birthday cake|cake|candles|celebration|dessert|frosting|holiday|party|pastry|sweet\"},\n{0xf1ec, false, \"calculator|Pocket Calculator|abacus|addition|arithmetic|counting|math|multiplication|subtraction\"},\n{0xf133, false, \"calendar|calendar|calendar-o|date|day|event|month|schedule|tear-off calendar|time|when|year\"},\n{0xf274, false, \"calendar check|accept|agree|appointment|confirm|correct|date|day|done|enable|event|month|ok|schedule|select|success|tick|time|todo|validate|warranty|when|working|year\"},\n{0xf783, false, \"calendar day|date|day|detail|event|focus|month|schedule|single day|time|today|when|year\"},\n{0xf073, false, \"calendar days|calendar|date|day|event|month|schedule|time|when|year\"},\n{0xf272, false, \"calendar minus|calendar|date|day|delete|event|month|negative|remove|schedule|time|when|year\"},\n{0xf271, false, \"calendar plus|add|calendar|create|date|day|event|month|new|positive|schedule|time|when|year\"},\n{0xf784, false, \"calendar week|date|day|detail|event|focus|month|schedule|single week|time|today|when|year\"},\n{0xf273, false, \"calendar xmark|archive|calendar|date|day|delete|event|month|remove|schedule|time|uncheck|when|x|year\"},\n{0xf030, false, \"camera|image|img|lens|photo|picture|record|shutter|video\"},\n{0xf083, false, \"camera retro|camera|image|img|lens|photo|picture|record|shutter|video\"},\n{0xe0d8, false, \"camera rotate|flip|front-facing|img|photo|selfie\"},\n{0xf6bb, false, \"campground|camping|fall|outdoors|teepee|tent|tipi\"},\n{0xf786, false, \"candy cane|candy|christmas|holiday|mint|peppermint|striped|xmas\"},\n{0xf55f, false, \"cannabis|bud|chronic|drugs|endica|endo|ganja|marijuana|mary jane|pot|reefer|sativa|spliff|weed|whacky-tabacky\"},\n{0xf46b, false, \"capsules|drugs|medicine|pills|prescription\"},\n{0xf1b9, false, \"car|auto|automobile|car|oncoming|oncoming automobile|sedan|transportation|travel|vehicle\"},\n{0xf5df, false, \"car battery|auto|electric|mechanic|power\"},\n{0xf5e1, false, \"car burst|accident|auto|automobile|insurance|sedan|transportation|vehicle|wreck\"},\n{0xe4dd, false, \"car on|alarm|car|carjack|warning\"},\n{0xf5de, false, \"car rear|auto|automobile|sedan|transportation|travel|vehicle\"},\n{0xf5e4, false, \"car side|auto|automobile|car|sedan|transportation|travel|vehicle\"},\n{0xe4de, false, \"car tunnel|road|tunnel\"},\n{0xf8ff, false, \"caravan|camper|motor home|rv|trailer|travel\"},\n{0xf0d7, false, \"caret down|arrow|dropdown|expand|menu|more|triangle\"},\n{0xf0d9, false, \"caret left|arrow|back|previous|triangle\"},\n{0xf0da, false, \"caret right|arrow|forward|next|triangle\"},\n{0xf0d8, false, \"caret up|arrow|collapse|triangle|upgrade\"},\n{0xf787, false, \"carrot|bugs bunny|carrot|food|orange|vegan|vegetable\"},\n{0xf218, false, \"cart arrow down|download|insert|save|shopping\"},\n{0xf474, false, \"cart flatbed|carry|inventory|shipping|transport\"},\n{0xf59d, false, \"cart flatbed suitcase|airport|bag|baggage|suitcase|travel\"},\n{0xf217, false, \"cart plus|add|create|new|positive|shopping\"},\n{0xf07a, false, \"cart shopping|buy|cart|checkout|grocery|payment|purchase|shopping|shopping cart|trolley\"},\n{0xf788, false, \"cash register|buy|cha-ching|change|checkout|commerce|leaerboard|machine|pay|payment|purchase|store\"},\n{0xf6be, false, \"cat|cat|feline|halloween|holiday|kitten|kitty|meow|pet\"},\n{0xe0df, false, \"cedi sign|Cedi Sign|currency\"},\n{0xe3f5, false, \"cent sign|Cent Sign|currency\"},\n{0xf0a3, false, \"certificate|badge|guarantee|star|verified\"},\n{0xf6c0, false, \"chair|chair|furniture|seat|sit\"},\n{0xf51b, false, \"chalkboard|blackboard|learning|school|teaching|whiteboard|writing\"},\n{0xf51c, false, \"chalkboard user|blackboard|instructor|learning|professor|school|uer|whiteboard|writing\"},\n{0xf79f, false, \"champagne glasses|alcohol|bar|beverage|celebrate|celebration|champagne|clink|clinking glasses|drink|glass|holiday|new year's eve|party|toast\"},\n{0xf5e7, false, \"charging station|electric|ev|tesla|vehicle\"},\n{0xf1fe, false, \"chart area|analytics|area|chart|graph|performance|revenue|statistics\"},\n{0xf080, false, \"chart bar|analytics|bar|chart|graph|performance|statistics\"},\n{0xe0e3, false, \"chart column|bar|bar chart|chart|graph|performance|revenue|statistics|track|trend\"},\n{0xe695, false, \"chart diagram|algorithm|analytics|flow|graph\"},\n{0xe0e4, false, \"chart gantt|chart|graph|performance|statistics|track|trend\"},\n{0xf201, false, \"chart line|activity|analytics|chart|dashboard|gain|graph|increase|line|performance|revenue|statistics\"},\n{0xf200, false, \"chart pie|analytics|chart|diagram|graph|performance|pie|revenue|statistics\"},\n{0xe473, false, \"chart simple|analytics|bar|chart|column|graph|performance|revenue|row|statistics|trend\"},\n{0xf00c, false, \"check|Check Mark|accept|agree|check|check mark|checkmark|confirm|correct|coupon|done|enable|mark|notice|notification|notify|ok|select|success|tick|todo|true|validate|working|yes|✓\"},\n{0xf560, false, \"check double|accept|agree|checkmark|confirm|correct|coupon|done|enable|notice|notification|notify|ok|select|select all|success|tick|todo|validate|working\"},\n{0xf772, false, \"check to slot|accept|cast|election|enable|politics|positive|validate|voting|working|yes\"},\n{0xf7ef, false, \"cheese|cheddar|curd|gouda|melt|parmesan|sandwich|swiss|wedge\"},\n{0xf439, false, \"chess|board|castle|checkmate|game|king|rook|strategy|tournament\"},\n{0xf43a, false, \"chess bishop|Black Chess Bishop|board|checkmate|game|strategy\"},\n{0xf43c, false, \"chess board|board|checkmate|game|strategy\"},\n{0xf43f, false, \"chess king|Black Chess King|board|checkmate|game|strategy\"},\n{0xf441, false, \"chess knight|Black Chess Knight|board|checkmate|game|horse|strategy\"},\n{0xf443, false, \"chess pawn|board|checkmate|chess|chess pawn|dupe|expendable|game|strategy\"},\n{0xf445, false, \"chess queen|Black Chess Queen|board|checkmate|game|strategy\"},\n{0xf447, false, \"chess rook|Black Chess Rook|board|castle|checkmate|game|strategy\"},\n{0xf078, false, \"chevron down|arrow|download|expand|insert\"},\n{0xf053, false, \"chevron left|Left-Pointing Angle Bracket|arrow|back|bracket|previous\"},\n{0xf054, false, \"chevron right|Right-Pointing Angle Bracket|arrow|bracket|forward|next\"},\n{0xf077, false, \"chevron up|arrow|collapse|upgrade|upload\"},\n{0xf1ae, false, \"child|boy|girl|kid|toddler|uer|young|youth\"},\n{0xe4e0, false, \"child combatant|combatant\"},\n{0xe59c, false, \"child dress|boy|girl|kid|toddler|uer|young|youth\"},\n{0xe59d, false, \"child reaching|boy|girl|kid|toddler|uer|young|youth\"},\n{0xe4e1, false, \"children|boy|child|girl|kid|kids|together|uer|young|youth\"},\n{0xf51d, false, \"church|Christian|building|cathedral|chapel|church|community|cross|religion\"},\n{0xf111, false, \"circle|Black Circle|Black Large Circle|black circle|blue|blue circle|brown|brown circle|chart|circle|circle-thin|diameter|dot|ellipse|fill|geometric|green|green circle|notification|orange|orange circle|progress|purple|purple circle|red|red circle|round|white circle|yellow|yellow circle\"},\n{0xf0ab, false, \"circle arrow down|download\"},\n{0xf0a8, false, \"circle arrow left|back|previous\"},\n{0xf0a9, false, \"circle arrow right|forward|next\"},\n{0xf0aa, false, \"circle arrow up|upgrade|upload\"},\n{0xf058, false, \"circle check|accept|affected|agree|clear|confirm|correct|coupon|done|enable|ok|select|success|tick|todo|validate|working|yes\"},\n{0xf13a, false, \"circle chevron down|arrow|download|dropdown|menu|more\"},\n{0xf137, false, \"circle chevron left|arrow|back|previous\"},\n{0xf138, false, \"circle chevron right|arrow|forward|next\"},\n{0xf139, false, \"circle chevron up|arrow|collapse|upgrade|upload\"},\n{0xf4b9, false, \"circle dollar to slot|contribute|generosity|gift|give|premium\"},\n{0xf192, false, \"circle dot|bullseye|button|geometric|notification|radio|radio button|target\"},\n{0xf358, false, \"circle down|arrow-circle-o-down|download\"},\n{0xf06a, false, \"circle exclamation|affect|alert|attention|damage|danger|error|failed|important|notice|notification|notify|problem|required|warning\"},\n{0xf47e, false, \"circle h|Circled Latin Capital Letter H|clinic|covid-19|emergency|letter|map\"},\n{0xf042, false, \"circle half stroke|Circle with Left Half Black|adjust|chart|contrast|dark|fill|light|pie|progress|saturation\"},\n{0xf05a, false, \"circle info|details|help|information|more|support\"},\n{0xf359, false, \"circle left|arrow-circle-o-left|back|previous\"},\n{0xf056, false, \"circle minus|delete|hide|negative|remove|shape|trash\"},\n{0xe4e2, false, \"circle nodes|cluster|connect|network\"},\n{0xf1ce, false, \"circle notch|circle-o-notch|diameter|dot|ellipse|round|spinner\"},\n{0xf28b, false, \"circle pause|hold|wait\"},\n{0xf144, false, \"circle play|audio|music|playing|sound|start|video\"},\n{0xf055, false, \"circle plus|add|create|expand|new|positive|shape\"},\n{0xf059, false, \"circle question|faq|help|information|support|unknown\"},\n{0xf7ba, false, \"circle radiation|danger|dangerous|deadly|hazard|nuclear|radioactive|sign|warning\"},\n{0xf35a, false, \"circle right|arrow-circle-o-right|forward|next\"},\n{0xf28d, false, \"circle stop|block|box|circle|square\"},\n{0xf35b, false, \"circle up|arrow-circle-o-up|upgrade\"},\n{0xf2bd, false, \"circle user|employee|uer|username|users-people\"},\n{0xf057, false, \"circle xmark|close|cross|destroy|exit|incorrect|notice|notification|notify|problem|uncheck|wrong|x\"},\n{0xf64f, false, \"city|buildings|busy|city|cityscape|skyscrapers|urban|windows\"},\n{0xe131, false, \"clapperboard|camera|clapper|clapper board|director|film|movie|record\"},\n{0xf328, false, \"clipboard|clipboar|clipboard|copy|notepad|notes|paste|record\"},\n{0xf46c, false, \"clipboard check|accept|agree|confirm|coupon|done|enable|ok|select|success|tick|todo|validate|working|yes\"},\n{0xf46d, false, \"clipboard list|cheatsheet|checklist|completed|done|finished|intinerary|ol|schedule|summary|survey|tick|todo|ul|wishlist\"},\n{0xe4e3, false, \"clipboard question|assistance|faq|interview|query|question\"},\n{0xf7f3, false, \"clipboard user|attendance|employee|record|roster|staff|uer\"},\n{0xf017, false, \"clock|00|4|4:00|clock|date|four|four o’clock|hour|late|minute|o'clock|o’clock|pending|schedule|ticking|time|timer|timestamp|watch\"},\n{0xf1da, false, \"clock rotate left|Rewind|clock|pending|reverse|time|time machine|time travel|waiting\"},\n{0xf24d, false, \"clone|arrange|copy|duplicate|paste\"},\n{0xf20a, false, \"closed captioning|cc|deaf|hearing|subtitle|subtitling|text|video\"},\n{0xf0c2, false, \"cloud|atmosphere|cloud|fog|overcast|save|upload|weather\"},\n{0xf0ed, false, \"cloud arrow down|download|export|save\"},\n{0xf0ee, false, \"cloud arrow up|import|save|upgrade|upload\"},\n{0xf76c, false, \"cloud bolt|bolt|cloud|cloud with lightning|lightning|precipitation|rain|storm|weather\"},\n{0xf73b, false, \"cloud meatball|FLDSMDFR|food|spaghetti|storm\"},\n{0xf6c3, false, \"cloud moon|crescent|evening|lunar|night|partly cloudy|sky\"},\n{0xf73c, false, \"cloud moon rain|crescent|evening|lunar|night|partly cloudy|precipitation|rain|sky|storm\"},\n{0xf73d, false, \"cloud rain|Rain|cloud|cloud with rain|precipitation|rain|sky|storm\"},\n{0xf740, false, \"cloud showers heavy|precipitation|rain|sky|storm\"},\n{0xe4e4, false, \"cloud showers water|cloud|deluge|flood|rain|storm|surge\"},\n{0xf6c4, false, \"cloud sun|clear|cloud|day|daytime|fall|outdoors|overcast|partly cloudy|sun|sun behind cloud\"},\n{0xf743, false, \"cloud sun rain|cloud|day|overcast|precipitation|rain|storm|summer|sun|sun behind rain cloud|sunshower\"},\n{0xe139, false, \"clover|4|charm|clover|four|four leaf clover|four-leaf clover|leaf|leprechaun|luck|lucky\"},\n{0xf121, false, \"code|brackets|code|development|html|mysql|sql\"},\n{0xf126, false, \"code branch|branch|git|github|mysql|rebase|sql|svn|vcs|version\"},\n{0xf386, false, \"code commit|commit|git|github|hash|rebase|svn|vcs|version\"},\n{0xe13a, false, \"code compare|compare|git|github|svn|version\"},\n{0xe13b, false, \"code fork|fork|git|github|svn|version\"},\n{0xf387, false, \"code merge|git|github|merge|pr|rebase|svn|vcs|version\"},\n{0xe13c, false, \"code pull request|git|github|pr|svn|version\"},\n{0xf51e, false, \"coins|currency|dime|financial|gold|money|penny|premium\"},\n{0xe140, false, \"colon sign|Colon Sign|currency\"},\n{0xf075, false, \"comment|Right Speech Bubble|answer|bubble|chat|commenting|conversation|conversation|discussion|feedback|message|note|notification|sms|speech|talk|talking|texting\"},\n{0xf651, false, \"comment dollar|answer|bubble|chat|commenting|conversation|feedback|message|money|note|notification|pay|salary|sms|speech|spend|texting|transfer\"},\n{0xf4ad, false, \"comment dots|answer|balloon|bubble|chat|comic|commenting|conversation|dialog|feedback|message|more|note|notification|reply|request|sms|speech|speech balloon|texting\"},\n{0xf7f5, false, \"comment medical|advice|answer|bubble|chat|commenting|conversation|diagnose|feedback|message|note|notification|prescription|sms|speech|texting\"},\n{0xe696, false, \"comment nodes|ai|artificial intelligence|cluster|language|model|network|neuronal\"},\n{0xf4b3, false, \"comment slash|answer|bubble|cancel|chat|commenting|conversation|disabled|feedback|message|mute|note|notification|quiet|sms|speech|texting\"},\n{0xf7cd, false, \"comment sms|answer|chat|conversation|message|mobile|notification|phone|sms|texting\"},\n{0xf086, false, \"comments|Two Speech Bubbles|answer|bubble|chat|commenting|conversation|conversation|discussion|feedback|message|note|notification|sms|speech|talk|talking|texting\"},\n{0xf653, false, \"comments dollar|answer|bubble|chat|commenting|conversation|feedback|message|money|note|notification|pay|salary|sms|speech|spend|texting|transfer\"},\n{0xf51f, false, \"compact disc|Optical Disc Icon|album|blu-ray|bluray|cd|computer|disc|disk|dvd|media|movie|music|optical|optical disk|record|video|vinyl\"},\n{0xf14e, false, \"compass|compass|directions|directory|location|magnetic|menu|navigation|orienteering|safari|travel\"},\n{0xf568, false, \"compass drafting|design|map|mechanical drawing|plot|plotting\"},\n{0xf066, false, \"compress|collapse|fullscreen|minimize|move|resize|shrink|smaller\"},\n{0xe4e5, false, \"computer|computer|desktop|display|monitor|tower\"},\n{0xf8cc, false, \"computer mouse|click|computer|computer mouse|cursor|input|peripheral\"},\n{0xf563, false, \"cookie|baked good|chips|chocolate|cookie|dessert|eat|snack|sweet|treat\"},\n{0xf564, false, \"cookie bite|baked good|bitten|chips|chocolate|eat|snack|sweet|treat\"},\n{0xf0c5, false, \"copy|clone|duplicate|file|files-o|paper|paste\"},\n{0xf1f9, false, \"copyright|brand|c|copyright|mark|register|trademark\"},\n{0xf4b8, false, \"couch|chair|cushion|furniture|relax|sofa\"},\n{0xf6c8, false, \"cow|agriculture|animal|beef|bovine|co|cow|farm|fauna|livestock|mammal|milk|moo\"},\n{0xf09d, false, \"credit card|buy|card|checkout|credit|credit card|credit-card-alt|debit|money|payment|purchase\"},\n{0xf125, false, \"crop|design|frame|mask|modify|resize|shrink\"},\n{0xf565, false, \"crop simple|design|frame|mask|modify|resize|shrink\"},\n{0xf654, false, \"cross|Christian|Heavy Latin Cross|catholicism|christianity|church|cross|jesus|latin cross|religion\"},\n{0xf05b, false, \"crosshairs|aim|bullseye|gpd|picker|position\"},\n{0xf520, false, \"crow|bird|bullfrog|fauna|halloween|holiday|toad\"},\n{0xf521, false, \"crown|award|clothing|crown|favorite|king|queen|royal|tiara|vip\"},\n{0xf7f7, false, \"crutch|cane|injury|mobility|wheelchair\"},\n{0xe152, false, \"cruzeiro sign|Cruzeiro Sign|currency\"},\n{0xf1b2, false, \"cube|3d|block|dice|package|square|tesseract\"},\n{0xf1b3, false, \"cubes|3d|block|dice|package|pyramid|square|stack|tesseract\"},\n{0xe4e6, false, \"cubes stacked|blocks|cubes|sugar\"},\n{0x44, false, \"d|Latin Capital Letter D|Latin Small Letter D|letter\"},\n{0xf1c0, false, \"database|computer|development|directory|memory|mysql|sql|storage\"},\n{0xf55a, false, \"delete left|Erase to the Left|command|delete|erase|keyboard|undo\"},\n{0xf747, false, \"democrat|american|democratic party|donkey|election|left|left-wing|liberal|politics|usa\"},\n{0xf390, false, \"desktop|computer|cpu|demo|desktop|desktop computer|device|imac|machine|monitor|pc|screen\"},\n{0xf655, false, \"dharmachakra|Buddhist|buddhism|buddhist|dharma|religion|wheel|wheel of dharma\"},\n{0xe476, false, \"diagram next|cells|chart|gantt|row|subtask|successor|table\"},\n{0xe477, false, \"diagram predecessor|cells|chart|gantt|predecessor|previous|row|subtask|table\"},\n{0xf542, false, \"diagram project|chart|graph|network|pert|statistics\"},\n{0xe47a, false, \"diagram successor|cells|chart|gantt|next|row|subtask|successor|table\"},\n{0xf219, false, \"diamond|ace|card|cards|diamond suit|game|gem|gemstone|poker|suit\"},\n{0xf5eb, false, \"diamond turn right|map|navigation|sign|turn\"},\n{0xf522, false, \"dice|chance|dice|die|gambling|game|game die|roll\"},\n{0xf6cf, false, \"dice d20|Dungeons & Dragons|chance|d&d|dnd|fantasy|gambling|game|roll\"},\n{0xf6d1, false, \"dice d6|Dungeons & Dragons|chance|d&d|dnd|fantasy|gambling|game|roll\"},\n{0xf523, false, \"dice five|Die Face-5|chance|gambling|game|roll\"},\n{0xf524, false, \"dice four|Die Face-4|chance|gambling|game|roll\"},\n{0xf525, false, \"dice one|Die Face-1|chance|gambling|game|roll\"},\n{0xf526, false, \"dice six|Die Face-6|chance|gambling|game|roll\"},\n{0xf527, false, \"dice three|Die Face-3|chance|gambling|game|roll\"},\n{0xf528, false, \"dice two|Die Face-2|chance|gambling|game|roll\"},\n{0xf7fa, false, \"disease|bacteria|cancer|coronavirus|covid-19|flu|illness|infection|pandemic|sickness|virus\"},\n{0xe163, false, \"display|Screen|computer|desktop|imac\"},\n{0xf529, false, \"divide|Division Sign|arithmetic|calculus|divide|division|math|sign|÷\"},\n{0xf471, false, \"dna|biologist|dna|double helix|evolution|gene|genetic|genetics|helix|life|molecule|protein\"},\n{0xf6d3, false, \"dog|animal|canine|dog|fauna|mammal|pet|pooch|puppy|woof\"},\n{0x24, false, \"dollar sign|Dollar Sign|coupon|currency|dollar|heavy dollar sign|investment|money|premium|revenue|salary\"},\n{0xf472, false, \"dolly|carry|shipping|transport\"},\n{0xe169, false, \"dong sign|Dong Sign|currency\"},\n{0xf52a, false, \"door closed|doo|door|enter|exit|locked|privacy\"},\n{0xf52b, false, \"door open|enter|exit|welcome\"},\n{0xf4ba, false, \"dove|bird|dove|fauna|fly|flying|peace|war\"},\n{0xf422, false, \"down left and up right to center|collapse|fullscreen|minimize|move|resize|scale|shrink|size|smaller\"},\n{0xf309, false, \"down long|download|long-arrow-down\"},\n{0xf019, false, \"download|export|hard drive|insert|save|transfer\"},\n{0xf6d5, false, \"dragon|Dungeons & Dragons|d&d|dnd|dragon|fairy tale|fantasy|fire|lizard|serpent\"},\n{0xf5ee, false, \"draw polygon|anchors|lines|object|render|shape\"},\n{0xf043, false, \"droplet|blood|cold|color|comic|drop|droplet|raindrop|sweat|waterdrop\"},\n{0xf5c7, false, \"droplet slash|blood|color|disabled|drop|droplet|raindrop|waterdrop\"},\n{0xf569, false, \"drum|drum|drumsticks|instrument|music|percussion|snare|sound\"},\n{0xf56a, false, \"drum steelpan|calypso|instrument|music|percussion|reggae|snare|sound|steel|tropical\"},\n{0xf6d7, false, \"drumstick bite|bone|chicken|leg|meat|poultry|turkey\"},\n{0xf44b, false, \"dumbbell|exercise|gym|strength|weight|weight-lifting|workout\"},\n{0xf793, false, \"dumpster|alley|bin|commercial|trash|waste\"},\n{0xf794, false, \"dumpster fire|alley|bin|commercial|danger|dangerous|euphemism|flame|heat|hot|trash|waste\"},\n{0xf6d9, false, \"dungeon|Dungeons & Dragons|building|d&d|dnd|door|entrance|fantasy|gate\"},\n{0x45, false, \"e|Latin Capital Letter E|Latin Small Letter E|letter\"},\n{0xf2a4, false, \"ear deaf|ear|hearing|sign language\"},\n{0xf2a2, false, \"ear listen|amplify|audio|deaf|ear|headset|hearing|sound\"},\n{0xf57c, false, \"earth africa|africa|all|country|earth|europe|global|globe|gps|language|localize|location|map|online|place|planet|translate|travel|world\"},\n{0xf57d, false, \"earth americas|all|america|country|earth|global|globe|gps|language|localize|location|map|online|place|planet|translate|travel|world\"},\n{0xf57e, false, \"earth asia|all|asia|australia|country|earth|global|globe|gps|language|localize|location|map|online|place|planet|translate|travel|world\"},\n{0xf7a2, false, \"earth europe|all|country|earth|europe|global|globe|gps|language|localize|location|map|online|place|planet|translate|travel|world\"},\n{0xe47b, false, \"earth oceania|all|australia|country|earth|global|globe|gps|language|localize|location|map|melanesia|micronesia|new zealand|online|place|planet|polynesia|translate|travel|world\"},\n{0xf7fb, false, \"egg|breakfast|chicken|easter|egg|food|shell|yolk\"},\n{0xf052, false, \"eject|abort|cancel|cd|discharge|eject|eject button\"},\n{0xe16d, false, \"elevator|accessibility|elevator|hoist|lift|uer|users-people\"},\n{0xf141, false, \"ellipsis|dots|drag|kebab|list|menu|nav|navigation|ol|pacman|reorder|settings|three dots|ul\"},\n{0xf142, false, \"ellipsis vertical|bullet|dots|drag|kebab|list|menu|nav|navigation|ol|reorder|settings|three dots|ul\"},\n{0xf0e0, false, \"envelope|Back of Envelope|e-mail|email|envelope|letter|mail|message|newsletter|notification|offer|support\"},\n{0xe4e8, false, \"envelope circle check|check|email|enable|envelope|mail|not affected|ok|okay|read|sent|validate|working\"},\n{0xf2b6, false, \"envelope open|e-mail|email|letter|mail|message|newsletter|notification|offer|support\"},\n{0xf658, false, \"envelope open text|e-mail|email|letter|mail|message|newsletter|notification|offer|support\"},\n{0xf674, false, \"envelopes bulk|archive|envelope|letter|newsletter|offer|post office|postal|postcard|send|stamp|usps\"},\n{0x3d, false, \"equals|Equals Sign|arithmetic|even|match|math\"},\n{0xf12d, false, \"eraser|art|delete|remove|rubber\"},\n{0xf796, false, \"ethernet|cable|cat 5|cat 6|connection|hardware|internet|network|wired\"},\n{0xf153, false, \"euro sign|Euro Sign|currency\"},\n{0x21, false, \"exclamation|!|Exclamation Mark|alert|attention|danger|error|exclamation|failed|important|mark|notice|notification|notify|outlined|problem|punctuation|red exclamation mark|required|warning|white exclamation mark\"},\n{0xf065, false, \"expand|arrows|bigger|enlarge|expand|fullscreen|maximize|resize|resize|scale|size|viewfinder\"},\n{0xe4e9, false, \"explosion|blast|blowup|boom|crash|detonation|explosion\"},\n{0xf06e, false, \"eye|body|eye|look|optic|see|seen|show|sight|views|visible\"},\n{0xf1fb, false, \"eye dropper|beaker|clone|color|copy|eyedropper|pipette\"},\n{0xf2a8, false, \"eye low vision|blind|eye|sight\"},\n{0xf070, false, \"eye slash|blind|disabled|hide|show|toggle|unseen|views|visible|visiblity\"},\n{0x46, false, \"f|Latin Capital Letter F|Latin Small Letter F|letter\"},\n{0xf556, false, \"face angry|angry|angry face|disapprove|emoticon|face|mad|upset\"},\n{0xf567, false, \"face dizzy|dazed|dead|disapprove|emoticon|face\"},\n{0xf579, false, \"face flushed|dazed|embarrassed|emoticon|face|flushed|flushed face\"},\n{0xf119, false, \"face frown|disapprove|emoticon|face|frown|frowning face|rating|sad|uer\"},\n{0xf57a, false, \"face frown open|disapprove|emoticon|face|frown|frowning face with open mouth|mouth|open|rating|sad\"},\n{0xf57f, false, \"face grimace|cringe|emoticon|face|grimace|grimacing face|teeth\"},\n{0xf580, false, \"face grin|emoticon|face|grin|grinning face|laugh|smile\"},\n{0xf582, false, \"face grin beam|emoticon|eye|face|grinning face with smiling eyes|laugh|mouth|open|smile\"},\n{0xf583, false, \"face grin beam sweat|cold|embarass|emoticon|face|grinning face with sweat|open|smile|sweat\"},\n{0xf584, false, \"face grin hearts|emoticon|eye|face|love|smile|smiling face with heart-eyes\"},\n{0xf585, false, \"face grin squint|emoticon|face|grinning squinting face|laugh|mouth|satisfied|smile\"},\n{0xf586, false, \"face grin squint tears|emoticon|face|floor|happy|laugh|rolling|rolling on the floor laughing|smile\"},\n{0xf587, false, \"face grin stars|emoticon|eyes|face|grinning|quality|star|star-struck|starry-eyed|vip\"},\n{0xf588, false, \"face grin tears|LOL|emoticon|face|face with tears of joy|joy|laugh|tear\"},\n{0xf589, false, \"face grin tongue|LOL|emoticon|face|face with tongue|tongue\"},\n{0xf58a, false, \"face grin tongue squint|LOL|emoticon|eye|face|horrible|squinting face with tongue|taste|tongue\"},\n{0xf58b, false, \"face grin tongue wink|LOL|emoticon|eye|face|joke|tongue|wink|winking face with tongue\"},\n{0xf581, false, \"face grin wide|emoticon|face|grinning face with big eyes|laugh|mouth|open|smile\"},\n{0xf58c, false, \"face grin wink|emoticon|face|flirt|laugh|smile\"},\n{0xf596, false, \"face kiss|beso|emoticon|face|kiss|kissing face|love|smooch\"},\n{0xf597, false, \"face kiss beam|beso|emoticon|eye|face|kiss|kissing face with smiling eyes|love|smile|smooch\"},\n{0xf598, false, \"face kiss wink heart|beso|emoticon|face|face blowing a kiss|kiss|love|smooch\"},\n{0xf599, false, \"face laugh|LOL|emoticon|face|laugh|smile\"},\n{0xf59a, false, \"face laugh beam|LOL|beaming face with smiling eyes|emoticon|eye|face|grin|happy|smile\"},\n{0xf59b, false, \"face laugh squint|LOL|emoticon|face|happy|smile\"},\n{0xf59c, false, \"face laugh wink|LOL|emoticon|face|happy|smile\"},\n{0xf11a, false, \"face meh|deadpan|default|emoticon|face|meh|neutral|neutral face|rating|uer\"},\n{0xf5a4, false, \"face meh blank|emoticon|face|face without mouth|mouth|neutral|quiet|rating|silent\"},\n{0xf5a5, false, \"face rolling eyes|emoticon|eyeroll|eyes|face|face with rolling eyes|neutral|rating|rolling\"},\n{0xf5b3, false, \"face sad cry|cry|emoticon|face|loudly crying face|sad|sob|tear|tears\"},\n{0xf5b4, false, \"face sad tear|cry|crying face|emoticon|face|sad|tear|tears\"},\n{0xf118, false, \"face smile|approve|default|emoticon|face|happy|rating|satisfied|slightly smiling face|smile|uer\"},\n{0xf5b8, false, \"face smile beam|blush|emoticon|eye|face|happy|positive|smile|smiling face with smiling eyes\"},\n{0xf4da, false, \"face smile wink|emoticon|face|happy|hint|joke|wink|winking face\"},\n{0xf5c2, false, \"face surprise|emoticon|face|face with open mouth|mouth|open|shocked|sympathy\"},\n{0xf5c8, false, \"face tired|angry|emoticon|face|grumpy|tired|tired face|upset\"},\n{0xf863, false, \"fan|ac|air conditioning|blade|blower|cool|hot\"},\n{0xe005, false, \"faucet|covid-19|drinking|drip|house|hygiene|kitchen|potable|potable water|sanitation|sink|water\"},\n{0xe006, false, \"faucet drip|drinking|drip|house|hygiene|kitchen|potable|potable water|sanitation|sink|water\"},\n{0xf1ac, false, \"fax|Fax Icon|business|communicate|copy|facsimile|fax|fax machine|send\"},\n{0xf52d, false, \"feather|bird|feather|flight|light|plucked|plumage|quill|write\"},\n{0xf56b, false, \"feather pointed|bird|light|plucked|quill|write\"},\n{0xe4ea, false, \"ferry|barge|boat|carry|ferryboat|ship\"},\n{0xf15b, false, \"file|Empty Document|cv|document|new|page|page facing up|pdf|resume\"},\n{0xf56d, false, \"file arrow down|archive|document|export|insert|save\"},\n{0xf574, false, \"file arrow up|document|import|page|save|upgrade\"},\n{0xf1c7, false, \"file audio|document|mp3|music|page|play|sound\"},\n{0xe5a0, false, \"file circle check|document|enable|file|not affected|ok|okay|paper|validate|working\"},\n{0xe4eb, false, \"file circle exclamation|document|failed|file|paper\"},\n{0xe4ed, false, \"file circle minus|document|file|paper\"},\n{0xe494, false, \"file circle plus|add|document|file|new|page|paper|pdf\"},\n{0xe4ef, false, \"file circle question|document|file|paper\"},\n{0xe5a1, false, \"file circle xmark|document|file|paper|uncheck\"},\n{0xf1c9, false, \"file code|css|development|document|html|mysql|sql\"},\n{0xf56c, false, \"file contract|agreement|binding|document|legal|signature|username\"},\n{0xf6dd, false, \"file csv|document|excel|numbers|spreadsheets|table\"},\n{0xf1c3, false, \"file excel|csv|document|numbers|spreadsheets|table\"},\n{0xf56e, false, \"file export|download|save\"},\n{0xe697, false, \"file fragment|block|data|partial|piece\"},\n{0xe698, false, \"file half dashed|data|fragment|partial|piece\"},\n{0xf1c5, false, \"file image|Document with Picture|document|image|img|jpg|photo|png\"},\n{0xf56f, false, \"file import|copy|document|insert|send|upload\"},\n{0xf570, false, \"file invoice|account|bill|charge|document|payment|receipt\"},\n{0xf571, false, \"file invoice dollar|$|account|bill|charge|document|dollar-sign|money|payment|receipt|revenue|salary|usd\"},\n{0xf15c, false, \"file lines|Document|Document with Text|document|file-text|invoice|new|page|pdf\"},\n{0xf477, false, \"file medical|document|health|history|prescription|record\"},\n{0xf1c1, false, \"file pdf|acrobat|document|preview|save\"},\n{0xf31c, false, \"file pen|edit|memo|modify|pen|pencil|update|write\"},\n{0xf1c4, false, \"file powerpoint|display|document|keynote|presentation\"},\n{0xf572, false, \"file prescription|document|drugs|medical|medicine|rx\"},\n{0xe4f0, false, \"file shield|antivirus|data|document|protect|safe|safety|secure\"},\n{0xf573, false, \"file signature|John Hancock|contract|document|name|username\"},\n{0xf1c8, false, \"file video|document|m4v|movie|mp4|play\"},\n{0xf478, false, \"file waveform|document|health|history|prescription|record\"},\n{0xf1c2, false, \"file word|document|edit|page|text|writing\"},\n{0xf1c6, false, \"file zipper|.zip|bundle|compress|compression|download|zip\"},\n{0xf575, false, \"fill|bucket|color|paint|paint bucket\"},\n{0xf576, false, \"fill drip|bucket|color|drop|paint|paint bucket|spill\"},\n{0xf008, false, \"film|cinema|film|film frames|frames|movie|strip|video\"},\n{0xf0b0, false, \"filter|funnel|options|separate|sort\"},\n{0xf662, false, \"filter circle dollar|filter|money|options|premium|separate|sort\"},\n{0xe17b, false, \"filter circle xmark|cancel|funnel|options|remove|separate|sort|uncheck\"},\n{0xf577, false, \"fingerprint|human|id|identification|lock|privacy|smudge|touch|unique|unlock\"},\n{0xf06d, false, \"fire|burn|caliente|fire|flame|heat|hot|popular|tool\"},\n{0xe4f1, false, \"fire burner|cook|fire|flame|kitchen|stove\"},\n{0xf134, false, \"fire extinguisher|burn|caliente|extinguish|fire|fire extinguisher|fire fighter|flame|heat|hot|quench|rescue\"},\n{0xf7e4, false, \"fire flame curved|burn|caliente|flame|heat|hot|popular\"},\n{0xf46a, false, \"fire flame simple|caliente|energy|fire|flame|gas|heat|hot\"},\n{0xf578, false, \"fish|Pisces|fauna|fish|gold|seafood|swimming|zodiac\"},\n{0xe4f2, false, \"fish fins|fish|fishery|pisces|seafood\"},\n{0xf024, false, \"flag|black flag|country|notice|notification|notify|pole|report|symbol|waving\"},\n{0xf11e, false, \"flag checkered|checkered|chequered|chequered flag|finish|notice|notification|notify|pole|racing|report|start|symbol|win\"},\n{0xf74d, false, \"flag usa|betsy ross|country|fla|flag: United States|old glory|stars|stripes|symbol\"},\n{0xf0c3, false, \"flask|beaker|chemicals|experiment|experimental|knowledge|labs|liquid|potion|science|vial\"},\n{0xe4f3, false, \"flask vial|ampule|beaker|chemicals|chemistry|experiment|experimental|lab|laboratory|labs|liquid|potion|science|test|test tube|vial\"},\n{0xf0c7, false, \"floppy disk|Black Hard Shell Floppy Disk|computer|disk|download|floppy|floppy disk|floppy-o\"},\n{0xe184, false, \"florin sign|currency\"},\n{0xf07b, false, \"folder|Black Folder|archive|directory|document|file|file folder|folder\"},\n{0xe185, false, \"folder closed|file\"},\n{0xf65d, false, \"folder minus|archive|delete|directory|document|file|negative|remove\"},\n{0xf07c, false, \"folder open|Open Folder|archive|directory|document|empty|file|folder|new|open|open file folder\"},\n{0xf65e, false, \"folder plus|add|archive|create|directory|document|file|new|positive\"},\n{0xf802, false, \"folder tree|archive|directory|document|file|search|structure\"},\n{0xf031, false, \"font|alphabet|glyph|text|type|typeface\"},\n{0xf2b4, false, \"font awesome|awesome|flag|font|icons|typeface\"},\n{0xf44e, false, \"football|american|american football|ball|fall|football|nfl|pigskin|seasonal\"},\n{0xf04e, false, \"forward|arrow|double|fast|fast-forward button|forward|next|skip\"},\n{0xf050, false, \"forward fast|arrow|end|last|next|next scene|next track|next track button|quick|triangle\"},\n{0xf051, false, \"forward step|end|last|next\"},\n{0xe18f, false, \"franc sign|French Franc Sign|currency\"},\n{0xf52e, false, \"frog|amphibian|bullfrog|fauna|hop|kermit|kiss|prince|ribbit|toad|wart\"},\n{0xf1e3, false, \"futbol|ball|football|mls|soccer|soccer ball\"},\n{0x47, false, \"g|Latin Capital Letter G|Latin Small Letter G|letter\"},\n{0xf11b, false, \"gamepad|arcade|controller|d-pad|joystick|playstore|video|video game\"},\n{0xf52f, false, \"gas pump|car|diesel|fuel|fuel pump|fuelpump|gas|gasoline|petrol|pump|station\"},\n{0xf624, false, \"gauge|dashboard|fast|odometer|speed|speedometer\"},\n{0xf625, false, \"gauge high|dashboard|fast|odometer|quick|speed|speedometer\"},\n{0xf629, false, \"gauge simple|dashboard|fast|odometer|speed|speedometer\"},\n{0xf62a, false, \"gauge simple high|dashboard|fast|odometer|quick|speed|speedometer\"},\n{0xf0e3, false, \"gavel|hammer|judge|law|lawyer|opinion\"},\n{0xf013, false, \"gear|cog|cogwheel|configuration|gear|mechanical|modify|settings|sprocket|tool|wheel\"},\n{0xf085, false, \"gears|configuration|gears|mechanical|modify|settings|sprocket|wheel\"},\n{0xf3a5, false, \"gem|diamond|gem|gem stone|jewel|jewelry|sapphire|stone|treasure\"},\n{0xf22d, false, \"genderless|androgynous|asexual|gender|sexless\"},\n{0xf6e2, false, \"ghost|apparition|blinky|clyde|creature|face|fairy tale|fantasy|floating|ghost|halloween|holiday|inky|monster|pacman|pinky|spirit\"},\n{0xf06b, false, \"gift|box|celebration|christmas|generosity|gift|giving|holiday|party|present|wrapped|wrapped gift|xmas\"},\n{0xf79c, false, \"gifts|christmas|generosity|giving|holiday|party|present|wrapped|xmas\"},\n{0xe4f4, false, \"glass water|potable|water\"},\n{0xe4f5, false, \"glass water droplet|potable|water\"},\n{0xf530, false, \"glasses|hipster|nerd|reading|sight|spectacles|vision\"},\n{0xf0ac, false, \"globe|all|coordinates|country|earth|global|globe|globe with meridians|gps|internet|language|localize|location|map|meridians|network|online|place|planet|translate|travel|world|www\"},\n{0xf450, false, \"golf ball tee|caddy|eagle|putt|tee\"},\n{0xf664, false, \"gopuram|building|entrance|hinduism|temple|tower\"},\n{0xf19d, false, \"graduation cap|cap|celebration|ceremony|clothing|college|graduate|graduation|graduation cap|hat|learning|school|student\"},\n{0x3e, false, \"greater than|Greater-Than Sign|arithmetic|compare|math\"},\n{0xf532, false, \"greater than equal|arithmetic|compare|math\"},\n{0xf58d, false, \"grip|affordance|drag|drop|grab|handle\"},\n{0xf7a4, false, \"grip lines|affordance|drag|drop|grab|handle\"},\n{0xf7a5, false, \"grip lines vertical|affordance|drag|drop|grab|handle\"},\n{0xf58e, false, \"grip vertical|affordance|drag|drop|grab|handle\"},\n{0xe4f6, false, \"group arrows rotate|community|engagement|spin|sync\"},\n{0xe19a, false, \"guarani sign|Guarani Sign|currency\"},\n{0xf7a6, false, \"guitar|acoustic|instrument|music|rock|rock and roll|song|strings\"},\n{0xe19b, false, \"gun|firearm|pistol|weapon\"},\n{0x48, false, \"h|Latin Capital Letter H|Latin Small Letter H|letter\"},\n{0xf6e3, false, \"hammer|admin|configuration|equipment|fix|hammer|maintenance|modify|recovery|repair|settings|tool\"},\n{0xf665, false, \"hamsa|amulet|christianity|islam|jewish|judaism|muslim|protection\"},\n{0xf256, false, \"hand|Raised Hand|backhand|game|halt|palm|raised|raised back of hand|request|roshambo|stop\"},\n{0xf255, false, \"hand back fist|fist|game|roshambo\"},\n{0xf461, false, \"hand dots|allergy|freckles|hand|hives|palm|pox|skin|spots\"},\n{0xf6de, false, \"hand fist|Dungeons & Dragons|clenched|d&d|dnd|fantasy|fist|hand|ki|monk|punch|raised fist|resist|strength|unarmed combat\"},\n{0xf4bd, false, \"hand holding|carry|lift\"},\n{0xf4c0, false, \"hand holding dollar|$|carry|coupon|dollar sign|donate|donation|giving|investment|lift|money|premium|price|revenue|salary\"},\n{0xf4c1, false, \"hand holding droplet|blood|carry|covid-19|drought|grow|lift|sanitation\"},\n{0xe4f7, false, \"hand holding hand|care|give|help|hold|protect\"},\n{0xf4be, false, \"hand holding heart|carry|charity|gift|lift|package|wishlist\"},\n{0xe05c, false, \"hand holding medical|care|covid-19|donate|help\"},\n{0xf258, false, \"hand lizard|game|roshambo\"},\n{0xf806, false, \"hand middle finger|finger|flip the bird|gesture|hand|hate|middle finger|rude\"},\n{0xf25b, false, \"hand peace|hand|rest|truce|v|victory|victory hand\"},\n{0xf0a7, false, \"hand point down|finger|hand-o-down|point\"},\n{0xf0a5, false, \"hand point left|back|finger|hand-o-left|left|point|previous\"},\n{0xf0a4, false, \"hand point right|finger|forward|hand-o-right|next|point|right\"},\n{0xf0a6, false, \"hand point up|finger|hand|hand-o-up|index|index pointing up|point|request|up|upgrade\"},\n{0xf25a, false, \"hand pointer|arrow|cursor|select\"},\n{0xf257, false, \"hand scissors|cut|game|roshambo\"},\n{0xe05d, false, \"hand sparkles|clean|covid-19|hygiene|magic|palm|soap|wash\"},\n{0xf259, false, \"hand spock|finger|hand|live long|palm|prosper|salute|spock|star trek|vulcan|vulcan salute\"},\n{0xe4f8, false, \"handcuffs|arrest|criminal|handcuffs|jail|lock|police|wrist\"},\n{0xf2a7, false, \"hands|Translate|asl|deaf|hands\"},\n{0xf2a3, false, \"hands asl interpreting|asl|deaf|finger|hand|interpret|speak\"},\n{0xe4f9, false, \"hands bound|abduction|bound|handcuff|wrist\"},\n{0xe05e, false, \"hands bubbles|covid-19|hygiene|soap|wash\"},\n{0xe1a8, false, \"hands clapping|applause|clap|clapping hands|hand\"},\n{0xf4c2, false, \"hands holding|carry|hold|lift\"},\n{0xe4fa, false, \"hands holding child|care|give|help|hold|parent|protect\"},\n{0xe4fb, false, \"hands holding circle|circle|gift|protection\"},\n{0xf684, false, \"hands praying|kneel|preach|religion|worship\"},\n{0xf2b5, false, \"handshake|agreement|greeting|meeting|partnership\"},\n{0xf4c4, false, \"handshake angle|aid|assistance|handshake|partnership|volunteering\"},\n{0xf4c6, false, \"handshake simple|agreement|greeting|hand|handshake|meeting|partnership|shake\"},\n{0xe05f, false, \"handshake simple slash|broken|covid-19|disabled|social distance\"},\n{0xe060, false, \"handshake slash|broken|covid-19|disabled|social distance\"},\n{0xf6e6, false, \"hanukiah|candelabrum|candle|candlestick|hanukkah|jewish|judaism|light|menorah|religion\"},\n{0xf0a0, false, \"hard drive|Hard Disk|cpu|hard drive|harddrive|machine|save|storage\"},\n{0x23, false, \"hashtag|Number Sign|Twitter|instagram|pound|social media|tag\"},\n{0xf8c0, false, \"hat cowboy|buckaroo|horse|jackeroo|john b.|old west|pardner|ranch|rancher|rodeo|western|wrangler\"},\n{0xf8c1, false, \"hat cowboy side|buckaroo|horse|jackeroo|john b.|old west|pardner|ranch|rancher|rodeo|western|wrangler\"},\n{0xf6e8, false, \"hat wizard|Dungeons & Dragons|accessory|buckle|clothing|d&d|dnd|fantasy|halloween|head|holiday|mage|magic|pointy|witch\"},\n{0xe061, false, \"head side cough|cough|covid-19|germs|lungs|respiratory|sick|uer\"},\n{0xe062, false, \"head side cough slash|cough|covid-19|disabled|germs|lungs|respiratory|sick|uer\"},\n{0xe063, false, \"head side mask|breath|coronavirus|covid-19|filter|flu|infection|pandemic|respirator|uer|virus\"},\n{0xe064, false, \"head side virus|cold|coronavirus|covid-19|flu|infection|pandemic|sick|uer\"},\n{0xf1dc, false, \"heading|format|header|text|title\"},\n{0xf025, false, \"headphones|audio|earbud|headphone|listen|music|sound|speaker\"},\n{0xf58f, false, \"headphones simple|audio|listen|music|sound|speaker\"},\n{0xf590, false, \"headset|audio|gamer|gaming|listen|live chat|microphone|shot caller|sound|support|telemarketer\"},\n{0xf004, false, \"heart|ace|black|black heart|blue|blue heart|brown|brown heart|card|evil|favorite|game|green|green heart|heart|heart suit|like|love|orange|orange heart|purple|purple heart|red heart|relationship|valentine|white|white heart|wicked|wishlist|yellow|yellow heart\"},\n{0xe4fc, false, \"heart circle bolt|cardiogram|ekg|electric|heart|love|pacemaker\"},\n{0xe4fd, false, \"heart circle check|enable|favorite|heart|love|not affected|ok|okay|validate|working\"},\n{0xe4fe, false, \"heart circle exclamation|failed|favorite|heart|love\"},\n{0xe4ff, false, \"heart circle minus|favorite|heart|love\"},\n{0xe500, false, \"heart circle plus|favorite|heart|love\"},\n{0xe501, false, \"heart circle xmark|favorite|heart|love|uncheck\"},\n{0xf7a9, false, \"heart crack|break|breakup|broken|broken heart|crushed|dislike|dumped|grief|love|lovesick|relationship|sad\"},\n{0xf21e, false, \"heart pulse|ekg|electrocardiogram|health|lifeline|vital signs\"},\n{0xf533, false, \"helicopter|airwolf|apache|chopper|flight|fly|helicopter|travel|vehicle\"},\n{0xe502, false, \"helicopter symbol|chopper|helicopter|landing pad|whirlybird\"},\n{0xf807, false, \"helmet safety|construction|hardhat|helmet|maintenance|safety\"},\n{0xe503, false, \"helmet un|helmet|united nations\"},\n{0xe699, false, \"hexagon nodes|action|ai|artificial intelligence|cluster|graph|language|llm|model|network|neuronal\"},\n{0xe69a, false, \"hexagon nodes bolt|LLM|action|ai|artificial intelligence|cluster|graph|language|llm|model|network|neuronal\"},\n{0xf591, false, \"highlighter|edit|marker|modify|sharpie|update|write\"},\n{0xe507, false, \"hill avalanche|mudslide|snow|winter\"},\n{0xe508, false, \"hill rockslide|mudslide\"},\n{0xf6ed, false, \"hippo|animal|fauna|hippo|hippopotamus|hungry|mammal\"},\n{0xf453, false, \"hockey puck|ice|nhl|sport\"},\n{0xf7aa, false, \"holly berry|catwoman|christmas|decoration|flora|halle|holiday|ororo munroe|plant|storm|xmas\"},\n{0xf6f0, false, \"horse|equestrian|equus|fauna|horse|mammmal|mare|neigh|pony|racehorse|racing\"},\n{0xf7ab, false, \"horse head|equus|fauna|mammmal|mare|neigh|pony\"},\n{0xf0f8, false, \"hospital|building|covid-19|doctor|emergency room|hospital|medical center|medicine\"},\n{0xf80d, false, \"hospital user|covid-19|doctor|network|patient|primary care|uer\"},\n{0xf593, false, \"hot tub person|jacuzzi|spa|uer\"},\n{0xf80f, false, \"hotdog|bun|chili|frankfurt|frankfurter|hot dog|hotdog|kosher|polish|sandwich|sausage|vienna|weiner\"},\n{0xf594, false, \"hotel|building|hotel|inn|lodging|motel|resort|travel\"},\n{0xf254, false, \"hourglass|hour|hourglass|hourglass not done|minute|sand|stopwatch|time|timer\"},\n{0xf253, false, \"hourglass end|hour|hourglass done|minute|pending|sand|stopwatch|time|timer|waiting\"},\n{0xf252, false, \"hourglass half|hour|minute|pending|sand|stopwatch|time|waiting\"},\n{0xf251, false, \"hourglass start|hour|minute|sand|stopwatch|time|waiting\"},\n{0xf015, false, \"house|abode|building|home|house|main|residence\"},\n{0xe3af, false, \"house chimney|abode|building|chimney|house|main|residence|smokestack\"},\n{0xf6f1, false, \"house chimney crack|building|devastation|disaster|earthquake|home|insurance\"},\n{0xf7f2, false, \"house chimney medical|covid-19|doctor|general practitioner|hospital|infirmary|medicine|office|outpatient\"},\n{0xe065, false, \"house chimney user|covid-19|home|isolation|quarantine|uer\"},\n{0xe00d, false, \"house chimney window|abode|building|family|home|residence\"},\n{0xe509, false, \"house circle check|abode|enable|home|house|not affected|ok|okay|validate|working\"},\n{0xe50a, false, \"house circle exclamation|abode|affected|failed|home|house\"},\n{0xe50b, false, \"house circle xmark|abode|destroy|home|house|uncheck\"},\n{0xe3b1, false, \"house crack|building|devastation|disaster|earthquake|home|insurance\"},\n{0xe50c, false, \"house fire|burn|emergency|home\"},\n{0xe50d, false, \"house flag|camp|home\"},\n{0xe50e, false, \"house flood water|damage|flood|water\"},\n{0xe50f, false, \"house flood water circle arrow right|damage|flood|water\"},\n{0xe066, false, \"house laptop|computer|covid-19|device|office|remote|work from home\"},\n{0xe510, false, \"house lock|closed|home|house|lockdown|padlock|privacy|quarantine\"},\n{0xe3b2, false, \"house medical|covid-19|doctor|facility|general practitioner|health|hospital|infirmary|medicine|office|outpatient\"},\n{0xe511, false, \"house medical circle check|clinic|enable|hospital|not affected|ok|okay|validate|working\"},\n{0xe512, false, \"house medical circle exclamation|affected|clinic|failed|hospital\"},\n{0xe513, false, \"house medical circle xmark|clinic|destroy|hospital|uncheck\"},\n{0xe514, false, \"house medical flag|clinic|hospital|mash\"},\n{0xe012, false, \"house signal|abode|building|connect|family|home|residence|smart home|wifi|www\"},\n{0xe515, false, \"house tsunami|damage|flood|tidal wave|wave\"},\n{0xe1b0, false, \"house user|house|uer\"},\n{0xf6f2, false, \"hryvnia sign|Hryvnia Sign|currency\"},\n{0xf751, false, \"hurricane|coriolis effect|eye|storm|tropical cyclone|typhoon\"},\n{0x49, false, \"i|Latin Capital Letter I|Latin Small Letter I|letter\"},\n{0xf246, false, \"i cursor|editing|i-beam|type|writing\"},\n{0xf810, false, \"ice cream|chocolate|cone|cream|dessert|frozen|ice|ice cream|scoop|sorbet|sweet|vanilla|yogurt\"},\n{0xf7ad, false, \"icicles|cold|frozen|hanging|ice|seasonal|sharp\"},\n{0xf86d, false, \"icons|bolt|category|emoji|heart|image|music|photo|symbols\"},\n{0xf2c1, false, \"id badge|address|contact|identification|license|profile|uer|username\"},\n{0xf2c2, false, \"id card|contact|demographics|document|identification|issued|profile|registration|uer|username\"},\n{0xf47f, false, \"id card clip|contact|demographics|document|identification|issued|profile|uer|username\"},\n{0xf7ae, false, \"igloo|dome|dwelling|eskimo|home|house|ice|snow\"},\n{0xf03e, false, \"image|album|img|landscape|photo|picture\"},\n{0xf3e0, false, \"image portrait|id|image|img|photo|picture|selfie|uer|username\"},\n{0xf302, false, \"images|album|img|landscape|photo|picture\"},\n{0xf01c, false, \"inbox|archive|desk|email|mail|message\"},\n{0xf03c, false, \"indent|align|justify|paragraph|tab\"},\n{0xe1bc, false, \"indian rupee sign|Indian Rupee Sign|currency\"},\n{0xf275, false, \"industry|building|factory|industrial|manufacturing|mill|warehouse\"},\n{0xf534, false, \"infinity|Infinity|eternity|forever|infinity|math|unbounded|universal\"},\n{0xf129, false, \"info|details|help|information|more|support\"},\n{0xf033, false, \"italic|edit|emphasis|font|format|text|type\"},\n{0x4a, false, \"j|Latin Capital Letter J|Latin Small Letter J|letter\"},\n{0xe516, false, \"jar|jam|jelly|storage\"},\n{0xe517, false, \"jar wheat|flour|storage\"},\n{0xf669, false, \"jedi|crest|force|sith|skywalker|star wars|yoda\"},\n{0xf0fb, false, \"jet fighter|airforce|airplane|airport|fast|fly|goose|marines|maverick|military|plane|quick|top gun|transportation|travel\"},\n{0xe518, false, \"jet fighter up|airforce|airplane|airport|fast|fly|goose|marines|maverick|military|plane|quick|top gun|transportation|travel\"},\n{0xf595, false, \"joint|blunt|cannabis|doobie|drugs|marijuana|roach|smoke|smoking|spliff\"},\n{0xe519, false, \"jug detergent|detergent|laundry|soap|wash\"},\n{0x4b, false, \"k|Latin Capital Letter K|Latin Small Letter K|letter\"},\n{0xf66b, false, \"kaaba|Muslim|building|cube|islam|kaaba|muslim|religion\"},\n{0xf084, false, \"key|key|lock|password|private|secret|unlock\"},\n{0xf11c, false, \"keyboard|accessory|computer|edit|input|keyboard|text|type|write\"},\n{0xf66d, false, \"khanda|Adi Shakti|chakkar|sikh|sikhism|sword\"},\n{0xe1c4, false, \"kip sign|Kip Sign|currency\"},\n{0xf479, false, \"kit medical|emergency|emt|health|medical|rescue\"},\n{0xe51a, false, \"kitchen set|chef|cook|cup|kitchen|pan|pot|skillet\"},\n{0xf535, false, \"kiwi bird|bird|fauna|new zealand\"},\n{0x4c, false, \"l|Latin Capital Letter L|Latin Small Letter L|letter\"},\n{0xe51b, false, \"land mine on|bomb|danger|explosion|war\"},\n{0xf66f, false, \"landmark|building|classical|historic|memorable|monument|museum|politics|society\"},\n{0xf752, false, \"landmark dome|building|historic|memorable|monument|politics\"},\n{0xe51c, false, \"landmark flag|capitol|flag|landmark|memorial\"},\n{0xf1ab, false, \"language|dialect|idiom|localize|speech|translate|vernacular\"},\n{0xf109, false, \"laptop|computer|cpu|dell|demo|device|fabook|fb|laptop|mac|macbook|machine|pc|personal\"},\n{0xf5fc, false, \"laptop code|computer|cpu|dell|demo|develop|device|fabook|fb|mac|macbook|machine|mysql|pc|sql\"},\n{0xe51d, false, \"laptop file|computer|education|laptop|learning|remote work\"},\n{0xf812, false, \"laptop medical|computer|device|ehr|electronic health records|history\"},\n{0xe1c8, false, \"lari sign|Lari Sign|currency\"},\n{0xf5fd, false, \"layer group|arrange|category|develop|layers|map|platform|stack\"},\n{0xf06c, false, \"leaf|eco|flora|nature|plant|vegan\"},\n{0xf30a, false, \"left long|back|long-arrow-left|previous\"},\n{0xf337, false, \"left right|arrow|arrows-h|expand|horizontal|landscape|left-right arrow|resize|wide\"},\n{0xf094, false, \"lemon|citrus|fruit|lemon|lemonade|lime|tart\"},\n{0x3c, false, \"less than|Less-Than Sign|arithmetic|compare|math\"},\n{0xf537, false, \"less than equal|arithmetic|compare|math\"},\n{0xf1cd, false, \"life ring|coast guard|help|overboard|save|support\"},\n{0xf0eb, false, \"lightbulb|bulb|bulb|comic|comic|electric|electric|energy|idea|idea|innovation|inspiration|inspiration|light|light bulb|mechanical\"},\n{0xe51e, false, \"lines leaning|canted|domino|falling|resilience|resilient|tipped\"},\n{0xf0c1, false, \"link|attach|attachment|chain|connect|lin|link\"},\n{0xf127, false, \"link slash|attachment|chain|chain-broken|disabled|disconnect|remove\"},\n{0xf195, false, \"lira sign|Lira Sign|currency\"},\n{0xf03a, false, \"list|bullet|category|cheatsheet|checklist|completed|done|finished|ol|summary|todo|ul\"},\n{0xf0ae, false, \"list check|bullet|cheatsheet|checklist|downloading|downloads|enable|loading|progress|project management|settings|summary|to do|validate|working\"},\n{0xf0cb, false, \"list ol|cheatsheet|checklist|completed|done|finished|numbers|ol|summary|todo|ul\"},\n{0xf0ca, false, \"list ul|bullet|cheatsheet|checklist|completed|done|finished|ol|summary|survey|todo|ul\"},\n{0xe1d3, false, \"litecoin sign|currency\"},\n{0xf124, false, \"location arrow|address|compass|coordinate|direction|gps|map|navigation|place\"},\n{0xf601, false, \"location crosshairs|address|coordinate|direction|gps|location|map|navigation|place|where\"},\n{0xf3c5, false, \"location dot|address|coordinates|destination|gps|localize|location|map|navigation|paper|pin|place|point of interest|position|route|travel\"},\n{0xf041, false, \"location pin|address|coordinates|destination|gps|localize|location|map|navigation|paper|pin|place|point of interest|position|route|travel\"},\n{0xe51f, false, \"location pin lock|closed|lockdown|map|padlock|privacy|quarantine\"},\n{0xf023, false, \"lock|admin|closed|lock|locked|open|padlock|password|privacy|private|protect|security\"},\n{0xf3c1, false, \"lock open|admin|lock|open|padlock|password|privacy|private|protect|security|unlock\"},\n{0xe520, false, \"locust|horde|infestation|locust|plague|swarm\"},\n{0xf604, false, \"lungs|air|breath|covid-19|exhalation|inhalation|lungs|organ|respiration|respiratory\"},\n{0xe067, false, \"lungs virus|breath|coronavirus|covid-19|flu|infection|pandemic|respiratory|sick\"},\n{0x4d, false, \"m|Latin Capital Letter M|Latin Small Letter M|letter\"},\n{0xf076, false, \"magnet|Attract|attraction|horseshoe|lodestone|magnet|magnetic|tool\"},\n{0xf002, false, \"magnifying glass|bigger|enlarge|equipment|find|glass|inspection|magnifier|magnify|magnifying|magnifying glass tilted left|preview|search|tool|zoom\"},\n{0xe521, false, \"magnifying glass arrow right|find|magnifier|next|search\"},\n{0xe522, false, \"magnifying glass chart|analysis|chart|data|graph|intelligence|magnifier|market|revenue\"},\n{0xf688, false, \"magnifying glass dollar|bigger|enlarge|find|magnifier|magnify|money|preview|zoom\"},\n{0xf689, false, \"magnifying glass location|bigger|enlarge|find|magnifier|magnify|preview|zoom\"},\n{0xf010, false, \"magnifying glass minus|magnifier|minify|negative|smaller|zoom|zoom out\"},\n{0xf00e, false, \"magnifying glass plus|bigger|enlarge|magnifier|magnify|positive|zoom|zoom in\"},\n{0xe1d5, false, \"manat sign|Manat Sign|currency\"},\n{0xf279, false, \"map|address|coordinates|destination|gps|localize|location|map|navigation|paper|pin|place|point of interest|position|route|travel|world|world map\"},\n{0xf59f, false, \"map location|address|coordinates|destination|gps|localize|location|map|navigation|paper|pin|place|point of interest|position|route|travel\"},\n{0xf5a0, false, \"map location dot|address|coordinates|destination|gps|localize|location|map|navigation|paper|pin|place|point of interest|position|route|travel\"},\n{0xf276, false, \"map pin|address|agree|coordinates|destination|gps|localize|location|map|marker|navigation|pin|place|position|pushpin|round pushpin|travel\"},\n{0xf5a1, false, \"marker|design|edit|modify|sharpie|update|write\"},\n{0xf222, false, \"mars|gender|male|male sign|man\"},\n{0xf224, false, \"mars and venus|Male and Female Sign|female|gender|intersex|male|transgender\"},\n{0xe523, false, \"mars and venus burst|gender|uer|violence\"},\n{0xf227, false, \"mars double|Doubled Male Sign|gay|gender|male|men\"},\n{0xf229, false, \"mars stroke|Male with Stroke Sign|gender|transgender\"},\n{0xf22b, false, \"mars stroke right|Horizontal Male with Stroke Sign|gender\"},\n{0xf22a, false, \"mars stroke up|Vertical Male with Stroke Sign|gender\"},\n{0xf57b, false, \"martini glass|alcohol|bar|beverage|cocktail|cocktail glass|drink|glass|liquor\"},\n{0xf561, false, \"martini glass citrus|alcohol|beverage|drink|gin|glass|margarita|martini|vodka\"},\n{0xf000, false, \"martini glass empty|alcohol|bar|beverage|drink|liquor\"},\n{0xf6fa, false, \"mask|carnivale|costume|disguise|halloween|secret|super hero\"},\n{0xe1d7, false, \"mask face|breath|coronavirus|covid-19|filter|flu|infection|pandemic|respirator|virus\"},\n{0xe524, false, \"mask ventilator|breath|gas|mask|oxygen|respirator|ventilator\"},\n{0xf630, false, \"masks theater|art|comedy|mask|perform|performing|performing arts|theater|theatre|tragedy\"},\n{0xe525, false, \"mattress pillow|air mattress|mattress|pillow|rest|sleep\"},\n{0xf31e, false, \"maximize|arrows|bigger|enlarge|expand|fullscreen|maximize|resize|resize|scale|size\"},\n{0xf5a2, false, \"medal|award|guarantee|medal|quality|ribbon|sports medal|star|trophy|warranty\"},\n{0xf538, false, \"memory|DIMM|RAM|hardware|storage|technology\"},\n{0xf676, false, \"menorah|candle|hanukkah|jewish|judaism|light\"},\n{0xf223, false, \"mercury|Mercury|gender|hybrid|transgender\"},\n{0xf27a, false, \"message|answer|bubble|chat|commenting|conversation|conversation|discussion|feedback|message|note|notification|sms|speech|talk|talking|texting\"},\n{0xf753, false, \"meteor|armageddon|asteroid|comet|shooting star|space\"},\n{0xf2db, false, \"microchip|cpu|hardware|processor|technology\"},\n{0xf130, false, \"microphone|address|audio|information|podcast|public|record|sing|sound|talking|voice\"},\n{0xf3c9, false, \"microphone lines|audio|mic|microphone|music|podcast|record|sing|sound|studio|studio microphone|talking|voice\"},\n{0xf539, false, \"microphone lines slash|audio|disable|disabled|disconnect|disconnect|mute|podcast|record|sing|sound|voice\"},\n{0xf131, false, \"microphone slash|audio|disable|disabled|mute|podcast|record|sing|sound|voice\"},\n{0xf610, false, \"microscope|covid-19|electron|knowledge|lens|microscope|optics|science|shrink|testing|tool\"},\n{0xe1ed, false, \"mill sign|Mill Sign|currency\"},\n{0xf78c, false, \"minimize|collapse|fullscreen|minimize|move|resize|shrink|smaller\"},\n{0xf068, false, \"minus|En Dash|Minus Sign|collapse|delete|hide|math|minify|minus|negative|remove|sign|trash|−\"},\n{0xf7b5, false, \"mitten|clothing|cold|glove|hands|knitted|seasonal|warmth\"},\n{0xf3ce, false, \"mobile|android|call|cell|cell phone|device|mobile|mobile phone|number|phone|screen|telephone|text\"},\n{0xf10b, false, \"mobile button|apple|call|cell phone|device|iphone|number|screen|telephone\"},\n{0xe527, false, \"mobile retro|cellphone|cellular|phone\"},\n{0xf3cf, false, \"mobile screen|android|call|cell phone|device|number|screen|telephone|text\"},\n{0xf3cd, false, \"mobile screen button|apple|call|cell phone|device|iphone|number|screen|telephone\"},\n{0xf0d6, false, \"money bill|buy|cash|checkout|coupon|investment|money|payment|premium|price|purchase|revenue|salary\"},\n{0xf3d1, false, \"money bill 1|buy|cash|checkout|money|payment|premium|price|purchase|salary\"},\n{0xf53b, false, \"money bill 1 wave|buy|cash|checkout|money|payment|premium|price|purchase|salary\"},\n{0xe528, false, \"money bill transfer|bank|conversion|deposit|investment|money|salary|transfer|withdrawal\"},\n{0xe529, false, \"money bill trend up|bank|bonds|inflation|investment|market|revenue|salary|stocks|trade\"},\n{0xf53a, false, \"money bill wave|buy|cash|checkout|money|payment|premium|price|purchase|salary\"},\n{0xe52a, false, \"money bill wheat|agribusiness|agriculture|farming|food|investment|livelihood|subsidy\"},\n{0xe1f3, false, \"money bills|atm|cash|investment|money|moolah|premium|revenue|salary\"},\n{0xf53c, false, \"money check|bank check|buy|checkout|cheque|money|payment|price|purchase|salary\"},\n{0xf53d, false, \"money check dollar|bank check|buy|checkout|cheque|money|payment|price|purchase|salary\"},\n{0xf5a6, false, \"monument|building|historic|landmark|memorable\"},\n{0xf186, false, \"moon|Power Sleep Symbol|contrast|crescent|crescent moon|dark|lunar|moon|night\"},\n{0xf5a7, false, \"mortar pestle|crush|culinary|grind|medical|mix|pharmacy|prescription|spices\"},\n{0xf678, false, \"mosque|Muslim|building|islam|landmark|mosque|muslim|religion\"},\n{0xe52b, false, \"mosquito|bite|bug|mosquito|west nile\"},\n{0xe52c, false, \"mosquito net|bite|malaria|mosquito|net\"},\n{0xf21c, false, \"motorcycle|bike|machine|motorcycle|racing|transportation|vehicle\"},\n{0xe52d, false, \"mound|barrier|hill|pitcher|speedbump\"},\n{0xf6fc, false, \"mountain|cold|glacier|hiking|hill|landscape|mountain|snow|snow-capped mountain|travel|view\"},\n{0xe52e, false, \"mountain city|location|rural|urban\"},\n{0xe52f, false, \"mountain sun|country|hiking|landscape|rural|travel|view\"},\n{0xf7b6, false, \"mug hot|beverage|caliente|cocoa|coffee|cup|drink|holiday|hot|hot beverage|hot chocolate|steam|steaming|tea|warmth\"},\n{0xf0f4, false, \"mug saucer|beverage|breakfast|cafe|drink|fall|morning|mug|seasonal|tea\"},\n{0xf001, false, \"music|lyrics|melody|music|musical note|note|sing|sound\"},\n{0x4e, false, \"n|Latin Capital Letter N|Latin Small Letter N|letter|nay|no\"},\n{0xe1f6, false, \"naira sign|Naira Sign|currency\"},\n{0xf6ff, false, \"network wired|computer|connect|ethernet|internet|intranet\"},\n{0xf22c, false, \"neuter|Neuter|gender\"},\n{0xf1ea, false, \"newspaper|article|editorial|headline|journal|journalism|news|newsletter|newspaper|paper|press\"},\n{0xf53e, false, \"not equal|arithmetic|compare|math\"},\n{0xe1fe, false, \"notdef|404|close|missing|not found\"},\n{0xf249, false, \"note sticky|message|note|paper|reminder|sticker\"},\n{0xf481, false, \"notes medical|clipboard|doctor|ehr|health|history|records\"},\n{0x4f, false, \"o|Latin Capital Letter O|Latin Small Letter O|letter\"},\n{0xf247, false, \"object group|combine|copy|design|merge|select\"},\n{0xf248, false, \"object ungroup|copy|design|merge|select|separate\"},\n{0xf613, false, \"oil can|auto|crude|gasoline|grease|lubricate|petroleum\"},\n{0xe532, false, \"oil well|drill|oil|rig\"},\n{0xf679, false, \"om|Hindu|buddhism|hinduism|jainism|mantra|om|religion\"},\n{0xf700, false, \"otter|animal|badger|fauna|fishing|fur|mammal|marten|otter|playful\"},\n{0xf03b, false, \"outdent|align|justify|paragraph|tab\"},\n{0x50, false, \"p|Latin Capital Letter P|Latin Small Letter P|letter\"},\n{0xf815, false, \"pager|beeper|cell phone|communication|page|pager\"},\n{0xf5aa, false, \"paint roller|acrylic|art|brush|color|fill|maintenance|paint|pigment|watercolor\"},\n{0xf1fc, false, \"paintbrush|acrylic|art|brush|color|fill|modify|paint|paintbrush|painting|pigment|watercolor\"},\n{0xf53f, false, \"palette|acrylic|art|artist palette|brush|color|fill|museum|paint|painting|palette|pigment|watercolor\"},\n{0xf482, false, \"pallet|archive|box|inventory|shipping|warehouse\"},\n{0xe209, false, \"panorama|image|img|landscape|photo|wide\"},\n{0xf1d8, false, \"paper plane|air|float|fold|mail|paper|send\"},\n{0xf0c6, false, \"paperclip|attach|attachment|connect|link|papercli|paperclip\"},\n{0xf4cd, false, \"parachute box|aid|assistance|goods|relief|rescue|supplies\"},\n{0xf1dd, false, \"paragraph|Pilcrow Sign|edit|format|text|writing\"},\n{0xf5ab, false, \"passport|document|id|identification|issued|travel\"},\n{0xf0ea, false, \"paste|clipboard|copy|document|paper\"},\n{0xf04c, false, \"pause|bar|double|hold|pause|pause button|vertical|wait\"},\n{0xf1b0, false, \"paw|animal|cat|dog|pet|print\"},\n{0xf67c, false, \"peace|peace|peace symbol|serenity|tranquility|truce|war\"},\n{0xf304, false, \"pen|ballpoint|design|edit|modify|pen|update|write\"},\n{0xf305, false, \"pen clip|design|edit|modify|update|write\"},\n{0xf5ac, false, \"pen fancy|black nib|design|edit|fountain|fountain pen|modify|nib|pen|update|write\"},\n{0xf5ad, false, \"pen nib|design|edit|fountain pen|modify|update|write\"},\n{0xf5ae, false, \"pen ruler|design|draft|draw|maintenance|modify|pencil\"},\n{0xf044, false, \"pen to square|edit|modify|pen|pencil|update|write\"},\n{0xf303, false, \"pencil|Lower Left Pencil|design|draw|edit|lead|maintenance|modify|pencil|update|write\"},\n{0xe068, false, \"people arrows|conversation|discussion|distance|insert|isolation|separate|social distancing|talk|talking|together|uer|users-people\"},\n{0xf4ce, false, \"people carry box|together|uer|users-people\"},\n{0xe533, false, \"people group|crowd|family|group|team|together|uer\"},\n{0xe534, false, \"people line|crowd|group|need|together|uer\"},\n{0xe535, false, \"people pulling|forced return|together|uer|yanking\"},\n{0xe536, false, \"people robbery|criminal|hands up|looting|robbery|steal|uer\"},\n{0xe537, false, \"people roof|crowd|family|group|manage|people|safe|shelter|together|uer\"},\n{0xf816, false, \"pepper hot|buffalo wings|capsicum|chili|chilli|habanero|hot|hot pepper|jalapeno|mexican|pepper|spicy|tabasco|vegetable\"},\n{0x25, false, \"percent|Percent Sign|discount|fraction|proportion|rate|ratio\"},\n{0xf183, false, \"person|default|man|person standing|stand|standing|uer|woman\"},\n{0xe538, false, \"person arrow down to line|ground|indigenous|insert|native|uer\"},\n{0xe539, false, \"person arrow up from line|population|rise|uer|upgrade\"},\n{0xf84a, false, \"person biking|bicycle|bike|biking|cyclist|pedal|person biking|summer|uer|wheel\"},\n{0xf756, false, \"person booth|changing room|curtain|uer|vote|voting\"},\n{0xe53a, false, \"person breastfeeding|baby|child|infant|mother|nutrition|parent|sustenance|uer\"},\n{0xe53b, false, \"person burst|abuse|accident|crash|explode|uer|violence\"},\n{0xe53c, false, \"person cane|aging|cane|elderly|old|staff|uer\"},\n{0xe53d, false, \"person chalkboard|blackboard|instructor|keynote|lesson|presentation|teacher|uer\"},\n{0xe53e, false, \"person circle check|approved|enable|not affected|ok|okay|uer|validate|working\"},\n{0xe53f, false, \"person circle exclamation|affected|alert|failed|lost|missing|uer\"},\n{0xe540, false, \"person circle minus|delete|remove|uer\"},\n{0xe541, false, \"person circle plus|add|follow|found|uer\"},\n{0xe542, false, \"person circle question|faq|lost|missing|request|uer\"},\n{0xe543, false, \"person circle xmark|dead|removed|uer|uncheck\"},\n{0xf85e, false, \"person digging|bury|construction|debris|dig|maintenance|men at work|uer\"},\n{0xf470, false, \"person dots from line|allergy|diagnosis|uer\"},\n{0xf182, false, \"person dress|man|skirt|uer|woman\"},\n{0xe544, false, \"person dress burst|abuse|accident|crash|explode|uer|violence\"},\n{0xe545, false, \"person drowning|drown|emergency|swim|uer\"},\n{0xe546, false, \"person falling|accident|fall|trip|uer\"},\n{0xe547, false, \"person falling burst|accident|crash|death|fall|homicide|murder|uer\"},\n{0xe548, false, \"person half dress|gender|man|restroom|transgender|uer|woman\"},\n{0xe549, false, \"person harassing|abuse|scream|shame|shout|uer|yell\"},\n{0xf6ec, false, \"person hiking|autumn|fall|follow|hike|mountain|outdoors|summer|uer|walk\"},\n{0xe54a, false, \"person military pointing|army|customs|guard|uer\"},\n{0xe54b, false, \"person military rifle|armed forces|army|military|rifle|uer|war\"},\n{0xe54c, false, \"person military to person|civilian|coordination|military|uer\"},\n{0xf683, false, \"person praying|kneel|place of worship|religion|thank|uer|worship\"},\n{0xe31e, false, \"person pregnant|baby|birth|child|parent|pregnant|pregnant woman|uer|woman\"},\n{0xe54d, false, \"person rays|affected|focus|shine|uer\"},\n{0xe54e, false, \"person rifle|army|combatant|gun|military|rifle|uer|war\"},\n{0xf70c, false, \"person running|exit|flee|follow|marathon|person running|race|running|uer|workout\"},\n{0xe54f, false, \"person shelter|house|inside|roof|safe|safety|shelter|uer\"},\n{0xf7c5, false, \"person skating|figure skating|ice|olympics|rink|skate|uer|winter\"},\n{0xf7c9, false, \"person skiing|downhill|olympics|ski|skier|snow|uer|winter\"},\n{0xf7ca, false, \"person skiing nordic|cross country|olympics|uer|winter\"},\n{0xf7ce, false, \"person snowboarding|olympics|ski|snow|snowboard|snowboarder|uer|winter\"},\n{0xf5c4, false, \"person swimming|ocean|person swimming|pool|sea|swim|uer|water\"},\n{0xe5a9, false, \"person through window|door|exit|forced entry|leave|robbery|steal|uer|window\"},\n{0xf554, false, \"person walking|crosswalk|exercise|follow|hike|move|person walking|uer|walk|walking|workout\"},\n{0xe551, false, \"person walking arrow loop left|follow|population return|return|uer\"},\n{0xe552, false, \"person walking arrow right|exit|follow|internally displaced|leave|refugee|uer\"},\n{0xe553, false, \"person walking dashed line arrow right|exit|follow|refugee|uer\"},\n{0xe554, false, \"person walking luggage|bag|baggage|briefcase|carry-on|deployment|follow|rolling|uer\"},\n{0xf29d, false, \"person walking with cane|blind|cane|follow|uer\"},\n{0xe221, false, \"peseta sign|Peseta Sign|currency\"},\n{0xe222, false, \"peso sign|Peso Sign|currency\"},\n{0xf095, false, \"phone|Left Hand Telephone Receiver|call|earphone|number|phone|receiver|support|talking|telephone|telephone receiver|voice\"},\n{0xf879, false, \"phone flip|Right Hand Telephone Receiver|call|earphone|number|support|telephone|voice\"},\n{0xf3dd, false, \"phone slash|call|cancel|disabled|disconnect|earphone|mute|number|support|telephone|voice\"},\n{0xf2a0, false, \"phone volume|call|earphone|number|ring|ringing|sound|support|talking|telephone|voice|volume-control-phone\"},\n{0xf87c, false, \"photo film|av|film|image|library|media\"},\n{0xf4d3, false, \"piggy bank|bank|salary|save|savings\"},\n{0xf484, false, \"pills|drugs|medicine|prescription|tablets\"},\n{0xf818, false, \"pizza slice|cheese|chicago|italian|mozzarella|new york|pepperoni|pie|slice|teenage mutant ninja turtles|tomato\"},\n{0xf67f, false, \"place of worship|building|church|holy|mosque|synagogue\"},\n{0xf072, false, \"plane|airplane|airport|destination|fly|location|mode|travel|trip\"},\n{0xf5af, false, \"plane arrival|aeroplane|airplane|airplane arrival|airport|arrivals|arriving|destination|fly|land|landing|location|mode|travel|trip\"},\n{0xe555, false, \"plane circle check|airplane|airport|enable|flight|fly|not affected|ok|okay|travel|validate|working\"},\n{0xe556, false, \"plane circle exclamation|affected|airplane|airport|failed|flight|fly|travel\"},\n{0xe557, false, \"plane circle xmark|airplane|airport|destroy|flight|fly|travel|uncheck\"},\n{0xf5b0, false, \"plane departure|aeroplane|airplane|airplane departure|airport|check-in|departing|departure|departures|destination|fly|location|mode|take off|taking off|travel|trip\"},\n{0xe558, false, \"plane lock|airplane|airport|closed|flight|fly|lockdown|padlock|privacy|quarantine|travel\"},\n{0xe069, false, \"plane slash|airplane mode|airport|canceled|covid-19|delayed|disabled|grounded|travel\"},\n{0xe22d, false, \"plane up|airplane|airport|internet|signal|sky|wifi|wireless\"},\n{0xe5aa, false, \"plant wilt|drought|planting|vegetation|wilt\"},\n{0xe55a, false, \"plate wheat|bowl|hunger|rations|wheat\"},\n{0xf04b, false, \"play|arrow|audio|music|play|play button|playing|right|sound|start|triangle|video\"},\n{0xf1e6, false, \"plug|connect|electric|electric plug|electricity|online|plug|power\"},\n{0xe55b, false, \"plug circle bolt|electric|electricity|plug|power\"},\n{0xe55c, false, \"plug circle check|electric|electricity|enable|not affected|ok|okay|plug|power|validate|working\"},\n{0xe55d, false, \"plug circle exclamation|affected|electric|electricity|failed|plug|power\"},\n{0xe55e, false, \"plug circle minus|disconnect|electric|electricity|plug|power\"},\n{0xe55f, false, \"plug circle plus|electric|electricity|plug|power\"},\n{0xe560, false, \"plug circle xmark|destroy|disconnect|electric|electricity|outage|plug|power|uncheck\"},\n{0x2b, false, \"plus|+|Plus Sign|add|create|expand|follow|math|modify|new|plus|positive|shape|sign\"},\n{0xe43c, false, \"plus minus|Plus-Minus Sign|add|math|subtract\"},\n{0xf2ce, false, \"podcast|audio|broadcast|music|sound\"},\n{0xf2fe, false, \"poo|crap|dung|face|monster|pile of poo|poo|poop|shit|smile|turd|uer\"},\n{0xf75a, false, \"poo storm|bolt|cloud|euphemism|lightning|mess|poop|shit|turd\"},\n{0xf619, false, \"poop|crap|poop|shit|smile|turd\"},\n{0xf011, false, \"power off|Power Symbol|cancel|computer|on|reboot|restart\"},\n{0xf5b1, false, \"prescription|drugs|medical|medicine|pharmacy|rx\"},\n{0xf485, false, \"prescription bottle|drugs|medical|medicine|pharmacy|rx\"},\n{0xf486, false, \"prescription bottle medical|drugs|medical|medicine|pharmacy|rx\"},\n{0xf02f, false, \"print|Print Screen Symbol|Printer Icon|business|computer|copy|document|office|paper|printer\"},\n{0xe06a, false, \"pump medical|anti-bacterial|clean|covid-19|disinfect|hygiene|medical grade|sanitizer|soap\"},\n{0xe06b, false, \"pump soap|anti-bacterial|clean|covid-19|disinfect|hygiene|sanitizer|soap\"},\n{0xf12e, false, \"puzzle piece|add-on|addon|clue|game|interlocking|jigsaw|piece|puzzle|puzzle piece|section\"},\n{0x51, false, \"q|Latin Capital Letter Q|Latin Small Letter Q|letter\"},\n{0xf029, false, \"qrcode|barcode|info|information|scan\"},\n{0x3f, false, \"question|?|Question Mark|faq|help|information|mark|outlined|punctuation|question|red question mark|request|support|unknown|white question mark\"},\n{0xf10d, false, \"quote left|Left Double Quotation Mark|mention|note|phrase|text|type\"},\n{0xf10e, false, \"quote right|Right Double Quotation Mark|mention|note|phrase|text|type\"},\n{0x52, false, \"r|Latin Capital Letter R|Latin Small Letter R|letter\"},\n{0xf7b9, false, \"radiation|danger|dangerous|deadly|hazard|nuclear|radioactive|warning\"},\n{0xf8d7, false, \"radio|am|broadcast|fm|frequency|music|news|radio|receiver|transmitter|tuner|video\"},\n{0xf75b, false, \"rainbow|gold|leprechaun|prism|rain|rainbow|sky\"},\n{0xe561, false, \"ranking star|chart|first place|podium|quality|rank|revenue|win\"},\n{0xf543, false, \"receipt|accounting|bookkeeping|check|coupon|evidence|invoice|money|pay|proof|receipt|table\"},\n{0xf8d9, false, \"record vinyl|LP|album|analog|music|phonograph|sound\"},\n{0xf641, false, \"rectangle ad|advertisement|media|newspaper|promotion|publicity\"},\n{0xf022, false, \"rectangle list|cheatsheet|checklist|completed|done|finished|ol|summary|todo|ul\"},\n{0xf410, false, \"rectangle xmark|browser|cancel|computer|development|uncheck\"},\n{0xf1b8, false, \"recycle|Recycling Symbol For Generic Materials|Universal Recycling Symbol|Waste|compost|garbage|recycle|recycling symbol|reuse|trash\"},\n{0xf25d, false, \"registered|copyright|mark|r|registered|trademark\"},\n{0xf363, false, \"repeat|arrow|clockwise|flip|reload|renew|repeat|repeat button|retry|rewind|switch\"},\n{0xf3e5, false, \"reply|mail|message|respond\"},\n{0xf122, false, \"reply all|mail|message|respond\"},\n{0xf75e, false, \"republican|american|conservative|election|elephant|politics|republican party|right|right-wing|usa\"},\n{0xf7bd, false, \"restroom|bathroom|toilet|uer|water closet|wc\"},\n{0xf079, false, \"retweet|refresh|reload|renew|retry|share|swap\"},\n{0xf4d6, false, \"ribbon|badge|cause|celebration|lapel|pin|reminder|reminder ribbon|ribbon\"},\n{0xf2f5, false, \"right from bracket|arrow|exit|leave|log out|logout|sign-out\"},\n{0xf362, false, \"right left|arrow|arrows|exchange|reciprocate|return|swap|transfer\"},\n{0xf30b, false, \"right long|forward|long-arrow-right|next\"},\n{0xf2f6, false, \"right to bracket|arrow|enter|join|log in|login|sign in|sign up|sign-in|signin|signup\"},\n{0xf70b, false, \"ring|Dungeons & Dragons|Gollum|band|binding|d&d|dnd|engagement|fantasy|gold|jewelry|marriage|precious|premium\"},\n{0xf018, false, \"road|highway|map|motorway|pavement|road|route|street|travel\"},\n{0xe562, false, \"road barrier|block|border|no entry|roadblock\"},\n{0xe563, false, \"road bridge|bridge|infrastructure|road|travel\"},\n{0xe564, false, \"road circle check|enable|freeway|highway|not affected|ok|okay|pavement|road|validate|working\"},\n{0xe565, false, \"road circle exclamation|affected|failed|freeway|highway|pavement|road\"},\n{0xe566, false, \"road circle xmark|destroy|freeway|highway|pavement|road|uncheck\"},\n{0xe567, false, \"road lock|closed|freeway|highway|lockdown|padlock|pavement|privacy|quarantine|road\"},\n{0xe568, false, \"road spikes|barrier|roadblock|spikes\"},\n{0xf544, false, \"robot|android|automate|computer|cyborg|face|monster|robot\"},\n{0xf135, false, \"rocket|aircraft|app|jet|launch|nasa|space\"},\n{0xf2f1, false, \"rotate|arrow|clockwise|exchange|modify|refresh|reload|renew|retry|rotate|swap|withershins\"},\n{0xf2ea, false, \"rotate left|back|control z|exchange|oops|return|swap\"},\n{0xf2f9, false, \"rotate right|forward|refresh|reload|renew|repeat|retry\"},\n{0xf4d7, false, \"route|directions|navigation|travel\"},\n{0xf09e, false, \"rss|blog|feed|journal|news|writing\"},\n{0xf158, false, \"ruble sign|Ruble Sign|currency\"},\n{0xe569, false, \"rug|blanket|carpet|rug|textile\"},\n{0xf545, false, \"ruler|design|draft|length|measure|planning|ruler|straight edge|straight ruler\"},\n{0xf546, false, \"ruler combined|design|draft|length|measure|planning\"},\n{0xf547, false, \"ruler horizontal|design|draft|length|measure|planning\"},\n{0xf548, false, \"ruler vertical|design|draft|length|measure|planning\"},\n{0xf156, false, \"rupee sign|Rupee Sign|currency\"},\n{0xe23d, false, \"rupiah sign|currency\"},\n{0x53, false, \"s|Latin Capital Letter S|Latin Small Letter S|letter\"},\n{0xf81d, false, \"sack dollar|bag|burlap|cash|dollar|investment|money|money bag|moneybag|premium|robber|salary|santa|usd\"},\n{0xe56a, false, \"sack xmark|bag|burlap|coupon|rations|salary|uncheck\"},\n{0xe445, false, \"sailboat|dinghy|mast|sailboat|sailing|yacht\"},\n{0xf7bf, false, \"satellite|communications|hardware|orbit|satellite|space\"},\n{0xf7c0, false, \"satellite dish|SETI|antenna|communications|dish|hardware|radar|receiver|satellite|satellite antenna|saucer|signal|space\"},\n{0xf24e, false, \"scale balanced|Libra|balance|balance scale|balanced|justice|law|legal|measure|rule|scale|weight|zodiac\"},\n{0xf515, false, \"scale unbalanced|justice|legal|measure|unbalanced|weight\"},\n{0xf516, false, \"scale unbalanced flip|justice|legal|measure|unbalanced|weight\"},\n{0xf549, false, \"school|building|education|learn|school|student|teacher\"},\n{0xe56b, false, \"school circle check|enable|not affected|ok|okay|schoolhouse|validate|working\"},\n{0xe56c, false, \"school circle exclamation|affected|failed|schoolhouse\"},\n{0xe56d, false, \"school circle xmark|destroy|schoolhouse|uncheck\"},\n{0xe56e, false, \"school flag|educate|flag|school|schoolhouse\"},\n{0xe56f, false, \"school lock|closed|lockdown|padlock|privacy|quarantine|schoolhouse\"},\n{0xf0c4, false, \"scissors|Black Safety Scissors|White Scissors|clip|cutting|equipment|modify|scissors|snip|tool\"},\n{0xf54a, false, \"screwdriver|admin|configuration|equipment|fix|maintenance|mechanic|modify|repair|screw|screwdriver|settings|tool\"},\n{0xf7d9, false, \"screwdriver wrench|admin|configuration|equipment|fix|maintenance|modify|repair|screwdriver|settings|tools|wrench\"},\n{0xf70e, false, \"scroll|Dungeons & Dragons|announcement|d&d|dnd|fantasy|paper|scholar|script|scroll\"},\n{0xf6a0, false, \"scroll torah|book|jewish|judaism|religion|scroll\"},\n{0xf7c2, false, \"sd card|image|img|memory|photo|save\"},\n{0xe447, false, \"section|Section Sign|law|legal|silcrow\"},\n{0xf4d8, false, \"seedling|environment|flora|grow|investment|plant|sapling|seedling|vegan|young\"},\n{0xf233, false, \"server|computer|cpu|database|hardware|mysql|network|sql\"},\n{0xf61f, false, \"shapes|blocks|build|circle|square|triangle\"},\n{0xf064, false, \"share|forward|save|send|social\"},\n{0xf14d, false, \"share from square|forward|save|send|social\"},\n{0xf1e0, false, \"share nodes|forward|save|send|social\"},\n{0xe571, false, \"sheet plastic|plastic|plastic wrap|protect|tarp|tarpaulin|waterproof\"},\n{0xf20b, false, \"shekel sign|New Sheqel Sign|currency|ils|money\"},\n{0xf132, false, \"shield|achievement|armor|award|block|cleric|defend|defense|holy|paladin|protect|safety|security|shield|weapon|winner\"},\n{0xe572, false, \"shield cat|animal|feline|pet|protect|safety|veterinary\"},\n{0xe573, false, \"shield dog|animal|canine|pet|protect|safety|veterinary\"},\n{0xf3ed, false, \"shield halved|achievement|armor|award|block|cleric|defend|defense|holy|paladin|privacy|security|shield|weapon|winner\"},\n{0xe574, false, \"shield heart|love|protect|safe|safety|shield|wishlist\"},\n{0xe06c, false, \"shield virus|antibodies|barrier|coronavirus|covid-19|flu|health|infection|pandemic|protect|safety|vaccine\"},\n{0xf21a, false, \"ship|boat|passenger|sea|ship|water\"},\n{0xf553, false, \"shirt|clothing|fashion|garment|shirt|short sleeve|t-shirt|tshirt\"},\n{0xf54b, false, \"shoe prints|feet|footprints|steps|walk\"},\n{0xf54f, false, \"shop|bodega|building|buy|market|purchase|shopping|store\"},\n{0xe4a5, false, \"shop lock|bodega|building|buy|closed|lock|lockdown|market|padlock|privacy|purchase|quarantine|shop|shopping|store\"},\n{0xe070, false, \"shop slash|building|buy|closed|covid-19|disabled|purchase|shopping\"},\n{0xf2cc, false, \"shower|bath|clean|faucet|shower|water\"},\n{0xe448, false, \"shrimp|allergy|crustacean|prawn|seafood|shellfish|shrimp|tail\"},\n{0xf074, false, \"shuffle|arrow|arrows|crossed|shuffle|shuffle tracks button|sort|swap|switch|transfer\"},\n{0xf197, false, \"shuttle space|astronaut|machine|nasa|rocket|space|transportation\"},\n{0xf4d9, false, \"sign hanging|directions|real estate|signage|wayfinding\"},\n{0xf012, false, \"signal|antenna|antenna bars|bar|bars|cell|graph|mobile|online|phone|reception|status\"},\n{0xf5b7, false, \"signature|John Hancock|cursive|name|username|writing\"},\n{0xf277, false, \"signs post|directions|directory|map|signage|wayfinding\"},\n{0xf7c4, false, \"sim card|hard drive|hardware|portable|storage|technology|tiny\"},\n{0xe06d, false, \"sink|bathroom|covid-19|faucet|kitchen|wash\"},\n{0xf0e8, false, \"sitemap|directory|hierarchy|ia|information architecture|organization\"},\n{0xf54c, false, \"skull|bones|death|face|fairy tale|monster|skeleton|skull|uer|x-ray|yorick\"},\n{0xf714, false, \"skull crossbones|Black Skull and Crossbones|Dungeons & Dragons|alert|bones|crossbones|d&d|danger|dangerous area|dead|deadly|death|dnd|face|fantasy|halloween|holiday|jolly-roger|monster|pirate|poison|skeleton|skull|skull and crossbones|warning\"},\n{0xf715, false, \"slash|cancel|close|mute|off|stop|x\"},\n{0xf7cc, false, \"sleigh|christmas|claus|fly|holiday|santa|sled|snow|xmas\"},\n{0xf1de, false, \"sliders|adjust|configuration|modify|settings|sliders|toggle\"},\n{0xf75f, false, \"smog|dragon|fog|haze|pollution|smoke|weather\"},\n{0xf48d, false, \"smoking|cancer|cigarette|nicotine|smoking|smoking status|tobacco\"},\n{0xf2dc, false, \"snowflake|Heavy Chevron Snowflake|cold|precipitation|rain|snow|snowfall|snowflake|winter\"},\n{0xf7d0, false, \"snowman|cold|decoration|frost|frosty|holiday|snow|snowman|snowman without snow\"},\n{0xf7d2, false, \"snowplow|clean up|cold|road|storm|winter\"},\n{0xe06e, false, \"soap|bar|bathing|bubbles|clean|cleaning|covid-19|hygiene|lather|soap|soapdish|wash\"},\n{0xf696, false, \"socks|business socks|business time|clothing|feet|flight of the conchords|socks|stocking|wednesday\"},\n{0xf5ba, false, \"solar panel|clean|eco-friendly|energy|green|sun\"},\n{0xf0dc, false, \"sort|filter|order\"},\n{0xf0dd, false, \"sort down|arrow|descending|filter|insert|order|sort-desc\"},\n{0xf0de, false, \"sort up|arrow|ascending|filter|order|sort-asc|upgrade\"},\n{0xf5bb, false, \"spa|flora|massage|mindfulness|plant|wellness\"},\n{0xf67b, false, \"spaghetti monster flying|agnosticism|atheism|flying spaghetti monster|fsm\"},\n{0xf891, false, \"spell check|dictionary|edit|editor|enable|grammar|text|validate|working\"},\n{0xf717, false, \"spider|arachnid|bug|charlotte|crawl|eight|halloween|insect|spider\"},\n{0xf110, false, \"spinner|circle|loading|pending|progress\"},\n{0xf5bc, false, \"splotch|Ink|blob|blotch|glob|stain\"},\n{0xf2e5, false, \"spoon|cutlery|dining|scoop|silverware|spoon|tableware\"},\n{0xf5bd, false, \"spray can|Paint|aerosol|design|graffiti|tag\"},\n{0xf5d0, false, \"spray can sparkles|car|clean|deodorize|fresh|pine|scent\"},\n{0xf0c8, false, \"square|Black Square|black medium square|block|box|geometric|shape|square|white medium square\"},\n{0xf14c, false, \"square arrow up right|diagonal|new|open|send|share\"},\n{0xe69b, false, \"square binary|ai|data|language|llm|model|programming|token\"},\n{0xf150, false, \"square caret down|arrow|caret-square-o-down|dropdown|expand|insert|menu|more|triangle\"},\n{0xf191, false, \"square caret left|arrow|back|caret-square-o-left|previous|triangle\"},\n{0xf152, false, \"square caret right|arrow|caret-square-o-right|forward|next|triangle\"},\n{0xf151, false, \"square caret up|arrow|caret-square-o-up|collapse|triangle|upgrade|upload\"},\n{0xf14a, false, \"square check|accept|agree|box|button|check|check box with check|check mark button|checkmark|confirm|correct|coupon|done|enable|mark|ok|select|success|tick|todo|validate|working|yes|✓\"},\n{0xf199, false, \"square envelope|e-mail|email|letter|mail|message|notification|offer|support\"},\n{0xf45c, false, \"square full|black large square|block|blue|blue square|box|brown|brown square|geometric|green|green square|orange|orange square|purple|purple square|red|red square|shape|square|white large square|yellow|yellow square\"},\n{0xf0fd, false, \"square h|directions|emergency|hospital|hotel|letter|map\"},\n{0xf146, false, \"square minus|collapse|delete|hide|minify|negative|remove|shape|trash\"},\n{0xe576, false, \"square nfi|non-food item|supplies\"},\n{0xf540, false, \"square parking|auto|car|garage|meter|parking\"},\n{0xf14b, false, \"square pen|edit|modify|pencil-square|update|write\"},\n{0xe577, false, \"square person confined|captivity|confined|uer\"},\n{0xf098, false, \"square phone|call|earphone|number|support|telephone|voice\"},\n{0xf87b, false, \"square phone flip|call|earphone|number|support|telephone|voice\"},\n{0xf0fe, false, \"square plus|add|create|expand|new|positive|shape\"},\n{0xf682, false, \"square poll horizontal|chart|graph|results|statistics|survey|trend|vote|voting\"},\n{0xf681, false, \"square poll vertical|chart|graph|results|revenue|statistics|survey|trend|vote|voting\"},\n{0xf698, false, \"square root variable|arithmetic|calculus|division|math\"},\n{0xf143, false, \"square rss|blog|feed|journal|news|writing\"},\n{0xf1e1, false, \"square share nodes|forward|save|send|social\"},\n{0xf360, false, \"square up right|arrow|diagonal|direction|external-link-square|intercardinal|new|northeast|open|share|up-right arrow\"},\n{0xe578, false, \"square virus|coronavirus|covid-19|disease|flu|infection|pandemic\"},\n{0xf2d3, false, \"square xmark|close|cross|cross mark button|incorrect|mark|notice|notification|notify|problem|square|uncheck|window|wrong|x|×\"},\n{0xe579, false, \"staff snake|asclepius|asklepian|health|serpent|wellness\"},\n{0xe289, false, \"stairs|exit|steps|up\"},\n{0xf5bf, false, \"stamp|art|certificate|imprint|rubber|seal\"},\n{0xe5af, false, \"stapler|desktop|milton|office|paperclip|staple\"},\n{0xf005, false, \"star|achievement|award|favorite|important|night|quality|rating|score|star|vip\"},\n{0xf699, false, \"star and crescent|Muslim|islam|muslim|religion|star and crescent\"},\n{0xf089, false, \"star half|achievement|award|rating|score|star-half-empty|star-half-full\"},\n{0xf5c0, false, \"star half stroke|achievement|award|rating|score|star-half-empty|star-half-full\"},\n{0xf69a, false, \"star of david|David|Jew|Jewish|jewish|judaism|religion|star|star of David\"},\n{0xf621, false, \"star of life|doctor|emt|first aid|health|medical\"},\n{0xf154, false, \"sterling sign|Pound Sign|currency\"},\n{0xf0f1, false, \"stethoscope|covid-19|diagnosis|doctor|general practitioner|heart|hospital|infirmary|medicine|office|outpatient|stethoscope\"},\n{0xf04d, false, \"stop|block|box|square|stop|stop button\"},\n{0xf2f2, false, \"stopwatch|clock|reminder|stopwatch|time|waiting\"},\n{0xe06f, false, \"stopwatch 20|ABCs|countdown|covid-19|happy birthday|i will survive|reminder|seconds|time|timer\"},\n{0xf54e, false, \"store|bodega|building|buy|market|purchase|shopping|store\"},\n{0xe071, false, \"store slash|building|buy|closed|covid-19|disabled|purchase|shopping\"},\n{0xf21d, false, \"street view|directions|location|map|navigation|uer\"},\n{0xf0cc, false, \"strikethrough|cancel|edit|font|format|modify|text|type\"},\n{0xf551, false, \"stroopwafel|caramel|cookie|dessert|sweets|waffle\"},\n{0xf12c, false, \"subscript|edit|font|format|text|type\"},\n{0xf0f2, false, \"suitcase|baggage|luggage|move|packing|suitcase|travel|trip\"},\n{0xf0fa, false, \"suitcase medical|first aid|firstaid|health|help|medical|supply|support\"},\n{0xf5c1, false, \"suitcase rolling|baggage|luggage|move|suitcase|travel|trip\"},\n{0xf185, false, \"sun|bright|brighten|contrast|day|lighter|rays|sol|solar|star|sun|sunny|weather\"},\n{0xe57a, false, \"sun plant wilt|arid|droop|drought\"},\n{0xf12b, false, \"superscript|edit|exponential|font|format|text|type\"},\n{0xf5c3, false, \"swatchbook|Pantone|color|design|hue|palette\"},\n{0xf69b, false, \"synagogue|Jew|Jewish|building|jewish|judaism|religion|star of david|synagogue|temple\"},\n{0xf48e, false, \"syringe|covid-19|doctor|immunizations|medical|medicine|needle|shot|sick|syringe|vaccinate|vaccine\"},\n{0x54, false, \"t|Latin Capital Letter T|Latin Small Letter T|letter\"},\n{0xf0ce, false, \"table|category|data|excel|spreadsheet\"},\n{0xf00a, false, \"table cells|blocks|boxes|category|excel|grid|spreadsheet|squares\"},\n{0xe678, false, \"table cells column lock|blocks|boxes|category|column|excel|grid|lock|spreadsheet|squares\"},\n{0xf009, false, \"table cells large|blocks|boxes|category|excel|grid|spreadsheet|squares\"},\n{0xe67a, false, \"table cells row lock|blocks|boxes|category|column|column|excel|grid|lock|lock|spreadsheet|squares\"},\n{0xe691, false, \"table cells row unlock|blocks|boxes|category|column|column|excel|grid|lock|lock|spreadsheet|squares|unlock\"},\n{0xf0db, false, \"table columns|browser|category|dashboard|organize|panes|split\"},\n{0xf00b, false, \"table list|category|cheatsheet|checklist|completed|done|finished|ol|summary|todo|ul\"},\n{0xf45d, false, \"table tennis paddle ball|ball|bat|game|paddle|ping pong|table tennis\"},\n{0xf3fb, false, \"tablet|device|kindle|screen\"},\n{0xf10a, false, \"tablet button|apple|device|ipad|kindle|screen\"},\n{0xf3fa, false, \"tablet screen button|apple|device|ipad|kindle|screen\"},\n{0xf490, false, \"tablets|drugs|medicine|pills|prescription\"},\n{0xf566, false, \"tachograph digital|data|distance|speed|tachometer\"},\n{0xf02b, false, \"tag|discount|labe|label|price|shopping\"},\n{0xf02c, false, \"tags|discount|label|price|shopping\"},\n{0xf4db, false, \"tape|design|package|sticky\"},\n{0xe57b, false, \"tarp|protection|tarp|tent|waterproof\"},\n{0xe57c, false, \"tarp droplet|protection|tarp|tent|waterproof\"},\n{0xf1ba, false, \"taxi|cab|cabbie|car|car service|lyft|machine|oncoming|oncoming taxi|taxi|transportation|travel|uber|vehicle\"},\n{0xf62e, false, \"teeth|bite|dental|dentist|gums|mouth|smile|tooth\"},\n{0xf62f, false, \"teeth open|dental|dentist|gums bite|mouth|smile|tooth\"},\n{0xe03f, false, \"temperature arrow down|air conditioner|cold|heater|mercury|thermometer|winter\"},\n{0xe040, false, \"temperature arrow up|air conditioner|cold|heater|mercury|thermometer|winter\"},\n{0xf2cb, false, \"temperature empty|cold|mercury|status|temperature\"},\n{0xf2c7, false, \"temperature full|fever|hot|mercury|status|temperature\"},\n{0xf2c9, false, \"temperature half|mercury|status|temperature|thermometer|weather\"},\n{0xf769, false, \"temperature high|cook|covid-19|mercury|summer|thermometer|warm\"},\n{0xf76b, false, \"temperature low|cold|cool|covid-19|mercury|thermometer|winter\"},\n{0xf2ca, false, \"temperature quarter|mercury|status|temperature\"},\n{0xf2c8, false, \"temperature three quarters|mercury|status|temperature\"},\n{0xf7d7, false, \"tenge sign|Tenge Sign|currency\"},\n{0xe57d, false, \"tent|bivouac|campground|campsite|refugee|shelter|tent\"},\n{0xe57e, false, \"tent arrow down to line|bivouac|campground|campsite|permanent|refugee|refugee|shelter|shelter|tent\"},\n{0xe57f, false, \"tent arrow left right|bivouac|campground|campsite|refugee|refugee|shelter|shelter|tent|transition\"},\n{0xe580, false, \"tent arrow turn left|bivouac|campground|campsite|refugee|refugee|shelter|shelter|temporary|tent\"},\n{0xe581, false, \"tent arrows down|bivouac|campground|campsite|insert|refugee|refugee|shelter|shelter|spontaneous|tent\"},\n{0xe582, false, \"tents|bivouac|bivouac|campground|campground|campsite|refugee|refugee|shelter|shelter|tent|tent\"},\n{0xf120, false, \"terminal|code|coding|command|console|development|prompt|terminal\"},\n{0xf034, false, \"text height|edit|font|format|modify|text|type\"},\n{0xf87d, false, \"text slash|cancel|disabled|font|format|remove|style|text\"},\n{0xf035, false, \"text width|edit|font|format|modify|text|type\"},\n{0xf491, false, \"thermometer|covid-19|mercury|status|temperature\"},\n{0xf165, false, \"thumbs down|-1|disagree|disapprove|dislike|down|hand|social|thumb|thumbs down|thumbs-o-down\"},\n{0xf164, false, \"thumbs up|+1|agree|approve|favorite|hand|like|ok|okay|social|success|thumb|thumbs up|thumbs-o-up|up|yes|you got it dude\"},\n{0xf08d, false, \"thumbtack|Black Pushpin|coordinates|location|marker|pin|pushpin|thumb-tack\"},\n{0xe68f, false, \"thumbtack slash|Black Pushpin|coordinates|location|marker|pin|pushpin|thumb-tack|unpin\"},\n{0xf145, false, \"ticket|admission|admission tickets|coupon|movie|pass|support|ticket|voucher\"},\n{0xf3ff, false, \"ticket simple|admission|coupon|movie|pass|support|ticket|voucher\"},\n{0xe29c, false, \"timeline|chronological|deadline|history|linear\"},\n{0xf204, false, \"toggle off|button|off|on|switch\"},\n{0xf205, false, \"toggle on|button|off|on|switch\"},\n{0xf7d8, false, \"toilet|bathroom|flush|john|loo|pee|plumbing|poop|porcelain|potty|restroom|throne|toile|toilet|washroom|waste|wc\"},\n{0xf71e, false, \"toilet paper|bathroom|covid-19|halloween|holiday|lavatory|paper towels|prank|privy|restroom|roll|roll of paper|toilet|toilet paper|wipe\"},\n{0xe072, false, \"toilet paper slash|bathroom|covid-19|disabled|halloween|holiday|lavatory|leaves|prank|privy|restroom|roll|toilet|trouble|ut oh|wipe\"},\n{0xe583, false, \"toilet portable|outhouse|toilet\"},\n{0xe584, false, \"toilets portable|outhouse|toilet\"},\n{0xf552, false, \"toolbox|admin|chest|configuration|container|equipment|fix|maintenance|mechanic|modify|repair|settings|tool|toolbox|tools\"},\n{0xf5c9, false, \"tooth|bicuspid|dental|dentist|molar|mouth|teeth|tooth\"},\n{0xf6a1, false, \"torii gate|building|religion|shinto|shinto shrine|shintoism|shrine\"},\n{0xf76f, false, \"tornado|cloud|cyclone|dorothy|landspout|tornado|toto|twister|vortext|waterspout|weather|whirlwind\"},\n{0xf519, false, \"tower broadcast|airwaves|antenna|communication|emergency|radio|reception|signal|waves\"},\n{0xe585, false, \"tower cell|airwaves|antenna|communication|radio|reception|signal|waves\"},\n{0xe586, false, \"tower observation|fire tower|view\"},\n{0xf722, false, \"tractor|agriculture|farm|tractor|vehicle\"},\n{0xf25c, false, \"trademark|copyright|mark|register|symbol|tm|trade mark|trademark\"},\n{0xf637, false, \"traffic light|direction|go|light|road|signal|slow|stop|traffic|travel|vertical traffic light\"},\n{0xe041, false, \"trailer|carry|haul|moving|travel\"},\n{0xf238, false, \"train|bullet|commute|locomotive|railway|subway|train\"},\n{0xf239, false, \"train subway|machine|railway|train|transportation|vehicle\"},\n{0xe5b4, false, \"train tram|crossing|machine|mountains|seasonal|tram|transportation|trolleybus\"},\n{0xf225, false, \"transgender|female|gender|intersex|male|transgender|transgender symbol\"},\n{0xf1f8, false, \"trash|delete|garbage|hide|remove\"},\n{0xf829, false, \"trash arrow up|back|control z|delete|garbage|hide|oops|remove|undo|upgrade\"},\n{0xf2ed, false, \"trash can|delete|garbage|hide|remove|trash-o\"},\n{0xf82a, false, \"trash can arrow up|back|control z|delete|garbage|hide|oops|remove|undo|upgrade\"},\n{0xf1bb, false, \"tree|bark|evergreen tree|fall|flora|forest|investment|nature|plant|seasonal|tree\"},\n{0xe587, false, \"tree city|building|city|urban\"},\n{0xf071, false, \"triangle exclamation|alert|attention|danger|error|failed|important|notice|notification|notify|problem|required|warnin|warning\"},\n{0xf091, false, \"trophy|achievement|award|cup|game|prize|trophy|winner\"},\n{0xe589, false, \"trowel|build|construction|equipment|maintenance|tool\"},\n{0xe58a, false, \"trowel bricks|build|construction|maintenance|reconstruction|tool\"},\n{0xf0d1, false, \"truck|Black Truck|cargo|delivery|delivery truck|shipping|truck|vehicle\"},\n{0xe58b, false, \"truck arrow right|access|fast|shipping|transport\"},\n{0xe58c, false, \"truck droplet|blood|thirst|truck|water|water supply\"},\n{0xf48b, false, \"truck fast|express|fedex|mail|overnight|package|quick|ups\"},\n{0xe58d, false, \"truck field|supplies|truck\"},\n{0xe58e, false, \"truck field un|supplies|truck|united nations\"},\n{0xe2b7, false, \"truck front|shuttle|truck|van\"},\n{0xf0f9, false, \"truck medical|ambulance|clinic|covid-19|emergency|emt|er|help|hospital|mobile|support|vehicle\"},\n{0xf63b, false, \"truck monster|offroad|vehicle|wheel\"},\n{0xf4df, false, \"truck moving|cargo|inventory|rental|vehicle\"},\n{0xf63c, false, \"truck pickup|cargo|maintenance|pick-up|pickup|pickup truck|truck|vehicle\"},\n{0xe58f, false, \"truck plane|airplane|plane|transportation|truck|vehicle\"},\n{0xf4de, false, \"truck ramp box|box|cargo|delivery|inventory|moving|rental|vehicle\"},\n{0xf1e4, false, \"tty|communication|deaf|telephone|teletypewriter|text\"},\n{0xe2bb, false, \"turkish lira sign|Turkish Lira Sign|currency\"},\n{0xf3be, false, \"turn down|arrow|down|level-down|right arrow curving down\"},\n{0xf3bf, false, \"turn up|arrow|level-up|right arrow curving up\"},\n{0xf26c, false, \"tv|computer|display|monitor|television\"},\n{0x55, false, \"u|Latin Capital Letter U|Latin Small Letter U|letter\"},\n{0xf0e9, false, \"umbrella|protection|rain|storm|wet\"},\n{0xf5ca, false, \"umbrella beach|beach|beach with umbrella|protection|recreation|sand|shade|summer|sun|umbrella\"},\n{0xf0cd, false, \"underline|edit|emphasis|format|modify|text|writing\"},\n{0xf29a, false, \"universal access|uer|users-people\"},\n{0xf09c, false, \"unlock|admin|lock|open|padlock|password|privacy|private|protect|unlock|unlocked\"},\n{0xf13e, false, \"unlock keyhole|admin|lock|padlock|password|privacy|private|protect\"},\n{0xf338, false, \"up down|Up Down Black Arrow|arrow|arrows-v|expand|portrait|resize|tall|up-down arrow|vertical\"},\n{0xf0b2, false, \"up down left right|arrow|arrows|bigger|enlarge|expand|fullscreen|move|position|reorder|resize\"},\n{0xf30c, false, \"up long|long-arrow-up|upgrade|upload\"},\n{0xf424, false, \"up right and down left from center|arrows|bigger|enlarge|expand|fullscreen|maximize|resize|resize|scale|size\"},\n{0xf35d, false, \"up right from square|external-link|new|open|share|upgrade\"},\n{0xf093, false, \"upload|hard drive|import|publish|upgrade\"},\n{0xf007, false, \"user|adult|bust|bust in silhouette|default|employee|gender-neutral|person|profile|silhouette|uer|unspecified gender|username|users-people\"},\n{0xf4fb, false, \"user astronaut|avatar|clothing|cosmonaut|nasa|space|suit|uer\"},\n{0xf4fc, false, \"user check|employee|enable|uer|users-people|validate|working\"},\n{0xf4fd, false, \"user clock|employee|uer|users-people\"},\n{0xf0f0, false, \"user doctor|covid-19|health|job|medical|nurse|occupation|physician|profile|surgeon|uer|worker\"},\n{0xf4fe, false, \"user gear|employee|together|uer|users-people\"},\n{0xf501, false, \"user graduate|uer|users-people\"},\n{0xf500, false, \"user group|bust|busts in silhouette|crowd|employee|silhouette|together|uer|users-people\"},\n{0xf728, false, \"user injured|employee|uer|users-people\"},\n{0xf406, false, \"user large|employee|uer|users-people\"},\n{0xf4fa, false, \"user large slash|disabled|disconnect|employee|uer|users-people\"},\n{0xf502, false, \"user lock|employee|padlock|privacy|uer|users-people\"},\n{0xf503, false, \"user minus|delete|employee|negative|remove|uer\"},\n{0xf504, false, \"user ninja|assassin|avatar|dangerous|deadly|fighter|hidden|ninja|sneaky|stealth|uer\"},\n{0xf82f, false, \"user nurse|covid-19|doctor|health|md|medical|midwife|physician|practitioner|surgeon|uer|worker\"},\n{0xf4ff, false, \"user pen|employee|modify|uer|users-people\"},\n{0xf234, false, \"user plus|add|avatar|employee|follow|positive|sign up|signup|team|uer\"},\n{0xf21b, false, \"user secret|detective|sleuth|spy|uer|users-people\"},\n{0xf505, false, \"user shield|employee|protect|safety|uer\"},\n{0xf506, false, \"user slash|ban|delete|deny|disabled|disconnect|employee|remove|uer\"},\n{0xf507, false, \"user tag|employee|uer|users-people\"},\n{0xf508, false, \"user tie|administrator|avatar|business|clothing|employee|formal|offer|portfolio|professional|suit|uer\"},\n{0xf235, false, \"user xmark|archive|delete|employee|remove|uer|uncheck|x\"},\n{0xf0c0, false, \"users|employee|together|uer|users-people\"},\n{0xe591, false, \"users between lines|covered|crowd|employee|group|people|together|uer\"},\n{0xf509, false, \"users gear|employee|uer|users-people\"},\n{0xe592, false, \"users line|crowd|employee|group|need|people|together|uer\"},\n{0xe593, false, \"users rays|affected|crowd|employee|focused|group|people|uer\"},\n{0xe594, false, \"users rectangle|crowd|employee|focus|group|people|reached|uer\"},\n{0xe073, false, \"users slash|disabled|disconnect|employee|together|uer|users-people\"},\n{0xe595, false, \"users viewfinder|crowd|focus|group|people|targeted|uer\"},\n{0xf2e7, false, \"utensils|cooking|cutlery|dining|dinner|eat|food|fork|fork and knife|knife|restaurant\"},\n{0x56, false, \"v|Latin Capital Letter V|Latin Small Letter V|letter\"},\n{0xf5b6, false, \"van shuttle|airport|bus|machine|minibus|public-transportation|transportation|travel|vehicle\"},\n{0xe2c5, false, \"vault|bank|important|investment|lock|money|premium|privacy|safe|salary\"},\n{0xf5cb, false, \"vector square|anchors|lines|object|render|shape\"},\n{0xf221, false, \"venus|female|female sign|gender|woman\"},\n{0xf226, false, \"venus double|Doubled Female Sign|female|gender|lesbian\"},\n{0xf228, false, \"venus mars|Interlocked Female and Male Sign|female|gender|heterosexual|male\"},\n{0xe085, false, \"vest|biker|fashion|style\"},\n{0xe086, false, \"vest patches|biker|fashion|style\"},\n{0xf492, false, \"vial|ampule|chemist|chemistry|experiment|knowledge|lab|sample|science|test|test tube\"},\n{0xe596, false, \"vial circle check|ampule|chemist|chemistry|enable|not affected|ok|okay|success|test tube|tube|vaccine|validate|working\"},\n{0xe597, false, \"vial virus|ampule|coronavirus|covid-19|flue|infection|lab|laboratory|pandemic|test|test tube|vaccine\"},\n{0xf493, false, \"vials|ampule|experiment|knowledge|lab|sample|science|test|test tube\"},\n{0xf03d, false, \"video|camera|film|movie|record|video-camera\"},\n{0xf4e2, false, \"video slash|add|create|disabled|disconnect|film|new|positive|record|video\"},\n{0xf6a7, false, \"vihara|buddhism|buddhist|building|monastery\"},\n{0xe074, false, \"virus|bug|coronavirus|covid-19|flu|health|infection|pandemic|sick|vaccine|viral\"},\n{0xe4a8, false, \"virus covid|bug|covid-19|flu|health|infection|pandemic|vaccine|viral|virus\"},\n{0xe4a9, false, \"virus covid slash|bug|covid-19|disabled|flu|health|infection|pandemic|vaccine|viral|virus\"},\n{0xe075, false, \"virus slash|bug|coronavirus|covid-19|cure|disabled|eliminate|flu|health|infection|pandemic|sick|vaccine|viral\"},\n{0xe076, false, \"viruses|bugs|coronavirus|covid-19|flu|health|infection|multiply|pandemic|sick|spread|vaccine|viral\"},\n{0xf897, false, \"voicemail|answer|inbox|message|phone\"},\n{0xf770, false, \"volcano|caldera|eruption|lava|magma|mountain|smoke|volcano\"},\n{0xf45f, false, \"volleyball|ball|beach|game|olympics|sport|volleyball\"},\n{0xf028, false, \"volume high|audio|higher|loud|louder|music|sound|speaker|speaker high volume\"},\n{0xf027, false, \"volume low|audio|lower|music|quieter|soft|sound|speaker|speaker low volume\"},\n{0xf026, false, \"volume off|audio|ban|music|mute|quiet|silent|sound\"},\n{0xf6a9, false, \"volume xmark|audio|music|quiet|sound|speaker\"},\n{0xf729, false, \"vr cardboard|3d|augment|google|reality|virtual\"},\n{0x57, false, \"w|Latin Capital Letter W|Latin Small Letter W|letter\"},\n{0xf8ef, false, \"walkie talkie|communication|copy|intercom|over|portable|radio|two way radio\"},\n{0xf555, false, \"wallet|billfold|cash|currency|money|salary\"},\n{0xf0d0, false, \"wand magic|autocomplete|automatic|mage|magic|spell|wand|witch|wizard\"},\n{0xe2ca, false, \"wand magic sparkles|auto|magic|magic wand|trick|witch|wizard\"},\n{0xf72b, false, \"wand sparkles|autocomplete|automatic|fantasy|halloween|holiday|magic|weapon|witch|wizard\"},\n{0xf494, false, \"warehouse|building|capacity|garage|inventory|storage\"},\n{0xf773, false, \"water|lake|liquid|ocean|sea|swim|wet\"},\n{0xf5c5, false, \"water ladder|ladder|recreation|swim|water\"},\n{0xf83e, false, \"wave square|frequency|pulse|signal\"},\n{0xe682, false, \"web awesome|awesome|coding|components|crown|web\"},\n{0xf5cd, false, \"weight hanging|anvil|heavy|measurement\"},\n{0xf496, false, \"weight scale|health|measurement|scale|weight\"},\n{0xe2cd, false, \"wheat awn|agriculture|autumn|fall|farming|grain\"},\n{0xe598, false, \"wheat awn circle exclamation|affected|failed|famine|food|gluten|hunger|starve|straw\"},\n{0xf193, false, \"wheelchair|disabled|uer|users-people\"},\n{0xe2ce, false, \"wheelchair move|access|disabled|handicap|impairment|physical|uer|wheelchair symbol\"},\n{0xf7a0, false, \"whiskey glass|alcohol|bar|beverage|bourbon|drink|glass|liquor|neat|rye|scotch|shot|tumbler|tumbler glass|whisky\"},\n{0xf1eb, false, \"wifi|connection|hotspot|internet|network|signal|wireless|www\"},\n{0xf72e, false, \"wind|air|blow|breeze|fall|seasonal|weather\"},\n{0xf2d0, false, \"window maximize|Maximize|browser|computer|development|expand\"},\n{0xf2d1, false, \"window minimize|Minimize|browser|collapse|computer|development\"},\n{0xf2d2, false, \"window restore|browser|computer|development\"},\n{0xf72f, false, \"wine bottle|alcohol|beverage|cabernet|drink|glass|grapes|merlot|sauvignon\"},\n{0xf4e3, false, \"wine glass|alcohol|bar|beverage|cabernet|drink|glass|grapes|merlot|sauvignon|wine|wine glass\"},\n{0xf5ce, false, \"wine glass empty|alcohol|beverage|cabernet|drink|grapes|merlot|sauvignon\"},\n{0xf159, false, \"won sign|Won Sign|currency\"},\n{0xe599, false, \"worm|dirt|garden|worm|wriggle\"},\n{0xf0ad, false, \"wrench|configuration|construction|equipment|fix|mechanic|modify|plumbing|settings|spanner|tool|update|wrench\"},\n{0x58, false, \"x|Latin Capital Letter X|Latin Small Letter X|letter|uncheck\"},\n{0xf497, false, \"x ray|health|medical|radiological images|radiology|skeleton\"},\n{0xf00d, false, \"xmark|Cancellation X|Multiplication Sign|Multiplication X|cancel|close|cross|cross mark|error|exit|incorrect|mark|multiplication|multiply|notice|notification|notify|problem|sign|uncheck|wrong|x|×\"},\n{0xe59a, false, \"xmarks lines|barricade|barrier|fence|poison|roadblock\"},\n{0x59, false, \"y|Latin Capital Letter Y|Latin Small Letter Y|letter|yay|yes\"},\n{0xf157, false, \"yen sign|Yen Sign|currency\"},\n{0xf6ad, false, \"yin yang|daoism|opposites|religion|tao|taoism|taoist|yang|yin|yin yang\"},\n{0x5a, false, \"z|Latin Capital Letter Z|Latin Small Letter Z|letter\"},\n{0xe080, true, \"42.group\"},\n{0xf26e, true, \"500px\"},\n{0xf368, true, \"accessible icon|accessibility|disabled|handicap|person|uer|wheelchair|wheelchair-alt\"},\n{0xf369, true, \"accusoft\"},\n{0xf170, true, \"app.net\"},\n{0xf36a, true, \"adversal\"},\n{0xf36b, true, \"affiliatetheme\"},\n{0xf834, true, \"airbnb\"},\n{0xf36c, true, \"algolia\"},\n{0xf642, true, \"alipay\"},\n{0xf270, true, \"amazon\"},\n{0xf42c, true, \"amazon pay\"},\n{0xf36d, true, \"amilia\"},\n{0xf17b, true, \"android|robot\"},\n{0xf209, true, \"angellist\"},\n{0xf36e, true, \"angry creative\"},\n{0xf420, true, \"angular\"},\n{0xf36f, true, \"app store\"},\n{0xf370, true, \"ios app store\"},\n{0xf371, true, \"apper systems ab\"},\n{0xf179, true, \"apple|fruit|ios|mac|operating system|os|osx\"},\n{0xf415, true, \"apple pay\"},\n{0xf77a, true, \"artstation\"},\n{0xf372, true, \"asymmetrik, ltd.\"},\n{0xf77b, true, \"atlassian\"},\n{0xf373, true, \"audible\"},\n{0xf41c, true, \"autoprefixer\"},\n{0xf374, true, \"avianex\"},\n{0xf421, true, \"aviato\"},\n{0xf375, true, \"amazon web services (aws)\"},\n{0xf2d5, true, \"bandcamp\"},\n{0xf835, true, \"battle.net\"},\n{0xf1b4, true, \"behance\"},\n{0xe3d9, true, \"bilibili\"},\n{0xf378, true, \"bimobject\"},\n{0xf171, true, \"bitbucket|atlassian|bitbucket-square|git\"},\n{0xf379, true, \"bitcoin\"},\n{0xf37a, true, \"bity\"},\n{0xf27e, true, \"font awesome black tie|administrator\"},\n{0xf37b, true, \"blackberry\"},\n{0xf37c, true, \"blogger\"},\n{0xf37d, true, \"blogger b\"},\n{0xe671, true, \"bluesky|social network\"},\n{0xf293, true, \"bluetooth|signal\"},\n{0xf294, true, \"bluetooth\"},\n{0xf836, true, \"bootstrap\"},\n{0xe340, true, \"bots\"},\n{0xe63c, true, \"brave\"},\n{0xe63d, true, \"brave reverse\"},\n{0xf15a, true, \"btc\"},\n{0xf837, true, \"buffer\"},\n{0xf37f, true, \"büromöbel-experte gmbh & co. kg.\"},\n{0xf8a6, true, \"buy n large\"},\n{0xf20d, true, \"buysellads\"},\n{0xf785, true, \"canadian maple leaf|canada|flag|flora|nature|plant\"},\n{0xf42d, true, \"amazon pay credit card\"},\n{0xf1f3, true, \"cc amex|amex\"},\n{0xf416, true, \"apple pay credit card\"},\n{0xf24c, true, \"diner's club credit card\"},\n{0xf1f2, true, \"discover credit card\"},\n{0xf24b, true, \"jcb credit card\"},\n{0xf1f1, true, \"mastercard credit card\"},\n{0xf1f4, true, \"paypal credit card\"},\n{0xf1f5, true, \"stripe credit card\"},\n{0xf1f0, true, \"visa credit card\"},\n{0xf380, true, \"centercode\"},\n{0xf789, true, \"centos|linux|operating system|os\"},\n{0xf268, true, \"chrome|browser\"},\n{0xf838, true, \"chromecast\"},\n{0xe07d, true, \"cloudflare\"},\n{0xf383, true, \"cloudscale.ch\"},\n{0xf384, true, \"cloudsmith\"},\n{0xf385, true, \"cloudversify\"},\n{0xe360, true, \"cmplid\"},\n{0xf1cb, true, \"codepen\"},\n{0xf284, true, \"codie pie\"},\n{0xf78d, true, \"confluence|atlassian\"},\n{0xf20e, true, \"connect develop\"},\n{0xf26d, true, \"contao\"},\n{0xf89e, true, \"cotton bureau|clothing|t-shirts|tshirts\"},\n{0xf388, true, \"cpanel\"},\n{0xf25e, true, \"creative commons\"},\n{0xf4e7, true, \"creative commons attribution\"},\n{0xf4e8, true, \"creative commons noncommercial\"},\n{0xf4e9, true, \"creative commons noncommercial (euro sign)\"},\n{0xf4ea, true, \"creative commons noncommercial (yen sign)\"},\n{0xf4eb, true, \"creative commons no derivative works\"},\n{0xf4ec, true, \"creative commons public domain\"},\n{0xf4ed, true, \"alternate creative commons public domain\"},\n{0xf4ee, true, \"creative commons remix\"},\n{0xf4ef, true, \"creative commons share alike\"},\n{0xf4f0, true, \"creative commons sampling\"},\n{0xf4f1, true, \"creative commons sampling +\"},\n{0xf4f2, true, \"creative commons share\"},\n{0xf4f3, true, \"creative commons cc0\"},\n{0xf6c9, true, \"critical role|Dungeons & Dragons|d&d|dnd|fantasy|game|gaming|tabletop\"},\n{0xe6a2, true, \"css|rebecca purple\"},\n{0xf13c, true, \"css 3 logo|code\"},\n{0xf38b, true, \"alternate css3 logo\"},\n{0xf38c, true, \"cuttlefish\"},\n{0xf38d, true, \"dungeons & dragons\"},\n{0xf6ca, true, \"d&d beyond|Dungeons & Dragons|d&d|dnd|fantasy|gaming|tabletop\"},\n{0xe052, true, \"dailymotion\"},\n{0xe693, true, \"dart lang\"},\n{0xf210, true, \"dashcube\"},\n{0xe60b, true, \"debian\"},\n{0xe077, true, \"deezer\"},\n{0xf1a5, true, \"delicious\"},\n{0xf38e, true, \"deploy.dog\"},\n{0xf38f, true, \"deskpro\"},\n{0xf6cc, true, \"dev\"},\n{0xf1bd, true, \"deviantart\"},\n{0xf790, true, \"dhl|Dalsey|Hillblom and Lynn|german|package|shipping\"},\n{0xf791, true, \"diaspora\"},\n{0xf1a6, true, \"digg logo\"},\n{0xf391, true, \"digital ocean\"},\n{0xf392, true, \"discord\"},\n{0xf393, true, \"discourse\"},\n{0xf394, true, \"dochub\"},\n{0xf395, true, \"docker\"},\n{0xf396, true, \"draft2digital\"},\n{0xf17d, true, \"dribbble\"},\n{0xf16b, true, \"dropbox\"},\n{0xf1a9, true, \"drupal logo\"},\n{0xf399, true, \"dyalog\"},\n{0xf39a, true, \"earlybirds\"},\n{0xf4f4, true, \"ebay\"},\n{0xf282, true, \"edge browser|browser|ie\"},\n{0xe078, true, \"edge legacy browser\"},\n{0xf430, true, \"elementor\"},\n{0xf5f1, true, \"ello\"},\n{0xf423, true, \"ember\"},\n{0xf1d1, true, \"galactic empire\"},\n{0xf299, true, \"envira gallery|leaf\"},\n{0xf39d, true, \"erlang\"},\n{0xf42e, true, \"ethereum\"},\n{0xf2d7, true, \"etsy\"},\n{0xf839, true, \"evernote\"},\n{0xf23e, true, \"expeditedssl\"},\n{0xf09a, true, \"facebook|fabook|facebook-official|fb|social network\"},\n{0xf39e, true, \"facebook f|fabook|facebook|fb\"},\n{0xf39f, true, \"facebook messenger|fabook|fb\"},\n{0xf6dc, true, \"fantasy flight-games|Dungeons & Dragons|d&d|dnd|fantasy|game|gaming|tabletop\"},\n{0xf797, true, \"fedex|Federal Express|package|shipping\"},\n{0xf798, true, \"fedora|linux|operating system|os\"},\n{0xf799, true, \"figma|app|design|interface\"},\n{0xe69f, true, \"files pinwheel\"},\n{0xf269, true, \"firefox|browser\"},\n{0xe007, true, \"firefox browser|browser\"},\n{0xf2b0, true, \"first order\"},\n{0xf50a, true, \"alternate first order\"},\n{0xf3a1, true, \"firstdraft\"},\n{0xf16e, true, \"flickr\"},\n{0xf44d, true, \"flipboard\"},\n{0xe694, true, \"flutter\"},\n{0xf417, true, \"fly\"},\n{0xf2b4, true, \"font awesome|awesome|flag|font|icons|typeface\"},\n{0xf280, true, \"fonticons\"},\n{0xf3a2, true, \"fonticons fi\"},\n{0xf286, true, \"fort awesome|castle\"},\n{0xf3a3, true, \"alternate fort awesome|castle\"},\n{0xf211, true, \"forumbee\"},\n{0xf180, true, \"foursquare\"},\n{0xf2c5, true, \"freecodecamp\"},\n{0xf3a4, true, \"freebsd\"},\n{0xf50b, true, \"fulcrum\"},\n{0xf50c, true, \"galactic republic|politics|star wars\"},\n{0xf50d, true, \"galactic senate|star wars\"},\n{0xf265, true, \"get pocket\"},\n{0xf260, true, \"gg currency\"},\n{0xf261, true, \"gg currency circle\"},\n{0xf1d3, true, \"git\"},\n{0xf841, true, \"git alt\"},\n{0xf09b, true, \"github|octocat\"},\n{0xf113, true, \"alternate github|octocat\"},\n{0xf3a6, true, \"gitkraken\"},\n{0xf296, true, \"gitlab|Axosoft\"},\n{0xf426, true, \"gitter\"},\n{0xf2a5, true, \"glide\"},\n{0xf2a6, true, \"glide g\"},\n{0xf3a7, true, \"gofore\"},\n{0xe40f, true, \"go\"},\n{0xf3a8, true, \"goodreads\"},\n{0xf3a9, true, \"goodreads g\"},\n{0xf1a0, true, \"google logo\"},\n{0xf3aa, true, \"google drive\"},\n{0xe079, true, \"google pay\"},\n{0xf3ab, true, \"google play|playstore\"},\n{0xf2b3, true, \"google plus|google-plus-circle|google-plus-official\"},\n{0xf0d5, true, \"google plus g|google-plus|social network\"},\n{0xe63b, true, \"google scholar\"},\n{0xf1ee, true, \"google wallet\"},\n{0xf184, true, \"gratipay (gittip)|favorite|heart|like|love\"},\n{0xf2d6, true, \"grav\"},\n{0xf3ac, true, \"gripfire, inc.\"},\n{0xf3ad, true, \"grunt\"},\n{0xe07e, true, \"guilded\"},\n{0xf3ae, true, \"gulp\"},\n{0xf1d4, true, \"hacker news\"},\n{0xf5f7, true, \"hackerrank\"},\n{0xe499, true, \"hashnode\"},\n{0xf452, true, \"hips\"},\n{0xf3b0, true, \"hireahelper\"},\n{0xe07f, true, \"hive blockchain network\"},\n{0xf427, true, \"hooli\"},\n{0xf592, true, \"hornbill\"},\n{0xf3b1, true, \"hotjar\"},\n{0xf27c, true, \"houzz\"},\n{0xf13b, true, \"html 5 logo\"},\n{0xf3b2, true, \"hubspot\"},\n{0xe013, true, \"ideal\"},\n{0xf2d8, true, \"imdb\"},\n{0xf16d, true, \"instagram\"},\n{0xe081, true, \"instalod\"},\n{0xf7af, true, \"intercom|app|customer|messenger\"},\n{0xf26b, true, \"internet-explorer|browser|ie\"},\n{0xf7b0, true, \"invision|app|design|interface\"},\n{0xf208, true, \"ioxhost\"},\n{0xf83a, true, \"itch.io\"},\n{0xf3b4, true, \"itunes\"},\n{0xf3b5, true, \"itunes note\"},\n{0xf4e4, true, \"java\"},\n{0xf50e, true, \"jedi order|star wars\"},\n{0xf3b6, true, \"jenkis\"},\n{0xf7b1, true, \"jira|atlassian\"},\n{0xf3b7, true, \"joget\"},\n{0xf1aa, true, \"joomla logo\"},\n{0xf3b8, true, \"javascript (js)\"},\n{0xf1cc, true, \"jsfiddle\"},\n{0xe67b, true, \"jxl\"},\n{0xf5fa, true, \"kaggle\"},\n{0xf4f5, true, \"keybase\"},\n{0xf3ba, true, \"keycdn\"},\n{0xf3bb, true, \"kickstarter\"},\n{0xf3bc, true, \"kickstarter k\"},\n{0xf42f, true, \"korvue\"},\n{0xf3bd, true, \"laravel\"},\n{0xf202, true, \"last.fm\"},\n{0xf212, true, \"leanpub\"},\n{0xf41d, true, \"less\"},\n{0xe62d, true, \"letterboxd\"},\n{0xf3c0, true, \"line\"},\n{0xf08c, true, \"linkedin|linkedin-square|linkin\"},\n{0xf0e1, true, \"linkedin in|linkedin|linkin\"},\n{0xf2b8, true, \"linode\"},\n{0xf17c, true, \"linux|tux\"},\n{0xf3c3, true, \"lyft\"},\n{0xf3c4, true, \"magento\"},\n{0xf59e, true, \"mailchimp\"},\n{0xf50f, true, \"mandalorian\"},\n{0xf60f, true, \"markdown\"},\n{0xf4f6, true, \"mastodon\"},\n{0xf136, true, \"maxcdn\"},\n{0xf8ca, true, \"material design for bootstrap\"},\n{0xf3c6, true, \"medapps\"},\n{0xf23a, true, \"medium\"},\n{0xf3c8, true, \"mrt\"},\n{0xf2e0, true, \"meetup\"},\n{0xf5a3, true, \"megaport\"},\n{0xf7b3, true, \"mendeley\"},\n{0xe49b, true, \"meta\"},\n{0xe01a, true, \"micro.blog\"},\n{0xf3ca, true, \"microsoft\"},\n{0xe62f, true, \"mintbit\"},\n{0xf3cb, true, \"mix\"},\n{0xf289, true, \"mixcloud\"},\n{0xe056, true, \"mixer\"},\n{0xf3cc, true, \"mizuni\"},\n{0xf285, true, \"modx\"},\n{0xf3d0, true, \"monero\"},\n{0xf3d2, true, \"napster\"},\n{0xf612, true, \"neos\"},\n{0xe530, true, \"nfc directional|connect|data|near field communication|nfc|scan|signal|transfer|wireless\"},\n{0xe531, true, \"nfc symbol|connect|data|near field communication|nfc|scan|signal|transfer|wireless\"},\n{0xf5a8, true, \"nimblr\"},\n{0xf419, true, \"node.js\"},\n{0xf3d3, true, \"node.js js\"},\n{0xf3d4, true, \"npm\"},\n{0xf3d5, true, \"ns8\"},\n{0xf3d6, true, \"nutritionix\"},\n{0xe082, true, \"octopus deploy\"},\n{0xf263, true, \"odnoklassniki\"},\n{0xe5c6, true, \"odysee\"},\n{0xf510, true, \"old republic|politics|star wars\"},\n{0xf23d, true, \"opencart\"},\n{0xf19b, true, \"openid\"},\n{0xe62b, true, \"opensuse\"},\n{0xf26a, true, \"opera\"},\n{0xf23c, true, \"optin monster\"},\n{0xf8d2, true, \"orcid\"},\n{0xf41a, true, \"open source initiative\"},\n{0xe4a0, true, \"padlet\"},\n{0xf3d7, true, \"page4 corporation\"},\n{0xf18c, true, \"pagelines|eco|flora|leaf|leaves|nature|plant|tree\"},\n{0xf3d8, true, \"palfed\"},\n{0xf3d9, true, \"patreon\"},\n{0xf1ed, true, \"paypal\"},\n{0xe083, true, \"perbyte\"},\n{0xf3da, true, \"periscope\"},\n{0xf3db, true, \"phabricator\"},\n{0xf3dc, true, \"phoenix framework\"},\n{0xf511, true, \"phoenix squadron\"},\n{0xf457, true, \"php\"},\n{0xf2ae, true, \"pied piper logo\"},\n{0xf1a8, true, \"alternate pied piper logo (old)\"},\n{0xf4e5, true, \"pied piper hat (old)|clothing\"},\n{0xf1a7, true, \"pied piper pp logo (old)\"},\n{0xf0d2, true, \"pinterest\"},\n{0xf231, true, \"pinterest p\"},\n{0xe43a, true, \"pix\"},\n{0xe640, true, \"pixiv\"},\n{0xf3df, true, \"playstation\"},\n{0xf288, true, \"product hunt\"},\n{0xf3e1, true, \"pushed\"},\n{0xf3e2, true, \"python\"},\n{0xf1d6, true, \"qq\"},\n{0xf459, true, \"quinscape\"},\n{0xf2c4, true, \"quora\"},\n{0xf4f7, true, \"r project\"},\n{0xf7bb, true, \"raspberry pi\"},\n{0xf2d9, true, \"ravelry\"},\n{0xf41b, true, \"react\"},\n{0xf75d, true, \"reacteurope\"},\n{0xf4d5, true, \"readme\"},\n{0xf1d0, true, \"rebel alliance\"},\n{0xf3e3, true, \"red river\"},\n{0xf1a1, true, \"reddit\"},\n{0xf281, true, \"reddit alien\"},\n{0xf7bc, true, \"redhat|linux|operating system|os\"},\n{0xf18b, true, \"renren\"},\n{0xf3e6, true, \"replyd\"},\n{0xf4f8, true, \"researchgate\"},\n{0xf3e7, true, \"resolving\"},\n{0xf5b2, true, \"rev.io\"},\n{0xf3e8, true, \"rocket.chat\"},\n{0xf3e9, true, \"rockrms\"},\n{0xe07a, true, \"rust\"},\n{0xf267, true, \"safari|browser\"},\n{0xf83b, true, \"salesforce\"},\n{0xf41e, true, \"sass\"},\n{0xf3ea, true, \"schlix\"},\n{0xe570, true, \"screenpal\"},\n{0xf28a, true, \"scribd\"},\n{0xf3eb, true, \"searchengin\"},\n{0xf2da, true, \"sellcast|eercast\"},\n{0xf213, true, \"sellsy\"},\n{0xf3ec, true, \"servicestack\"},\n{0xf214, true, \"shirts in bulk\"},\n{0xe60c, true, \"shoelace\"},\n{0xe057, true, \"shopify\"},\n{0xf5b5, true, \"shopware\"},\n{0xe663, true, \"signal messenger\"},\n{0xf215, true, \"simplybuilt\"},\n{0xf3ee, true, \"sistrix\"},\n{0xf512, true, \"sith\"},\n{0xe44a, true, \"sitrox\"},\n{0xf7c6, true, \"sketch|app|design|interface\"},\n{0xf216, true, \"skyatlas\"},\n{0xf17e, true, \"skype\"},\n{0xf198, true, \"slack logo|anchor|hash|hashtag\"},\n{0xf1e7, true, \"slideshare\"},\n{0xf2ab, true, \"snapchat\"},\n{0xf1be, true, \"soundcloud\"},\n{0xf7d3, true, \"sourcetree\"},\n{0xe5ac, true, \"space awesome|adventure|rocket|ship|shuttle\"},\n{0xf3f3, true, \"speakap\"},\n{0xf83c, true, \"speaker deck\"},\n{0xf1bc, true, \"spotify\"},\n{0xf1b5, true, \"square behance\"},\n{0xe6a3, true, \"square bluesky|social network\"},\n{0xf397, true, \"square dribbble\"},\n{0xf082, true, \"square facebook|fabook|fb|social network\"},\n{0xe5ad, true, \"square font awesome\"},\n{0xf35c, true, \"square font awesome stroke|awesome|flag|font|icons|typeface\"},\n{0xf1d2, true, \"square git\"},\n{0xf092, true, \"square github|octocat\"},\n{0xe5ae, true, \"square gitlab\"},\n{0xf0d4, true, \"square google plus|social network\"},\n{0xf3af, true, \"square hacker news\"},\n{0xe055, true, \"square instagram\"},\n{0xf3b9, true, \"square js\"},\n{0xf203, true, \"square lastfm\"},\n{0xe62e, true, \"square letterboxd\"},\n{0xf264, true, \"square odnoklassniki\"},\n{0xe01e, true, \"pied piper square logo (old)\"},\n{0xf0d3, true, \"square pinterest\"},\n{0xf1a2, true, \"square reddit\"},\n{0xf2ad, true, \"snapchat square\"},\n{0xf1b7, true, \"square steam\"},\n{0xe619, true, \"square threads|social network\"},\n{0xf174, true, \"square tumblr\"},\n{0xf081, true, \"square twitter|social network|tweet\"},\n{0xe67c, true, \"square upwork\"},\n{0xf2aa, true, \"square viadeo\"},\n{0xf194, true, \"square vimeo\"},\n{0xe683, true, \"square web awesome|awesome|coding|components|crown|web\"},\n{0xe684, true, \"square web awesome stroke|awesome|coding|components|crown|web\"},\n{0xf40c, true, \"square whatsapp\"},\n{0xe61a, true, \"square x twitter|elon|twitter|x\"},\n{0xf169, true, \"square xing\"},\n{0xf431, true, \"square youtube\"},\n{0xf5be, true, \"squarespace\"},\n{0xf18d, true, \"stack exchange\"},\n{0xf16c, true, \"stack overflow\"},\n{0xf842, true, \"stackpath\"},\n{0xf3f5, true, \"staylinked|linkin\"},\n{0xf1b6, true, \"steam\"},\n{0xf3f6, true, \"steam symbol\"},\n{0xf3f7, true, \"sticker mule\"},\n{0xf428, true, \"strava\"},\n{0xf429, true, \"stripe\"},\n{0xf42a, true, \"stripe s\"},\n{0xe5c7, true, \"stubber\"},\n{0xf3f8, true, \"studio vinari\"},\n{0xf1a4, true, \"stumbleupon logo\"},\n{0xf1a3, true, \"stumbleupon circle\"},\n{0xf2dd, true, \"superpowers\"},\n{0xf3f9, true, \"supple\"},\n{0xf7d6, true, \"suse|linux|operating system|os\"},\n{0xf8e1, true, \"swift\"},\n{0xf83d, true, \"symfony\"},\n{0xf4f9, true, \"teamspeak\"},\n{0xf2c6, true, \"telegram\"},\n{0xf1d5, true, \"tencent weibo\"},\n{0xf69d, true, \"the red yeti\"},\n{0xf5c6, true, \"themeco\"},\n{0xf2b2, true, \"themeisle\"},\n{0xf731, true, \"think peaks\"},\n{0xe618, true, \"threads|social network\"},\n{0xe07b, true, \"tiktok\"},\n{0xf513, true, \"trade federation\"},\n{0xf181, true, \"trello|atlassian\"},\n{0xf173, true, \"tumblr\"},\n{0xf1e8, true, \"twitch\"},\n{0xf099, true, \"twitter|social network|tweet\"},\n{0xf42b, true, \"typo3\"},\n{0xf402, true, \"uber\"},\n{0xf7df, true, \"ubuntu|linux|operating system|os\"},\n{0xf403, true, \"uikit\"},\n{0xf8e8, true, \"umbraco\"},\n{0xe084, true, \"uncharted software\"},\n{0xf404, true, \"uniregistry\"},\n{0xe049, true, \"unity 3d\"},\n{0xe07c, true, \"unsplash\"},\n{0xf405, true, \"untappd\"},\n{0xf7e0, true, \"ups|United Parcel Service|package|shipping\"},\n{0xe641, true, \"upwork\"},\n{0xf287, true, \"usb\"},\n{0xf7e1, true, \"united states postal service|american|package|shipping|usa\"},\n{0xf407, true, \"us-sunnah foundation\"},\n{0xf408, true, \"vaadin\"},\n{0xf237, true, \"viacoin\"},\n{0xf2a9, true, \"viadeo\"},\n{0xf409, true, \"viber\"},\n{0xf40a, true, \"vimeo\"},\n{0xf27d, true, \"vimeo v|vimeo\"},\n{0xf1ca, true, \"vine\"},\n{0xf189, true, \"vk\"},\n{0xf40b, true, \"vnv\"},\n{0xf41f, true, \"vue.js\"},\n{0xe087, true, \"watchman monitoring\"},\n{0xf83f, true, \"waze\"},\n{0xe682, true, \"web awesome|awesome|coding|components|crown|web\"},\n{0xe65c, true, \"webflow\"},\n{0xf5cc, true, \"weebly\"},\n{0xf18a, true, \"weibo\"},\n{0xf1d7, true, \"weixin (wechat)\"},\n{0xf232, true, \"what's app\"},\n{0xf40d, true, \"whmcs\"},\n{0xf266, true, \"wikipedia w\"},\n{0xf17a, true, \"windows|microsoft|operating system|os\"},\n{0xe2d0, true, \"wirsindhandwerk\"},\n{0xf5cf, true, \"wix\"},\n{0xf730, true, \"wizards of the coast|Dungeons & Dragons|d&d|dnd|fantasy|game|gaming|tabletop\"},\n{0xe088, true, \"wodu\"},\n{0xf514, true, \"wolf pack battalion\"},\n{0xf19a, true, \"wordpress logo\"},\n{0xf411, true, \"wordpress simple\"},\n{0xf297, true, \"wpbeginner\"},\n{0xf2de, true, \"wpexplorer\"},\n{0xf298, true, \"wpforms\"},\n{0xf3e4, true, \"wpressr|rendact\"},\n{0xe61b, true, \"x twitter|elon|twitter|x\"},\n{0xf412, true, \"xbox\"},\n{0xf168, true, \"xing\"},\n{0xf23b, true, \"y combinator\"},\n{0xf19e, true, \"yahoo logo\"},\n{0xf840, true, \"yammer\"},\n{0xf413, true, \"yandex\"},\n{0xf414, true, \"yandex international\"},\n{0xf7e3, true, \"yarn\"},\n{0xf1e9, true, \"yelp\"},\n{0xf2b1, true, \"yoast\"},\n{0xf167, true, \"youtube|film|video|youtube-play|youtube-square\"},\n{0xf63f, true, \"zhihu\"}\n};\n"
  },
  {
    "path": "src/gui/iconfactory.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"iconfactory.h\"\n\n#include \"gui/fix_icon_id.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/fromiconid.h\"\n#include \"gui/pixelratio.h\"\n\n#include <QBitmap>\n#include <QCoreApplication>\n#include <QFile>\n#include <QFont>\n#include <QFontDatabase>\n#include <QFontMetrics>\n#include <QIcon>\n#include <QIconEngine>\n#include <QPainter>\n#include <QPainterPath>\n#include <QPaintDevice>\n#include <QPaintEngine>\n#include <QPixmap>\n#include <QPixmapCache>\n#include <QPointer>\n#include <QSvgRenderer>\n#include <QVariant>\n#include <QWidget>\n\n#ifndef COPYQ_ICON_NAME\n# define COPYQ_ICON_NAME \"copyq\"\n#endif\n\nnamespace {\n\n/// Up to this value of background lightness, icon color will be lighter.\nconst int lightThreshold = 100;\n\nbool sessionIconTagEnabledFlag = true;\n\nQPointer<QObject> &activePaintDevice() {\n    static QPointer<QObject> activePaintDevice;\n    return activePaintDevice;\n}\n\nQIcon fromTheme(const QString &name)\n{\n    if ( qEnvironmentVariableIsEmpty(\"COPYQ_DEFAULT_ICON\") )\n        return QIcon::fromTheme(name);\n\n    return QIcon();\n}\n\nbool hasNormalIconHelper()\n{\n    // QIcon::hasThemeIcon() returns true even if icon \"copyq-normal\" is not available\n    // but \"copyq\" is.\n    const QIcon normalIcon = fromTheme(QStringLiteral(COPYQ_ICON_NAME \"-normal\"));\n    if ( normalIcon.isNull() )\n        return false;\n\n    const QIcon defaultIcon = fromTheme(QStringLiteral(COPYQ_ICON_NAME));\n    return defaultIcon.pixmap(16).toImage() != normalIcon.pixmap(16).toImage();\n}\n\nbool hasNormalIcon()\n{\n    static const bool result = hasNormalIconHelper();\n    return result;\n}\n\nQString sessionName()\n{\n    return qApp->property(\"CopyQ_session_name\").toString();\n}\n\nQColor colorFromEnv(const char *envVaribleName)\n{\n    return QColor( qEnvironmentVariable(envVaribleName) );\n}\n\nQColor sessionNameToColor(const QString &name)\n{\n    if (name.isEmpty())\n        return QColor();\n\n    int r = 0;\n    int g = 0;\n    int b = 0;\n\n    for (const auto &c : name) {\n        const ushort x = c.unicode() % 3;\n        if (x == 0)\n            r += 255;\n        else if (x == 1)\n            g += 255;\n        else\n            b += 255;\n    }\n\n    int max = qMax(r, qMax(g, b));\n    r = r * 255 / max;\n    g = g * 255 / max;\n    b = b * 255 / max;\n\n    return QColor(r, g, b);\n}\n\nQColor sessionIconColorHelper()\n{\n    const auto color = colorFromEnv(\"COPYQ_SESSION_COLOR\");\n    return color.isValid() ? color : sessionNameToColor( sessionName() );\n}\n\nQColor &sessionIconColorVariable()\n{\n    static QColor color = sessionIconColorHelper();\n    return color;\n}\n\nQString &sessionIconTagVariable()\n{\n    static QString tag = qEnvironmentVariable(\"COPYQ_SESSION_TAG\");\n    return tag;\n}\n\nQColor &sessionIconTagColorVariable()\n{\n    static QColor color = colorFromEnv(\"COPYQ_SESSION_TAG_COLOR\");\n    return color;\n}\n\nQPixmap pixmapFromBitmapFile(const QString &path, QSize size)\n{\n    return QPixmap(path)\n            .scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);\n}\n\nQPixmap pixmapFromFile(const QString &path, QSize size)\n{\n    const auto cacheKey = QStringLiteral(\"path:%1|%2x%3\")\n            .arg(path)\n            .arg(size.width())\n            .arg(size.height());\n\n    {\n        QPixmap pixmap;\n        if ( QPixmapCache::find(cacheKey, &pixmap) )\n            return pixmap;\n    }\n\n    if ( !QFile::exists(path) )\n        return QPixmap();\n\n    if ( !path.endsWith(\".svg\", Qt::CaseInsensitive) )\n        return pixmapFromBitmapFile(path, size);\n\n    QSvgRenderer renderer(path);\n    if ( !renderer.isValid() )\n        return pixmapFromBitmapFile(path, size);\n\n    QPixmap pix(size);\n    pix.setDevicePixelRatio(1);\n    pix.fill(Qt::transparent);\n    QPainter painter(&pix);\n    renderer.render(&painter, pix.rect());\n\n    QPixmapCache::insert(cacheKey, pix);\n\n    return pix;\n}\n\nQString iconPath(const QString &iconSuffix)\n{\n#ifdef COPYQ_ICON_PREFIX\n    const QString fileName(\n        QStringLiteral(COPYQ_ICON_PREFIX) + iconSuffix + QStringLiteral(\".svg\"));\n    if ( QFile::exists(fileName) )\n        return fileName;\n#else\n    Q_UNUSED(iconSuffix)\n#endif\n    return QStringLiteral(\":/images/icon\") + iconSuffix;\n}\n\nQPixmap appPixmap(const QString &iconSuffix, QSize size)\n{\n    if ( iconSuffix.isEmpty() && hasNormalIcon() )\n        return appPixmap(QStringLiteral(\"-normal\"), size);\n\n    const auto icon = fromTheme(QStringLiteral(COPYQ_ICON_NAME) + iconSuffix);\n\n    QPixmap pix;\n\n    if ( icon.isNull() ) {\n        const auto path = iconPath(iconSuffix);\n        pix = pixmapFromFile(path, size);\n    } else {\n        pix = icon.pixmap(size)\n                .scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);\n    }\n\n    pix.setDevicePixelRatio(1);\n\n    return pix;\n}\n\nvoid replaceColor(QPixmap *pix, const QColor &targetColor)\n{\n    auto pix2 = appPixmap(QStringLiteral(\"_mask\"), pix->size());\n\n    {\n        QPainter p1(&pix2);\n        p1.setCompositionMode(QPainter::CompositionMode_SourceAtop);\n        p1.fillRect(pix->rect(), targetColor);\n    }\n\n    QPainter p(pix);\n    p.setCompositionMode(QPainter::CompositionMode_SourceAtop);\n    p.drawPixmap(0, 0, pix2);\n}\n\nvoid disableIcon(QPixmap *pix)\n{\n    QPixmap pix2(pix->size());\n    pix2.fill(Qt::transparent);\n    {\n        QPainter p(&pix2);\n        p.setOpacity(0.7);\n        p.drawPixmap(0, 0, *pix);\n    }\n    *pix = pix2;\n}\n\nQPixmap drawFontIcon(ushort id, int w, int h, const QColor &color)\n{\n    const auto cacheKey = QStringLiteral(\"id:%1|%2x%3|%4\")\n            .arg(id)\n            .arg(w)\n            .arg(h)\n            .arg(color.rgba());\n\n    {\n        QPixmap pixmap;\n        if ( QPixmapCache::find(cacheKey, &pixmap) )\n            return pixmap;\n    }\n\n    QPixmap pixmap(w, h);\n    pixmap.fill(Qt::transparent);\n\n    id = fixIconId(id);\n\n    QPainter painter(&pixmap);\n    painter.setRenderHint(QPainter::TextAntialiasing);\n    painter.setRenderHint(QPainter::Antialiasing);\n    const QFont font = iconFontFitSize(w, h);\n\n    painter.setFont(font);\n\n    // Center the icon to whole pixels so it stays sharp.\n    const auto flags = Qt::AlignTop | Qt::AlignLeft;\n    const auto iconText = fromIconId(id);\n    auto boundingRect = painter.boundingRect(0, 0, w, h, flags, iconText);\n    const auto x = w - boundingRect.width();\n    // If icon is wider, assume that a tag will be rendered and align image to the right.\n    const auto pos = boundingRect.bottomLeft()\n            + ((w > h) ? QPoint(x * 3 / 4, 0) : QPoint(x / 2, 0));\n\n    // Draw shadow.\n    painter.setPen(Qt::black);\n    painter.setOpacity(0.2);\n    painter.drawText(pos + QPoint(1, 1), iconText);\n    painter.setOpacity(1);\n\n    painter.setPen(color);\n    painter.drawText(pos, iconText);\n\n    QPixmapCache::insert(cacheKey, pixmap);\n\n    return pixmap;\n}\n\nQColor getDefaultIconColor(const QColor &color)\n{\n    QColor c = color;\n    bool menuBackgrounIsLight = c.lightness() > lightThreshold;\n    c.setHsl(c.hue(),\n             qMax(0, qMin(255, c.saturation() + (menuBackgrounIsLight ? 30 : 10))),\n             qMax(0, qMin(255, c.lightness() + (menuBackgrounIsLight ? -140 : 100))));\n\n    return c;\n}\n\nvoid tagIcon(QPixmap *pix, const QString &tag, QColor color)\n{\n    if ( tag.isEmpty() )\n        return;\n\n    const auto ratio = pixelRatio(pix);\n    pix->setDevicePixelRatio(1);\n\n    QPainter painter(pix);\n    painter.setRenderHint(QPainter::TextAntialiasing);\n    painter.setRenderHint(QPainter::Antialiasing);\n\n    const int h = pix->height();\n    const int strokeWidth = static_cast<int>(ratio + h / 16);\n\n    QFont font;\n    const auto pixelSize = pix->width() / 2;\n    if ( tag.size() == 1 ) {\n        font = iconFontFitSize(pixelSize, pixelSize);\n    } else {\n        font.setPixelSize(pixelSize);\n        font.setBold(true);\n    }\n    painter.setFont(font);\n\n    const auto rect = painter.fontMetrics().tightBoundingRect(tag);\n    const auto baseLineY = rect.bottom();\n    const auto pos = QPoint(strokeWidth, h - strokeWidth - baseLineY);\n\n    QPainterPath path;\n    path.addText(pos, font, tag);\n    const auto strokeColor = color.lightness() < 100 ? Qt::white : Qt::black;\n    painter.strokePath(path, QPen(strokeColor, strokeWidth));\n\n    painter.setPen(color);\n    painter.drawText(pos, tag);\n}\n\nQColor colorForMode(QPainter *painter, QIcon::Mode mode)\n{\n    auto parent = painter\n            ? dynamic_cast<QWidget*>(painter->device())\n            : qobject_cast<QWidget*>(activePaintDevice().data());\n\n    const bool selected = (mode == QIcon::Active || mode == QIcon::Selected);\n    QColor color = parent ? getDefaultIconColor(*parent, selected) : Qt::darkGray;\n\n    if (mode == QIcon::Disabled)\n        color.setAlphaF(0.5);\n\n    return color;\n}\n\nclass BaseIconEngine : public QIconEngine\n{\npublic:\n    void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) override\n    {\n        painter->drawPixmap( rect, createPixmap(rect.size(), mode, state, painter) );\n    }\n\n    QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) override\n    {\n        return createPixmap(size, mode, state);\n    }\n\n    QPixmap createPixmap(QSize size, QIcon::Mode mode, QIcon::State state, QPainter *painter = nullptr)\n    {\n        // WORKAROUND: Big icons can cause application to crash.\n        if ( size.width() > 256 || size.height() > 256 )\n            size.scale(256, 256, Qt::KeepAspectRatio);\n\n        if (painter)\n            size *= pixelRatio(painter->paintEngine()->paintDevice());\n\n        auto pixmap = doCreatePixmap(size, mode, state, painter);\n\n        if ( pixmap.isNull() ) {\n            pixmap = QPixmap(size);\n            pixmap.fill(Qt::transparent);\n        }\n\n        return taggedIcon(&pixmap);\n    }\n\n    QList<QSize> availableSizes(QIcon::Mode, QIcon::State)\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n        const\n#endif\n        override\n    {\n        static const auto sizes = QList<QSize>()\n                << QSize(32, 32)\n                << QSize(48, 48)\n                << QSize(64, 64)\n                << QSize(96, 96)\n                << QSize(128, 128);\n        return sizes;\n    }\n\nprotected:\n    BaseIconEngine(const QString &tag, QColor tagColor)\n        : m_tag(tag)\n        , m_tagColor(tagColor)\n    {\n    }\n\nprivate:\n    virtual QPixmap doCreatePixmap(QSize size, QIcon::Mode mode, QIcon::State state, QPainter *painter) = 0;\n\n    QPixmap taggedIcon(QPixmap *pix)\n    {\n        tagIcon(pix, m_tag, m_tagColor);\n        return *pix;\n    }\n\n    QString m_tag;\n    QColor m_tagColor;\n};\n\nclass FontIconEngine : public BaseIconEngine\n{\npublic:\n    FontIconEngine(ushort iconId, const QString &tag, QColor tagColor)\n        : BaseIconEngine(tag, tagColor)\n        , m_iconId(iconId)\n    {\n    }\n\n    QIconEngine *clone() const override\n    {\n        return new FontIconEngine(*this);\n    }\n\n    QPixmap doCreatePixmap(QSize size, QIcon::Mode mode, QIcon::State, QPainter *painter) override\n    {\n        if (m_iconId == 0) {\n            QPixmap pixmap(size);\n            pixmap.fill(Qt::transparent);\n            return pixmap;\n        }\n\n        return drawFontIcon( m_iconId, size.width(), size.height(), colorForMode(painter, mode) );\n    }\n\nprivate:\n    ushort m_iconId;\n};\n\nclass ImageIconEngine final : public FontIconEngine\n{\npublic:\n    ImageIconEngine(const QString &iconName, ushort fallbackIconId, const QString &tag, QColor tagColor)\n        : FontIconEngine(fallbackIconId, tag, tagColor)\n        , m_iconName(iconName)\n    {\n    }\n\n    QIconEngine *clone() const override\n    {\n        return new ImageIconEngine(*this);\n    }\n\n    QPixmap doCreatePixmap(QSize size, QIcon::Mode mode, QIcon::State state, QPainter *painter) override\n    {\n        if ( m_iconName.isEmpty() )\n            return FontIconEngine::doCreatePixmap(size, mode, state, painter);\n\n        // Tint tab icons.\n        if ( m_iconName.startsWith(QLatin1String(\":/images/tab_\")) ) {\n            const QPixmap pixmap = pixmapFromFile(m_iconName, size);\n\n            QPixmap pixmap2(pixmap.size());\n            pixmap2.fill(Qt::transparent);\n            QPainter painter2(&pixmap2);\n            painter2.setRenderHint(QPainter::SmoothPixmapTransform);\n            painter2.setRenderHint(QPainter::TextAntialiasing);\n            painter2.setRenderHint(QPainter::Antialiasing);\n\n            // Draw shadow.\n            const auto rect = pixmap.rect();\n            painter2.setOpacity(0.2);\n            painter2.drawPixmap(rect.translated(1, 1), pixmap);\n            painter2.setOpacity(1);\n            painter2.setCompositionMode(QPainter::CompositionMode_SourceIn);\n            painter2.fillRect( pixmap2.rect(), Qt::black );\n            painter2.setCompositionMode(QPainter::CompositionMode_SourceOver);\n\n            painter2.drawPixmap(rect, pixmap);\n            painter2.setCompositionMode(QPainter::CompositionMode_SourceIn);\n            painter2.fillRect( pixmap2.rect(), colorForMode(painter, mode) );\n\n            return pixmap2;\n        }\n\n        QIcon icon = pixmapFromFile(m_iconName, size);\n        if ( icon.isNull() )\n            icon = fromTheme(m_iconName);\n        if ( !icon.isNull() ) {\n            auto pixmap = icon.pixmap(size, mode, state);\n            if (pixmap.size() != size) {\n                pixmap = pixmap.scaled(size.width(), size.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);\n                QPixmap pixmap2(size);\n                pixmap2.fill(Qt::transparent);\n                QPainter painter2(&pixmap2);\n                const int x = size.width() - pixmap.width();\n                const QRect rect( QPoint(x, 0), pixmap.size() );\n                painter2.drawPixmap(rect, pixmap);\n                pixmap = pixmap2;\n            }\n            return pixmap;\n        }\n\n        return FontIconEngine::doCreatePixmap(size, mode, state, painter);\n    }\n\nprivate:\n    QString m_iconName;\n};\n\nclass AppIconEngine final : public BaseIconEngine\n{\npublic:\n    AppIconEngine()\n        : BaseIconEngine(sessionIconTagVariable(), sessionIconTagColor())\n    {\n    }\n\n    QIconEngine *clone() const override\n    {\n        return new AppIconEngine(*this);\n    }\n\n    QPixmap doCreatePixmap(QSize size, QIcon::Mode, QIcon::State, QPainter *) override\n    {\n        // If copyq-normal icon exist in theme, omit changing color.\n        const bool useColoredIcon = !hasNormalIcon();\n        const auto sessionColor = useColoredIcon ? sessionIconColor() : QColor();\n\n        const auto cacheKey = QStringLiteral(\"app:%1|%2x%3|%4\")\n                .arg(sessionColor.name())\n                .arg(size.width())\n                .arg(size.height())\n                .arg(sessionIconTagEnabledFlag);\n\n        {\n            QPixmap pixmap;\n            if ( QPixmapCache::find(cacheKey, &pixmap) )\n                return pixmap;\n        }\n\n        auto pix = appPixmap(QString(), size);\n\n        if ( sessionColor.isValid() )\n            replaceColor(&pix, sessionColor);\n\n        if (!sessionIconTagEnabledFlag)\n            disableIcon(&pix);\n\n        QPixmapCache::insert(cacheKey, pix);\n\n        return pix;\n    }\n};\n\nclass IconEngine final\n{\npublic:\n    static bool useSystemIcons;\n\n    static QIcon createIcon(ushort iconId, const QString &iconName, const QString &tag = QString(), const QColor &tagColor = QColor())\n    {\n        if ( canUseFontIcon(iconId, iconName) )\n            return QIcon( new FontIconEngine(iconId, tag, tagColor) );\n        return QIcon( new ImageIconEngine(iconName, iconId, tag, tagColor) );\n    }\n\n    static QIcon createIcon()\n    {\n        return QIcon( new AppIconEngine() );\n    }\n\nprivate:\n    static bool canUseFontIcon(ushort iconId, const QString &iconName)\n    {\n        if ( iconId == 0 || !loadIconFont() )\n            return false;\n\n        if ( useSystemIcons && !iconName.isEmpty() )\n            return false;\n\n        return true;\n    }\n};\n\nbool IconEngine::useSystemIcons = false;\n\n} // namespace\n\nQIcon getIcon(const QString &themeName, unsigned short id)\n{\n    return loadIconFont() || !themeName.isEmpty()\n            ? IconEngine::createIcon(loadIconFont() ? id : 0, themeName)\n            : QIcon();\n}\n\nQIcon getIcon(const QVariant &iconOrIconId)\n{\n    if (iconOrIconId.canConvert(QVariant::UInt))\n        return getIcon( QString(), iconOrIconId.value<ushort>() );\n\n    if (iconOrIconId.canConvert(QVariant::Icon))\n        return iconOrIconId.value<QIcon>();\n\n    return QIcon();\n}\n\nQIcon getIconFromResources(const QString &iconName)\n{\n    return IconEngine::createIcon(0, QStringLiteral(\":/images/\") + iconName);\n}\n\nQIcon iconFromFile(const QString &fileName, const QString &tag, const QColor &color)\n{\n    if ( fileName.isEmpty() && tag.isEmpty() )\n        return QIcon();\n\n    const auto unicode = toIconId(fileName);\n    if (unicode != 0)\n        return loadIconFont() ? IconEngine::createIcon(unicode, \"\", tag, color) : QIcon();\n\n    return IconEngine::createIcon(0, fileName, tag, color);\n}\n\nQIcon iconFromFile(const QString &fileName, const QString &tag)\n{\n    return iconFromFile(fileName, tag, {});\n}\n\nQIcon iconFromFile(const QString &fileName)\n{\n    return iconFromFile(fileName, {}, {});\n}\n\nQPixmap createPixmap(unsigned short id, const QColor &color, int size)\n{\n    if (loadIconFont())\n        return drawFontIcon(id, size, size, color);\n\n    QPixmap pixmap(size, size);\n    pixmap.fill(Qt::transparent);\n    return pixmap;\n}\n\nQIcon appIcon()\n{\n    return IconEngine::createIcon();\n}\n\nvoid setActivePaintDevice(QObject *device)\n{\n    activePaintDevice() = device;\n}\n\nQColor getDefaultIconColor(const QWidget &widget, bool selected)\n{\n    const QWidget *parent = &widget;\n    while ( parent->parentWidget()\n            && !parent->isTopLevel()\n            && !parent->testAttribute(Qt::WA_OpaquePaintEvent) )\n    {\n        parent = parent->parentWidget();\n    }\n\n    QPalette::ColorRole role = selected ? QPalette::Highlight : parent->backgroundRole();\n    return getDefaultIconColor( parent->palette().color(QPalette::Active, role) );\n}\n\nunsigned short toIconId(const QString &fileNameOrId)\n{\n    if ( fileNameOrId.size() != 1 )\n        return 0;\n\n    return fileNameOrId.at(0).unicode();\n}\n\nvoid setSessionIconColor(QColor color)\n{\n    sessionIconColorVariable() = color.isValid() ? color : sessionIconColorHelper();\n}\n\nvoid setSessionIconTag(const QString &tag)\n{\n    sessionIconTagVariable() = tag;\n}\n\nvoid setSessionIconTagColor(QColor color)\n{\n    sessionIconTagColorVariable() = color;\n}\n\nvoid setSessionIconEnabled(bool enabled)\n{\n    sessionIconTagEnabledFlag = enabled;\n}\n\nQColor sessionIconColor()\n{\n    return ::sessionIconColorVariable();\n}\n\nQString sessionIconTag()\n{\n    return ::sessionIconTagVariable();\n}\n\nQColor sessionIconTagColor()\n{\n    return ::sessionIconTagColorVariable();\n}\n\nvoid setUseSystemIcons(bool useSystemIcons)\n{\n    IconEngine::useSystemIcons = useSystemIcons;\n}\n"
  },
  {
    "path": "src/gui/iconfactory.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QColor;\nclass QIcon;\nclass QPixmap;\nclass QPainter;\nclass QObject;\nclass QString;\nclass QVariant;\nclass QWidget;\n\nQIcon getIcon(const QString &themeName, unsigned short id);\n\nQIcon getIcon(const QVariant &iconOrIconId);\n\nQIcon getIconFromResources(const QString &iconName);\n\nQIcon iconFromFile(const QString &fileName, const QString &tag, const QColor &color);\nQIcon iconFromFile(const QString &fileName, const QString &tag);\nQIcon iconFromFile(const QString &fileName);\n\nunsigned short toIconId(const QString &fileNameOrId);\n\nQPixmap createPixmap(unsigned short id, const QColor &color, int size);\n\n/// Return app icon (color is calculated from session name).\nQIcon appIcon();\n\nvoid setActivePaintDevice(QObject *device);\n\nQColor getDefaultIconColor(const QWidget &widget, bool selected = false);\n\nvoid setSessionIconColor(QColor color);\n\nvoid setSessionIconTag(const QString &tag);\n\nvoid setSessionIconTagColor(QColor color);\n\nvoid setSessionIconEnabled(bool enabled);\n\nQColor sessionIconColor();\n\nQString sessionIconTag();\n\nQColor sessionIconTagColor();\n\nvoid setUseSystemIcons(bool useSystemIcons);\n"
  },
  {
    "path": "src/gui/iconfont.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"iconfont.h\"\n\n#include <QApplication>\n#include <QFont>\n#include <QFontDatabase>\n#include <QFontMetrics>\n#include <QStyle>\n\n#include <algorithm>\n#include <vector>\n\nnamespace {\n\nconst int iconFontMaxHeight = 128;\nconst int iconFontMaxWidth = 160;\n\nint iconFontId()\n{\n    static const auto fontId =\n        QFontDatabase::addApplicationFont(\":/images/fontawesome.ttf\");\n    return fontId;\n}\n\nstd::vector<int> smoothSizes()\n{\n    const auto smoothSizes = QFontDatabase().smoothSizes(iconFontFamily(), QString());\n    return std::vector<int>(std::begin(smoothSizes), std::end(smoothSizes));\n}\n\nint iconFontSmoothPixelSize(int pixelSize)\n{\n    static const auto smoothSizes = ::smoothSizes();\n\n    const auto it = std::upper_bound(\n        std::begin(smoothSizes), std::end(smoothSizes), pixelSize);\n\n    if ( it == std::begin(smoothSizes) )\n        return pixelSize;\n\n    return *(it - 1);\n}\n\nQString createIconFontFamily()\n{\n    const QString iconFontFamily =\n        QFontDatabase::applicationFontFamilies(iconFontId()).value(0);\n    Q_ASSERT(iconFontFamily.endsWith(\"(CopyQ)\"));\n    return iconFontFamily;\n}\n\n} // namespace\n\nconst QString &iconFontFamily()\n{\n    static const QString fontFamily = createIconFontFamily();\n    return fontFamily;\n}\n\nbool loadIconFont()\n{\n    return iconFontId() != -1;\n}\n\nQFont iconFont()\n{\n    static QFont font(iconFontFamily());\n    font.setPixelSize( iconFontSizePixels() );\n    return font;\n}\n\nint iconFontSizePixels()\n{\n    return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);\n}\n\nQFont iconFontFitSize(int w, int h)\n{\n    QFont font = iconFont();\n    const auto pixelSize = w < h\n        ? w * iconFontMaxWidth / iconFontMaxHeight\n        : h * iconFontMaxHeight / iconFontMaxWidth;\n    const auto smoothPixelSize =  iconFontSmoothPixelSize(pixelSize);\n    font.setPixelSize(smoothPixelSize);\n    return font;\n}\n"
  },
  {
    "path": "src/gui/iconfont.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QFont;\nclass QString;\n\nconst QString &iconFontFamily();\n\nbool loadIconFont();\n\nint iconFontSizePixels();\n\nQFont iconFont();\n\nQFont iconFontFitSize(int w, int h);\n"
  },
  {
    "path": "src/gui/icons.h",
    "content": "// This file is generated with \"update_icon_font.py\" from FontAwesome's metadata.\n\n#pragma once\n\n\nenum IconId {\n    Icon0 = 0x30,\n    Icon1 = 0x31,\n    Icon2 = 0x32,\n    Icon3 = 0x33,\n    Icon4 = 0x34,\n    Icon5 = 0x35,\n    Icon6 = 0x36,\n    Icon7 = 0x37,\n    Icon8 = 0x38,\n    Icon9 = 0x39,\n    Icon42Group = 0xe080,\n    Icon500Px = 0xf26e,\n    IconA = 0x41,\n    IconAccessibleIcon = 0xf368,\n    IconAccusoft = 0xf369,\n    IconAddressBook = 0xf2b9,\n    IconAddressCard = 0xf2bb,\n    IconAdn = 0xf170,\n    IconAdversal = 0xf36a,\n    IconAffiliatetheme = 0xf36b,\n    IconAirbnb = 0xf834,\n    IconAlgolia = 0xf36c,\n    IconAlignCenter = 0xf037,\n    IconAlignJustify = 0xf039,\n    IconAlignLeft = 0xf036,\n    IconAlignRight = 0xf038,\n    IconAlipay = 0xf642,\n    IconAmazon = 0xf270,\n    IconAmazonPay = 0xf42c,\n    IconAmilia = 0xf36d,\n    IconAnchor = 0xf13d,\n    IconAnchorCircleCheck = 0xe4aa,\n    IconAnchorCircleExclamation = 0xe4ab,\n    IconAnchorCircleXmark = 0xe4ac,\n    IconAnchorLock = 0xe4ad,\n    IconAndroid = 0xf17b,\n    IconAngellist = 0xf209,\n    IconAngleDown = 0xf107,\n    IconAngleLeft = 0xf104,\n    IconAngleRight = 0xf105,\n    IconAngleUp = 0xf106,\n    IconAnglesDown = 0xf103,\n    IconAnglesLeft = 0xf100,\n    IconAnglesRight = 0xf101,\n    IconAnglesUp = 0xf102,\n    IconAngrycreative = 0xf36e,\n    IconAngular = 0xf420,\n    IconAnkh = 0xf644,\n    IconAppStore = 0xf36f,\n    IconAppStoreIos = 0xf370,\n    IconApper = 0xf371,\n    IconApple = 0xf179,\n    IconApplePay = 0xf415,\n    IconAppleWhole = 0xf5d1,\n    IconArchway = 0xf557,\n    IconArrowDown = 0xf063,\n    IconArrowDown19 = 0xf162,\n    IconArrowDown91 = 0xf886,\n    IconArrowDownAZ = 0xf15d,\n    IconArrowDownLong = 0xf175,\n    IconArrowDownShortWide = 0xf884,\n    IconArrowDownUpAcrossLine = 0xe4af,\n    IconArrowDownUpLock = 0xe4b0,\n    IconArrowDownWideShort = 0xf160,\n    IconArrowDownZA = 0xf881,\n    IconArrowLeft = 0xf060,\n    IconArrowLeftLong = 0xf177,\n    IconArrowPointer = 0xf245,\n    IconArrowRight = 0xf061,\n    IconArrowRightArrowLeft = 0xf0ec,\n    IconArrowRightFromBracket = 0xf08b,\n    IconArrowRightLong = 0xf178,\n    IconArrowRightToBracket = 0xf090,\n    IconArrowRightToCity = 0xe4b3,\n    IconArrowRotateLeft = 0xf0e2,\n    IconArrowRotateRight = 0xf01e,\n    IconArrowTrendDown = 0xe097,\n    IconArrowTrendUp = 0xe098,\n    IconArrowTurnDown = 0xf149,\n    IconArrowTurnUp = 0xf148,\n    IconArrowUp = 0xf062,\n    IconArrowUp19 = 0xf163,\n    IconArrowUp91 = 0xf887,\n    IconArrowUpAZ = 0xf15e,\n    IconArrowUpFromBracket = 0xe09a,\n    IconArrowUpFromGroundWater = 0xe4b5,\n    IconArrowUpFromWaterPump = 0xe4b6,\n    IconArrowUpLong = 0xf176,\n    IconArrowUpRightDots = 0xe4b7,\n    IconArrowUpRightFromSquare = 0xf08e,\n    IconArrowUpShortWide = 0xf885,\n    IconArrowUpWideShort = 0xf161,\n    IconArrowUpZA = 0xf882,\n    IconArrowsDownToLine = 0xe4b8,\n    IconArrowsDownToPeople = 0xe4b9,\n    IconArrowsLeftRight = 0xf07e,\n    IconArrowsLeftRightToLine = 0xe4ba,\n    IconArrowsRotate = 0xf021,\n    IconArrowsSpin = 0xe4bb,\n    IconArrowsSplitUpAndLeft = 0xe4bc,\n    IconArrowsToCircle = 0xe4bd,\n    IconArrowsToDot = 0xe4be,\n    IconArrowsToEye = 0xe4bf,\n    IconArrowsTurnRight = 0xe4c0,\n    IconArrowsTurnToDots = 0xe4c1,\n    IconArrowsUpDown = 0xf07d,\n    IconArrowsUpDownLeftRight = 0xf047,\n    IconArrowsUpToLine = 0xe4c2,\n    IconArtstation = 0xf77a,\n    IconAsterisk = 0x2a,\n    IconAsymmetrik = 0xf372,\n    IconAt = 0x40,\n    IconAtlassian = 0xf77b,\n    IconAtom = 0xf5d2,\n    IconAudible = 0xf373,\n    IconAudioDescription = 0xf29e,\n    IconAustralSign = 0xe0a9,\n    IconAutoprefixer = 0xf41c,\n    IconAvianex = 0xf374,\n    IconAviato = 0xf421,\n    IconAward = 0xf559,\n    IconAws = 0xf375,\n    IconB = 0x42,\n    IconBaby = 0xf77c,\n    IconBabyCarriage = 0xf77d,\n    IconBackward = 0xf04a,\n    IconBackwardFast = 0xf049,\n    IconBackwardStep = 0xf048,\n    IconBacon = 0xf7e5,\n    IconBacteria = 0xe059,\n    IconBacterium = 0xe05a,\n    IconBagShopping = 0xf290,\n    IconBahai = 0xf666,\n    IconBahtSign = 0xe0ac,\n    IconBan = 0xf05e,\n    IconBanSmoking = 0xf54d,\n    IconBandage = 0xf462,\n    IconBandcamp = 0xf2d5,\n    IconBangladeshiTakaSign = 0xe2e6,\n    IconBarcode = 0xf02a,\n    IconBars = 0xf0c9,\n    IconBarsProgress = 0xf828,\n    IconBarsStaggered = 0xf550,\n    IconBaseball = 0xf433,\n    IconBaseballBatBall = 0xf432,\n    IconBasketShopping = 0xf291,\n    IconBasketball = 0xf434,\n    IconBath = 0xf2cd,\n    IconBatteryEmpty = 0xf244,\n    IconBatteryFull = 0xf240,\n    IconBatteryHalf = 0xf242,\n    IconBatteryQuarter = 0xf243,\n    IconBatteryThreeQuarters = 0xf241,\n    IconBattleNet = 0xf835,\n    IconBed = 0xf236,\n    IconBedPulse = 0xf487,\n    IconBeerMugEmpty = 0xf0fc,\n    IconBehance = 0xf1b4,\n    IconBell = 0xf0f3,\n    IconBellConcierge = 0xf562,\n    IconBellSlash = 0xf1f6,\n    IconBezierCurve = 0xf55b,\n    IconBicycle = 0xf206,\n    IconBilibili = 0xe3d9,\n    IconBimobject = 0xf378,\n    IconBinoculars = 0xf1e5,\n    IconBiohazard = 0xf780,\n    IconBitbucket = 0xf171,\n    IconBitcoin = 0xf379,\n    IconBitcoinSign = 0xe0b4,\n    IconBity = 0xf37a,\n    IconBlackTie = 0xf27e,\n    IconBlackberry = 0xf37b,\n    IconBlender = 0xf517,\n    IconBlenderPhone = 0xf6b6,\n    IconBlog = 0xf781,\n    IconBlogger = 0xf37c,\n    IconBloggerB = 0xf37d,\n    IconBluesky = 0xe671,\n    IconBluetooth = 0xf293,\n    IconBluetoothB = 0xf294,\n    IconBold = 0xf032,\n    IconBolt = 0xf0e7,\n    IconBoltLightning = 0xe0b7,\n    IconBomb = 0xf1e2,\n    IconBone = 0xf5d7,\n    IconBong = 0xf55c,\n    IconBook = 0xf02d,\n    IconBookAtlas = 0xf558,\n    IconBookBible = 0xf647,\n    IconBookBookmark = 0xe0bb,\n    IconBookJournalWhills = 0xf66a,\n    IconBookMedical = 0xf7e6,\n    IconBookOpen = 0xf518,\n    IconBookOpenReader = 0xf5da,\n    IconBookQuran = 0xf687,\n    IconBookSkull = 0xf6b7,\n    IconBookTanakh = 0xf827,\n    IconBookmark = 0xf02e,\n    IconBootstrap = 0xf836,\n    IconBorderAll = 0xf84c,\n    IconBorderNone = 0xf850,\n    IconBorderTopLeft = 0xf853,\n    IconBoreHole = 0xe4c3,\n    IconBots = 0xe340,\n    IconBottleDroplet = 0xe4c4,\n    IconBottleWater = 0xe4c5,\n    IconBowlFood = 0xe4c6,\n    IconBowlRice = 0xe2eb,\n    IconBowlingBall = 0xf436,\n    IconBox = 0xf466,\n    IconBoxArchive = 0xf187,\n    IconBoxOpen = 0xf49e,\n    IconBoxTissue = 0xe05b,\n    IconBoxesPacking = 0xe4c7,\n    IconBoxesStacked = 0xf468,\n    IconBraille = 0xf2a1,\n    IconBrain = 0xf5dc,\n    IconBrave = 0xe63c,\n    IconBraveReverse = 0xe63d,\n    IconBrazilianRealSign = 0xe46c,\n    IconBreadSlice = 0xf7ec,\n    IconBridge = 0xe4c8,\n    IconBridgeCircleCheck = 0xe4c9,\n    IconBridgeCircleExclamation = 0xe4ca,\n    IconBridgeCircleXmark = 0xe4cb,\n    IconBridgeLock = 0xe4cc,\n    IconBridgeWater = 0xe4ce,\n    IconBriefcase = 0xf0b1,\n    IconBriefcaseMedical = 0xf469,\n    IconBroom = 0xf51a,\n    IconBroomBall = 0xf458,\n    IconBrush = 0xf55d,\n    IconBtc = 0xf15a,\n    IconBucket = 0xe4cf,\n    IconBuffer = 0xf837,\n    IconBug = 0xf188,\n    IconBugSlash = 0xe490,\n    IconBugs = 0xe4d0,\n    IconBuilding = 0xf1ad,\n    IconBuildingCircleArrowRight = 0xe4d1,\n    IconBuildingCircleCheck = 0xe4d2,\n    IconBuildingCircleExclamation = 0xe4d3,\n    IconBuildingCircleXmark = 0xe4d4,\n    IconBuildingColumns = 0xf19c,\n    IconBuildingFlag = 0xe4d5,\n    IconBuildingLock = 0xe4d6,\n    IconBuildingNgo = 0xe4d7,\n    IconBuildingShield = 0xe4d8,\n    IconBuildingUn = 0xe4d9,\n    IconBuildingUser = 0xe4da,\n    IconBuildingWheat = 0xe4db,\n    IconBullhorn = 0xf0a1,\n    IconBullseye = 0xf140,\n    IconBurger = 0xf805,\n    IconBuromobelexperte = 0xf37f,\n    IconBurst = 0xe4dc,\n    IconBus = 0xf207,\n    IconBusSimple = 0xf55e,\n    IconBusinessTime = 0xf64a,\n    IconBuyNLarge = 0xf8a6,\n    IconBuysellads = 0xf20d,\n    IconC = 0x43,\n    IconCableCar = 0xf7da,\n    IconCakeCandles = 0xf1fd,\n    IconCalculator = 0xf1ec,\n    IconCalendar = 0xf133,\n    IconCalendarCheck = 0xf274,\n    IconCalendarDay = 0xf783,\n    IconCalendarDays = 0xf073,\n    IconCalendarMinus = 0xf272,\n    IconCalendarPlus = 0xf271,\n    IconCalendarWeek = 0xf784,\n    IconCalendarXmark = 0xf273,\n    IconCamera = 0xf030,\n    IconCameraRetro = 0xf083,\n    IconCameraRotate = 0xe0d8,\n    IconCampground = 0xf6bb,\n    IconCanadianMapleLeaf = 0xf785,\n    IconCandyCane = 0xf786,\n    IconCannabis = 0xf55f,\n    IconCapsules = 0xf46b,\n    IconCar = 0xf1b9,\n    IconCarBattery = 0xf5df,\n    IconCarBurst = 0xf5e1,\n    IconCarOn = 0xe4dd,\n    IconCarRear = 0xf5de,\n    IconCarSide = 0xf5e4,\n    IconCarTunnel = 0xe4de,\n    IconCaravan = 0xf8ff,\n    IconCaretDown = 0xf0d7,\n    IconCaretLeft = 0xf0d9,\n    IconCaretRight = 0xf0da,\n    IconCaretUp = 0xf0d8,\n    IconCarrot = 0xf787,\n    IconCartArrowDown = 0xf218,\n    IconCartFlatbed = 0xf474,\n    IconCartFlatbedSuitcase = 0xf59d,\n    IconCartPlus = 0xf217,\n    IconCartShopping = 0xf07a,\n    IconCashRegister = 0xf788,\n    IconCat = 0xf6be,\n    IconCcAmazonPay = 0xf42d,\n    IconCcAmex = 0xf1f3,\n    IconCcApplePay = 0xf416,\n    IconCcDinersClub = 0xf24c,\n    IconCcDiscover = 0xf1f2,\n    IconCcJcb = 0xf24b,\n    IconCcMastercard = 0xf1f1,\n    IconCcPaypal = 0xf1f4,\n    IconCcStripe = 0xf1f5,\n    IconCcVisa = 0xf1f0,\n    IconCediSign = 0xe0df,\n    IconCentSign = 0xe3f5,\n    IconCentercode = 0xf380,\n    IconCentos = 0xf789,\n    IconCertificate = 0xf0a3,\n    IconChair = 0xf6c0,\n    IconChalkboard = 0xf51b,\n    IconChalkboardUser = 0xf51c,\n    IconChampagneGlasses = 0xf79f,\n    IconChargingStation = 0xf5e7,\n    IconChartArea = 0xf1fe,\n    IconChartBar = 0xf080,\n    IconChartColumn = 0xe0e3,\n    IconChartDiagram = 0xe695,\n    IconChartGantt = 0xe0e4,\n    IconChartLine = 0xf201,\n    IconChartPie = 0xf200,\n    IconChartSimple = 0xe473,\n    IconCheck = 0xf00c,\n    IconCheckDouble = 0xf560,\n    IconCheckToSlot = 0xf772,\n    IconCheese = 0xf7ef,\n    IconChess = 0xf439,\n    IconChessBishop = 0xf43a,\n    IconChessBoard = 0xf43c,\n    IconChessKing = 0xf43f,\n    IconChessKnight = 0xf441,\n    IconChessPawn = 0xf443,\n    IconChessQueen = 0xf445,\n    IconChessRook = 0xf447,\n    IconChevronDown = 0xf078,\n    IconChevronLeft = 0xf053,\n    IconChevronRight = 0xf054,\n    IconChevronUp = 0xf077,\n    IconChild = 0xf1ae,\n    IconChildCombatant = 0xe4e0,\n    IconChildDress = 0xe59c,\n    IconChildReaching = 0xe59d,\n    IconChildren = 0xe4e1,\n    IconChrome = 0xf268,\n    IconChromecast = 0xf838,\n    IconChurch = 0xf51d,\n    IconCircle = 0xf111,\n    IconCircleArrowDown = 0xf0ab,\n    IconCircleArrowLeft = 0xf0a8,\n    IconCircleArrowRight = 0xf0a9,\n    IconCircleArrowUp = 0xf0aa,\n    IconCircleCheck = 0xf058,\n    IconCircleChevronDown = 0xf13a,\n    IconCircleChevronLeft = 0xf137,\n    IconCircleChevronRight = 0xf138,\n    IconCircleChevronUp = 0xf139,\n    IconCircleDollarToSlot = 0xf4b9,\n    IconCircleDot = 0xf192,\n    IconCircleDown = 0xf358,\n    IconCircleExclamation = 0xf06a,\n    IconCircleH = 0xf47e,\n    IconCircleHalfStroke = 0xf042,\n    IconCircleInfo = 0xf05a,\n    IconCircleLeft = 0xf359,\n    IconCircleMinus = 0xf056,\n    IconCircleNodes = 0xe4e2,\n    IconCircleNotch = 0xf1ce,\n    IconCirclePause = 0xf28b,\n    IconCirclePlay = 0xf144,\n    IconCirclePlus = 0xf055,\n    IconCircleQuestion = 0xf059,\n    IconCircleRadiation = 0xf7ba,\n    IconCircleRight = 0xf35a,\n    IconCircleStop = 0xf28d,\n    IconCircleUp = 0xf35b,\n    IconCircleUser = 0xf2bd,\n    IconCircleXmark = 0xf057,\n    IconCity = 0xf64f,\n    IconClapperboard = 0xe131,\n    IconClipboard = 0xf328,\n    IconClipboardCheck = 0xf46c,\n    IconClipboardList = 0xf46d,\n    IconClipboardQuestion = 0xe4e3,\n    IconClipboardUser = 0xf7f3,\n    IconClock = 0xf017,\n    IconClockRotateLeft = 0xf1da,\n    IconClone = 0xf24d,\n    IconClosedCaptioning = 0xf20a,\n    IconCloud = 0xf0c2,\n    IconCloudArrowDown = 0xf0ed,\n    IconCloudArrowUp = 0xf0ee,\n    IconCloudBolt = 0xf76c,\n    IconCloudMeatball = 0xf73b,\n    IconCloudMoon = 0xf6c3,\n    IconCloudMoonRain = 0xf73c,\n    IconCloudRain = 0xf73d,\n    IconCloudShowersHeavy = 0xf740,\n    IconCloudShowersWater = 0xe4e4,\n    IconCloudSun = 0xf6c4,\n    IconCloudSunRain = 0xf743,\n    IconCloudflare = 0xe07d,\n    IconCloudscale = 0xf383,\n    IconCloudsmith = 0xf384,\n    IconCloudversify = 0xf385,\n    IconClover = 0xe139,\n    IconCmplid = 0xe360,\n    IconCode = 0xf121,\n    IconCodeBranch = 0xf126,\n    IconCodeCommit = 0xf386,\n    IconCodeCompare = 0xe13a,\n    IconCodeFork = 0xe13b,\n    IconCodeMerge = 0xf387,\n    IconCodePullRequest = 0xe13c,\n    IconCodepen = 0xf1cb,\n    IconCodiepie = 0xf284,\n    IconCoins = 0xf51e,\n    IconColonSign = 0xe140,\n    IconComment = 0xf075,\n    IconCommentDollar = 0xf651,\n    IconCommentDots = 0xf4ad,\n    IconCommentMedical = 0xf7f5,\n    IconCommentNodes = 0xe696,\n    IconCommentSlash = 0xf4b3,\n    IconCommentSms = 0xf7cd,\n    IconComments = 0xf086,\n    IconCommentsDollar = 0xf653,\n    IconCompactDisc = 0xf51f,\n    IconCompass = 0xf14e,\n    IconCompassDrafting = 0xf568,\n    IconCompress = 0xf066,\n    IconComputer = 0xe4e5,\n    IconComputerMouse = 0xf8cc,\n    IconConfluence = 0xf78d,\n    IconConnectdevelop = 0xf20e,\n    IconContao = 0xf26d,\n    IconCookie = 0xf563,\n    IconCookieBite = 0xf564,\n    IconCopy = 0xf0c5,\n    IconCopyright = 0xf1f9,\n    IconCottonBureau = 0xf89e,\n    IconCouch = 0xf4b8,\n    IconCow = 0xf6c8,\n    IconCpanel = 0xf388,\n    IconCreativeCommons = 0xf25e,\n    IconCreativeCommonsBy = 0xf4e7,\n    IconCreativeCommonsNc = 0xf4e8,\n    IconCreativeCommonsNcEu = 0xf4e9,\n    IconCreativeCommonsNcJp = 0xf4ea,\n    IconCreativeCommonsNd = 0xf4eb,\n    IconCreativeCommonsPd = 0xf4ec,\n    IconCreativeCommonsPdAlt = 0xf4ed,\n    IconCreativeCommonsRemix = 0xf4ee,\n    IconCreativeCommonsSa = 0xf4ef,\n    IconCreativeCommonsSampling = 0xf4f0,\n    IconCreativeCommonsSamplingPlus = 0xf4f1,\n    IconCreativeCommonsShare = 0xf4f2,\n    IconCreativeCommonsZero = 0xf4f3,\n    IconCreditCard = 0xf09d,\n    IconCriticalRole = 0xf6c9,\n    IconCrop = 0xf125,\n    IconCropSimple = 0xf565,\n    IconCross = 0xf654,\n    IconCrosshairs = 0xf05b,\n    IconCrow = 0xf520,\n    IconCrown = 0xf521,\n    IconCrutch = 0xf7f7,\n    IconCruzeiroSign = 0xe152,\n    IconCss = 0xe6a2,\n    IconCss3 = 0xf13c,\n    IconCss3Alt = 0xf38b,\n    IconCube = 0xf1b2,\n    IconCubes = 0xf1b3,\n    IconCubesStacked = 0xe4e6,\n    IconCuttlefish = 0xf38c,\n    IconD = 0x44,\n    IconDAndD = 0xf38d,\n    IconDAndDBeyond = 0xf6ca,\n    IconDailymotion = 0xe052,\n    IconDartLang = 0xe693,\n    IconDashcube = 0xf210,\n    IconDatabase = 0xf1c0,\n    IconDebian = 0xe60b,\n    IconDeezer = 0xe077,\n    IconDeleteLeft = 0xf55a,\n    IconDelicious = 0xf1a5,\n    IconDemocrat = 0xf747,\n    IconDeploydog = 0xf38e,\n    IconDeskpro = 0xf38f,\n    IconDesktop = 0xf390,\n    IconDev = 0xf6cc,\n    IconDeviantart = 0xf1bd,\n    IconDharmachakra = 0xf655,\n    IconDhl = 0xf790,\n    IconDiagramNext = 0xe476,\n    IconDiagramPredecessor = 0xe477,\n    IconDiagramProject = 0xf542,\n    IconDiagramSuccessor = 0xe47a,\n    IconDiamond = 0xf219,\n    IconDiamondTurnRight = 0xf5eb,\n    IconDiaspora = 0xf791,\n    IconDice = 0xf522,\n    IconDiceD20 = 0xf6cf,\n    IconDiceD6 = 0xf6d1,\n    IconDiceFive = 0xf523,\n    IconDiceFour = 0xf524,\n    IconDiceOne = 0xf525,\n    IconDiceSix = 0xf526,\n    IconDiceThree = 0xf527,\n    IconDiceTwo = 0xf528,\n    IconDigg = 0xf1a6,\n    IconDigitalOcean = 0xf391,\n    IconDiscord = 0xf392,\n    IconDiscourse = 0xf393,\n    IconDisease = 0xf7fa,\n    IconDisplay = 0xe163,\n    IconDivide = 0xf529,\n    IconDna = 0xf471,\n    IconDochub = 0xf394,\n    IconDocker = 0xf395,\n    IconDog = 0xf6d3,\n    IconDollarSign = 0x24,\n    IconDolly = 0xf472,\n    IconDongSign = 0xe169,\n    IconDoorClosed = 0xf52a,\n    IconDoorOpen = 0xf52b,\n    IconDove = 0xf4ba,\n    IconDownLeftAndUpRightToCenter = 0xf422,\n    IconDownLong = 0xf309,\n    IconDownload = 0xf019,\n    IconDraft2Digital = 0xf396,\n    IconDragon = 0xf6d5,\n    IconDrawPolygon = 0xf5ee,\n    IconDribbble = 0xf17d,\n    IconDropbox = 0xf16b,\n    IconDroplet = 0xf043,\n    IconDropletSlash = 0xf5c7,\n    IconDrum = 0xf569,\n    IconDrumSteelpan = 0xf56a,\n    IconDrumstickBite = 0xf6d7,\n    IconDrupal = 0xf1a9,\n    IconDumbbell = 0xf44b,\n    IconDumpster = 0xf793,\n    IconDumpsterFire = 0xf794,\n    IconDungeon = 0xf6d9,\n    IconDyalog = 0xf399,\n    IconE = 0x45,\n    IconEarDeaf = 0xf2a4,\n    IconEarListen = 0xf2a2,\n    IconEarlybirds = 0xf39a,\n    IconEarthAfrica = 0xf57c,\n    IconEarthAmericas = 0xf57d,\n    IconEarthAsia = 0xf57e,\n    IconEarthEurope = 0xf7a2,\n    IconEarthOceania = 0xe47b,\n    IconEbay = 0xf4f4,\n    IconEdge = 0xf282,\n    IconEdgeLegacy = 0xe078,\n    IconEgg = 0xf7fb,\n    IconEject = 0xf052,\n    IconElementor = 0xf430,\n    IconElevator = 0xe16d,\n    IconEllipsis = 0xf141,\n    IconEllipsisVertical = 0xf142,\n    IconEllo = 0xf5f1,\n    IconEmber = 0xf423,\n    IconEmpire = 0xf1d1,\n    IconEnvelope = 0xf0e0,\n    IconEnvelopeCircleCheck = 0xe4e8,\n    IconEnvelopeOpen = 0xf2b6,\n    IconEnvelopeOpenText = 0xf658,\n    IconEnvelopesBulk = 0xf674,\n    IconEnvira = 0xf299,\n    IconEquals = 0x3d,\n    IconEraser = 0xf12d,\n    IconErlang = 0xf39d,\n    IconEthereum = 0xf42e,\n    IconEthernet = 0xf796,\n    IconEtsy = 0xf2d7,\n    IconEuroSign = 0xf153,\n    IconEvernote = 0xf839,\n    IconExclamation = 0x21,\n    IconExpand = 0xf065,\n    IconExpeditedssl = 0xf23e,\n    IconExplosion = 0xe4e9,\n    IconEye = 0xf06e,\n    IconEyeDropper = 0xf1fb,\n    IconEyeLowVision = 0xf2a8,\n    IconEyeSlash = 0xf070,\n    IconF = 0x46,\n    IconFaceAngry = 0xf556,\n    IconFaceDizzy = 0xf567,\n    IconFaceFlushed = 0xf579,\n    IconFaceFrown = 0xf119,\n    IconFaceFrownOpen = 0xf57a,\n    IconFaceGrimace = 0xf57f,\n    IconFaceGrin = 0xf580,\n    IconFaceGrinBeam = 0xf582,\n    IconFaceGrinBeamSweat = 0xf583,\n    IconFaceGrinHearts = 0xf584,\n    IconFaceGrinSquint = 0xf585,\n    IconFaceGrinSquintTears = 0xf586,\n    IconFaceGrinStars = 0xf587,\n    IconFaceGrinTears = 0xf588,\n    IconFaceGrinTongue = 0xf589,\n    IconFaceGrinTongueSquint = 0xf58a,\n    IconFaceGrinTongueWink = 0xf58b,\n    IconFaceGrinWide = 0xf581,\n    IconFaceGrinWink = 0xf58c,\n    IconFaceKiss = 0xf596,\n    IconFaceKissBeam = 0xf597,\n    IconFaceKissWinkHeart = 0xf598,\n    IconFaceLaugh = 0xf599,\n    IconFaceLaughBeam = 0xf59a,\n    IconFaceLaughSquint = 0xf59b,\n    IconFaceLaughWink = 0xf59c,\n    IconFaceMeh = 0xf11a,\n    IconFaceMehBlank = 0xf5a4,\n    IconFaceRollingEyes = 0xf5a5,\n    IconFaceSadCry = 0xf5b3,\n    IconFaceSadTear = 0xf5b4,\n    IconFaceSmile = 0xf118,\n    IconFaceSmileBeam = 0xf5b8,\n    IconFaceSmileWink = 0xf4da,\n    IconFaceSurprise = 0xf5c2,\n    IconFaceTired = 0xf5c8,\n    IconFacebook = 0xf09a,\n    IconFacebookF = 0xf39e,\n    IconFacebookMessenger = 0xf39f,\n    IconFan = 0xf863,\n    IconFantasyFlightGames = 0xf6dc,\n    IconFaucet = 0xe005,\n    IconFaucetDrip = 0xe006,\n    IconFax = 0xf1ac,\n    IconFeather = 0xf52d,\n    IconFeatherPointed = 0xf56b,\n    IconFedex = 0xf797,\n    IconFedora = 0xf798,\n    IconFerry = 0xe4ea,\n    IconFigma = 0xf799,\n    IconFile = 0xf15b,\n    IconFileArrowDown = 0xf56d,\n    IconFileArrowUp = 0xf574,\n    IconFileAudio = 0xf1c7,\n    IconFileCircleCheck = 0xe5a0,\n    IconFileCircleExclamation = 0xe4eb,\n    IconFileCircleMinus = 0xe4ed,\n    IconFileCirclePlus = 0xe494,\n    IconFileCircleQuestion = 0xe4ef,\n    IconFileCircleXmark = 0xe5a1,\n    IconFileCode = 0xf1c9,\n    IconFileContract = 0xf56c,\n    IconFileCsv = 0xf6dd,\n    IconFileExcel = 0xf1c3,\n    IconFileExport = 0xf56e,\n    IconFileFragment = 0xe697,\n    IconFileHalfDashed = 0xe698,\n    IconFileImage = 0xf1c5,\n    IconFileImport = 0xf56f,\n    IconFileInvoice = 0xf570,\n    IconFileInvoiceDollar = 0xf571,\n    IconFileLines = 0xf15c,\n    IconFileMedical = 0xf477,\n    IconFilePdf = 0xf1c1,\n    IconFilePen = 0xf31c,\n    IconFilePowerpoint = 0xf1c4,\n    IconFilePrescription = 0xf572,\n    IconFileShield = 0xe4f0,\n    IconFileSignature = 0xf573,\n    IconFileVideo = 0xf1c8,\n    IconFileWaveform = 0xf478,\n    IconFileWord = 0xf1c2,\n    IconFileZipper = 0xf1c6,\n    IconFilesPinwheel = 0xe69f,\n    IconFill = 0xf575,\n    IconFillDrip = 0xf576,\n    IconFilm = 0xf008,\n    IconFilter = 0xf0b0,\n    IconFilterCircleDollar = 0xf662,\n    IconFilterCircleXmark = 0xe17b,\n    IconFingerprint = 0xf577,\n    IconFire = 0xf06d,\n    IconFireBurner = 0xe4f1,\n    IconFireExtinguisher = 0xf134,\n    IconFireFlameCurved = 0xf7e4,\n    IconFireFlameSimple = 0xf46a,\n    IconFirefox = 0xf269,\n    IconFirefoxBrowser = 0xe007,\n    IconFirstOrder = 0xf2b0,\n    IconFirstOrderAlt = 0xf50a,\n    IconFirstdraft = 0xf3a1,\n    IconFish = 0xf578,\n    IconFishFins = 0xe4f2,\n    IconFlag = 0xf024,\n    IconFlagCheckered = 0xf11e,\n    IconFlagUsa = 0xf74d,\n    IconFlask = 0xf0c3,\n    IconFlaskVial = 0xe4f3,\n    IconFlickr = 0xf16e,\n    IconFlipboard = 0xf44d,\n    IconFloppyDisk = 0xf0c7,\n    IconFlorinSign = 0xe184,\n    IconFlutter = 0xe694,\n    IconFly = 0xf417,\n    IconFolder = 0xf07b,\n    IconFolderClosed = 0xe185,\n    IconFolderMinus = 0xf65d,\n    IconFolderOpen = 0xf07c,\n    IconFolderPlus = 0xf65e,\n    IconFolderTree = 0xf802,\n    IconFont = 0xf031,\n    IconFontAwesome = 0xf2b4,\n    IconFonticons = 0xf280,\n    IconFonticonsFi = 0xf3a2,\n    IconFootball = 0xf44e,\n    IconFortAwesome = 0xf286,\n    IconFortAwesomeAlt = 0xf3a3,\n    IconForumbee = 0xf211,\n    IconForward = 0xf04e,\n    IconForwardFast = 0xf050,\n    IconForwardStep = 0xf051,\n    IconFoursquare = 0xf180,\n    IconFrancSign = 0xe18f,\n    IconFreeCodeCamp = 0xf2c5,\n    IconFreebsd = 0xf3a4,\n    IconFrog = 0xf52e,\n    IconFulcrum = 0xf50b,\n    IconFutbol = 0xf1e3,\n    IconG = 0x47,\n    IconGalacticRepublic = 0xf50c,\n    IconGalacticSenate = 0xf50d,\n    IconGamepad = 0xf11b,\n    IconGasPump = 0xf52f,\n    IconGauge = 0xf624,\n    IconGaugeHigh = 0xf625,\n    IconGaugeSimple = 0xf629,\n    IconGaugeSimpleHigh = 0xf62a,\n    IconGavel = 0xf0e3,\n    IconGear = 0xf013,\n    IconGears = 0xf085,\n    IconGem = 0xf3a5,\n    IconGenderless = 0xf22d,\n    IconGetPocket = 0xf265,\n    IconGg = 0xf260,\n    IconGgCircle = 0xf261,\n    IconGhost = 0xf6e2,\n    IconGift = 0xf06b,\n    IconGifts = 0xf79c,\n    IconGit = 0xf1d3,\n    IconGitAlt = 0xf841,\n    IconGithub = 0xf09b,\n    IconGithubAlt = 0xf113,\n    IconGitkraken = 0xf3a6,\n    IconGitlab = 0xf296,\n    IconGitter = 0xf426,\n    IconGlassWater = 0xe4f4,\n    IconGlassWaterDroplet = 0xe4f5,\n    IconGlasses = 0xf530,\n    IconGlide = 0xf2a5,\n    IconGlideG = 0xf2a6,\n    IconGlobe = 0xf0ac,\n    IconGofore = 0xf3a7,\n    IconGolang = 0xe40f,\n    IconGolfBallTee = 0xf450,\n    IconGoodreads = 0xf3a8,\n    IconGoodreadsG = 0xf3a9,\n    IconGoogle = 0xf1a0,\n    IconGoogleDrive = 0xf3aa,\n    IconGooglePay = 0xe079,\n    IconGooglePlay = 0xf3ab,\n    IconGooglePlus = 0xf2b3,\n    IconGooglePlusG = 0xf0d5,\n    IconGoogleScholar = 0xe63b,\n    IconGoogleWallet = 0xf1ee,\n    IconGopuram = 0xf664,\n    IconGraduationCap = 0xf19d,\n    IconGratipay = 0xf184,\n    IconGrav = 0xf2d6,\n    IconGreaterThan = 0x3e,\n    IconGreaterThanEqual = 0xf532,\n    IconGrip = 0xf58d,\n    IconGripLines = 0xf7a4,\n    IconGripLinesVertical = 0xf7a5,\n    IconGripVertical = 0xf58e,\n    IconGripfire = 0xf3ac,\n    IconGroupArrowsRotate = 0xe4f6,\n    IconGrunt = 0xf3ad,\n    IconGuaraniSign = 0xe19a,\n    IconGuilded = 0xe07e,\n    IconGuitar = 0xf7a6,\n    IconGulp = 0xf3ae,\n    IconGun = 0xe19b,\n    IconH = 0x48,\n    IconHackerNews = 0xf1d4,\n    IconHackerrank = 0xf5f7,\n    IconHammer = 0xf6e3,\n    IconHamsa = 0xf665,\n    IconHand = 0xf256,\n    IconHandBackFist = 0xf255,\n    IconHandDots = 0xf461,\n    IconHandFist = 0xf6de,\n    IconHandHolding = 0xf4bd,\n    IconHandHoldingDollar = 0xf4c0,\n    IconHandHoldingDroplet = 0xf4c1,\n    IconHandHoldingHand = 0xe4f7,\n    IconHandHoldingHeart = 0xf4be,\n    IconHandHoldingMedical = 0xe05c,\n    IconHandLizard = 0xf258,\n    IconHandMiddleFinger = 0xf806,\n    IconHandPeace = 0xf25b,\n    IconHandPointDown = 0xf0a7,\n    IconHandPointLeft = 0xf0a5,\n    IconHandPointRight = 0xf0a4,\n    IconHandPointUp = 0xf0a6,\n    IconHandPointer = 0xf25a,\n    IconHandScissors = 0xf257,\n    IconHandSparkles = 0xe05d,\n    IconHandSpock = 0xf259,\n    IconHandcuffs = 0xe4f8,\n    IconHands = 0xf2a7,\n    IconHandsAslInterpreting = 0xf2a3,\n    IconHandsBound = 0xe4f9,\n    IconHandsBubbles = 0xe05e,\n    IconHandsClapping = 0xe1a8,\n    IconHandsHolding = 0xf4c2,\n    IconHandsHoldingChild = 0xe4fa,\n    IconHandsHoldingCircle = 0xe4fb,\n    IconHandsPraying = 0xf684,\n    IconHandshake = 0xf2b5,\n    IconHandshakeAngle = 0xf4c4,\n    IconHandshakeSimple = 0xf4c6,\n    IconHandshakeSimpleSlash = 0xe05f,\n    IconHandshakeSlash = 0xe060,\n    IconHanukiah = 0xf6e6,\n    IconHardDrive = 0xf0a0,\n    IconHashnode = 0xe499,\n    IconHashtag = 0x23,\n    IconHatCowboy = 0xf8c0,\n    IconHatCowboySide = 0xf8c1,\n    IconHatWizard = 0xf6e8,\n    IconHeadSideCough = 0xe061,\n    IconHeadSideCoughSlash = 0xe062,\n    IconHeadSideMask = 0xe063,\n    IconHeadSideVirus = 0xe064,\n    IconHeading = 0xf1dc,\n    IconHeadphones = 0xf025,\n    IconHeadphonesSimple = 0xf58f,\n    IconHeadset = 0xf590,\n    IconHeart = 0xf004,\n    IconHeartCircleBolt = 0xe4fc,\n    IconHeartCircleCheck = 0xe4fd,\n    IconHeartCircleExclamation = 0xe4fe,\n    IconHeartCircleMinus = 0xe4ff,\n    IconHeartCirclePlus = 0xe500,\n    IconHeartCircleXmark = 0xe501,\n    IconHeartCrack = 0xf7a9,\n    IconHeartPulse = 0xf21e,\n    IconHelicopter = 0xf533,\n    IconHelicopterSymbol = 0xe502,\n    IconHelmetSafety = 0xf807,\n    IconHelmetUn = 0xe503,\n    IconHexagonNodes = 0xe699,\n    IconHexagonNodesBolt = 0xe69a,\n    IconHighlighter = 0xf591,\n    IconHillAvalanche = 0xe507,\n    IconHillRockslide = 0xe508,\n    IconHippo = 0xf6ed,\n    IconHips = 0xf452,\n    IconHireAHelper = 0xf3b0,\n    IconHive = 0xe07f,\n    IconHockeyPuck = 0xf453,\n    IconHollyBerry = 0xf7aa,\n    IconHooli = 0xf427,\n    IconHornbill = 0xf592,\n    IconHorse = 0xf6f0,\n    IconHorseHead = 0xf7ab,\n    IconHospital = 0xf0f8,\n    IconHospitalUser = 0xf80d,\n    IconHotTubPerson = 0xf593,\n    IconHotdog = 0xf80f,\n    IconHotel = 0xf594,\n    IconHotjar = 0xf3b1,\n    IconHourglass = 0xf254,\n    IconHourglassEnd = 0xf253,\n    IconHourglassHalf = 0xf252,\n    IconHourglassStart = 0xf251,\n    IconHouse = 0xf015,\n    IconHouseChimney = 0xe3af,\n    IconHouseChimneyCrack = 0xf6f1,\n    IconHouseChimneyMedical = 0xf7f2,\n    IconHouseChimneyUser = 0xe065,\n    IconHouseChimneyWindow = 0xe00d,\n    IconHouseCircleCheck = 0xe509,\n    IconHouseCircleExclamation = 0xe50a,\n    IconHouseCircleXmark = 0xe50b,\n    IconHouseCrack = 0xe3b1,\n    IconHouseFire = 0xe50c,\n    IconHouseFlag = 0xe50d,\n    IconHouseFloodWater = 0xe50e,\n    IconHouseFloodWaterCircleArrowRight = 0xe50f,\n    IconHouseLaptop = 0xe066,\n    IconHouseLock = 0xe510,\n    IconHouseMedical = 0xe3b2,\n    IconHouseMedicalCircleCheck = 0xe511,\n    IconHouseMedicalCircleExclamation = 0xe512,\n    IconHouseMedicalCircleXmark = 0xe513,\n    IconHouseMedicalFlag = 0xe514,\n    IconHouseSignal = 0xe012,\n    IconHouseTsunami = 0xe515,\n    IconHouseUser = 0xe1b0,\n    IconHouzz = 0xf27c,\n    IconHryvniaSign = 0xf6f2,\n    IconHtml5 = 0xf13b,\n    IconHubspot = 0xf3b2,\n    IconHurricane = 0xf751,\n    IconI = 0x49,\n    IconICursor = 0xf246,\n    IconIceCream = 0xf810,\n    IconIcicles = 0xf7ad,\n    IconIcons = 0xf86d,\n    IconIdBadge = 0xf2c1,\n    IconIdCard = 0xf2c2,\n    IconIdCardClip = 0xf47f,\n    IconIdeal = 0xe013,\n    IconIgloo = 0xf7ae,\n    IconImage = 0xf03e,\n    IconImagePortrait = 0xf3e0,\n    IconImages = 0xf302,\n    IconImdb = 0xf2d8,\n    IconInbox = 0xf01c,\n    IconIndent = 0xf03c,\n    IconIndianRupeeSign = 0xe1bc,\n    IconIndustry = 0xf275,\n    IconInfinity = 0xf534,\n    IconInfo = 0xf129,\n    IconInstagram = 0xf16d,\n    IconInstalod = 0xe081,\n    IconIntercom = 0xf7af,\n    IconInternetExplorer = 0xf26b,\n    IconInvision = 0xf7b0,\n    IconIoxhost = 0xf208,\n    IconItalic = 0xf033,\n    IconItchIo = 0xf83a,\n    IconItunes = 0xf3b4,\n    IconItunesNote = 0xf3b5,\n    IconJ = 0x4a,\n    IconJar = 0xe516,\n    IconJarWheat = 0xe517,\n    IconJava = 0xf4e4,\n    IconJedi = 0xf669,\n    IconJediOrder = 0xf50e,\n    IconJenkins = 0xf3b6,\n    IconJetFighter = 0xf0fb,\n    IconJetFighterUp = 0xe518,\n    IconJira = 0xf7b1,\n    IconJoget = 0xf3b7,\n    IconJoint = 0xf595,\n    IconJoomla = 0xf1aa,\n    IconJs = 0xf3b8,\n    IconJsfiddle = 0xf1cc,\n    IconJugDetergent = 0xe519,\n    IconJxl = 0xe67b,\n    IconK = 0x4b,\n    IconKaaba = 0xf66b,\n    IconKaggle = 0xf5fa,\n    IconKey = 0xf084,\n    IconKeybase = 0xf4f5,\n    IconKeyboard = 0xf11c,\n    IconKeycdn = 0xf3ba,\n    IconKhanda = 0xf66d,\n    IconKickstarter = 0xf3bb,\n    IconKickstarterK = 0xf3bc,\n    IconKipSign = 0xe1c4,\n    IconKitMedical = 0xf479,\n    IconKitchenSet = 0xe51a,\n    IconKiwiBird = 0xf535,\n    IconKorvue = 0xf42f,\n    IconL = 0x4c,\n    IconLandMineOn = 0xe51b,\n    IconLandmark = 0xf66f,\n    IconLandmarkDome = 0xf752,\n    IconLandmarkFlag = 0xe51c,\n    IconLanguage = 0xf1ab,\n    IconLaptop = 0xf109,\n    IconLaptopCode = 0xf5fc,\n    IconLaptopFile = 0xe51d,\n    IconLaptopMedical = 0xf812,\n    IconLaravel = 0xf3bd,\n    IconLariSign = 0xe1c8,\n    IconLastfm = 0xf202,\n    IconLayerGroup = 0xf5fd,\n    IconLeaf = 0xf06c,\n    IconLeanpub = 0xf212,\n    IconLeftLong = 0xf30a,\n    IconLeftRight = 0xf337,\n    IconLemon = 0xf094,\n    IconLess = 0xf41d,\n    IconLessThan = 0x3c,\n    IconLessThanEqual = 0xf537,\n    IconLetterboxd = 0xe62d,\n    IconLifeRing = 0xf1cd,\n    IconLightbulb = 0xf0eb,\n    IconLine = 0xf3c0,\n    IconLinesLeaning = 0xe51e,\n    IconLink = 0xf0c1,\n    IconLinkSlash = 0xf127,\n    IconLinkedin = 0xf08c,\n    IconLinkedinIn = 0xf0e1,\n    IconLinode = 0xf2b8,\n    IconLinux = 0xf17c,\n    IconLiraSign = 0xf195,\n    IconList = 0xf03a,\n    IconListCheck = 0xf0ae,\n    IconListOl = 0xf0cb,\n    IconListUl = 0xf0ca,\n    IconLitecoinSign = 0xe1d3,\n    IconLocationArrow = 0xf124,\n    IconLocationCrosshairs = 0xf601,\n    IconLocationDot = 0xf3c5,\n    IconLocationPin = 0xf041,\n    IconLocationPinLock = 0xe51f,\n    IconLock = 0xf023,\n    IconLockOpen = 0xf3c1,\n    IconLocust = 0xe520,\n    IconLungs = 0xf604,\n    IconLungsVirus = 0xe067,\n    IconLyft = 0xf3c3,\n    IconM = 0x4d,\n    IconMagento = 0xf3c4,\n    IconMagnet = 0xf076,\n    IconMagnifyingGlass = 0xf002,\n    IconMagnifyingGlassArrowRight = 0xe521,\n    IconMagnifyingGlassChart = 0xe522,\n    IconMagnifyingGlassDollar = 0xf688,\n    IconMagnifyingGlassLocation = 0xf689,\n    IconMagnifyingGlassMinus = 0xf010,\n    IconMagnifyingGlassPlus = 0xf00e,\n    IconMailchimp = 0xf59e,\n    IconManatSign = 0xe1d5,\n    IconMandalorian = 0xf50f,\n    IconMap = 0xf279,\n    IconMapLocation = 0xf59f,\n    IconMapLocationDot = 0xf5a0,\n    IconMapPin = 0xf276,\n    IconMarkdown = 0xf60f,\n    IconMarker = 0xf5a1,\n    IconMars = 0xf222,\n    IconMarsAndVenus = 0xf224,\n    IconMarsAndVenusBurst = 0xe523,\n    IconMarsDouble = 0xf227,\n    IconMarsStroke = 0xf229,\n    IconMarsStrokeRight = 0xf22b,\n    IconMarsStrokeUp = 0xf22a,\n    IconMartiniGlass = 0xf57b,\n    IconMartiniGlassCitrus = 0xf561,\n    IconMartiniGlassEmpty = 0xf000,\n    IconMask = 0xf6fa,\n    IconMaskFace = 0xe1d7,\n    IconMaskVentilator = 0xe524,\n    IconMasksTheater = 0xf630,\n    IconMastodon = 0xf4f6,\n    IconMattressPillow = 0xe525,\n    IconMaxcdn = 0xf136,\n    IconMaximize = 0xf31e,\n    IconMdb = 0xf8ca,\n    IconMedal = 0xf5a2,\n    IconMedapps = 0xf3c6,\n    IconMedium = 0xf23a,\n    IconMedrt = 0xf3c8,\n    IconMeetup = 0xf2e0,\n    IconMegaport = 0xf5a3,\n    IconMemory = 0xf538,\n    IconMendeley = 0xf7b3,\n    IconMenorah = 0xf676,\n    IconMercury = 0xf223,\n    IconMessage = 0xf27a,\n    IconMeta = 0xe49b,\n    IconMeteor = 0xf753,\n    IconMicroblog = 0xe01a,\n    IconMicrochip = 0xf2db,\n    IconMicrophone = 0xf130,\n    IconMicrophoneLines = 0xf3c9,\n    IconMicrophoneLinesSlash = 0xf539,\n    IconMicrophoneSlash = 0xf131,\n    IconMicroscope = 0xf610,\n    IconMicrosoft = 0xf3ca,\n    IconMillSign = 0xe1ed,\n    IconMinimize = 0xf78c,\n    IconMintbit = 0xe62f,\n    IconMinus = 0xf068,\n    IconMitten = 0xf7b5,\n    IconMix = 0xf3cb,\n    IconMixcloud = 0xf289,\n    IconMixer = 0xe056,\n    IconMizuni = 0xf3cc,\n    IconMobile = 0xf3ce,\n    IconMobileButton = 0xf10b,\n    IconMobileRetro = 0xe527,\n    IconMobileScreen = 0xf3cf,\n    IconMobileScreenButton = 0xf3cd,\n    IconModx = 0xf285,\n    IconMonero = 0xf3d0,\n    IconMoneyBill = 0xf0d6,\n    IconMoneyBill1 = 0xf3d1,\n    IconMoneyBill1Wave = 0xf53b,\n    IconMoneyBillTransfer = 0xe528,\n    IconMoneyBillTrendUp = 0xe529,\n    IconMoneyBillWave = 0xf53a,\n    IconMoneyBillWheat = 0xe52a,\n    IconMoneyBills = 0xe1f3,\n    IconMoneyCheck = 0xf53c,\n    IconMoneyCheckDollar = 0xf53d,\n    IconMonument = 0xf5a6,\n    IconMoon = 0xf186,\n    IconMortarPestle = 0xf5a7,\n    IconMosque = 0xf678,\n    IconMosquito = 0xe52b,\n    IconMosquitoNet = 0xe52c,\n    IconMotorcycle = 0xf21c,\n    IconMound = 0xe52d,\n    IconMountain = 0xf6fc,\n    IconMountainCity = 0xe52e,\n    IconMountainSun = 0xe52f,\n    IconMugHot = 0xf7b6,\n    IconMugSaucer = 0xf0f4,\n    IconMusic = 0xf001,\n    IconN = 0x4e,\n    IconNairaSign = 0xe1f6,\n    IconNapster = 0xf3d2,\n    IconNeos = 0xf612,\n    IconNetworkWired = 0xf6ff,\n    IconNeuter = 0xf22c,\n    IconNewspaper = 0xf1ea,\n    IconNfcDirectional = 0xe530,\n    IconNfcSymbol = 0xe531,\n    IconNimblr = 0xf5a8,\n    IconNode = 0xf419,\n    IconNodeJs = 0xf3d3,\n    IconNotEqual = 0xf53e,\n    IconNotdef = 0xe1fe,\n    IconNoteSticky = 0xf249,\n    IconNotesMedical = 0xf481,\n    IconNpm = 0xf3d4,\n    IconNs8 = 0xf3d5,\n    IconNutritionix = 0xf3d6,\n    IconO = 0x4f,\n    IconObjectGroup = 0xf247,\n    IconObjectUngroup = 0xf248,\n    IconOctopusDeploy = 0xe082,\n    IconOdnoklassniki = 0xf263,\n    IconOdysee = 0xe5c6,\n    IconOilCan = 0xf613,\n    IconOilWell = 0xe532,\n    IconOldRepublic = 0xf510,\n    IconOm = 0xf679,\n    IconOpencart = 0xf23d,\n    IconOpenid = 0xf19b,\n    IconOpensuse = 0xe62b,\n    IconOpera = 0xf26a,\n    IconOptinMonster = 0xf23c,\n    IconOrcid = 0xf8d2,\n    IconOsi = 0xf41a,\n    IconOtter = 0xf700,\n    IconOutdent = 0xf03b,\n    IconP = 0x50,\n    IconPadlet = 0xe4a0,\n    IconPage4 = 0xf3d7,\n    IconPagelines = 0xf18c,\n    IconPager = 0xf815,\n    IconPaintRoller = 0xf5aa,\n    IconPaintbrush = 0xf1fc,\n    IconPalette = 0xf53f,\n    IconPalfed = 0xf3d8,\n    IconPallet = 0xf482,\n    IconPanorama = 0xe209,\n    IconPaperPlane = 0xf1d8,\n    IconPaperclip = 0xf0c6,\n    IconParachuteBox = 0xf4cd,\n    IconParagraph = 0xf1dd,\n    IconPassport = 0xf5ab,\n    IconPaste = 0xf0ea,\n    IconPatreon = 0xf3d9,\n    IconPause = 0xf04c,\n    IconPaw = 0xf1b0,\n    IconPaypal = 0xf1ed,\n    IconPeace = 0xf67c,\n    IconPen = 0xf304,\n    IconPenClip = 0xf305,\n    IconPenFancy = 0xf5ac,\n    IconPenNib = 0xf5ad,\n    IconPenRuler = 0xf5ae,\n    IconPenToSquare = 0xf044,\n    IconPencil = 0xf303,\n    IconPeopleArrows = 0xe068,\n    IconPeopleCarryBox = 0xf4ce,\n    IconPeopleGroup = 0xe533,\n    IconPeopleLine = 0xe534,\n    IconPeoplePulling = 0xe535,\n    IconPeopleRobbery = 0xe536,\n    IconPeopleRoof = 0xe537,\n    IconPepperHot = 0xf816,\n    IconPerbyte = 0xe083,\n    IconPercent = 0x25,\n    IconPeriscope = 0xf3da,\n    IconPerson = 0xf183,\n    IconPersonArrowDownToLine = 0xe538,\n    IconPersonArrowUpFromLine = 0xe539,\n    IconPersonBiking = 0xf84a,\n    IconPersonBooth = 0xf756,\n    IconPersonBreastfeeding = 0xe53a,\n    IconPersonBurst = 0xe53b,\n    IconPersonCane = 0xe53c,\n    IconPersonChalkboard = 0xe53d,\n    IconPersonCircleCheck = 0xe53e,\n    IconPersonCircleExclamation = 0xe53f,\n    IconPersonCircleMinus = 0xe540,\n    IconPersonCirclePlus = 0xe541,\n    IconPersonCircleQuestion = 0xe542,\n    IconPersonCircleXmark = 0xe543,\n    IconPersonDigging = 0xf85e,\n    IconPersonDotsFromLine = 0xf470,\n    IconPersonDress = 0xf182,\n    IconPersonDressBurst = 0xe544,\n    IconPersonDrowning = 0xe545,\n    IconPersonFalling = 0xe546,\n    IconPersonFallingBurst = 0xe547,\n    IconPersonHalfDress = 0xe548,\n    IconPersonHarassing = 0xe549,\n    IconPersonHiking = 0xf6ec,\n    IconPersonMilitaryPointing = 0xe54a,\n    IconPersonMilitaryRifle = 0xe54b,\n    IconPersonMilitaryToPerson = 0xe54c,\n    IconPersonPraying = 0xf683,\n    IconPersonPregnant = 0xe31e,\n    IconPersonRays = 0xe54d,\n    IconPersonRifle = 0xe54e,\n    IconPersonRunning = 0xf70c,\n    IconPersonShelter = 0xe54f,\n    IconPersonSkating = 0xf7c5,\n    IconPersonSkiing = 0xf7c9,\n    IconPersonSkiingNordic = 0xf7ca,\n    IconPersonSnowboarding = 0xf7ce,\n    IconPersonSwimming = 0xf5c4,\n    IconPersonThroughWindow = 0xe5a9,\n    IconPersonWalking = 0xf554,\n    IconPersonWalkingArrowLoopLeft = 0xe551,\n    IconPersonWalkingArrowRight = 0xe552,\n    IconPersonWalkingDashedLineArrowRight = 0xe553,\n    IconPersonWalkingLuggage = 0xe554,\n    IconPersonWalkingWithCane = 0xf29d,\n    IconPesetaSign = 0xe221,\n    IconPesoSign = 0xe222,\n    IconPhabricator = 0xf3db,\n    IconPhoenixFramework = 0xf3dc,\n    IconPhoenixSquadron = 0xf511,\n    IconPhone = 0xf095,\n    IconPhoneFlip = 0xf879,\n    IconPhoneSlash = 0xf3dd,\n    IconPhoneVolume = 0xf2a0,\n    IconPhotoFilm = 0xf87c,\n    IconPhp = 0xf457,\n    IconPiedPiper = 0xf2ae,\n    IconPiedPiperAlt = 0xf1a8,\n    IconPiedPiperHat = 0xf4e5,\n    IconPiedPiperPp = 0xf1a7,\n    IconPiggyBank = 0xf4d3,\n    IconPills = 0xf484,\n    IconPinterest = 0xf0d2,\n    IconPinterestP = 0xf231,\n    IconPix = 0xe43a,\n    IconPixiv = 0xe640,\n    IconPizzaSlice = 0xf818,\n    IconPlaceOfWorship = 0xf67f,\n    IconPlane = 0xf072,\n    IconPlaneArrival = 0xf5af,\n    IconPlaneCircleCheck = 0xe555,\n    IconPlaneCircleExclamation = 0xe556,\n    IconPlaneCircleXmark = 0xe557,\n    IconPlaneDeparture = 0xf5b0,\n    IconPlaneLock = 0xe558,\n    IconPlaneSlash = 0xe069,\n    IconPlaneUp = 0xe22d,\n    IconPlantWilt = 0xe5aa,\n    IconPlateWheat = 0xe55a,\n    IconPlay = 0xf04b,\n    IconPlaystation = 0xf3df,\n    IconPlug = 0xf1e6,\n    IconPlugCircleBolt = 0xe55b,\n    IconPlugCircleCheck = 0xe55c,\n    IconPlugCircleExclamation = 0xe55d,\n    IconPlugCircleMinus = 0xe55e,\n    IconPlugCirclePlus = 0xe55f,\n    IconPlugCircleXmark = 0xe560,\n    IconPlus = 0x2b,\n    IconPlusMinus = 0xe43c,\n    IconPodcast = 0xf2ce,\n    IconPoo = 0xf2fe,\n    IconPooStorm = 0xf75a,\n    IconPoop = 0xf619,\n    IconPowerOff = 0xf011,\n    IconPrescription = 0xf5b1,\n    IconPrescriptionBottle = 0xf485,\n    IconPrescriptionBottleMedical = 0xf486,\n    IconPrint = 0xf02f,\n    IconProductHunt = 0xf288,\n    IconPumpMedical = 0xe06a,\n    IconPumpSoap = 0xe06b,\n    IconPushed = 0xf3e1,\n    IconPuzzlePiece = 0xf12e,\n    IconPython = 0xf3e2,\n    IconQ = 0x51,\n    IconQq = 0xf1d6,\n    IconQrcode = 0xf029,\n    IconQuestion = 0x3f,\n    IconQuinscape = 0xf459,\n    IconQuora = 0xf2c4,\n    IconQuoteLeft = 0xf10d,\n    IconQuoteRight = 0xf10e,\n    IconR = 0x52,\n    IconRProject = 0xf4f7,\n    IconRadiation = 0xf7b9,\n    IconRadio = 0xf8d7,\n    IconRainbow = 0xf75b,\n    IconRankingStar = 0xe561,\n    IconRaspberryPi = 0xf7bb,\n    IconRavelry = 0xf2d9,\n    IconReact = 0xf41b,\n    IconReacteurope = 0xf75d,\n    IconReadme = 0xf4d5,\n    IconRebel = 0xf1d0,\n    IconReceipt = 0xf543,\n    IconRecordVinyl = 0xf8d9,\n    IconRectangleAd = 0xf641,\n    IconRectangleList = 0xf022,\n    IconRectangleXmark = 0xf410,\n    IconRecycle = 0xf1b8,\n    IconRedRiver = 0xf3e3,\n    IconReddit = 0xf1a1,\n    IconRedditAlien = 0xf281,\n    IconRedhat = 0xf7bc,\n    IconRegistered = 0xf25d,\n    IconRenren = 0xf18b,\n    IconRepeat = 0xf363,\n    IconReply = 0xf3e5,\n    IconReplyAll = 0xf122,\n    IconReplyd = 0xf3e6,\n    IconRepublican = 0xf75e,\n    IconResearchgate = 0xf4f8,\n    IconResolving = 0xf3e7,\n    IconRestroom = 0xf7bd,\n    IconRetweet = 0xf079,\n    IconRev = 0xf5b2,\n    IconRibbon = 0xf4d6,\n    IconRightFromBracket = 0xf2f5,\n    IconRightLeft = 0xf362,\n    IconRightLong = 0xf30b,\n    IconRightToBracket = 0xf2f6,\n    IconRing = 0xf70b,\n    IconRoad = 0xf018,\n    IconRoadBarrier = 0xe562,\n    IconRoadBridge = 0xe563,\n    IconRoadCircleCheck = 0xe564,\n    IconRoadCircleExclamation = 0xe565,\n    IconRoadCircleXmark = 0xe566,\n    IconRoadLock = 0xe567,\n    IconRoadSpikes = 0xe568,\n    IconRobot = 0xf544,\n    IconRocket = 0xf135,\n    IconRocketchat = 0xf3e8,\n    IconRockrms = 0xf3e9,\n    IconRotate = 0xf2f1,\n    IconRotateLeft = 0xf2ea,\n    IconRotateRight = 0xf2f9,\n    IconRoute = 0xf4d7,\n    IconRss = 0xf09e,\n    IconRubleSign = 0xf158,\n    IconRug = 0xe569,\n    IconRuler = 0xf545,\n    IconRulerCombined = 0xf546,\n    IconRulerHorizontal = 0xf547,\n    IconRulerVertical = 0xf548,\n    IconRupeeSign = 0xf156,\n    IconRupiahSign = 0xe23d,\n    IconRust = 0xe07a,\n    IconS = 0x53,\n    IconSackDollar = 0xf81d,\n    IconSackXmark = 0xe56a,\n    IconSafari = 0xf267,\n    IconSailboat = 0xe445,\n    IconSalesforce = 0xf83b,\n    IconSass = 0xf41e,\n    IconSatellite = 0xf7bf,\n    IconSatelliteDish = 0xf7c0,\n    IconScaleBalanced = 0xf24e,\n    IconScaleUnbalanced = 0xf515,\n    IconScaleUnbalancedFlip = 0xf516,\n    IconSchlix = 0xf3ea,\n    IconSchool = 0xf549,\n    IconSchoolCircleCheck = 0xe56b,\n    IconSchoolCircleExclamation = 0xe56c,\n    IconSchoolCircleXmark = 0xe56d,\n    IconSchoolFlag = 0xe56e,\n    IconSchoolLock = 0xe56f,\n    IconScissors = 0xf0c4,\n    IconScreenpal = 0xe570,\n    IconScrewdriver = 0xf54a,\n    IconScrewdriverWrench = 0xf7d9,\n    IconScribd = 0xf28a,\n    IconScroll = 0xf70e,\n    IconScrollTorah = 0xf6a0,\n    IconSdCard = 0xf7c2,\n    IconSearchengin = 0xf3eb,\n    IconSection = 0xe447,\n    IconSeedling = 0xf4d8,\n    IconSellcast = 0xf2da,\n    IconSellsy = 0xf213,\n    IconServer = 0xf233,\n    IconServicestack = 0xf3ec,\n    IconShapes = 0xf61f,\n    IconShare = 0xf064,\n    IconShareFromSquare = 0xf14d,\n    IconShareNodes = 0xf1e0,\n    IconSheetPlastic = 0xe571,\n    IconShekelSign = 0xf20b,\n    IconShield = 0xf132,\n    IconShieldCat = 0xe572,\n    IconShieldDog = 0xe573,\n    IconShieldHalved = 0xf3ed,\n    IconShieldHeart = 0xe574,\n    IconShieldVirus = 0xe06c,\n    IconShip = 0xf21a,\n    IconShirt = 0xf553,\n    IconShirtsinbulk = 0xf214,\n    IconShoePrints = 0xf54b,\n    IconShoelace = 0xe60c,\n    IconShop = 0xf54f,\n    IconShopLock = 0xe4a5,\n    IconShopSlash = 0xe070,\n    IconShopify = 0xe057,\n    IconShopware = 0xf5b5,\n    IconShower = 0xf2cc,\n    IconShrimp = 0xe448,\n    IconShuffle = 0xf074,\n    IconShuttleSpace = 0xf197,\n    IconSignHanging = 0xf4d9,\n    IconSignal = 0xf012,\n    IconSignalMessenger = 0xe663,\n    IconSignature = 0xf5b7,\n    IconSignsPost = 0xf277,\n    IconSimCard = 0xf7c4,\n    IconSimplybuilt = 0xf215,\n    IconSink = 0xe06d,\n    IconSistrix = 0xf3ee,\n    IconSitemap = 0xf0e8,\n    IconSith = 0xf512,\n    IconSitrox = 0xe44a,\n    IconSketch = 0xf7c6,\n    IconSkull = 0xf54c,\n    IconSkullCrossbones = 0xf714,\n    IconSkyatlas = 0xf216,\n    IconSkype = 0xf17e,\n    IconSlack = 0xf198,\n    IconSlash = 0xf715,\n    IconSleigh = 0xf7cc,\n    IconSliders = 0xf1de,\n    IconSlideshare = 0xf1e7,\n    IconSmog = 0xf75f,\n    IconSmoking = 0xf48d,\n    IconSnapchat = 0xf2ab,\n    IconSnowflake = 0xf2dc,\n    IconSnowman = 0xf7d0,\n    IconSnowplow = 0xf7d2,\n    IconSoap = 0xe06e,\n    IconSocks = 0xf696,\n    IconSolarPanel = 0xf5ba,\n    IconSort = 0xf0dc,\n    IconSortDown = 0xf0dd,\n    IconSortUp = 0xf0de,\n    IconSoundcloud = 0xf1be,\n    IconSourcetree = 0xf7d3,\n    IconSpa = 0xf5bb,\n    IconSpaceAwesome = 0xe5ac,\n    IconSpaghettiMonsterFlying = 0xf67b,\n    IconSpeakap = 0xf3f3,\n    IconSpeakerDeck = 0xf83c,\n    IconSpellCheck = 0xf891,\n    IconSpider = 0xf717,\n    IconSpinner = 0xf110,\n    IconSplotch = 0xf5bc,\n    IconSpoon = 0xf2e5,\n    IconSpotify = 0xf1bc,\n    IconSprayCan = 0xf5bd,\n    IconSprayCanSparkles = 0xf5d0,\n    IconSquare = 0xf0c8,\n    IconSquareArrowUpRight = 0xf14c,\n    IconSquareBehance = 0xf1b5,\n    IconSquareBinary = 0xe69b,\n    IconSquareBluesky = 0xe6a3,\n    IconSquareCaretDown = 0xf150,\n    IconSquareCaretLeft = 0xf191,\n    IconSquareCaretRight = 0xf152,\n    IconSquareCaretUp = 0xf151,\n    IconSquareCheck = 0xf14a,\n    IconSquareDribbble = 0xf397,\n    IconSquareEnvelope = 0xf199,\n    IconSquareFacebook = 0xf082,\n    IconSquareFontAwesome = 0xe5ad,\n    IconSquareFontAwesomeStroke = 0xf35c,\n    IconSquareFull = 0xf45c,\n    IconSquareGit = 0xf1d2,\n    IconSquareGithub = 0xf092,\n    IconSquareGitlab = 0xe5ae,\n    IconSquareGooglePlus = 0xf0d4,\n    IconSquareH = 0xf0fd,\n    IconSquareHackerNews = 0xf3af,\n    IconSquareInstagram = 0xe055,\n    IconSquareJs = 0xf3b9,\n    IconSquareLastfm = 0xf203,\n    IconSquareLetterboxd = 0xe62e,\n    IconSquareMinus = 0xf146,\n    IconSquareNfi = 0xe576,\n    IconSquareOdnoklassniki = 0xf264,\n    IconSquareParking = 0xf540,\n    IconSquarePen = 0xf14b,\n    IconSquarePersonConfined = 0xe577,\n    IconSquarePhone = 0xf098,\n    IconSquarePhoneFlip = 0xf87b,\n    IconSquarePiedPiper = 0xe01e,\n    IconSquarePinterest = 0xf0d3,\n    IconSquarePlus = 0xf0fe,\n    IconSquarePollHorizontal = 0xf682,\n    IconSquarePollVertical = 0xf681,\n    IconSquareReddit = 0xf1a2,\n    IconSquareRootVariable = 0xf698,\n    IconSquareRss = 0xf143,\n    IconSquareShareNodes = 0xf1e1,\n    IconSquareSnapchat = 0xf2ad,\n    IconSquareSteam = 0xf1b7,\n    IconSquareThreads = 0xe619,\n    IconSquareTumblr = 0xf174,\n    IconSquareTwitter = 0xf081,\n    IconSquareUpRight = 0xf360,\n    IconSquareUpwork = 0xe67c,\n    IconSquareViadeo = 0xf2aa,\n    IconSquareVimeo = 0xf194,\n    IconSquareVirus = 0xe578,\n    IconSquareWebAwesome = 0xe683,\n    IconSquareWebAwesomeStroke = 0xe684,\n    IconSquareWhatsapp = 0xf40c,\n    IconSquareXTwitter = 0xe61a,\n    IconSquareXing = 0xf169,\n    IconSquareXmark = 0xf2d3,\n    IconSquareYoutube = 0xf431,\n    IconSquarespace = 0xf5be,\n    IconStackExchange = 0xf18d,\n    IconStackOverflow = 0xf16c,\n    IconStackpath = 0xf842,\n    IconStaffSnake = 0xe579,\n    IconStairs = 0xe289,\n    IconStamp = 0xf5bf,\n    IconStapler = 0xe5af,\n    IconStar = 0xf005,\n    IconStarAndCrescent = 0xf699,\n    IconStarHalf = 0xf089,\n    IconStarHalfStroke = 0xf5c0,\n    IconStarOfDavid = 0xf69a,\n    IconStarOfLife = 0xf621,\n    IconStaylinked = 0xf3f5,\n    IconSteam = 0xf1b6,\n    IconSteamSymbol = 0xf3f6,\n    IconSterlingSign = 0xf154,\n    IconStethoscope = 0xf0f1,\n    IconStickerMule = 0xf3f7,\n    IconStop = 0xf04d,\n    IconStopwatch = 0xf2f2,\n    IconStopwatch20 = 0xe06f,\n    IconStore = 0xf54e,\n    IconStoreSlash = 0xe071,\n    IconStrava = 0xf428,\n    IconStreetView = 0xf21d,\n    IconStrikethrough = 0xf0cc,\n    IconStripe = 0xf429,\n    IconStripeS = 0xf42a,\n    IconStroopwafel = 0xf551,\n    IconStubber = 0xe5c7,\n    IconStudiovinari = 0xf3f8,\n    IconStumbleupon = 0xf1a4,\n    IconStumbleuponCircle = 0xf1a3,\n    IconSubscript = 0xf12c,\n    IconSuitcase = 0xf0f2,\n    IconSuitcaseMedical = 0xf0fa,\n    IconSuitcaseRolling = 0xf5c1,\n    IconSun = 0xf185,\n    IconSunPlantWilt = 0xe57a,\n    IconSuperpowers = 0xf2dd,\n    IconSuperscript = 0xf12b,\n    IconSupple = 0xf3f9,\n    IconSuse = 0xf7d6,\n    IconSwatchbook = 0xf5c3,\n    IconSwift = 0xf8e1,\n    IconSymfony = 0xf83d,\n    IconSynagogue = 0xf69b,\n    IconSyringe = 0xf48e,\n    IconT = 0x54,\n    IconTable = 0xf0ce,\n    IconTableCells = 0xf00a,\n    IconTableCellsColumnLock = 0xe678,\n    IconTableCellsLarge = 0xf009,\n    IconTableCellsRowLock = 0xe67a,\n    IconTableCellsRowUnlock = 0xe691,\n    IconTableColumns = 0xf0db,\n    IconTableList = 0xf00b,\n    IconTableTennisPaddleBall = 0xf45d,\n    IconTablet = 0xf3fb,\n    IconTabletButton = 0xf10a,\n    IconTabletScreenButton = 0xf3fa,\n    IconTablets = 0xf490,\n    IconTachographDigital = 0xf566,\n    IconTag = 0xf02b,\n    IconTags = 0xf02c,\n    IconTape = 0xf4db,\n    IconTarp = 0xe57b,\n    IconTarpDroplet = 0xe57c,\n    IconTaxi = 0xf1ba,\n    IconTeamspeak = 0xf4f9,\n    IconTeeth = 0xf62e,\n    IconTeethOpen = 0xf62f,\n    IconTelegram = 0xf2c6,\n    IconTemperatureArrowDown = 0xe03f,\n    IconTemperatureArrowUp = 0xe040,\n    IconTemperatureEmpty = 0xf2cb,\n    IconTemperatureFull = 0xf2c7,\n    IconTemperatureHalf = 0xf2c9,\n    IconTemperatureHigh = 0xf769,\n    IconTemperatureLow = 0xf76b,\n    IconTemperatureQuarter = 0xf2ca,\n    IconTemperatureThreeQuarters = 0xf2c8,\n    IconTencentWeibo = 0xf1d5,\n    IconTengeSign = 0xf7d7,\n    IconTent = 0xe57d,\n    IconTentArrowDownToLine = 0xe57e,\n    IconTentArrowLeftRight = 0xe57f,\n    IconTentArrowTurnLeft = 0xe580,\n    IconTentArrowsDown = 0xe581,\n    IconTents = 0xe582,\n    IconTerminal = 0xf120,\n    IconTextHeight = 0xf034,\n    IconTextSlash = 0xf87d,\n    IconTextWidth = 0xf035,\n    IconTheRedYeti = 0xf69d,\n    IconThemeco = 0xf5c6,\n    IconThemeisle = 0xf2b2,\n    IconThermometer = 0xf491,\n    IconThinkPeaks = 0xf731,\n    IconThreads = 0xe618,\n    IconThumbsDown = 0xf165,\n    IconThumbsUp = 0xf164,\n    IconThumbtack = 0xf08d,\n    IconThumbtackSlash = 0xe68f,\n    IconTicket = 0xf145,\n    IconTicketSimple = 0xf3ff,\n    IconTiktok = 0xe07b,\n    IconTimeline = 0xe29c,\n    IconToggleOff = 0xf204,\n    IconToggleOn = 0xf205,\n    IconToilet = 0xf7d8,\n    IconToiletPaper = 0xf71e,\n    IconToiletPaperSlash = 0xe072,\n    IconToiletPortable = 0xe583,\n    IconToiletsPortable = 0xe584,\n    IconToolbox = 0xf552,\n    IconTooth = 0xf5c9,\n    IconToriiGate = 0xf6a1,\n    IconTornado = 0xf76f,\n    IconTowerBroadcast = 0xf519,\n    IconTowerCell = 0xe585,\n    IconTowerObservation = 0xe586,\n    IconTractor = 0xf722,\n    IconTradeFederation = 0xf513,\n    IconTrademark = 0xf25c,\n    IconTrafficLight = 0xf637,\n    IconTrailer = 0xe041,\n    IconTrain = 0xf238,\n    IconTrainSubway = 0xf239,\n    IconTrainTram = 0xe5b4,\n    IconTransgender = 0xf225,\n    IconTrash = 0xf1f8,\n    IconTrashArrowUp = 0xf829,\n    IconTrashCan = 0xf2ed,\n    IconTrashCanArrowUp = 0xf82a,\n    IconTree = 0xf1bb,\n    IconTreeCity = 0xe587,\n    IconTrello = 0xf181,\n    IconTriangleExclamation = 0xf071,\n    IconTrophy = 0xf091,\n    IconTrowel = 0xe589,\n    IconTrowelBricks = 0xe58a,\n    IconTruck = 0xf0d1,\n    IconTruckArrowRight = 0xe58b,\n    IconTruckDroplet = 0xe58c,\n    IconTruckFast = 0xf48b,\n    IconTruckField = 0xe58d,\n    IconTruckFieldUn = 0xe58e,\n    IconTruckFront = 0xe2b7,\n    IconTruckMedical = 0xf0f9,\n    IconTruckMonster = 0xf63b,\n    IconTruckMoving = 0xf4df,\n    IconTruckPickup = 0xf63c,\n    IconTruckPlane = 0xe58f,\n    IconTruckRampBox = 0xf4de,\n    IconTty = 0xf1e4,\n    IconTumblr = 0xf173,\n    IconTurkishLiraSign = 0xe2bb,\n    IconTurnDown = 0xf3be,\n    IconTurnUp = 0xf3bf,\n    IconTv = 0xf26c,\n    IconTwitch = 0xf1e8,\n    IconTwitter = 0xf099,\n    IconTypo3 = 0xf42b,\n    IconU = 0x55,\n    IconUber = 0xf402,\n    IconUbuntu = 0xf7df,\n    IconUikit = 0xf403,\n    IconUmbraco = 0xf8e8,\n    IconUmbrella = 0xf0e9,\n    IconUmbrellaBeach = 0xf5ca,\n    IconUncharted = 0xe084,\n    IconUnderline = 0xf0cd,\n    IconUniregistry = 0xf404,\n    IconUnity = 0xe049,\n    IconUniversalAccess = 0xf29a,\n    IconUnlock = 0xf09c,\n    IconUnlockKeyhole = 0xf13e,\n    IconUnsplash = 0xe07c,\n    IconUntappd = 0xf405,\n    IconUpDown = 0xf338,\n    IconUpDownLeftRight = 0xf0b2,\n    IconUpLong = 0xf30c,\n    IconUpRightAndDownLeftFromCenter = 0xf424,\n    IconUpRightFromSquare = 0xf35d,\n    IconUpload = 0xf093,\n    IconUps = 0xf7e0,\n    IconUpwork = 0xe641,\n    IconUsb = 0xf287,\n    IconUser = 0xf007,\n    IconUserAstronaut = 0xf4fb,\n    IconUserCheck = 0xf4fc,\n    IconUserClock = 0xf4fd,\n    IconUserDoctor = 0xf0f0,\n    IconUserGear = 0xf4fe,\n    IconUserGraduate = 0xf501,\n    IconUserGroup = 0xf500,\n    IconUserInjured = 0xf728,\n    IconUserLarge = 0xf406,\n    IconUserLargeSlash = 0xf4fa,\n    IconUserLock = 0xf502,\n    IconUserMinus = 0xf503,\n    IconUserNinja = 0xf504,\n    IconUserNurse = 0xf82f,\n    IconUserPen = 0xf4ff,\n    IconUserPlus = 0xf234,\n    IconUserSecret = 0xf21b,\n    IconUserShield = 0xf505,\n    IconUserSlash = 0xf506,\n    IconUserTag = 0xf507,\n    IconUserTie = 0xf508,\n    IconUserXmark = 0xf235,\n    IconUsers = 0xf0c0,\n    IconUsersBetweenLines = 0xe591,\n    IconUsersGear = 0xf509,\n    IconUsersLine = 0xe592,\n    IconUsersRays = 0xe593,\n    IconUsersRectangle = 0xe594,\n    IconUsersSlash = 0xe073,\n    IconUsersViewfinder = 0xe595,\n    IconUsps = 0xf7e1,\n    IconUssunnah = 0xf407,\n    IconUtensils = 0xf2e7,\n    IconV = 0x56,\n    IconVaadin = 0xf408,\n    IconVanShuttle = 0xf5b6,\n    IconVault = 0xe2c5,\n    IconVectorSquare = 0xf5cb,\n    IconVenus = 0xf221,\n    IconVenusDouble = 0xf226,\n    IconVenusMars = 0xf228,\n    IconVest = 0xe085,\n    IconVestPatches = 0xe086,\n    IconViacoin = 0xf237,\n    IconViadeo = 0xf2a9,\n    IconVial = 0xf492,\n    IconVialCircleCheck = 0xe596,\n    IconVialVirus = 0xe597,\n    IconVials = 0xf493,\n    IconViber = 0xf409,\n    IconVideo = 0xf03d,\n    IconVideoSlash = 0xf4e2,\n    IconVihara = 0xf6a7,\n    IconVimeo = 0xf40a,\n    IconVimeoV = 0xf27d,\n    IconVine = 0xf1ca,\n    IconVirus = 0xe074,\n    IconVirusCovid = 0xe4a8,\n    IconVirusCovidSlash = 0xe4a9,\n    IconVirusSlash = 0xe075,\n    IconViruses = 0xe076,\n    IconVk = 0xf189,\n    IconVnv = 0xf40b,\n    IconVoicemail = 0xf897,\n    IconVolcano = 0xf770,\n    IconVolleyball = 0xf45f,\n    IconVolumeHigh = 0xf028,\n    IconVolumeLow = 0xf027,\n    IconVolumeOff = 0xf026,\n    IconVolumeXmark = 0xf6a9,\n    IconVrCardboard = 0xf729,\n    IconVuejs = 0xf41f,\n    IconW = 0x57,\n    IconWalkieTalkie = 0xf8ef,\n    IconWallet = 0xf555,\n    IconWandMagic = 0xf0d0,\n    IconWandMagicSparkles = 0xe2ca,\n    IconWandSparkles = 0xf72b,\n    IconWarehouse = 0xf494,\n    IconWatchmanMonitoring = 0xe087,\n    IconWater = 0xf773,\n    IconWaterLadder = 0xf5c5,\n    IconWaveSquare = 0xf83e,\n    IconWaze = 0xf83f,\n    IconWebAwesome = 0xe682,\n    IconWebflow = 0xe65c,\n    IconWeebly = 0xf5cc,\n    IconWeibo = 0xf18a,\n    IconWeightHanging = 0xf5cd,\n    IconWeightScale = 0xf496,\n    IconWeixin = 0xf1d7,\n    IconWhatsapp = 0xf232,\n    IconWheatAwn = 0xe2cd,\n    IconWheatAwnCircleExclamation = 0xe598,\n    IconWheelchair = 0xf193,\n    IconWheelchairMove = 0xe2ce,\n    IconWhiskeyGlass = 0xf7a0,\n    IconWhmcs = 0xf40d,\n    IconWifi = 0xf1eb,\n    IconWikipediaW = 0xf266,\n    IconWind = 0xf72e,\n    IconWindowMaximize = 0xf2d0,\n    IconWindowMinimize = 0xf2d1,\n    IconWindowRestore = 0xf2d2,\n    IconWindows = 0xf17a,\n    IconWineBottle = 0xf72f,\n    IconWineGlass = 0xf4e3,\n    IconWineGlassEmpty = 0xf5ce,\n    IconWirsindhandwerk = 0xe2d0,\n    IconWix = 0xf5cf,\n    IconWizardsOfTheCoast = 0xf730,\n    IconWodu = 0xe088,\n    IconWolfPackBattalion = 0xf514,\n    IconWonSign = 0xf159,\n    IconWordpress = 0xf19a,\n    IconWordpressSimple = 0xf411,\n    IconWorm = 0xe599,\n    IconWpbeginner = 0xf297,\n    IconWpexplorer = 0xf2de,\n    IconWpforms = 0xf298,\n    IconWpressr = 0xf3e4,\n    IconWrench = 0xf0ad,\n    IconX = 0x58,\n    IconXRay = 0xf497,\n    IconXTwitter = 0xe61b,\n    IconXbox = 0xf412,\n    IconXing = 0xf168,\n    IconXmark = 0xf00d,\n    IconXmarksLines = 0xe59a,\n    IconY = 0x59,\n    IconYCombinator = 0xf23b,\n    IconYahoo = 0xf19e,\n    IconYammer = 0xf840,\n    IconYandex = 0xf413,\n    IconYandexInternational = 0xf414,\n    IconYarn = 0xf7e3,\n    IconYelp = 0xf1e9,\n    IconYenSign = 0xf157,\n    IconYinYang = 0xf6ad,\n    IconYoast = 0xf2b1,\n    IconYoutube = 0xf167,\n    IconZ = 0x5a,\n    IconZhihu = 0xf63f,\n};\n"
  },
  {
    "path": "src/gui/iconselectbutton.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"iconselectbutton.h\"\n\n#include \"common/common.h\"\n#include \"gui/fix_icon_id.h\"\n#include \"gui/geometry.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/iconselectdialog.h\"\n#include \"gui/fromiconid.h\"\n\n#include <QApplication>\n#include <QIcon>\n\n#include <memory>\n\nIconSelectButton::IconSelectButton(QWidget *parent)\n    : QPushButton(parent)\n    , m_currentIcon()\n{\n    setToolTip(tr(\"Select Icon…\"));\n\n    connect( this, &QAbstractButton::clicked, this, &IconSelectButton::onClicked );\n\n    // reset button text to \"...\"\n    m_currentIcon = \"X\";\n    setCurrentIcon(QString());\n}\n\nvoid IconSelectButton::setCurrentIcon(const QString &iconString)\n{\n    if ( m_currentIcon == iconString )\n        return;\n\n    m_currentIcon = iconString;\n\n    setText(QString());\n    setIcon(QIcon());\n\n    if ( iconString.size() == 1 ) {\n        const QChar c = iconString[0];\n        const ushort id = fixIconId( c.unicode() );\n        m_currentIcon = fromIconId(id);\n        setFont(iconFont());\n        setText(m_currentIcon);\n    } else if ( !iconString.isEmpty() ) {\n        const QIcon icon(iconString);\n        if ( icon.isNull() )\n            m_currentIcon = QString();\n        else\n            setIcon(icon);\n    }\n\n    if (m_currentIcon.isEmpty()) {\n        setFont(QFont());\n        setText( tr(\"...\", \"Select/browse icon.\") );\n    }\n\n    emit currentIconChanged(m_currentIcon);\n}\n\nQSize IconSelectButton::sizeHint() const\n{\n    const int h = QPushButton::sizeHint().height();\n    return QSize(h, h);\n}\n\nvoid IconSelectButton::onClicked()\n{\n    std::unique_ptr<IconSelectDialog> dialog( new IconSelectDialog(m_currentIcon, this) );\n\n    // Set position under button.\n    const QPoint dialogPosition = mapToGlobal(QPoint(0, height()));\n    moveWindowOnScreen( dialog.get(), dialogPosition );\n\n    dialog->setAttribute(Qt::WA_DeleteOnClose, true);\n    connect( dialog.get(), &IconSelectDialog::iconSelected,\n             this, &IconSelectButton::setCurrentIcon );\n    dialog->open();\n    dialog.release();\n}\n"
  },
  {
    "path": "src/gui/iconselectbutton.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QPushButton>\n\nclass IconSelectButton final : public QPushButton\n{\n    Q_OBJECT\n    Q_PROPERTY(QString currentIcon READ currentIcon WRITE setCurrentIcon NOTIFY currentIconChanged)\npublic:\n    explicit IconSelectButton(QWidget *parent = nullptr);\n\n    const QString &currentIcon() const { return m_currentIcon; }\n\n    QSize sizeHint() const override;\n\n    void setCurrentIcon(const QString &iconString);\n\nsignals:\n    void currentIconChanged(const QString &icon);\n\nprivate:\n    void onClicked();\n\n    QString m_currentIcon;\n};\n"
  },
  {
    "path": "src/gui/iconselectdialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"iconselectdialog.h\"\n\n#include \"gui/geometry.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/icon_list.h\"\n\n#include <QDialogButtonBox>\n#include <QFileDialog>\n#include <QKeyEvent>\n#include <QListWidget>\n#include <QLineEdit>\n#include <QPushButton>\n#include <QVBoxLayout>\n\nclass IconListWidget final : public QListWidget {\npublic:\n    explicit IconListWidget(QWidget *parent)\n        : QListWidget(parent)\n    {\n        const int gridSize = iconFontSizePixels() + 8;\n        const QSize size(gridSize, gridSize);\n\n        setViewMode(QListView::IconMode);\n\n        setFont( iconFont() );\n        setGridSize(size);\n        setResizeMode(QListView::Adjust);\n        setSelectionMode(QAbstractItemView::SingleSelection);\n        setDragDropMode(QAbstractItemView::NoDragDrop);\n\n        addItem( QString() );\n        item(0)->setSizeHint(size);\n    }\n\n    QString addIcon(ushort unicode, bool isBrand, const QStringList &searchTerms)\n    {\n        const QString icon(unicode);\n        auto item = new QListWidgetItem(icon, this);\n        item->setSizeHint( gridSize() );\n        item->setToolTip( searchTerms.join(\", \") );\n        if (isBrand)\n            item->setBackground( QColor(90,90,90,50) );\n        return icon;\n    }\n\n    QString icon(const QModelIndex &index) const\n    {\n        return item(index.row())->text();\n    }\n\n    bool isIconSelected() const\n    {\n        const QModelIndex index = currentIndex();\n        return index.isValid() && item(index.row())->isSelected();\n    }\n\n    void keyboardSearch(const QString &search) override\n    {\n        if (!m_search) {\n            m_search = new QLineEdit(this);\n            connect( m_search, &QLineEdit::textChanged,\n                     this, &IconListWidget::onSearchTextChanged );\n            m_search->show();\n            updateSearchPosition();\n        }\n\n        m_search->setText( m_search->text() + search );\n    }\n\nprotected:\n    void keyPressEvent(QKeyEvent *event) override\n    {\n        if (m_search) {\n            if ( event->key() == Qt::Key_Escape ) {\n                event->accept();\n                stopSearch();\n                return;\n            }\n\n            if ( event->key() == Qt::Key_Backspace ) {\n                event->accept();\n                auto text = m_search->text();\n                text.chop(1);\n                m_search->setText(text);\n                return;\n            }\n        }\n\n        QListView::keyPressEvent(event);\n    }\n\n    void resizeEvent(QResizeEvent *event) override\n    {\n        QListWidget::resizeEvent(event);\n        if (m_search)\n            updateSearchPosition();\n    }\n\nprivate:\n    void onSearchTextChanged(const QString &text)\n    {\n        if ( text.isEmpty() )\n            stopSearch();\n        else\n            search( text.toLower() );\n    }\n\n    void updateSearchPosition()\n    {\n        if (!m_search)\n            return;\n\n        const auto sizeDiff = this->size() - m_search->size();\n        m_search->move( sizeDiff.width(), sizeDiff.height() );\n    }\n\n    void search(const QString &text)\n    {\n        setCurrentItem(nullptr);\n        for (int row = 0; row < count(); ++row) {\n            auto item = this->item(row);\n            const bool matches = item->toolTip().contains(text);\n            item->setHidden(!matches);\n            if (matches && currentItem() == nullptr)\n                setCurrentItem(item);\n        }\n    }\n\n    void stopSearch()\n    {\n        if (!m_search)\n            return;\n\n        m_search->deleteLater();\n        m_search = nullptr;\n        search(QString());\n        setFocus();\n    }\n\n    QLineEdit *m_search = nullptr;\n};\n\nIconSelectDialog::IconSelectDialog(const QString &defaultIcon, QWidget *parent)\n    : QDialog(parent)\n    , m_iconList(new IconListWidget(this))\n    , m_selectedIcon(defaultIcon)\n{\n    setWindowTitle( tr(\"Select Icon\") );\n\n    connect( m_iconList, &QAbstractItemView::activated,\n             this, &IconSelectDialog::onIconListItemActivated );\n\n    addIcons();\n\n    QPushButton *browseButton = new QPushButton(tr(\"Browse...\"), this);\n    if ( m_selectedIcon.size() > 2 )\n        browseButton->setIcon(QIcon(m_selectedIcon));\n    connect( browseButton, &QAbstractButton::clicked,\n             this, &IconSelectDialog::onBrowse );\n\n    QDialogButtonBox *buttonBox = new QDialogButtonBox(\n                QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this);\n    connect( buttonBox, &QDialogButtonBox::rejected,\n             this, &QDialog::reject );\n    connect( buttonBox, &QDialogButtonBox::accepted,\n             this, &IconSelectDialog::onAcceptCurrent );\n\n    auto layout = new QVBoxLayout(this);\n    layout->addWidget(m_iconList);\n\n    auto buttonLayout = new QHBoxLayout;\n    layout->addLayout(buttonLayout);\n    buttonLayout->addWidget(browseButton);\n    buttonLayout->addWidget(buttonBox);\n\n    m_iconList->setFocus();\n\n    // Restore previous geometry.\n    restoreWindowGeometry(this, false);\n}\n\nvoid IconSelectDialog::done(int result)\n{\n    saveWindowGeometry(this, false);\n\n    if (result == QDialog::Accepted)\n        emit iconSelected(m_selectedIcon);\n\n    QDialog::done(result);\n}\n\nvoid IconSelectDialog::onIconListItemActivated(const QModelIndex &index)\n{\n    m_selectedIcon = m_iconList->icon(index);\n    accept();\n}\n\nvoid IconSelectDialog::onBrowse()\n{\n    const QString fileName = QFileDialog::getOpenFileName(\n                this, tr(\"Open Icon file\"), m_selectedIcon,\n                tr(\"Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)\"));\n    if ( !fileName.isNull() ) {\n        m_selectedIcon = fileName;\n        accept();\n    }\n}\n\nvoid IconSelectDialog::onAcceptCurrent()\n{\n    if ( m_iconList->isIconSelected() )\n        onIconListItemActivated( m_iconList->currentIndex() );\n    else\n        reject();\n}\n\nvoid IconSelectDialog::addIcons()\n{\n    for (const Icon &icon : iconList) {\n        const auto searchTerms = QString(icon.searchTerms).split('|');\n        const auto iconText = m_iconList->addIcon(icon.unicode, icon.isBrand, searchTerms);\n        if (m_selectedIcon == iconText)\n            m_iconList->setCurrentRow(m_iconList->count() - 1);\n    }\n}\n"
  },
  {
    "path": "src/gui/iconselectdialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n\nclass QModelIndex;\n\nclass IconListWidget;\n\nclass IconSelectDialog final : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit IconSelectDialog(const QString &defaultIcon, QWidget *parent = nullptr);\n\n    const QString &selectedIcon() const { return m_selectedIcon; }\n\n    void done(int result) override;\n\nsignals:\n    void iconSelected(const QString &icon);\n\nprivate:\n    void onIconListItemActivated(const QModelIndex &index);\n\n    void onBrowse();\n\n    void onAcceptCurrent();\n\n    void addIcons();\n\n    IconListWidget *m_iconList;\n    QString m_selectedIcon;\n};\n"
  },
  {
    "path": "src/gui/iconwidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"iconwidget.h\"\n\n#include \"gui/icons.h\"\n#include \"gui/iconfont.h\"\n\n#include <QPainter>\n#include <QPaintEvent>\n#include <QString>\n\nIconWidget::IconWidget(int icon, QWidget *parent)\n    : QWidget(parent)\n    , m_icon()\n{\n    QFontMetrics fm(iconFont());\n    QChar c(icon);\n    if ( fm.inFont(c) )\n        m_icon = QString(c);\n\n    setFixedSize(sizeHint());\n}\n\nIconWidget::IconWidget(const QString &icon, QWidget *parent)\n    : QWidget(parent)\n    , m_icon(icon)\n{\n    setFixedSize(sizeHint());\n}\n\nQSize IconWidget::sizeHint() const\n{\n    if ( m_icon.isEmpty() )\n        return QSize(0, 0);\n\n    const int side = iconFontSizePixels() + 4;\n    return QSize(side, side);\n}\n\nvoid IconWidget::paintEvent(QPaintEvent *)\n{\n    if (m_icon.isEmpty())\n        return;\n\n    QPainter p(this);\n\n    if (m_icon.size() == 1) {\n        p.setFont(iconFont());\n        p.setRenderHint(QPainter::TextAntialiasing, true);\n\n        if (parentWidget())\n            p.setPen( parentWidget()->palette().color(QPalette::Text) );\n        p.drawText( rect(), Qt::AlignCenter, m_icon);\n    } else {\n        QPixmap pix(m_icon);\n        p.drawPixmap( 0, 0, pix.scaled(size(), Qt::KeepAspectRatio) );\n    }\n}\n"
  },
  {
    "path": "src/gui/iconwidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QWidget>\n\nclass QString;\n\nclass IconWidget final : public QWidget\n{\npublic:\n    explicit IconWidget(int icon, QWidget *parent = nullptr);\n\n    explicit IconWidget(const QString &icon, QWidget *parent = nullptr);\n\n    QSize sizeHint() const override;\n\nprotected:\n    void paintEvent(QPaintEvent *event) override;\n\nprivate:\n    QString m_icon;\n};\n"
  },
  {
    "path": "src/gui/importexportdialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/importexportdialog.h\"\n#include \"ui_importexportdialog.h\"\n\n#include \"gui/tabicons.h\"\n\n#include <QPushButton>\n\nImportExportDialog::ImportExportDialog(QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::ImportExportDialog)\n{\n    ui->setupUi(this);\n\n    connect(ui->checkBoxAll, &QCheckBox::clicked,\n            this, &ImportExportDialog::onCheckBoxAllClicked);\n\n    connect( ui->listTabs, &QListWidget::itemSelectionChanged,\n             this, &ImportExportDialog::update );\n    connect( ui->checkBoxConfiguration, &QCheckBox::stateChanged,\n             this, &ImportExportDialog::update );\n    connect( ui->checkBoxCommands, &QCheckBox::stateChanged,\n             this, &ImportExportDialog::update );\n}\n\nImportExportDialog::~ImportExportDialog()\n{\n    delete ui;\n}\n\nvoid ImportExportDialog::setTabs(const QStringList &tabs)\n{\n    ui->listTabs->clear();\n    ui->listTabs->addItems(tabs);\n    ui->listTabs->selectAll();\n    const auto items = ui->listTabs->selectedItems();\n    for (const auto item : items)\n        item->setIcon( getIconForTabName(item->text()) );\n\n    const bool showTabs = ui->listTabs->count() > 0;\n    ui->listTabs->setVisible(showTabs);\n    ui->labelTabs->setVisible(showTabs);\n}\n\nvoid ImportExportDialog::setCurrentTab(const QString &tabName)\n{\n    const auto items = ui->listTabs->findItems(tabName, Qt::MatchExactly);\n    if ( !items.isEmpty() )\n        ui->listTabs->setCurrentItem( items.first() );\n}\n\nvoid ImportExportDialog::setHasConfiguration(bool hasConfiguration)\n{\n    ui->checkBoxConfiguration->setVisible(hasConfiguration);\n}\n\nvoid ImportExportDialog::setHasCommands(bool hasCommands)\n{\n    ui->checkBoxCommands->setVisible(hasCommands);\n}\n\nvoid ImportExportDialog::setConfigurationEnabled(bool enabled)\n{\n    ui->checkBoxConfiguration->setChecked(enabled);\n}\n\nvoid ImportExportDialog::setCommandsEnabled(bool enabled)\n{\n    ui->checkBoxCommands->setChecked(enabled);\n}\n\nQStringList ImportExportDialog::selectedTabs() const\n{\n    const auto items = ui->listTabs->selectedItems();\n    QStringList result;\n    result.reserve( items.size() );\n    for (const auto item : items)\n        result.append( item->text() );\n    return result;\n}\n\nbool ImportExportDialog::isConfigurationEnabled() const\n{\n    return ui->checkBoxConfiguration->isChecked()\n            && !ui->checkBoxConfiguration->isHidden();\n}\n\nbool ImportExportDialog::isCommandsEnabled() const\n{\n    return ui->checkBoxCommands->isChecked()\n            && !ui->checkBoxCommands->isHidden();\n}\n\nvoid ImportExportDialog::onCheckBoxAllClicked(bool checked)\n{\n    ui->checkBoxConfiguration->setChecked(checked);\n    ui->checkBoxCommands->setChecked(checked);\n\n    if (checked)\n        ui->listTabs->selectAll();\n    else\n        ui->listTabs->clearSelection();\n}\n\nvoid ImportExportDialog::update()\n{\n    const bool ok = canAccept();\n\n    auto button = ui->buttonBox->button(QDialogButtonBox::Ok);\n    if (button)\n        button->setEnabled(ok);\n\n    if (!ok) {\n        ui->checkBoxAll->setCheckState(Qt::Unchecked);\n    } else if ( ui->listTabs->selectedItems().count() == ui->listTabs->count()\n                && (ui->checkBoxConfiguration->isChecked() || ui->checkBoxConfiguration->isHidden())\n                && (ui->checkBoxCommands->isChecked() || ui->checkBoxCommands->isHidden()) )\n    {\n        ui->checkBoxAll->setCheckState(Qt::Checked);\n    } else {\n        ui->checkBoxAll->setCheckState(Qt::PartiallyChecked);\n    }\n}\n\nbool ImportExportDialog::canAccept() const\n{\n    return ui->listTabs->selectionModel()->hasSelection()\n            || isConfigurationEnabled()\n            || isCommandsEnabled();\n}\n"
  },
  {
    "path": "src/gui/importexportdialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n\nnamespace Ui {\nclass ImportExportDialog;\n}\n\nclass ImportExportDialog final : public QDialog\n{\npublic:\n    explicit ImportExportDialog(QWidget *parent = nullptr);\n    ~ImportExportDialog();\n\n    void setTabs(const QStringList &tabs);\n    void setCurrentTab(const QString &tabName);\n\n    void setHasConfiguration(bool hasConfiguration);\n    void setHasCommands(bool hasCommands);\n\n    void setConfigurationEnabled(bool enabled);\n    void setCommandsEnabled(bool enabled);\n\n    QStringList selectedTabs() const;\n    bool isConfigurationEnabled() const;\n    bool isCommandsEnabled() const;\n\nprivate:\n    void onCheckBoxAllClicked(bool checked);\n\n    void update();\n\n    bool canAccept() const;\n\n    Ui::ImportExportDialog *ui;\n};\n"
  },
  {
    "path": "src/gui/itemorderlist.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/itemorderlist.h\"\n#include \"ui_itemorderlist.h\"\n\n#include \"gui/iconfactory.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/icons.h\"\n\n#include <QDragEnterEvent>\n#include <QMenu>\n#include <QMimeData>\n#include <QScrollBar>\n\nnamespace {\n\nvoid deleteWidget(const QPointer<QWidget> &object)\n{\n    if (object)\n        object->deleteLater();\n}\n\nvoid setItemId(QListWidgetItem *item, int id)\n{\n    item->setData(Qt::UserRole, id);\n}\n\nint itemId(QListWidgetItem *item)\n{\n    return item->data(Qt::UserRole).toInt();\n}\n\n} // namespace\n\nItemOrderList::ItemOrderList(QWidget *parent)\n    : QWidget(parent)\n    , ui(new Ui::ItemOrderList)\n{\n    ui->setupUi(this);\n\n    connect(ui->pushButtonUp, &QToolButton::clicked,\n            this, &ItemOrderList::onPushButtonUpClicked);\n    connect(ui->pushButtonDown, &QToolButton::clicked,\n            this, &ItemOrderList::onPushButtonDownClicked);\n    connect(ui->pushButtonTop, &QToolButton::clicked,\n            this, &ItemOrderList::onPushButtonTopClicked);\n    connect(ui->pushButtonBottom, &QToolButton::clicked,\n            this, &ItemOrderList::onPushButtonBottomClicked);\n    connect(ui->pushButtonRemove, &QToolButton::clicked,\n            this, &ItemOrderList::onPushButtonRemoveClicked);\n    connect(ui->pushButtonAdd, &QToolButton::clicked,\n            this, &ItemOrderList::onPushButtonAddClicked);\n\n    connect(ui->listWidgetItems, &QListWidget::currentItemChanged,\n            this, &ItemOrderList::onListWidgetItemsCurrentItemChanged);\n    connect(ui->listWidgetItems, &QListWidget::itemSelectionChanged,\n            this, &ItemOrderList::onListWidgetItemsItemSelectionChanged);\n    connect(ui->listWidgetItems, &QListWidget::itemChanged,\n            this, &ItemOrderList::onListWidgetItemsItemChanged);\n\n    ui->pushButtonRemove->hide();\n    ui->pushButtonAdd->hide();\n    setFocusProxy(ui->listWidgetItems);\n    ui->listWidgetItems->setFocus();\n    setCurrentItemWidget(nullptr);\n\n    setEditable(false);\n    setItemsMovable(false);\n}\n\nItemOrderList::~ItemOrderList()\n{\n    delete ui;\n}\n\nvoid ItemOrderList::setEditable(bool editable)\n{\n    ui->pushButtonRemove->setVisible(editable);\n    ui->pushButtonAdd->setVisible(editable);\n    ui->listWidgetItems->setSelectionMode(\n        editable\n            ? QAbstractItemView::ExtendedSelection\n            : QAbstractItemView::SingleSelection);\n}\n\nvoid ItemOrderList::setItemsMovable(bool movable)\n{\n    ui->pushButtonUp->setVisible(movable);\n    ui->pushButtonDown->setVisible(movable);\n    ui->pushButtonTop->setVisible(movable);\n    ui->pushButtonBottom->setVisible(movable);\n    ui->listWidgetItems->setDragEnabled(movable);\n}\n\nvoid ItemOrderList::clearItems()\n{\n    ui->listWidgetItems->clear();\n    for (const auto &pair : m_items)\n        deleteWidget(pair.second.widget);\n    m_items.clear();\n}\n\nvoid ItemOrderList::appendItem(\n        const QString &label, const QIcon &icon,\n        const ItemPtr &item, CheckState state)\n{\n    insertItem(label, icon, item, -1, state);\n}\n\nvoid ItemOrderList::insertItem(\n        const QString &label, const QIcon &icon,\n        const ItemPtr &item, int targetRow, CheckState state)\n{\n    QListWidget *list = ui->listWidgetItems;\n    auto listItem = new QListWidgetItem(icon, label);\n    if (state != NotCheckable)\n        listItem->setCheckState(state == Checked ? Qt::Checked : Qt::Unchecked);\n\n    ++m_lastItemId;\n    setItemId(listItem, m_lastItemId);\n    m_items.insert({m_lastItemId, ItemWidgetPair(item, state == Checked)});\n\n    const int row = targetRow >= 0 ? qMin(list->count(), targetRow) : list->count();\n    list->insertItem(row, listItem);\n\n    if ( list->currentItem() == nullptr )\n        list->setCurrentRow(row);\n}\n\nvoid ItemOrderList::removeRow(int row)\n{\n    auto item = listItem(row);\n    removeItem(item);\n}\n\nQWidget *ItemOrderList::widget(int row) const\n{\n    const int id = itemId(listItem(row));\n    Q_ASSERT(m_items.find(id) != m_items.end());\n    return m_items.at(id).widget;\n}\n\nQVariant ItemOrderList::data(int row) const\n{\n    const int id = itemId(listItem(row));\n    Q_ASSERT(m_items.find(id) != m_items.end());\n    return m_items.at(id).item->data();\n}\n\nint ItemOrderList::itemCount() const\n{\n    return m_items.size();\n}\n\nbool ItemOrderList::isItemChecked(int row) const\n{\n    return listItem(row)->checkState() == Qt::Checked;\n}\n\nint ItemOrderList::currentRow() const\n{\n    return ui->listWidgetItems->currentIndex().row();\n}\n\nvoid ItemOrderList::setCurrentItem(int row)\n{\n    QListWidgetItem *currentItem = listItem(row);\n    ui->listWidgetItems->setCurrentItem(currentItem, QItemSelectionModel::ClearAndSelect);\n    QWidget *widget = createWidget(currentItem);\n    widget->setFocus();\n}\n\nvoid ItemOrderList::setCurrentItemIcon(const QIcon &icon)\n{\n    QListWidgetItem *current = ui->listWidgetItems->currentItem();\n    if(current != nullptr)\n        current->setIcon(icon);\n}\n\nvoid ItemOrderList::setCurrentItemLabel(const QString &label)\n{\n    QListWidgetItem *current = ui->listWidgetItems->currentItem();\n    if(current != nullptr)\n        current->setText(label);\n}\n\nvoid ItemOrderList::setItemIcon(int row, const QIcon &icon)\n{\n    QListWidgetItem *item = listItem(row);\n    if(item != nullptr)\n        item->setIcon(icon);\n}\n\nQString ItemOrderList::itemLabel(int row) const\n{\n    return listItem(row)->text();\n}\n\nQList<int> ItemOrderList::selectedRows() const\n{\n    QList<int> rows;\n    for (auto item : ui->listWidgetItems->selectedItems())\n        rows.append(ui->listWidgetItems->row(item));\n    return rows;\n}\n\nvoid ItemOrderList::setSelectedRows(const QList<int> &selectedRows)\n{\n    ui->listWidgetItems->clearSelection();\n    ui->listWidgetItems->setCurrentItem(nullptr);\n\n    for (int row : selectedRows) {\n        if (row >= 0 && row < rowCount()) {\n            QListWidgetItem *item = ui->listWidgetItems->item(row);\n            if ( ui->listWidgetItems->currentItem() == nullptr )\n                ui->listWidgetItems->setCurrentItem(item);\n            else\n                item->setSelected(true);\n        }\n    }\n}\n\nint ItemOrderList::rowCount() const\n{\n    return ui->listWidgetItems->count();\n}\n\nvoid ItemOrderList::setItemWidgetVisible(int row, bool visible)\n{\n    QListWidgetItem *item = ui->listWidgetItems->item(row);\n    Q_ASSERT(item);\n    item->setHidden(!visible);\n}\n\nvoid ItemOrderList::setDragAndDropValidator(const QRegularExpression &re)\n{\n    m_dragAndDropRe = re;\n    setAcceptDrops(m_dragAndDropRe.isValid());\n}\n\nvoid ItemOrderList::setWiderIconsEnabled(bool wider)\n{\n    const auto height = iconFontSizePixels();\n    const auto width = wider ? height * 3/2 : height;\n    ui->listWidgetItems->setIconSize( QSize(width, height) );\n}\n\nvoid ItemOrderList::keyPressEvent(QKeyEvent *event)\n{\n    if ( event->matches(QKeySequence::NextChild) ) {\n         nextPreviousItem(1);\n         event->accept();\n         return;\n    }\n\n    if ( event->matches(QKeySequence::PreviousChild) ) {\n         nextPreviousItem(-1);\n         event->accept();\n         return;\n    }\n\n    QWidget::keyPressEvent(event);\n}\n\nvoid ItemOrderList::dragEnterEvent(QDragEnterEvent *event)\n{\n    const QString text = event->mimeData()->text();\n    if ( text.contains(m_dragAndDropRe) )\n        event->acceptProposedAction();\n}\n\nvoid ItemOrderList::dropEvent(QDropEvent *event)\n{\n    event->accept();\n\n    QListWidget *list = ui->listWidgetItems;\n    const QPoint pos = list->mapFromParent(event->pos());\n\n    const int s = list->spacing();\n    QModelIndex index = list->indexAt(pos);\n    if ( !index.isValid() )\n        index = list->indexAt( pos + QPoint(s, - 2 * s) );\n\n    emit dropped( event->mimeData()->text(), index.row() );\n}\n\nvoid ItemOrderList::showEvent(QShowEvent *event)\n{\n    if ( ui->pushButtonAdd->icon().isNull() ) {\n        ui->pushButtonAdd->setIcon( getIcon(\"list-add\", IconPlus) );\n        ui->pushButtonRemove->setIcon( getIcon(\"list-remove\", IconMinus) );\n        ui->pushButtonDown->setIcon( getIcon(\"go-down\", IconArrowDown) );\n        ui->pushButtonUp->setIcon( getIcon(\"go-up\", IconArrowUp) );\n        ui->pushButtonTop->setIcon( getIcon(\"go-top\", IconAnglesUp) );\n        ui->pushButtonBottom->setIcon( getIcon(\"go-bottom\", IconAnglesDown) );\n    }\n\n    // Resize list to minimal size.\n    QListWidget *list = ui->listWidgetItems;\n    const int w = list->sizeHintForColumn(0)\n                + list->verticalScrollBar()->sizeHint().width() + 4;\n    const auto sizes = ui->splitter->sizes();\n    ui->splitter->setSizes({w, sizes[0] + sizes[1] - w});\n\n    QWidget::showEvent(event);\n}\n\nvoid ItemOrderList::nextPreviousItem(int d)\n{\n    QListWidget *list = ui->listWidgetItems;\n    const int rowCount = list->count();\n    if (rowCount < 2)\n        return;\n\n    const int row = list->currentRow();\n    const int nextRow = (row + d + rowCount) % rowCount;\n    list->setCurrentRow(nextRow, QItemSelectionModel::ClearAndSelect);\n}\n\nvoid ItemOrderList::onPushButtonUpClicked()\n{\n    const int row = ui->listWidgetItems->currentRow();\n    if (row >= 1)\n        moveTab(row, row - 1);\n}\n\nvoid ItemOrderList::onPushButtonDownClicked()\n{\n    QListWidget *list = ui->listWidgetItems;\n    const int row = list->currentRow();\n    if (row >= 0 && row + 1 < list->count())\n        moveTab(row, row + 1);\n}\n\nvoid ItemOrderList::onPushButtonTopClicked()\n{\n    const int row = ui->listWidgetItems->currentRow();\n    if (row >= 1)\n        moveTab(row, 0);\n}\n\nvoid ItemOrderList::onPushButtonBottomClicked()\n{\n    QListWidget *list = ui->listWidgetItems;\n    const int row = ui->listWidgetItems->currentRow();\n    if (row >= 0 && row + 1 < list->count())\n        moveTab(row, list->count() - 1);\n}\n\nvoid ItemOrderList::onPushButtonRemoveClicked()\n{\n    for (auto item : ui->listWidgetItems->selectedItems())\n        removeItem(item);\n}\n\nvoid ItemOrderList::onPushButtonAddClicked()\n{\n    emit addButtonClicked();\n}\n\nvoid ItemOrderList::onListWidgetItemsCurrentItemChanged(QListWidgetItem *current, QListWidgetItem *)\n{\n    setCurrentItemWidget( current ? createWidget(current) : nullptr );\n}\n\nvoid ItemOrderList::onListWidgetItemsItemSelectionChanged()\n{\n    const QItemSelectionModel *sel = ui->listWidgetItems->selectionModel();\n    ui->pushButtonRemove->setEnabled( sel->hasSelection() );\n    emit itemSelectionChanged();\n}\n\nvoid ItemOrderList::onListWidgetItemsItemChanged(QListWidgetItem *item)\n{\n    const int id = itemId(item);\n    if (id == 0)\n        return;\n\n    const auto row = ui->listWidgetItems->row(item);\n    const bool checked = item->checkState() == Qt::Checked;\n\n    Q_ASSERT(m_items.find(id) != m_items.end());\n    ItemWidgetPair &pair = m_items.at(id);\n    if ( pair.lastCheckedState != checked ) {\n        pair.lastCheckedState = checked;\n        emit itemCheckStateChanged(row, checked);\n    }\n}\n\nvoid ItemOrderList::moveTab(int row, int targetRow)\n{\n    QListWidget *list = ui->listWidgetItems;\n    list->blockSignals(true);\n    list->insertItem(targetRow, list->takeItem(row));\n    list->setCurrentRow(targetRow);\n    list->blockSignals(false);\n}\n\nQListWidgetItem *ItemOrderList::listItem(int row) const\n{\n    Q_ASSERT(row >= 0 && row < itemCount());\n    return ui->listWidgetItems->item(row);\n}\n\nvoid ItemOrderList::setCurrentItemWidget(QWidget *widget)\n{\n    QLayoutItem *layoutItem =  ui->widgetLayout->takeAt(0);\n    if (layoutItem)\n        layoutItem->widget()->hide();\n    delete layoutItem;\n\n    if (widget) {\n        ui->widgetLayout->addWidget(widget);\n        ui->widgetParent->setFocusProxy(widget);\n        widget->show();\n    }\n}\n\nQWidget *ItemOrderList::createWidget(QListWidgetItem *item)\n{\n    const int id = itemId(item);\n    Q_ASSERT(m_items.find(id) != m_items.end());\n    ItemWidgetPair &pair = m_items.at(id);\n    if (!pair.widget)\n        pair.widget = pair.item->createWidget(this);\n    return pair.widget;\n}\n\nvoid ItemOrderList::removeItem(QListWidgetItem *item)\n{\n    const int id = itemId(item);\n    Q_ASSERT(m_items.find(id) != m_items.end());\n    ItemWidgetPair pair = m_items.at(id);\n    m_items.erase(id);\n    deleteWidget(pair.widget);\n    delete item;\n}\n"
  },
  {
    "path": "src/gui/itemorderlist.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QListWidgetItem>\n#include <QPointer>\n#include <QWidget>\n\n#include <memory>\n#include <unordered_map>\n\nnamespace Ui {\nclass ItemOrderList;\n}\n\nclass QAbstractButton;\nclass QMenu;\nclass QScrollArea;\n\nclass ItemOrderList final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    enum CheckState {\n        Checked,\n        Unchecked,\n        NotCheckable\n    };\n\n    class Item {\n        friend class ItemOrderList;\n    public:\n        Item() = default;\n        virtual ~Item() = default;\n        virtual QVariant data() const = 0;\n        Item(const Item &) = delete;\n        Item &operator=(const Item &) = delete;\n    private:\n        virtual QWidget *createWidget(QWidget *parent) = 0;\n    };\n\n    using ItemPtr = std::shared_ptr<Item>;\n\n    explicit ItemOrderList(QWidget *parent = nullptr);\n    ~ItemOrderList();\n\n    void setEditable(bool editable);\n    void setItemsMovable(bool movable);\n\n    void clearItems();\n\n    void appendItem(const QString &label, const QIcon &icon, const ItemPtr &item, CheckState state = NotCheckable);\n\n    void insertItem(const QString &label, const QIcon &icon, const ItemPtr &item, int targetRow, CheckState state = NotCheckable);\n\n    void removeRow(int row);\n\n    /// Returns widget created by Item::createWidget() given @a row\n    /// (could be nullptr is not yet created).\n    QWidget *widget(int row) const;\n\n    /// Returns Item::data() for item in given @a row.\n    QVariant data(int row) const;\n\n    int itemCount() const;\n\n    bool isItemChecked(int row) const;\n\n    int currentRow() const;\n\n    void setCurrentItem(int row);\n\n    void setCurrentItemIcon(const QIcon &icon);\n\n    void setCurrentItemLabel(const QString &label);\n\n    void setItemIcon(int row, const QIcon &icon);\n\n    QString itemLabel(int row) const;\n\n    QList<int> selectedRows() const;\n    void setSelectedRows(const QList<int> &selectedRows);\n\n    int rowCount() const;\n\n    void setItemWidgetVisible(int row, bool visible);\n\n    void setDragAndDropValidator(const QRegularExpression &re);\n\n    /// Make icons wider so icon tag can be bigger.\n    void setWiderIconsEnabled(bool wider);\n\nsignals:\n    void addButtonClicked();\n    void itemSelectionChanged();\n    void dropped(const QString &text, int row);\n    void itemCheckStateChanged(int row, bool checked);\n\nprotected:\n    void keyPressEvent(QKeyEvent *event) override;\n    void dragEnterEvent(QDragEnterEvent *event) override;\n    void dropEvent(QDropEvent *event) override;\n    void showEvent(QShowEvent *event) override;\n\nprivate:\n    void nextPreviousItem(int d);\n\n    void onPushButtonUpClicked();\n    void onPushButtonDownClicked();\n    void onPushButtonTopClicked();\n    void onPushButtonBottomClicked();\n    void onPushButtonRemoveClicked();\n    void onPushButtonAddClicked();\n\n    void onListWidgetItemsCurrentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);\n    void onListWidgetItemsItemSelectionChanged();\n    void onListWidgetItemsItemChanged(QListWidgetItem *item);\n\n    void moveTab(int row, int targetRow);\n\n    struct ItemWidgetPair {\n        explicit ItemWidgetPair(const ItemPtr &item, bool checked)\n            : item(item)\n            , lastCheckedState(checked)\n        {}\n\n        ItemPtr item;\n        QPointer<QWidget> widget;\n        bool lastCheckedState = true;\n    };\n\n    QListWidgetItem *listItem(int row) const;\n    void setCurrentItemWidget(QWidget *widget);\n    QWidget *createWidget(QListWidgetItem *item);\n    void removeItem(QListWidgetItem *item);\n\n    Ui::ItemOrderList *ui;\n    std::unordered_map<int, ItemWidgetPair> m_items;\n    int m_lastItemId = 0;\n\n    QRegularExpression m_dragAndDropRe;\n};\n"
  },
  {
    "path": "src/gui/logdialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#include \"gui/logdialog.h\"\n#include \"ui_logdialog.h\"\n\n#include \"common/common.h\"\n#include \"common/log.h\"\n#include \"common/timer.h\"\n\n#include <QCheckBox>\n#include <QElapsedTimer>\n#include <QRegularExpression>\n#include <QTextBlock>\n#include <QTextCharFormat>\n#include <QTextBlockFormat>\n#include <QTextCursor>\n#include <QTimer>\n\nnamespace {\n\nconstexpr int maxDisplayLogSize = 128 * 1024;\nconstexpr auto logLinePrefixSize =\n    std::char_traits<char>::length(\"[yyyy-MM-dd hh:mm:ss.zzz] \");\n\nvoid removeLogLines(QByteArray *content, LogLevel level)\n{\n    const QByteArray label = logLevelLabel(level);\n    if ( content->mid(logLinePrefixSize).startsWith(label) ) {\n        const int i = content->indexOf('\\n');\n        if (i == -1) {\n            content->clear();\n            return;\n        }\n        content->remove(0, i);\n    }\n\n    const QByteArray labelLine = '\\n' + label;\n    for (;;) {\n        const int i = content->indexOf(labelLine);\n        if (i == -1)\n            break;\n\n        const int j = content->indexOf('\\n', i + 1);\n        if (j == -1) {\n            content->remove(i, content->size());\n            break;\n        }\n\n        content->remove(i, j - i);\n    }\n}\n\n} // namespace\n\n/// Decorates document in batches so it doesn't block UI.\nclass Decorator : public QObject\n{\npublic:\n    Decorator(const QRegularExpression &re, QObject *parent)\n        : QObject(parent)\n        , m_re(re)\n    {\n        initSingleShotTimer(&m_timerDecorate, 0, this, &Decorator::decorateBatch);\n    }\n\n    /// Start decorating.\n    void decorate(QTextDocument *document)\n    {\n        m_tc = QTextCursor(document);\n        m_tc.movePosition(QTextCursor::End);\n        decorateBatch();\n    }\n\nprivate:\n    void decorateBatch()\n    {\n        if (m_tc.isNull())\n            return;\n\n        QElapsedTimer t;\n        t.start();\n\n        do {\n            m_tc = m_tc.document()->find(m_re, m_tc, QTextDocument::FindBackward);\n            if (m_tc.isNull())\n                return;\n\n            decorate(&m_tc);\n        } while ( t.elapsed() < 20 );\n\n        m_timerDecorate.start();\n    }\n\n    virtual void decorate(QTextCursor *tc) = 0;\n\n    QTimer m_timerDecorate;\n    QTextCursor m_tc;\n    QRegularExpression m_re;\n};\n\nnamespace {\n\nclass LogDecorator final : public Decorator\n{\npublic:\n    LogDecorator(const QFont &font, QObject *parent)\n        : Decorator(QRegularExpression(\"^[^\\\\]]*\\\\] \\\\w+\"), parent)\n        , m_labelNote(logLevelLabel(LogNote))\n        , m_labelError(logLevelLabel(LogError))\n        , m_labelWarning(logLevelLabel(LogWarning))\n        , m_labelDebug(logLevelLabel(LogDebug))\n        , m_labelTrace(logLevelLabel(LogTrace))\n    {\n        QFont boldFont = font;\n        boldFont.setBold(true);\n\n        QTextCharFormat normalFormat;\n        normalFormat.setFont(boldFont);\n        normalFormat.setBackground(Qt::white);\n        normalFormat.setForeground(Qt::black);\n\n        m_noteLogLevelFormat = normalFormat;\n\n        m_errorLogLevelFormat = normalFormat;\n        m_errorLogLevelFormat.setForeground(Qt::red);\n\n        m_warningLogLevelFormat = normalFormat;\n        m_warningLogLevelFormat.setForeground(Qt::darkRed);\n\n        m_debugLogLevelFormat = normalFormat;\n        m_debugLogLevelFormat.setForeground(QColor(100, 100, 200));\n\n        m_traceLogLevelFormat = normalFormat;\n        m_traceLogLevelFormat.setForeground(QColor(200, 150, 100));\n    }\n\nprivate:\n    void decorate(QTextCursor *tc) override\n    {\n        const QString text = tc->selectedText().mid(logLinePrefixSize);\n        if ( text.startsWith(m_labelNote) )\n            tc->setCharFormat(m_noteLogLevelFormat);\n        else if ( text.startsWith(m_labelError) )\n            tc->setCharFormat(m_errorLogLevelFormat);\n        else if ( text.startsWith(m_labelWarning) )\n            tc->setCharFormat(m_warningLogLevelFormat);\n        else if ( text.startsWith(m_labelDebug) )\n            tc->setCharFormat(m_debugLogLevelFormat);\n        else if ( text.startsWith(m_labelTrace) )\n            tc->setCharFormat(m_traceLogLevelFormat);\n    }\n\n    QString m_labelNote;\n    QString m_labelError;\n    QString m_labelWarning;\n    QString m_labelDebug;\n    QString m_labelTrace;\n\n    QTextCharFormat m_noteLogLevelFormat;\n    QTextCharFormat m_errorLogLevelFormat;\n    QTextCharFormat m_warningLogLevelFormat;\n    QTextCharFormat m_debugLogLevelFormat;\n    QTextCharFormat m_traceLogLevelFormat;\n};\n\nclass StringDecorator final : public Decorator\n{\npublic:\n    explicit StringDecorator(QObject *parent)\n        : Decorator(QRegularExpression(\"\\\"[^\\\"]*\\\"|'[^']*'\"), parent)\n    {\n        m_stringFormat.setForeground(Qt::darkGreen);\n    }\n\nprivate:\n    void decorate(QTextCursor *tc) override\n    {\n        tc->setCharFormat(m_stringFormat);\n    }\n\n    QTextCharFormat m_stringFormat;\n};\n\nclass ThreadNameDecorator final : public Decorator\n{\npublic:\n    explicit ThreadNameDecorator(const QFont &font, QObject *parent)\n        : Decorator(QRegularExpression(\"<[A-Za-z/]+-[0-9-]+>\"), parent)\n    {\n        QFont boldFont = font;\n        boldFont.setBold(true);\n        m_format.setFont(boldFont);\n    }\n\nprivate:\n    void decorate(QTextCursor *tc) override\n    {\n        // Colorize thread label.\n        const auto text = tc->selectedText();\n\n        const auto hash = qHash(text);\n        const int h = hash % 360;\n        m_format.setForeground( QColor::fromHsv(h, 150, 100) );\n\n        const auto bg =\n                text.startsWith(\"<Server-\") ? QColor::fromRgb(255, 255, 200)\n              : text.startsWith(\"<cmd/monitor\") ? QColor::fromRgb(220, 240, 255)\n              : text.startsWith(\"<cmd/provide\") ? QColor::fromRgb(220, 255, 220)\n              : text.startsWith(\"<cmd/synchronize\") ? QColor::fromRgb(220, 255, 240)\n              : QColor(Qt::white);\n        m_format.setBackground(bg);\n\n        tc->setCharFormat(m_format);\n    }\n\n    QTextCharFormat m_format;\n};\n\n} // namespace\n\nLogDialog::LogDialog(QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::LogDialog)\n    , m_showError(true)\n    , m_showWarning(true)\n    , m_showNote(true)\n    , m_showDebug(true)\n    , m_showTrace(true)\n{\n    ui->setupUi(this);\n\n    auto font = ui->textBrowserLog->font();\n    font.setFamily(\"Monospace\");\n    ui->textBrowserLog->setFont(font);\n\n    m_logDecorator = new LogDecorator(font, this);\n    m_stringDecorator = new StringDecorator(this);\n    m_threadNameDecorator = new ThreadNameDecorator(font, this);\n\n    ui->labelLogFileName->setText(logFileName());\n\n    addFilterCheckBox(LogError, &LogDialog::showError);\n    addFilterCheckBox(LogWarning, &LogDialog::showWarning);\n    addFilterCheckBox(LogNote, &LogDialog::showNote);\n    addFilterCheckBox(LogDebug, &LogDialog::showDebug);\n    addFilterCheckBox(LogTrace, &LogDialog::showTrace);\n    ui->layoutFilters->addStretch(1);\n\n    updateLog();\n}\n\nLogDialog::~LogDialog()\n{\n    delete ui;\n}\n\nvoid LogDialog::updateLog()\n{\n    QByteArray content = readLogFile(maxDisplayLogSize);\n\n    if(!m_showTrace)\n        removeLogLines(&content, LogTrace);\n    if(!m_showDebug)\n        removeLogLines(&content, LogDebug);\n    if(!m_showNote)\n        removeLogLines(&content, LogNote);\n    if(!m_showWarning)\n        removeLogLines(&content, LogWarning);\n    if(!m_showError)\n        removeLogLines(&content, LogError);\n\n    ui->textBrowserLog->setPlainText(QString::fromUtf8(content));\n\n    ui->textBrowserLog->moveCursor(QTextCursor::End);\n\n    QTextDocument *doc = ui->textBrowserLog->document();\n    m_logDecorator->decorate(doc);\n    m_stringDecorator->decorate(doc);\n    m_threadNameDecorator->decorate(doc);\n}\n\nvoid LogDialog::showError(bool show)\n{\n    m_showError = show;\n    updateLog();\n}\n\nvoid LogDialog::showWarning(bool show)\n{\n    m_showWarning = show;\n    updateLog();\n}\n\nvoid LogDialog::showNote(bool show)\n{\n    m_showNote = show;\n    updateLog();\n}\n\nvoid LogDialog::showDebug(bool show)\n{\n    m_showDebug = show;\n    updateLog();\n}\n\nvoid LogDialog::showTrace(bool show)\n{\n    m_showTrace = show;\n    updateLog();\n}\n\nvoid LogDialog::addFilterCheckBox(LogLevel level, FilterCheckBoxSlot slot)\n{\n    auto checkBox = new QCheckBox(this);\n    checkBox->setText(logLevelLabel(level));\n    checkBox->setChecked(true);\n    QObject::connect(checkBox, &QCheckBox::toggled, this, slot);\n    ui->layoutFilters->addWidget(checkBox);\n}\n"
  },
  {
    "path": "src/gui/logdialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n\n#include \"common/log.h\"\n\n#include <QDialog>\n\nnamespace Ui {\nclass LogDialog;\n}\n\nclass Decorator;\n\nclass LogDialog final : public QDialog\n{\npublic:\n    explicit LogDialog(QWidget *parent = nullptr);\n    ~LogDialog();\n\nprivate:\n    using FilterCheckBoxSlot = void (LogDialog::*)(bool);\n\n    void updateLog();\n\n    void showError(bool show);\n    void showWarning(bool show);\n    void showNote(bool show);\n    void showDebug(bool show);\n    void showTrace(bool show);\n\n    void addFilterCheckBox(LogLevel level, FilterCheckBoxSlot slot);\n\n    Ui::LogDialog *ui;\n\n    Decorator *m_logDecorator;\n    Decorator *m_stringDecorator;\n    Decorator *m_threadNameDecorator;\n\n    bool m_showError;\n    bool m_showWarning;\n    bool m_showNote;\n    bool m_showDebug;\n    bool m_showTrace;\n};\n"
  },
  {
    "path": "src/gui/mainwindow.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"mainwindow.h\"\n#include \"ui_mainwindow.h\"\n\n#include \"common/action.h\"\n#include \"common/actionoutput.h\"\n#include \"common/appconfig.h\"\n#include \"common/common.h\"\n#include \"common/command.h\"\n#include \"common/commandstore.h\"\n#include \"common/config.h\"\n#include \"common/contenttype.h\"\n#include \"common/display.h\"\n#include \"common/encryption.h\"\n#include \"common/globalshortcutcommands.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/shortcuts.h\"\n#include \"common/tabs.h\"\n#include \"common/textdata.h\"\n#include \"common/timer.h\"\n\n#include \"gui/aboutdialog.h\"\n#include \"gui/actiondialog.h\"\n#include \"gui/actionhandler.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/clipboardbrowserplaceholder.h\"\n#include \"gui/clipboardbrowsershared.h\"\n#include \"gui/clipboarddialog.h\"\n#include \"gui/commandaction.h\"\n#include \"gui/commanddialog.h\"\n#include \"gui/configurationmanager.h\"\n#include \"gui/encryptionpassword.h\"\n#include \"gui/geometry.h\"\n#include \"gui/importexportdialog.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/iconselectdialog.h\"\n#include \"gui/icons.h\"\n#include \"gui/logdialog.h\"\n#include \"gui/navigation.h\"\n#include \"gui/notification.h\"\n#include \"gui/notificationdaemon.h\"\n#include \"gui/passwordprompt.h\"\n#include \"gui/selectiondata.h\"\n#include \"gui/tabdialog.h\"\n#include \"gui/tabicons.h\"\n#include \"gui/tabwidget.h\"\n#include \"gui/theme.h\"\n#include \"gui/traymenu.h\"\n#include \"gui/windowgeometryguard.h\"\n#include \"item/itemfactory.h\"\n#include \"item/itemstore.h\"\n#include \"item/serialize.h\"\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformnativeinterface.h\"\n#include \"platform/platformwindow.h\"\n#include \"scriptable/scriptoverrides.h\"\n#include <qnamespace.h>\n\n#ifdef WITH_NATIVE_NOTIFICATIONS\n#include <KStatusNotifierItem>\n#endif\n\n#include <QAction>\n#include <QCloseEvent>\n#include <QDesktopServices>\n#include <QFile>\n#include <QFileDialog>\n#include <QFlags>\n#include <QInputDialog>\n#include <QLoggingCategory>\n#include <QMenu>\n#include <QMenuBar>\n#include <QMessageBox>\n#include <QMimeData>\n#include <QModelIndex>\n#include <QPushButton>\n#include <QSaveFile>\n#include <QShortcut>\n#include <QSystemTrayIcon>\n#include <QTimer>\n#include <QToolBar>\n#include <QUrl>\n#include <QVector>\n\n#include <algorithm>\n#include <memory>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.wnd\")\n\nconst int contextMenuUpdateIntervalMsec = 100;\nconst int itemPreviewUpdateIntervalMsec = 100;\n\nconstexpr auto dataStreamImportVersionDefault = QDataStream::Qt_4_7;\nconstexpr auto dataStreamImportVersionForV5 = QDataStream::Qt_5_15;\n\nconst QLatin1String menuItemKeyColor(\"color\");\nconst QLatin1String menuItemKeyIcon(\"icon\");\nconst QLatin1String menuItemKeyTag(\"tag\");\n\nconst QIcon iconClipboard() { return getIcon(\"clipboard\", IconPaste); }\nconst QIcon iconTabIcon() { return getIconFromResources(\"tab_icon\"); }\nconst QIcon iconTabNew() { return getIconFromResources(\"tab_new\"); }\nconst QIcon iconTabRemove() { return getIconFromResources(\"tab_remove\"); }\nconst QIcon iconTabRename() { return getIconFromResources(\"tab_rename\"); }\n\nconst char propertyWidgetSizeGuarded[] = \"CopyQ_widget_size_guarded\";\n\nconst char propertyActionFilterCommandFailed[] = \"CopyQ_action_filter_command_failed\";\n\n/// Omit size changes of a widget.\nclass WidgetSizeGuard final : public QObject {\npublic:\n    explicit WidgetSizeGuard(QWidget *guardedObject)\n        : m_guarded(guardedObject)\n    {\n        if ( m_guarded->property(propertyWidgetSizeGuarded).toBool() ) {\n            m_guarded = nullptr;\n        } else {\n            m_guarded->setProperty(propertyWidgetSizeGuarded, true);\n            m_guarded->setFixedSize( m_guarded->size() );\n        }\n    }\n\n    ~WidgetSizeGuard()\n    {\n        if (m_guarded) {\n            m_guarded->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);\n            m_guarded->adjustSize();\n            m_guarded->resize( m_guarded->sizeHint() );\n            m_guarded->setProperty(propertyWidgetSizeGuarded, false);\n        }\n    }\n\nprivate:\n    QWidget *m_guarded;\n};\n\nbool canPaste()\n{\n    return !QApplication::queryKeyboardModifiers().testFlag(Qt::ControlModifier);\n}\n\nbool matchData(const QRegularExpression &re, const QVariantMap &data, const QString &format = QString())\n{\n    if ( re.pattern().isEmpty() )\n        return true;\n\n    const QString text = getTextData(data, format);\n    return text.contains(re);\n}\n\nbool canExecuteCommand(const Command &command, const QVariantMap &data, const QString &sourceTabName)\n{\n    // Verify that an action is provided.\n    if ( command.cmd.isEmpty()\n         && (command.tab.isEmpty() || command.tab == sourceTabName) )\n    {\n        return false;\n    }\n\n    // Verify that data for given MIME is available.\n    if ( !command.input.isEmpty() ) {\n        if (command.input == mimeItems || command.input == \"!OUTPUT\") {\n            // Disallow applying action that takes serialized item more times.\n            if ( data.contains(command.output) )\n                return false;\n        } else if ( !data.contains(command.input) ) {\n            return false;\n        }\n    }\n\n    // Verify that and text matches given regexp.\n    if ( !matchData(command.re, data) )\n        return false;\n\n    // Verify that window title matches given regexp.\n    if ( !matchData(command.wndre, data, mimeWindowTitle) )\n        return false;\n\n    return true;\n}\n\ntemplate <typename WidgetOrAction>\nvoid disableActionWhenTabGroupSelected(WidgetOrAction *action, MainWindow *window)\n{\n    QObject::connect( window, &MainWindow::tabGroupSelected,\n                      action, &WidgetOrAction::setDisabled );\n}\n\nQMenu *findSubMenu(const QString &name, const QMenu &menu)\n{\n    for (auto action : menu.actions()) {\n        QMenu *subMenu = action->menu();\n        if (subMenu && subMenu->title() == name)\n            return subMenu;\n    }\n\n    return nullptr;\n}\n\nstd::pair<QMenu*, QMenu*> createSubMenus(QString *name, QMenu *menu)\n{\n    QStringList path = name->split('|');\n    if (path.size() == 1)\n        return {nullptr, menu};\n\n    *name = path.takeLast();\n\n    QMenu *parentMenu = menu;\n    QMenu *rootMenu = nullptr;\n\n    for (const auto &subMenuName : path) {\n        QMenu *subMenu = findSubMenu(subMenuName, *parentMenu);\n\n        if (!subMenu) {\n            subMenu = new QMenu(subMenuName, parentMenu);\n            parentMenu->addMenu(subMenu);\n        }\n\n        if (parentMenu == menu)\n            rootMenu = subMenu;\n        parentMenu = subMenu;\n    }\n\n    return {rootMenu, parentMenu};\n}\n\nclass WindowFlags\n{\npublic:\n    explicit WindowFlags(QWidget *window)\n        : m_window(window)\n        , m_flags(window->windowFlags())\n    {\n    }\n\n    void apply()\n    {\n        if (!m_window || m_window->windowFlags() == m_flags)\n            return;\n\n        // WORKAROUND: setWindowFlags() hides the window.\n        // See: https://doc.qt.io/qt-6/qwidget.html#windowFlags-prop\n        const bool wasVisible = m_window->isVisible();\n        const bool wasActive = m_window->isActiveWindow();\n\n        m_window->setWindowFlags(m_flags);\n\n        if (wasVisible) {\n            if (wasActive) {\n                m_window->show();\n                m_window->activateWindow();\n                QApplication::setActiveWindow(m_window);\n                raiseWindow(m_window);\n            } else {\n                const bool showWithoutActivating = m_window->testAttribute(Qt::WA_ShowWithoutActivating);\n                m_window->setAttribute(Qt::WA_ShowWithoutActivating);\n                m_window->show();\n                m_window->setAttribute(Qt::WA_ShowWithoutActivating, showWithoutActivating);\n            }\n        }\n    }\n\n    void set(Qt::WindowType flag, bool enable)\n    {\n        if (m_flags.testFlag(flag) != enable)\n            m_flags.setFlag(flag, enable);\n    }\n\nprivate:\n    QPointer<QWidget> m_window;\n    Qt::WindowFlags m_flags;\n};\n\ntemplate<typename Dialog, typename ...Ts>\nDialog *openDialog(Ts... arguments)\n{\n    std::unique_ptr<Dialog> dialog( new Dialog(arguments...) );\n    WindowGeometryGuard::create( dialog.get() );\n    dialog->setAttribute(Qt::WA_DeleteOnClose, true);\n    dialog->setWindowIcon(appIcon());\n    dialog->activateWindow();\n    dialog->show();\n    return dialog.release();\n}\n\nbool isItemActivationShortcut(const QKeySequence &shortcut)\n{\n    return (shortcut.matches(Qt::Key_Return) || shortcut.matches(Qt::Key_Enter))\n            && shortcut[1] == 0\n            && shortcut[2] == 0\n            && shortcut[3] == 0;\n}\n\nQString importExportFileDialogFilter()\n{\n    return MainWindow::tr(\"CopyQ Items (*.cpq)\");\n}\n\n/**\n * Returns QVariant value that can be serialized and deserialized with QDataStream.\n *\n * WORKAROUND: Invalid QVariant() can be serialized but deserialization fails.\n */\nQVariant serializableValue(const QSettings &settings, const QString &key)\n{\n    const auto value = settings.value(key);\n    if ( value.isValid() )\n        return value;\n\n    return QString();\n}\n\nQByteArray serializeToByteArray(const QVariant &value)\n{\n    QByteArray bytes;\n    {\n        QDataStream in(&bytes, QIODevice::WriteOnly);\n        in.setVersion(dataStreamImportVersionForV5);\n        in << value;\n    }\n    return bytes;\n}\n\nQVariant deserializeFromByteArray(const QByteArray &bytes)\n{\n    QVariant value;\n    {\n        QDataStream out(bytes);\n        out.setVersion(dataStreamImportVersionForV5);\n        out >> value;\n    }\n    return value;\n}\n\nbool isAnyApplicationWindowActive()\n{\n    if ( qApp->activeWindow() )\n        return true;\n\n    const auto platform = platformNativeInterface();\n    const auto currentWindow = platform->getCurrentWindow();\n    if (!currentWindow)\n        return false;\n\n    const auto currentWindowTitle = currentWindow->getTitle();\n    if ( currentWindowTitle.isEmpty() )\n        return false;\n\n    for ( auto window : qApp->topLevelWidgets() ) {\n        const auto ownWindow = platform->getWindow( window->winId() );\n        if ( ownWindow && currentWindowTitle == ownWindow->getTitle() )\n            return true;\n    }\n\n    return false;\n}\n\nbool hasDialogOpen(QWidget *parent)\n{\n    for ( auto window : qApp->topLevelWidgets() ) {\n        if ( window->isVisible() && window->parentWidget() == parent )\n            return true;\n    }\n\n    return false;\n}\n\nvoid deleteSubMenus(QObject *parent)\n{\n    for (auto subMenu : parent->findChildren<QMenu*>()) {\n        if (subMenu->parent() == parent)\n            subMenu->deleteLater();\n    }\n}\n\nvoid clearActions(QMenu *menu)\n{\n    for (QAction *action : menu->actions()) {\n        action->setVisible(false);\n        action->setDisabled(true);\n        action->setShortcuts({});\n        action->deleteLater();\n        menu->removeAction(action);\n    }\n\n    deleteSubMenus(menu);\n    menu->clear();\n}\n\nvoid clearActions(QToolBar *toolBar)\n{\n    for (QAction *action : toolBar->actions()) {\n        // Omit removing action from other menus.\n        if (action->parent() == toolBar) {\n            action->setVisible(false);\n            action->setDisabled(true);\n            action->setShortcuts({});\n            action->deleteLater();\n        }\n    }\n\n    deleteSubMenus(toolBar);\n    toolBar->clear();\n}\n\nbool hasCommandFuzzy(const QVector<Command> &commands, const Command &command)\n{\n    return std::any_of(std::begin(commands), std::end(commands), [&command](const Command &cmd){\n        return command.name == cmd.name || command.cmd == cmd.cmd;\n    });\n}\n\nbool syncInternalCommandChanges(const Command &command, QVector<Command> *allCommands)\n{\n    Q_ASSERT( !command.internalId.isEmpty() );\n    if ( command.internalId.isEmpty() )\n        return false;\n\n    const auto found = std::find_if(std::begin(*allCommands), std::end(*allCommands), [&command](const Command &cmd){\n        return command.internalId == cmd.internalId;\n    });\n    if ( found == std::end(*allCommands) )\n        return false;\n\n    // Synchronize internal/plugin commands attributes\n    // except the ones user can change.\n    Command command2 = *found;\n    command2.icon = command.icon;\n    command2.enable = command.enable;\n    command2.shortcuts = command.shortcuts;\n    command2.globalShortcuts = command.globalShortcuts;\n    if (command2 == command)\n        return false;\n\n    const auto icon = found->icon;\n    const auto enable = found->enable;\n    const auto shortcuts = found->shortcuts;\n    const auto globalShortcuts = found->globalShortcuts;\n    *found = command;\n    found->icon = icon;\n    found->enable = enable;\n    found->shortcuts = shortcuts;\n    found->globalShortcuts = globalShortcuts;\n    return true;\n}\n\nbool menuItemMatches(const QModelIndex &index, const QString &searchText)\n{\n    for (const int type : {contentType::text, contentType::notes}) {\n        const QString itemText = index.data(type).toString().toLower();\n        if ( itemText.contains(searchText.toLower()) )\n            return true;\n    }\n    return false;\n}\n\nQList<QKeySequence> getUniqueShortcuts(const QStringList &shortcuts, QList<QKeySequence> *usedShortcuts)\n{\n    QList<QKeySequence> uniqueShortcuts;\n\n    for (const auto &shortcutText : shortcuts) {\n        const QKeySequence shortcut(shortcutText, QKeySequence::PortableText);\n        if ( !shortcut.isEmpty() && !usedShortcuts->contains(shortcut) ) {\n            usedShortcuts->append(shortcut);\n            uniqueShortcuts.append(shortcut);\n        }\n    }\n\n    return uniqueShortcuts;\n}\n\nbool hadleKeyOverride(QObject *object, QEvent *ev, KeyMods keyMods)\n{\n    if (keyMods.key <= 0)\n        return false;\n\n    if (ev->type() == QEvent::ShortcutOverride) {\n        ev->accept();\n        return true;\n    }\n\n    QKeyEvent event2(QEvent::KeyPress, keyMods.key, keyMods.mods);\n    if ( QCoreApplication::sendEvent(object, &event2) ) {\n        ev->accept();\n        return true;\n    }\n\n    return false;\n}\n\nImportSelection getImportSelection(\n    const QVariantMap &data, ImportOptions options, QWidget *parent)\n{\n    ImportSelection sel{\n        data.value(\"tabs\").toStringList(),\n        data.value(\"settings\").toMap(),\n        data.value(\"commands\").toList()\n    };\n    if (options == ImportOptions::All)\n        return sel;\n\n    ImportExportDialog importDialog(parent);\n    importDialog.setWindowTitle( MainWindow::tr(\"Options for Import\") );\n    importDialog.setTabs(sel.tabs);\n    importDialog.setHasConfiguration(!sel.configuration.isEmpty());\n    importDialog.setHasCommands(!sel.commands.isEmpty());\n    importDialog.setConfigurationEnabled(!sel.configuration.isEmpty());\n    importDialog.setCommandsEnabled(!sel.commands.isEmpty());\n    if ( importDialog.exec() != QDialog::Accepted )\n        return {};\n\n    return ImportSelection{\n        importDialog.selectedTabs(),\n        importDialog.isConfigurationEnabled() ? sel.configuration : QVariantMap(),\n        importDialog.isCommandsEnabled() ? sel.commands : QVariantList()\n    };\n}\n\nvoid showEncryptionUnavailableMessage(QWidget *parent)\n{\n    QMessageBox::warning(\n        parent,\n        MainWindow::tr(\"Encryption Unavailable\"),\n        MainWindow::tr(\"Encryption is not available (see logs for details).\\n\\nIt will be possible to encrypt and decrypt tab data.\")\n    );\n}\n\nQVariantMap exportSettings(const QStringList &tabs, bool exportConfiguration, bool exportCommands)\n{\n    QVariantMap settingsMap;\n    if (exportConfiguration) {\n        log(\"Exporting settings\");\n        const QSettings settings;\n        const QLatin1String commandsPrefix(\"Commands/\");\n        for (const auto &key : settings.allKeys()) {\n            if ( !key.startsWith(commandsPrefix) ) {\n                settingsMap[key] = serializableValue(settings, key);\n            }\n        }\n    }\n\n    QVariantList commandsList;\n    if (exportCommands) {\n        log(\"Exporting commands\");\n        Settings settings(getConfigurationFilePath(\"-commands.ini\"));\n        const int commandCount = settings.beginReadArray(QLatin1String(\"Commands\"));\n        commandsList.reserve(commandCount);\n        for (int i = 0; i < commandCount; ++i) {\n            settings.setArrayIndex(i);\n\n            QVariantMap commandMap;\n            for ( const auto &key : settings.allKeys() )\n                commandMap[key] = serializableValue(settings, key);\n\n            commandsList.append(commandMap);\n        }\n        settings.endArray();\n\n        settings.beginGroup(QLatin1String(\"Command\"));\n        QVariantMap commandMap;\n        for ( const auto &key : settings.allKeys() )\n            commandMap[key] = serializableValue(settings, key);\n        if (!commandMap.isEmpty())\n            commandsList.append(commandMap);\n    }\n\n    QVariantMap data;\n    if ( !tabs.isEmpty() )\n        data[QStringLiteral(\"tabs\")] = tabs;\n    if ( !settingsMap.isEmpty() )\n        data[QStringLiteral(\"settings\")] = settingsMap;\n    if ( !commandsList.isEmpty() )\n        data[QStringLiteral(\"commands\")] = commandsList;\n\n    return data;\n}\n\nEncryption::EncryptionKey promptForImportPassword(QWidget *parent)\n{\n    if (!Encryption::initialize()) {\n        showEncryptionUnavailableMessage(parent);\n        return {};\n    }\n\n    const auto password = promptForNewPassword(\n        MainWindow::tr(\"Import Password\"),\n        MainWindow::tr(\"Enter password for import:\"),\n        PasswordPromptType::AskOnce,\n        parent);\n\n    if (password.isEmpty()) {\n        log(\"Import cancelled\", LogWarning);\n        return {};\n    }\n\n    return Encryption::EncryptionKey(password);\n}\n\n#ifdef WITH_QCA_ENCRYPTION\nEncryption::EncryptionKey promptForExportPassword(QWidget *parent, bool *ok)\n{\n    if (!Encryption::initialize()) {\n        showEncryptionUnavailableMessage(parent);\n        *ok = false;\n        return {};\n    }\n\n    *ok = true;\n    const auto password = promptForNewPassword(\n        MainWindow::tr(\"Export Password\"),\n        MainWindow::tr(\"Enter password for export (empty for no encryption):\"),\n        PasswordPromptType::AllowEmpty,\n        parent);\n\n    if ( password.isEmpty() )\n        return {};\n\n    const Encryption::EncryptionKey key(password);\n    if (key.isValid())\n        return key;\n\n    log(\"Failed to derive encryption key for export\", LogError);\n    *ok = false;\n    return {};\n}\n#endif\n\nbool checkFileAndStreamErrors(const QFileDevice &file, const QDataStream &stream, const char *label)\n{\n    if (file.error() != QFileDevice::NoError) {\n        qCCritical(logCategory) << label << \"-\" << \"file:\"\n            << file.fileName() << \"message:\" << file.errorString();\n        return false;\n    }\n\n    if (stream.status() != QDataStream::Ok) {\n        qCCritical(logCategory) << label << \"-\"  << \"file:\"\n            << file.fileName() << \"reason:\" << stream.status();\n        return false;\n    }\n\n    return true;\n}\n\n} // namespace\n\n#ifdef WITH_NATIVE_NOTIFICATIONS\nclass SystemTrayIcon final : public KStatusNotifierItem {\n    Q_OBJECT\npublic:\n    explicit SystemTrayIcon(QWidget *parent = nullptr)\n        : KStatusNotifierItem(QCoreApplication::applicationName())\n    {\n        setIcon(appIcon());\n        // Parent is not passed to the KStatusNotifierItem constructor because\n        // it calls KStatusNotifierItem::setAssociatedWidget() which breaks\n        // setting main window position.\n        setParent(parent);\n        setStandardActionsEnabled(false);\n        setTitle(QGuiApplication::applicationDisplayName());\n        setToolTipTitle(QGuiApplication::applicationDisplayName());\n        setCategory(KStatusNotifierItem::ApplicationStatus);\n    }\n\n    void setIcon(const QIcon &icon) { setIconByPixmap(icon); }\n\n    void setToolTip(const QString &text)\n    {\n#if defined(Q_OS_WIN)\n        // Only the tooltip title seems to be supported on Windows.\n        KStatusNotifierItem::setToolTipTitle(text);\n#else\n        KStatusNotifierItem::setToolTipSubTitle(text);\n#endif\n    }\n\n    bool isVisible() const\n    {\n        return status() != KStatusNotifierItem::Passive;\n    }\n    void show() { setStatus(KStatusNotifierItem::Active); }\n    void hide() { setStatus(KStatusNotifierItem::Passive); }\n\n    void activate(const QPoint &) override\n    {\n        emit activated(QSystemTrayIcon::Trigger);\n    }\n\nsignals:\n    void activated(QSystemTrayIcon::ActivationReason reason);\n};\n#else\nclass SystemTrayIcon final : public QSystemTrayIcon {\npublic:\n    explicit SystemTrayIcon(QWidget *parent = nullptr)\n        : QSystemTrayIcon(parent)\n    {\n        setIcon(appIcon());\n    }\n};\n#endif\n\nclass ToolBar final : public QToolBar {\npublic:\n    explicit ToolBar(QWidget *parent)\n        : QToolBar(parent)\n    {\n        setObjectName(\"toolBar\");\n        setContextMenuPolicy(Qt::PreventContextMenu);\n        initSingleShotTimer( &m_timerUnfreeze, 50, this, &ToolBar::unfreeze );\n    }\n\n    void setFrozen(bool frozen) {\n        if (frozen) {\n            m_frozen = true;\n            setUpdatesEnabled(false);\n            setEnabled(false);\n            m_timerUnfreeze.stop();\n        } else {\n            m_timerUnfreeze.start();\n        }\n    }\n\nprotected:\n    void paintEvent(QPaintEvent *ev) override\n    {\n        if (m_frozen)\n            return;\n\n        QToolBar::paintEvent(ev);\n    }\n\nprivate:\n    void unfreeze()\n    {\n        m_frozen = false;\n        setEnabled(true);\n        setUpdatesEnabled(true);\n        update();\n    }\n\n    bool m_frozen = false;\n    QTimer m_timerUnfreeze;\n};\n\nMainWindow::MainWindow(const ClipboardBrowserSharedPtr &sharedData, QWidget *parent)\n    : QMainWindow(parent)\n    , cm(nullptr)\n    , ui(new Ui::MainWindow)\n    , m_menuItem(nullptr)\n    , m_trayMenu( new TrayMenu(this) )\n    , m_tray(nullptr)\n    , m_toolBar(new ToolBar(this))\n    , m_sharedData(sharedData)\n    , m_wasEncrypted(AppConfig().option<Config::encrypt_tabs>())\n    , m_menu( new TrayMenu(this) )\n    , m_menuMaxItemCount(-1)\n    , m_commandDialog(nullptr)\n    , m_clipboard(platformNativeInterface()->clipboard())\n{\n    ui->setupUi(this);\n\n    m_sharedData->passwordPrompt = new PasswordPrompt(this);\n    m_sharedData->menuItems = menuItems();\n\n    setWindowRole(QStringLiteral(\"main\"));\n\n    menuBar()->setObjectName(\"menu_bar\");\n    createMenu();\n\n    ui->tabWidget->addToolBars(this);\n    addToolBar(Qt::RightToolBarArea, m_toolBar);\n\n    ui->dockWidgetItemPreview->setFocusProxy(ui->scrollAreaItemPreview);\n    ui->dockWidgetItemPreview->hide();\n    ui->scrollAreaItemPreview->viewport()->setObjectName(\"item_preview\");\n\n    WindowGeometryGuard::create(this);\n    restoreState( mainWindowState(objectName()) );\n    // NOTE: QWidget::isVisible() returns false if parent is not visible.\n    m_showItemPreview = !ui->dockWidgetItemPreview->isHidden();\n\n    // Disable the show-preview option when the preview dock is closed.\n    connect( ui->dockWidgetItemPreview, &QDockWidget::visibilityChanged,\n             this, [this]() {\n                if ( ui->dockWidgetItemPreview->isHidden() )\n                    setItemPreviewVisible(false);\n             } );\n\n    updateIcon();\n\n    updateFocusWindows();\n\n    connect( m_trayMenu, &QMenu::aboutToShow,\n             this, &MainWindow::updateFocusWindows );\n    connect( m_trayMenu, &QMenu::aboutToShow,\n             this, &MainWindow::updateTrayMenuItemsTimeout );\n    connect( m_trayMenu, &QMenu::aboutToHide,\n             this, [this](){ m_timerRaiseLastWindowAfterMenuClosed.start(); } );\n    connect( m_trayMenu, &TrayMenu::searchRequest,\n             this, &MainWindow::filterTrayMenuItems );\n    connect( m_trayMenu, &TrayMenu::clipboardItemActionTriggered,\n             this, &MainWindow::onTrayActionTriggered );\n\n    connect( m_menu, &QMenu::aboutToShow,\n             this, &MainWindow::updateFocusWindows );\n    connect( m_menu, &QMenu::aboutToHide,\n             this, [this](){ m_timerRaiseLastWindowAfterMenuClosed.start(); } );\n    connect( m_menu, &TrayMenu::searchRequest,\n             this, &MainWindow::filterMenuItems );\n    connect( m_menu, &TrayMenu::clipboardItemActionTriggered,\n             this, &MainWindow::onMenuActionTriggered );\n\n    connect( ui->tabWidget, &TabWidget::currentChanged,\n             this, &MainWindow::tabChanged );\n    connect( ui->tabWidget, &TabWidget::tabMoved,\n             this, &MainWindow::saveTabPositions );\n    connect( ui->tabWidget, &TabWidget::tabsMoved,\n             this, &MainWindow::tabsMoved );\n    connect( ui->tabWidget, &TabWidget::tabBarMenuRequested,\n             this, &MainWindow::tabBarMenuRequested );\n    connect( ui->tabWidget, &TabWidget::tabTreeMenuRequested,\n             this, &MainWindow::tabTreeMenuRequested );\n    connect( ui->tabWidget, &TabWidget::tabRenamed,\n             this, &MainWindow::renameTab );\n    connect( ui->tabWidget, &TabWidget::tabCloseRequested,\n             this, &MainWindow::tabCloseRequested );\n    connect( ui->tabWidget, &TabWidget::dropItems,\n             this, &MainWindow::onTabWidgetDropItems);\n    connect( ui->searchBar, &Utils::FilterLineEdit::filterChanged,\n             this, &MainWindow::onFilterChanged );\n    connect( qApp, &QCoreApplication::aboutToQuit,\n             this, &MainWindow::onAboutToQuit );\n\n    connect(m_sharedData->itemFactory, &ItemFactory::error,\n            this, &MainWindow::showError);\n    connect(m_sharedData->itemFactory, &ItemFactory::addCommands,\n            this, &MainWindow::addCommands);\n\n    initSingleShotTimer( &m_timerUpdateFocusWindows, 100, this, &MainWindow::updateFocusWindows );\n    initSingleShotTimer( &m_timerUpdateContextMenu, 0, this, &MainWindow::updateContextMenuTimeout );\n    initSingleShotTimer( &m_timerUpdatePreview, 0, this, &MainWindow::updateItemPreviewTimeout );\n    initSingleShotTimer( &m_timerSaveTabPositions, 0, this, &MainWindow::onSaveTabPositionsTimer );\n    initSingleShotTimer( &m_timerRaiseLastWindowAfterMenuClosed, 50, this, &MainWindow::raiseLastWindowAfterMenuClosed);\n    enableHideWindowOnUnfocus();\n\n    m_trayMenu->setObjectName(\"TrayMenu\");\n    m_menu->setObjectName(\"Menu\");\n\n    auto act = m_trayMenu->addAction( appIcon(), tr(\"&Show/Hide\") );\n    connect(act, &QAction::triggered, this, &MainWindow::toggleVisibleFromTray);\n    m_trayMenu->setDefaultAction(act);\n    addTrayAction(Actions::File_Preferences);\n    addTrayAction(Actions::File_ToggleClipboardStoring);\n    m_trayMenu->addSeparator();\n    addTrayAction(Actions::File_Exit);\n\n    // Initialize tray menu even if it's not visible to ensure\n    // the initial size is correct in native tray menus.\n    QTimer::singleShot(0, this, [this](){\n        if (m_trayMenuDirty)\n            initTrayMenuItems();\n    });\n}\n\nbool MainWindow::browseMode() const\n{\n    return ui->searchBar->isHidden();\n}\n\nQStringList MainWindow::copyqStats() const\n{\n    int totalTabs = 0;\n    int loadedTabs = 0;\n    for (auto *placeholder : findChildren<ClipboardBrowserPlaceholder*>()) {\n        ++totalTabs;\n        if (placeholder->isDataLoaded())\n            ++loadedTabs;\n    }\n\n    QStringList lines;\n    if (totalTabs > 0) {\n        lines += QStringLiteral(\"TABS: total=%1, loaded=%2\")\n            .arg(totalTabs).arg(loadedTabs);\n    }\n\n    lines += QStringLiteral(\"COMMANDS: automatic=%1, display=%2, menu=%3, tray_menu=%4, script=%5\")\n        .arg(m_automaticCommands.size())\n        .arg(m_displayCommands.size())\n        .arg(m_menuCommands.size())\n        .arg(m_trayMenuCommands.size())\n        .arg(m_scriptCommands.size());\n\n    return lines;\n}\n\nvoid MainWindow::exit()\n{\n    // Check if not editing in any tab (show and try to close editors).\n    for ( int i = 0; i < ui->tabWidget->count(); ++i ) {\n        auto c = getPlaceholder(i)->browser();\n        if ( c && (c->isInternalEditorOpen() || c->isExternalEditorOpen()) ) {\n            setCurrentTab(i);\n            if ( !c->maybeCloseEditors() )\n                return;\n        }\n    }\n\n    int answer = QMessageBox::Yes;\n    if (m_options.confirmExit) {\n        showWindow();\n        answer = QMessageBox::question(\n                    this,\n                    tr(\"Exit?\"),\n                    tr(\"Do you want to <strong>exit</strong> CopyQ?\"),\n                    QMessageBox::Yes | QMessageBox::No,\n                    QMessageBox::Yes);\n    }\n\n    if (answer == QMessageBox::Yes)\n        emit requestExit();\n}\n\nvoid MainWindow::closeEvent(QCloseEvent *event)\n{\n    hideWindow();\n    event->accept();\n    COPYQ_LOG(\"Got main window close event.\");\n}\n\nbool MainWindow::focusNextPrevChild(bool next)\n{\n    auto c = browser();\n    if (!c)\n        return false;\n\n    if ( next && ui->searchBar->hasFocus() ) {\n        c->setFocus();\n        return true;\n    }\n\n    if ( !next && c->hasFocus() && !browseMode() ) {\n        ui->searchBar->setFocus();\n        return true;\n    }\n\n    // Focus floating preview dock.\n    if ( next && m_showItemPreview && ui->dockWidgetItemPreview->isFloating() ) {\n        QWidget *w = ui->scrollAreaItemPreview->widget();\n        if (w && c->isActiveWindow() && c->hasFocus()) {\n            ui->dockWidgetItemPreview->raise();\n            ui->dockWidgetItemPreview->activateWindow();\n            w->setFocus(Qt::TabFocusReason);\n            return true;\n        }\n    }\n\n    return QMainWindow::focusNextPrevChild(next);\n}\n\nvoid MainWindow::createMenu()\n{\n    QMenuBar *menubar = menuBar();\n    QMenu *menu;\n    QAction *act;\n\n    // Some action should not be triggered from tab widget or preview dock.\n    QWidget *actionParent = ui->tabWidget;\n\n    menubar->clear();\n\n    // File\n    menu = menubar->addMenu( tr(\"&File\") );\n\n    // - new\n    act = createAction( Actions::File_New, &MainWindow::editNewItem, menu );\n    disableActionWhenTabGroupSelected(act, this);\n\n    // - import\n    createAction( Actions::File_Import, &MainWindow::importData, menu );\n\n    // - export\n    createAction( Actions::File_Export, &MainWindow::exportData, menu );\n\n    // - separator\n    menu->addSeparator();\n\n    // - preferences\n    createAction( Actions::File_Preferences, &MainWindow::openPreferences, menu );\n\n    // - commands\n    createAction( Actions::File_Commands, &MainWindow::openCommands, menu );\n\n    // - separator\n    menu->addSeparator();\n\n    // - show clipboard content\n    createAction( Actions::File_ShowClipboardContent, &MainWindow::showClipboardContent, menu );\n\n    // - show preview\n    QAction *togglePreviewAction =\n            createAction( Actions::File_ShowPreview, &MainWindow::toggleItemPreviewVisible, menu );\n    togglePreviewAction->setCheckable(true);\n    togglePreviewAction->setChecked(m_showItemPreview);\n\n    // - active commands\n    createAction( Actions::File_ProcessManager, &MainWindow::showProcessManagerDialog, menu );\n\n    // - enable/disable\n    createAction( Actions::File_ToggleClipboardStoring, &MainWindow::toggleClipboardStoring, menu );\n\n    // - separator\n    menu->addSeparator();\n\n    // - exit\n    createAction( Actions::File_Exit, &MainWindow::exit, menu );\n\n    // Edit\n    menu = menubar->addMenu( tr(\"&Edit\") );\n\n    // - find\n    createAction( Actions::Edit_FindItems, &MainWindow::findNextOrPrevious, menu, actionParent );\n\n    // - separator\n    menu->addSeparator();\n\n    // - sort\n    createAction( Actions::Edit_SortSelectedItems, &MainWindow::sortSelectedItems, menu, actionParent );\n\n    // - reverse order\n    createAction( Actions::Edit_ReverseSelectedItems, &MainWindow::reverseSelectedItems, menu, actionParent );\n\n    // - separator\n    menu->addSeparator();\n\n    // - paste items\n    createAction( Actions::Edit_PasteItems, &MainWindow::pasteItems, menu, actionParent );\n\n    // - copy items\n    createAction( Actions::Edit_CopySelectedItems, &MainWindow::copyItems, menu, actionParent );\n\n    // Items\n    m_menuItem = menubar->addMenu( tr(\"&Item\") );\n    disableActionWhenTabGroupSelected(m_menuItem, this);\n\n    // Tabs\n    menu = menubar->addMenu(tr(\"&Tabs\"));\n\n    // - new tab\n    createAction( Actions::Tabs_NewTab, &MainWindow::openNewTabDialog, menu );\n\n    // - rename tab\n    act = createAction( Actions::Tabs_RenameTab, &MainWindow::openRenameTabDialog, menu );\n    disableActionWhenTabGroupSelected(act, this);\n\n    // - remove tab\n    act = createAction( Actions::Tabs_RemoveTab, &MainWindow::removeTab, menu );\n    disableActionWhenTabGroupSelected(act, this);\n\n    createAction( Actions::Tabs_ChangeTabIcon, &MainWindow::setTabIcon, menu );\n\n    // - separator\n    menu->addSeparator();\n\n    // - next tab\n    createAction( Actions::Tabs_NextTab, &MainWindow::nextTab, menu );\n\n    // - previous tab\n    createAction( Actions::Tabs_PreviousTab, &MainWindow::previousTab, menu );\n\n    // Help\n    menu = menubar->addMenu(tr(\"&Help\"));\n    createAction( Actions::Help_Help, &MainWindow::openHelp, menu );\n    createAction( Actions::Help_ShowLog, &MainWindow::openLogDialog, menu );\n    createAction( Actions::Help_About, &MainWindow::openAboutDialog, menu );\n\n    // Open Item Menu\n    createAction( Actions::ItemMenu, &MainWindow::showContextMenu, nullptr );\n\n    for (auto subMenu : menuBar()->findChildren<QMenu*>()) {\n        connect( subMenu, &QMenu::aboutToShow,\n                 this, &MainWindow::disableHideWindowOnUnfocus );\n        connect( subMenu, &QMenu::aboutToHide,\n                 this, &MainWindow::enableHideWindowOnUnfocus );\n    }\n}\n\nvoid MainWindow::popupTabBarMenu(QPoint pos, const QString &tab)\n{\n    QMenu menu(ui->tabWidget);\n\n    const int tabIndex = ui->tabWidget->tabs().indexOf(tab);\n    bool hasTab = tabIndex != -1;\n    bool isGroup = ui->tabWidget->isTabGroup(tab);\n\n    const QString quotedTab = quoteString(tab);\n    QAction *actNew = menu.addAction( iconTabNew(), tr(\"&New Tab\") );\n    QAction *actRenameGroup =\n            isGroup ? menu.addAction( iconTabRename(), tr(\"Rename &Group %1\").arg(quotedTab) ) : nullptr;\n    QAction *actRename =\n            hasTab ? menu.addAction( iconTabRename(), tr(\"Re&name Tab %1\").arg(quotedTab) ) : nullptr;\n    QAction *actRemove =\n            hasTab ? menu.addAction( iconTabRemove(), tr(\"Re&move Tab %1\").arg(quotedTab) ) : nullptr;\n    QAction *actRemoveGroup =\n            isGroup ? menu.addAction( iconTabRemove(), tr(\"Remove Group %1\").arg(quotedTab) ) : nullptr;\n\n    QAction *actIcon = menu.addAction( iconTabIcon(), tr(\"&Change Tab Icon\") );\n\n    QAction *act = menu.exec(pos);\n    if (act != nullptr) {\n        if (act == actNew)\n            openNewTabDialog(tab);\n        else if (act == actRenameGroup)\n            openRenameTabGroupDialog(tab);\n        else if (act == actRename)\n            openRenameTabDialog(tabIndex);\n        else if (act == actRemove)\n            removeTab(true, tabIndex);\n        else if (act == actRemoveGroup)\n            removeTabGroup(tab);\n        else if (act == actIcon)\n            setTabIcon(tab);\n    }\n}\n\nvoid MainWindow::updateContextMenu(int intervalMsec)\n{\n    interruptMenuCommandFilters(&m_itemMenuMatchCommands);\n\n    // Omit tool bar flickering.\n    m_toolBar->setFrozen(true);\n\n    clearActions(m_menuItem);\n\n    m_timerUpdateContextMenu.start(intervalMsec);\n}\n\nvoid MainWindow::updateTrayMenuItems()\n{\n    m_trayMenuDirty = true;\n}\n\nvoid MainWindow::updateTrayMenuCommands()\n{\n    m_trayMenu->clearCustomActions();\n\n    if (!m_options.trayCommands)\n        return;\n\n    const QString format = tr(\"&Clipboard: %1\", \"Tray menu clipboard item format\");\n    const auto font = m_trayMenu->font();\n    const auto clipboardLabel = textLabelForData(m_clipboardData, font, format, true);\n\n    QAction *clipboardAction = m_trayMenu->addAction( iconClipboard(), clipboardLabel );\n    connect(clipboardAction, &QAction::triggered,\n            this, &MainWindow::showClipboardContent);\n    m_trayMenu->markItemInClipboard(m_clipboardData);\n\n    QList<QAction*> customActions;\n    customActions.append(clipboardAction);\n    addCommandsToTrayMenu(m_clipboardData, &customActions);\n    m_trayMenu->setCustomActions(customActions);\n}\n\nvoid MainWindow::updateIcon()\n{\n    const QIcon icon = appIcon();\n    setWindowIcon(icon);\n    if (m_tray)\n        m_tray->setIcon(icon);\n}\n\nvoid MainWindow::updateContextMenuTimeout()\n{\n    auto c = browserOrNull();\n    if ( ui->tabWidget->isTabGroupSelected() || !c || c->isInternalEditorOpen()) {\n        clearActions(m_toolBar);\n        m_toolBar->setFrozen(false);\n        return;\n    }\n\n    addCommandsToItemMenu(c);\n\n    m_menuItem->addSeparator();\n\n    addItemAction( Actions::Item_MoveToClipboard, c, &ClipboardBrowser::moveToClipboard );\n    addItemAction( Actions::Item_ShowContent, this, &MainWindow::showItemContent );\n    addItemAction( Actions::Item_Remove, c, &ClipboardBrowser::remove );\n    addItemAction( Actions::Item_Edit, c, &ClipboardBrowser::editSelected );\n    addItemAction( Actions::Item_EditNotes, c, &ClipboardBrowser::editNotes );\n    addItemAction( Actions::Item_EditWithEditor, c, &ClipboardBrowser::openEditor );\n    addItemAction( Actions::Item_Action, this, &MainWindow::openActionDialog );\n\n    m_menuItem->addSeparator();\n\n    addItemAction( Actions::Item_MoveUp, this, &MainWindow::moveUp );\n    addItemAction( Actions::Item_MoveDown, this, &MainWindow::moveDown );\n    addItemAction( Actions::Item_MoveToTop, this, &MainWindow::moveToTop );\n    addItemAction( Actions::Item_MoveToBottom, this, &MainWindow::moveToBottom );\n\n    updateToolBar();\n    updateActionShortcuts();\n}\n\nvoid MainWindow::updateItemPreviewAfterMs(int ms)\n{\n    m_timerUpdatePreview.start(ms);\n}\n\nvoid MainWindow::updateItemPreviewTimeout()\n{\n    const bool showPreview = m_showItemPreview;\n\n    auto c = browserOrNull();\n    if (c && c->length() > 0) {\n        ui->dockWidgetItemPreview->setVisible(m_showItemPreview && !c->isInternalEditorOpen());\n\n        QWidget *w = ui->dockWidgetItemPreview->isVisible() && !ui->tabWidget->isTabGroupSelected()\n                ? c->currentItemPreview(ui->scrollAreaItemPreview)\n                : nullptr;\n\n        ui->scrollAreaItemPreview->setVisible(w != nullptr);\n        ui->scrollAreaItemPreview->setWidget(w);\n        if (w) {\n            ui->dockWidgetItemPreview->setStyleSheet( c->styleSheet() );\n            w->show();\n\n            // Focus from floating preview dock back to the main window on Esc/Tab.\n            if ( ui->dockWidgetItemPreview->isFloating() ) {\n                const auto keys = {\n                    Qt::Key_Backtab,\n                    Qt::Key_Escape,\n                    Qt::Key_Tab,\n                };\n                for (auto key : keys) {\n                    const auto shortcut = new QShortcut(key, w);\n                    connect(shortcut, &QShortcut::activated, this, &MainWindow::showWindow);\n                }\n            }\n        }\n    } else {\n        ui->dockWidgetItemPreview->hide();\n    }\n\n    m_showItemPreview = showPreview;\n    m_timerUpdatePreview.stop();\n}\n\nvoid MainWindow::toggleItemPreviewVisible()\n{\n    setItemPreviewVisible(!m_showItemPreview);\n}\n\nvoid MainWindow::setItemPreviewVisible(bool visible)\n{\n    if (m_showItemPreview == visible)\n        return;\n\n    m_showItemPreview = visible;\n    updateItemPreviewAfterMs(0);\n}\n\nbool MainWindow::isItemPreviewVisible() const\n{\n    return m_showItemPreview;\n}\n\nvoid MainWindow::setScriptOverrides(const QVector<int> &overrides, int actionId)\n{\n    if (!m_actionCollectOverrides || m_actionCollectOverrides->id() != actionId)\n        return;\n\n    m_overrides = overrides;\n    std::sort(m_overrides.begin(), m_overrides.end());\n}\n\nbool MainWindow::isScriptOverridden(int id) const\n{\n    return\n        // Assume everything is overridden until collectOverrides() finishes\n        (m_actionCollectOverrides && m_actionCollectOverrides->isRunning() && m_overrides.isEmpty())\n        || std::binary_search(m_overrides.begin(), m_overrides.end(), id);\n}\n\nQVariant MainWindow::callPlugin(const QVariantList &arguments)\n{\n    const QString name = arguments.value(0).toString();\n    for (const auto &loader : m_sharedData->itemFactory->loaders()) {\n        if (loader->id() == name) {\n            return loader->isEnabled()\n                ? loader->scriptCallback(arguments.mid(1)) : QVariant();\n        }\n    }\n    return {};\n}\n\nvoid MainWindow::onAboutToQuit()\n{\n    if (cm)\n        cm->close();\n\n    saveMainWindowState( objectName(), saveState() );\n    hideWindow();\n    if (m_tray)\n        m_tray->hide();\n\n    stopMenuCommandFilters(&m_itemMenuMatchCommands);\n    stopMenuCommandFilters(&m_trayMenuMatchCommands);\n    abortAction(m_displayActionId);\n    abortAction(m_provideClipboardActionId);\n    abortAction(m_provideSelectionActionId);\n}\n\nvoid MainWindow::onItemCommandActionTriggered(CommandAction *commandAction, const QString &triggeredShortcut)\n{\n    COPYQ_LOG( QString(\"Trigger: %1\").arg(commandAction->text()) );\n    auto c = getPlaceholder()->createBrowser();\n    if (!c)\n        return;\n\n    const QModelIndexList selected = c->selectionModel()->selectedIndexes();\n\n    const auto command = commandAction->command();\n\n    if ( !command.cmd.isEmpty() ) {\n        if (command.transform) {\n            for (const auto &index : selected) {\n                auto actionData = selectionData(*c, index, {index});\n                if ( !triggeredShortcut.isEmpty() )\n                    actionData.insert(mimeShortcut, triggeredShortcut);\n                action(actionData, command, index);\n            }\n        } else {\n            auto actionData = selectionData(*c);\n            if ( !triggeredShortcut.isEmpty() )\n                actionData.insert(mimeShortcut, triggeredShortcut);\n            action(actionData, command, QModelIndex());\n        }\n    }\n\n    if ( !command.tab.isEmpty() && command.tab != c->tabName() ) {\n        auto c2 = tab(command.tab);\n        if (c2) {\n            for (int i = selected.size() - 1; i >= 0; --i) {\n                const auto data = c->copyIndex(selected[i]);\n                if ( !data.isEmpty() )\n                    c2->addUnique(data, ClipboardMode::Clipboard);\n            }\n        }\n    }\n\n    if ( command.remove && (command.tab.isEmpty() || command.tab != c->tabName()) )\n        c->removeIndexes(selected);\n\n    if (command.hideWindow)\n        hideWindow();\n}\n\nvoid MainWindow::onClipboardCommandActionTriggered(CommandAction *commandAction, const QString &triggeredShortcut)\n{\n    const QMimeData *data = m_clipboard->mimeData(ClipboardMode::Clipboard);\n    if (data == nullptr)\n        return;\n\n    auto actionData = cloneData(data);\n    if ( !triggeredShortcut.isEmpty() )\n        actionData.insert(mimeShortcut, triggeredShortcut);\n\n    auto command = commandAction->command();\n\n    action( actionData, command, QModelIndex() );\n}\n\nvoid MainWindow::onTabWidgetDropItems(const QString &tabName, const QMimeData *data, bool *accepted)\n{\n    auto browser = tab(tabName);\n\n    if (browser) {\n        const QVariantMap dataMap = data->hasFormat(mimeItems)\n                ? cloneData(data, QStringList() << mimeItems) : cloneData(data);\n        if ( browser->addAndSelect(dataMap, 0) )\n            *accepted = true;\n    }\n}\n\nvoid MainWindow::showContextMenuAt(QPoint position)\n{\n    // Restrict menu position to central widget.\n    const auto localRect = centralWidget()->rect();\n    const auto rect = QRect(\n        centralWidget()->mapToGlobal(localRect.topLeft()),\n        centralWidget()->mapToGlobal(localRect.bottomRight())\n    );\n    const QPoint positionInCentralWidget(\n        qBound(rect.left(), position.x(), rect.right()),\n        qBound(rect.top(), position.y(), rect.bottom())\n    );\n\n    m_menuItem->exec(positionInCentralWidget);\n}\n\nvoid MainWindow::showContextMenu()\n{\n    auto c = browser();\n    if (!c)\n        return;\n\n    const auto index = c->currentIndex();\n    if ( !index.isValid() )\n        return;\n\n    const auto itemRect = c->visualRect(index);\n    const auto viewportPosition = itemRect.center();\n    const auto position = c->mapToGlobal(viewportPosition);\n    showContextMenuAt(position);\n}\n\nvoid MainWindow::moveUp()\n{\n    auto c = browser();\n    if (c)\n        c->move(Qt::Key_Up);\n}\n\nvoid MainWindow::moveDown()\n{\n    auto c = browser();\n    if (c)\n        c->move(Qt::Key_Down);\n}\n\nvoid MainWindow::moveToTop()\n{\n    auto c = browser();\n    if (c)\n        c->move(Qt::Key_Home);\n}\n\nvoid MainWindow::moveToBottom()\n{\n    auto c = browser();\n    if (c)\n        c->move(Qt::Key_End);\n}\n\nvoid MainWindow::onBrowserCreated(ClipboardBrowser *browser)\n{\n    connect( browser, &ClipboardBrowser::changeClipboard,\n             this, &MainWindow::setClipboardAndSelection );\n    connect( browser, &ClipboardBrowser::requestShow,\n             this, &MainWindow::showBrowser );\n    connect( browser, &ClipboardBrowser::error,\n             this, &MainWindow::showError );\n    connect( browser, &QAbstractItemView::clicked,\n             this, &MainWindow::onItemClicked );\n    connect( browser, &QAbstractItemView::doubleClicked,\n             this, &MainWindow::onItemDoubleClicked );\n    connect( browser, &ClipboardBrowser::itemCountChanged,\n             ui->tabWidget, &TabWidget::setTabItemCount );\n    connect( browser, &ClipboardBrowser::showContextMenu,\n             this, &MainWindow::showContextMenuAt );\n    connect( browser, &ClipboardBrowser::itemSelectionChanged,\n             this, &MainWindow::onItemSelectionChanged );\n    connect( browser, &ClipboardBrowser::itemsChanged,\n             this, &MainWindow::onItemsChanged );\n    connect( browser, &ClipboardBrowser::internalEditorStateChanged,\n             this, &MainWindow::onInternalEditorStateChanged );\n    connect( browser, &ClipboardBrowser::searchRequest,\n             this, &MainWindow::findNextOrPrevious );\n    connect( browser, &ClipboardBrowser::searchHideRequest,\n             ui->searchBar, &Utils::FilterLineEdit::hide );\n    connect( browser, &ClipboardBrowser::searchShowRequest,\n             this, &MainWindow::onSearchShowRequest );\n    connect( browser, &ClipboardBrowser::itemWidgetCreated,\n             this, &MainWindow::onItemWidgetCreated );\n\n    connect( browser, &ClipboardBrowser::runOnRemoveItemsHandler,\n             browser, [this, browser](const QList<QPersistentModelIndex> &indexes, bool *canRemove) {\n                 if (isScriptOverridden(ScriptOverrides::OnItemsRemoved)) {\n                     QVariantMap data = createDataMap(mimeCurrentTab, browser->tabName());\n                     addSelectionData(&data, indexes);\n                     *canRemove = runEventHandlerScript(QStringLiteral(\"onItemsRemoved()\"), data);\n                 }\n             } );\n    connect( browser->model(), &QAbstractItemModel::rowsInserted,\n             browser, [this, browser](const QModelIndex &, int first, int last) {\n                 if (isScriptOverridden(ScriptOverrides::OnItemsAdded))\n                    runItemHandlerScript(QStringLiteral(\"onItemsAdded()\"), browser, first, last);\n             } );\n    connect( browser->model(), &QAbstractItemModel::dataChanged,\n             browser, [this, browser](const QModelIndex &topLeft, const QModelIndex &bottomRight) {\n                 if (isScriptOverridden(ScriptOverrides::OnItemsChanged)) {\n                    runItemHandlerScript(\n                        QStringLiteral(\"onItemsChanged()\"),\n                        browser, topLeft.row(), bottomRight.row());\n                    }\n             } );\n}\n\nvoid MainWindow::onBrowserLoaded(ClipboardBrowser *browser)\n{\n    if (isScriptOverridden(ScriptOverrides::OnItemsLoaded)) {\n        runScript(\n            QStringLiteral(\"onItemsLoaded()\"),\n            createDataMap(mimeCurrentTab, browser->tabName()));\n    }\n\n    if (browserOrNull() == browser) {\n        const int index = ui->tabWidget->currentIndex();\n        tabChanged(index, index);\n    }\n}\n\nvoid MainWindow::onBrowserDestroyed(ClipboardBrowserPlaceholder *placeholder)\n{\n    if (placeholder == getPlaceholder()) {\n        updateContextMenu(0);\n        updateItemPreviewAfterMs(0);\n    }\n}\n\nvoid MainWindow::onItemSelectionChanged(const ClipboardBrowser *browser)\n{\n    if (browser == browserOrNull()) {\n        updateContextMenu(0);\n        updateItemPreviewAfterMs(0);\n    }\n}\n\nvoid MainWindow::onItemsChanged(const ClipboardBrowser *browser)\n{\n    if (browser == browserOrNull()) {\n        updateContextMenu(contextMenuUpdateIntervalMsec);\n        updateItemPreviewAfterMs(itemPreviewUpdateIntervalMsec);\n    }\n\n    const ClipboardBrowserPlaceholder *placeholder = getPlaceholderForTrayMenu();\n    if (placeholder && placeholder->browser() == browser)\n        updateTrayMenuItems();\n}\n\nvoid MainWindow::onInternalEditorStateChanged(const ClipboardBrowser *browser)\n{\n    if (browser == browserOrNull()) {\n        updateContextMenu(0);\n        updateItemPreviewAfterMs(0);\n    }\n}\n\nvoid MainWindow::onItemWidgetCreated(const PersistentDisplayItem &item)\n{\n    if ( m_displayCommands.isEmpty() )\n        return;\n\n    m_displayItemList.append(item);\n    runDisplayCommands();\n}\n\nvoid MainWindow::onActionDialogAccepted(const Command &command, const QStringList &arguments, const QVariantMap &data)\n{\n    auto act = new Action();\n    act->setCommand(command.cmd, arguments);\n    act->setInputWithFormat(data, command.input);\n    act->setName(command.localizedName());\n    act->setData(data);\n\n    if ( !command.output.isEmpty() ) {\n        if ( !command.sep.isEmpty() )\n            actionOutput(this, act, command.output, command.outputTab, QRegularExpression(command.sep));\n        else\n            actionOutput(this, act, command.output, command.outputTab);\n    }\n\n    m_sharedData->actions->action(act);\n}\n\nvoid MainWindow::onSearchShowRequest(const QString &text)\n{\n    if (m_enteringSearchMode)\n        return;\n    m_enteringSearchMode = true;\n\n    enterSearchMode();\n\n    if (m_options.navigationStyle != NavigationStyle::Vi || text != \"/\") {\n        ui->searchBar->setText(text);\n        ui->searchBar->end(false);\n    }\n\n    m_enteringSearchMode = false;\n}\n\nvoid MainWindow::runDisplayCommands()\n{\n    if ( m_displayItemList.isEmpty() )\n        return;\n\n    if ( !isInternalActionId(m_displayActionId) ) {\n        m_currentDisplayItem = m_displayItemList.takeFirst();\n        const auto action = runScript(QStringLiteral(\"runDisplayCommands()\"), m_currentDisplayItem.data());\n        m_displayActionId = action->id();\n    }\n\n    emit sendActionData(m_displayActionId, QByteArray());\n}\n\nvoid MainWindow::clearHiddenDisplayData()\n{\n    for (int i = m_displayItemList.size() - 1; i >= 0; --i) {\n        auto &item = m_displayItemList[i];\n        if ( !item.isValid() )\n            m_displayItemList.removeAt(i);\n    }\n}\n\nvoid MainWindow::reloadBrowsers()\n{\n    for( int i = 0; i < ui->tabWidget->count(); ++i )\n        getPlaceholder(i)->reloadBrowser();\n}\n\nint MainWindow::findTabIndexExactMatch(const QString &name)\n{\n    TabWidget *w = ui->tabWidget;\n\n    for( int i = 0; i < w->count(); ++i ) {\n        if ( name == w->tabName(i) )\n            return i;\n    }\n\n    return -1;\n}\n\nvoid MainWindow::setClipboardData(const QVariantMap &data)\n{\n    m_clipboardData = data;\n    updateContextMenu(contextMenuUpdateIntervalMsec);\n    updateTrayMenuCommands();\n}\n\nvoid MainWindow::setFilter(const QString &text)\n{\n    if ( text.isEmpty() ) {\n        enterBrowseMode();\n    } else {\n        enterSearchMode(text);\n        getPlaceholder()->setFocus();\n    }\n}\n\nQString MainWindow::filter() const\n{\n    return ui->searchBar->isVisible() ? ui->searchBar->text() : QString();\n}\n\nvoid MainWindow::updateWindowTransparency(bool mouseOver)\n{\n    int opacity = 100 - (mouseOver || isActiveWindow() ? m_options.transparencyFocused : m_options.transparency);\n    setWindowOpacity(opacity / 100.0);\n}\n\nClipboardBrowserPlaceholder *MainWindow::getPlaceholder(int index) const\n{\n    return qobject_cast<ClipboardBrowserPlaceholder*>( ui->tabWidget->widget(index) );\n}\n\nClipboardBrowserPlaceholder *MainWindow::getPlaceholder(const QString &tabName) const\n{\n    for (auto placeholder : findChildren<ClipboardBrowserPlaceholder*>()) {\n        if ( placeholder->tabName() == tabName )\n            return placeholder;\n    }\n    return nullptr;\n}\n\nClipboardBrowserPlaceholder *MainWindow::getPlaceholder() const\n{\n    return qobject_cast<ClipboardBrowserPlaceholder*>( ui->tabWidget->currentWidget() );\n}\n\nvoid MainWindow::delayedUpdateForeignFocusWindows()\n{\n    if ( isActiveWindow() || m_trayMenu->isActiveWindow() || m_menu->isActiveWindow() )\n        m_timerUpdateFocusWindows.stop();\n    else\n        m_timerUpdateFocusWindows.start();\n}\n\nvoid MainWindow::setHideTabs(bool hide)\n{\n    ui->tabWidget->setTabBarHidden(hide);\n}\n\nbool MainWindow::closeMinimizes() const\n{\n    return !m_options.hideMainWindow\n        && (!m_tray || !m_tray->isVisible() || !QSystemTrayIcon::isSystemTrayAvailable());\n}\n\nClipboardBrowserPlaceholder *MainWindow::createTab(const QString &name, TabNameMatching nameMatch, const Tabs &tabs)\n{\n    if ( name.isEmpty() )\n        return nullptr;\n\n    const int i = nameMatch == MatchExactTabName\n            ? findTabIndexExactMatch(name)\n            : findTabIndex(name);\n\n    ClipboardBrowserPlaceholder *placeholder = nullptr;\n    if (i != -1) {\n        placeholder = getPlaceholder(i);\n    } else {\n        placeholder = new ClipboardBrowserPlaceholder(name, m_sharedData, this);\n        connect( placeholder, &ClipboardBrowserPlaceholder::browserCreated,\n                 this, &MainWindow::onBrowserCreated );\n        connect( placeholder, &ClipboardBrowserPlaceholder::browserLoaded,\n                 this, &MainWindow::onBrowserLoaded );\n        connect( placeholder, &ClipboardBrowserPlaceholder::browserDestroyed,\n                 this, [this, placeholder]() { onBrowserDestroyed(placeholder); } );\n\n        ui->tabWidget->addTab(placeholder, name);\n        saveTabPositions();\n    }\n\n    const TabProperties tab = tabs.tabProperties(name);\n    placeholder->setStoreItems(tab.storeItems);\n    placeholder->setEncryptedExpireSeconds(\n        tab.encryptedExpireSeconds > 0\n        ? tab.encryptedExpireSeconds : m_sharedData->encryptedExpireSeconds);\n\n    int maxItemCount = tab.maxItemCount;\n    if (maxItemCount <= 0)\n        maxItemCount = m_sharedData->maxItems;\n    else if (maxItemCount > Config::maxItems)\n        maxItemCount = Config::maxItems;\n\n    placeholder->setMaxItemCount(maxItemCount);\n\n    return placeholder;\n}\n\ntemplate <typename SlotReturnType>\nQAction *MainWindow::createAction(Actions::Id id, MainWindowActionSlot<SlotReturnType> slot, QMenu *menu, QWidget *parent)\n{\n    QAction *act = parent\n        ? actionForMenuItem(id, parent, Qt::WidgetWithChildrenShortcut)\n        : actionForMenuItem(id, this, Qt::WindowShortcut);\n    connect(act, &QAction::triggered, this, slot, Qt::UniqueConnection);\n    if (menu)\n        menu->addAction(act);\n    return act;\n}\n\nQAction *MainWindow::addTrayAction(Actions::Id id)\n{\n    QAction *act = actionForMenuItem(id, m_trayMenu, Qt::WindowShortcut);\n    m_trayMenu->addAction(act);\n    return act;\n}\n\ntemplate <typename Receiver, typename ReturnType>\nQAction *MainWindow::addItemAction(Actions::Id id, Receiver *receiver, ReturnType (Receiver::* slot)())\n{\n    QAction *act = actionForMenuItem(id, getPlaceholder(), Qt::WidgetWithChildrenShortcut);\n    connect( act, &QAction::triggered, receiver, slot, Qt::UniqueConnection );\n    m_menuItem->addAction(act);\n    return act;\n}\n\nQVector<Command> MainWindow::commandsForMenu(const QVariantMap &data, const QString &tabName, const QVector<Command> &allCommands)\n{\n    QVector<Command> commands;\n    for (const auto &command : allCommands) {\n        if ( canExecuteCommand(command, data, tabName) ) {\n            Command cmd = command;\n            if ( cmd.outputTab.isEmpty() )\n                cmd.outputTab = tabName;\n            commands.append(cmd);\n        }\n    }\n\n    return commands;\n}\n\nvoid MainWindow::addCommandsToItemMenu(ClipboardBrowser *c)\n{\n    if ( m_menuCommands.isEmpty() ) {\n        interruptMenuCommandFilters(&m_itemMenuMatchCommands);\n        return;\n    }\n\n    auto data = selectionData(*c);\n    const auto commands = commandsForMenu(data, c->tabName(), m_menuCommands);\n\n    for (const auto &command : commands) {\n        QString name = command.localizedName();\n        QMenu *_rootMenu, *currentMenu;\n        std::tie(_rootMenu, currentMenu) = createSubMenus(&name, m_menuItem);\n        auto act = new CommandAction(command, name, currentMenu);\n        c->addAction(act);\n\n        addMenuMatchCommand(&m_itemMenuMatchCommands, command.matchCmd, act);\n\n        connect(act, &CommandAction::triggerCommand,\n                this, &MainWindow::onItemCommandActionTriggered);\n    }\n\n    runMenuCommandFilters(&m_itemMenuMatchCommands, data);\n}\n\nvoid MainWindow::addCommandsToTrayMenu(const QVariantMap &clipboardData, QList<QAction*> *actions)\n{\n    if ( m_trayMenuCommands.isEmpty() ) {\n        interruptMenuCommandFilters(&m_trayMenuMatchCommands);\n        return;\n    }\n\n    ClipboardBrowserPlaceholder *placeholder = getPlaceholderForTrayMenu();\n    if (!placeholder)\n        return;\n\n    // Pass current window title to commands in tray menu.\n    auto data = clipboardData;\n    if (m_windowForMenuPaste)\n        data.insert( mimeWindowTitle, m_windowForMenuPaste->getTitle() );\n\n    const auto commands = commandsForMenu(data, placeholder->tabName(), m_trayMenuCommands);\n    QList<QKeySequence> usedShortcuts;\n\n    const QRegularExpression showTrayCmdRe(R\"(^(copyq: menu\\(\\)|copyq menu)$)\");\n    for (const auto &command : commands) {\n        // Skip command to show the tray menu itself\n        if (command.internalId == QStringLiteral(\"copyq_global_menu\")\n            || command.cmd.simplified().contains(showTrayCmdRe))\n        {\n            continue;\n        }\n\n        QString name = command.localizedName();\n        QMenu *rootMenu, *currentMenu;\n        std::tie(rootMenu, currentMenu) = createSubMenus(&name, m_trayMenu);\n        auto act = new CommandAction(command, name, currentMenu);\n\n        const QList<QKeySequence> uniqueShortcuts = getUniqueShortcuts(\n                command.globalShortcuts, &usedShortcuts);\n        act->setShortcuts(uniqueShortcuts);\n\n        if (rootMenu)\n            actions->append(rootMenu->menuAction());\n        else\n            actions->append(act);\n\n        addMenuMatchCommand(&m_trayMenuMatchCommands, command.matchCmd, act);\n\n        connect(act, &CommandAction::triggerCommand,\n                this, &MainWindow::onClipboardCommandActionTriggered);\n    }\n\n    runMenuCommandFilters(&m_trayMenuMatchCommands, data);\n}\n\nvoid MainWindow::addMenuMatchCommand(MenuMatchCommands *menuMatchCommands, const QString &matchCommand, QAction *act)\n{\n    if ( !matchCommand.isEmpty() ) {\n        act->setDisabled(true);\n        menuMatchCommands->matchCommands.append(matchCommand);\n        menuMatchCommands->actions.append(act);\n    }\n}\n\nvoid MainWindow::runMenuCommandFilters(MenuMatchCommands *menuMatchCommands, QVariantMap &data)\n{\n    if ( menuMatchCommands->actions.isEmpty() ) {\n        interruptMenuCommandFilters(menuMatchCommands);\n        return;\n    }\n\n    data[COPYQ_MIME_PREFIX \"match-commands\"] = menuMatchCommands->matchCommands;\n\n    const bool isRunning = isInternalActionId(menuMatchCommands->actionId);\n    if (isRunning) {\n        m_sharedData->actions->setActionData(menuMatchCommands->actionId, data);\n    } else {\n        const auto act = runScript(QStringLiteral(\"runMenuCommandFilters()\"), data);\n        menuMatchCommands->actionId = act->id();\n    }\n\n    const int currentRun = ++menuMatchCommands->currentRun;\n    emit sendActionData(menuMatchCommands->actionId, QByteArray::number(currentRun));\n}\n\nvoid MainWindow::interruptMenuCommandFilters(MainWindow::MenuMatchCommands *menuMatchCommands)\n{\n    ++menuMatchCommands->currentRun;\n    menuMatchCommands->matchCommands.clear();\n    menuMatchCommands->actions.clear();\n\n    const bool isRunning = isInternalActionId(menuMatchCommands->actionId);\n    if (isRunning)\n        emit sendActionData(menuMatchCommands->actionId, QByteArray());\n}\n\nvoid MainWindow::stopMenuCommandFilters(MainWindow::MenuMatchCommands *menuMatchCommands)\n{\n    ++menuMatchCommands->currentRun;\n    menuMatchCommands->matchCommands.clear();\n    menuMatchCommands->actions.clear();\n    abortAction(menuMatchCommands->actionId);\n}\n\nbool MainWindow::abortAction(int &actionId, int waitMs, int terminateAfterMs, int killAfterMs)\n{\n    if (actionId == -1)\n        return true;\n\n    const int oldActionId = actionId;\n\n    // Send CommandStop for clean exit.\n    emit stopAction(oldActionId);\n\n    if (Action *action = m_sharedData->actions->findAction(oldActionId)) {\n        if (waitMs > 0)\n            action->waitForFinished(waitMs);\n        if (action->isRunning()) {\n            if (terminateAfterMs >= 0)\n                QTimer::singleShot(terminateAfterMs, action, &Action::requestTerminate);\n            if (killAfterMs >= 0)\n                QTimer::singleShot(terminateAfterMs + killAfterMs, action, &Action::requestKill);\n        }\n    }\n\n    // Re-entrancy guard: if another call for the same tracked action ID\n    // ran during the nested event loop, it already set actionId.\n    if (actionId != oldActionId)\n        return false;\n\n    actionId = -1;\n    return true;\n}\n\nbool MainWindow::registerClipboardProviderAction(int actionId, ClipboardMode mode)\n{\n    int &tracked = mode == ClipboardMode::Clipboard\n        ? m_provideClipboardActionId\n        : m_provideSelectionActionId;\n\n    if (tracked != actionId && !abortAction(tracked, 1000))\n        return false;\n\n    tracked = actionId;\n    return true;\n}\n\nbool MainWindow::isItemMenuDefaultActionValid() const\n{\n    const auto defaultAction = m_menuItem->defaultAction();\n    return defaultAction != nullptr && defaultAction->isEnabled();\n}\n\nvoid MainWindow::updateToolBar()\n{\n    clearActions(m_toolBar);\n\n    if ( m_toolBar->isHidden() )\n        return;\n\n    QAction *act = actionForMenuItem(Actions::File_New, this, Qt::WindowShortcut);\n    m_toolBar->addAction(act);\n\n    for ( auto action : m_menuItem->actions() ) {\n        if ( action->isSeparator() ) {\n            m_toolBar->addSeparator();\n        } else if ( !action->icon().isNull() ) {\n            act = m_toolBar->addAction(QString());\n\n            const auto update = [=]() {\n                const QIcon icon = action->icon();\n                act->setIcon(icon);\n\n                const QString text = action->text().remove(\"&\");\n                const QString shortcut = action->shortcut().toString(QKeySequence::NativeText);\n                const QString label = text + (shortcut.isEmpty() ? QString() : \"\\n[\" + shortcut + \"]\");\n                act->setText(label);\n\n                const QString tooltip = \"<center>\" + escapeHtml(text)\n                        + (shortcut.isEmpty() ? QString() : \"<br /><b>\" + escapeHtml(shortcut) + \"</b>\") + \"</center>\";\n                act->setToolTip(tooltip);\n                act->setEnabled(action->isEnabled());\n\n                if ( action->isCheckable() ) {\n                    act->setCheckable(true);\n                    act->setChecked(action->isChecked());\n                }\n            };\n\n            connect(act, &QAction::triggered, action, &QAction::triggered);\n            connect(action, &QAction::changed, act, update);\n            update();\n        }\n    }\n\n    m_toolBar->setFrozen(false);\n}\n\nvoid MainWindow::setTrayEnabled(bool enable)\n{\n    if (enable) {\n        if (m_tray == nullptr) {\n            m_tray = new SystemTrayIcon(this);\n        } else {\n            disconnect( m_tray, &SystemTrayIcon::activated,\n                        this, &MainWindow::trayActivated );\n        }\n\n        if (m_options.nativeTrayMenu) {\n            m_tray->setContextMenu(m_trayMenu);\n        } else {\n#ifndef Q_OS_MAC\n            m_tray->setContextMenu(m_trayMenu);\n#endif\n            connect( m_tray, &SystemTrayIcon::activated,\n                     this, &MainWindow::trayActivated );\n        }\n\n        m_tray->show();\n\n        if ( isMinimized() )\n            hideWindow();\n    } else {\n        if (m_tray != nullptr)\n            m_tray->hide();\n\n        if ( isHidden() && !isMinimized() )\n            minimizeWindow();\n    }\n}\n\nbool MainWindow::isWindowVisible() const\n{\n    return !isMinimized() && isVisible() && m_isActiveWindow;\n}\n\nvoid MainWindow::onEscape()\n{\n    if ( browseMode() ) {\n        auto c = browser();\n        if (c && !c->hasFocus()) {\n            enterBrowseMode();\n            return;\n        }\n\n        hideWindow();\n        if (c)\n            c->setCurrent(0);\n    } else {\n        enterBrowseMode();\n    }\n}\n\nvoid MainWindow::updateActionShortcuts()\n{\n    QList<QKeySequence> usedShortcuts;\n\n    for (auto act : m_menuItem->findChildren<CommandAction*>()) {\n        if (!act->isEnabled() && !act->isVisible())\n            continue;\n\n        if ( act->property(propertyActionFilterCommandFailed).toBool() )\n            continue;\n\n        const Command &command = act->command();\n        const QList<QKeySequence> uniqueShortcuts = getUniqueShortcuts(\n                command.shortcuts + command.globalShortcuts, &usedShortcuts);\n\n        for (const auto &shortcut : uniqueShortcuts) {\n            if ( !isItemMenuDefaultActionValid() && isItemActivationShortcut(shortcut) ) {\n                m_menuItem->setDefaultAction(act);\n                break;\n            }\n        }\n\n        act->setShortcuts(uniqueShortcuts);\n    }\n\n    for (int id = 0; id < m_actions.size(); ++id) {\n        QAction *action = m_actions[id];\n        if (!action)\n            continue;\n\n        QList<QKeySequence> shortcuts = m_sharedData->menuItems[id].shortcuts;\n        for (const auto &shortcut : usedShortcuts)\n            shortcuts.removeAll(shortcut);\n\n        action->setShortcuts(shortcuts);\n    }\n}\n\nQAction *MainWindow::actionForMenuItem(Actions::Id id, QWidget *parent, Qt::ShortcutContext context)\n{\n    Q_ASSERT(id < m_sharedData->menuItems.size());\n\n    m_actions.resize(m_sharedData->menuItems.size());\n\n    QPointer<QAction> &action = m_actions[id];\n    if (action && !action->isEnabled() && !action->isVisible()) {\n        action->deleteLater();\n        action = nullptr;\n    }\n\n    const MenuItem &item = m_sharedData->menuItems[id];\n\n    if (!action) {\n        action = new QAction(item.text, parent);\n        action->setShortcutContext(context);\n        parent->addAction(action);\n    }\n\n    action->setIcon( getIcon(item.iconName, item.iconId) );\n\n    return action;\n}\n\nvoid MainWindow::addMenuItems(TrayMenu *menu, ClipboardBrowserPlaceholder *placeholder, int maxItemCount, const QString &searchText)\n{\n    WidgetSizeGuard sizeGuard(menu);\n    menu->clearClipboardItems();\n\n    if (maxItemCount <= 0)\n        return;\n\n    if (!placeholder)\n        return;\n\n    const ClipboardBrowser *c = placeholder->createBrowser();\n    if (!c)\n        return;\n\n    int itemCount = 0;\n    for ( int i = 0; i < c->length() && itemCount < maxItemCount; ++i ) {\n        const QModelIndex index = c->model()->index(i, 0);\n        if ( !searchText.isEmpty() && !menuItemMatches(index, searchText) )\n            continue;\n        QVariantMap data = index.data(contentType::data).toMap();\n        QAction *act = menu->addClipboardItemAction(data, m_options.trayImages);\n        if ( !m_displayCommands.isEmpty() ) {\n            data.insert(mimeCurrentTab, c->tabName());\n            data.insert(mimeDisplayItemInMenu, QByteArrayLiteral(\"1\"));\n            PersistentDisplayItem item(act, data);\n            onItemWidgetCreated(item);\n        }\n        ++itemCount;\n    }\n}\n\nvoid MainWindow::activateMenuItem(ClipboardBrowserPlaceholder *placeholder, const QVariantMap &data, bool omitPaste)\n{\n    if ( m_sharedData->moveItemOnReturnKey ) {\n        const auto itemHash = ::hash(data);\n        if (placeholder) {\n            ClipboardBrowser *c = placeholder->createBrowser();\n            if (c)\n                c->moveToTop(itemHash);\n        }\n    }\n\n    if ( QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier) )\n        setClipboard( createDataMap(mimeText, data.value(mimeText) ) );\n    else\n        setClipboard(data);\n\n    if (!m_windowForMenuPaste)\n        updateFocusWindows();\n\n    PlatformWindowPtr lastWindow = m_windowForMenuPaste;\n\n    if ( m_options.trayItemPaste && !omitPaste && canPaste() ) {\n        // Raise the target window before paste so that getCurrentWindow()\n        // returns it even when the scripted paste() path is taken.  On\n        // macOS, closing the menu transitions the app to background, so\n        // without this raise getCurrentWindow() returns the wrong window.\n        if (lastWindow)\n            lastWindow->raise();\n\n        if (isScriptOverridden(ScriptOverrides::Paste)) {\n            COPYQ_LOG(\"Pasting item with paste()\");\n            runScript(QStringLiteral(\"paste()\"));\n        } else if (lastWindow) {\n            COPYQ_LOG( QStringLiteral(\"Pasting item from tray menu to: %1\")\n                       .arg(lastWindow->getTitle()) );\n            lastWindow->pasteFromClipboard();\n        }\n    }\n}\n\nbool MainWindow::toggleMenu(TrayMenu *menu, QPoint pos)\n{\n    if ( menu->isVisible() ) {\n        menu->close();\n        return false;\n    }\n\n    menu->popup( toScreen(pos, menu) );\n\n#ifdef Q_OS_MACOS\n    // On macOS, menus need the full activation sequence even when Qt\n    // considers the app already active (popup() created a Qt window, so\n    // applicationState() returns ApplicationActive even though macOS may\n    // not have granted real focus yet).  Flush events between activation\n    // and raiseWindow so the activation-policy change from\n    // ForegroundBackgroundFilter is fully processed before the\n    // platform-level focus steal.\n    menu->activateWindow();\n    QApplication::setActiveWindow(menu);\n    QApplication::processEvents();\n#endif\n    raiseWindow(menu);\n\n    return true;\n}\n\nbool MainWindow::toggleMenu(TrayMenu *menu)\n{\n    return toggleMenu(menu, QCursor::pos());\n}\n\nbool MainWindow::exportDataFrom(const QString &fileName, const QStringList &tabs, bool exportConfiguration, bool exportCommands, const Encryption::EncryptionKey &encryptionKey)\n{\n    QSaveFile file(fileName);\n    if ( !file.open(QIODevice::WriteOnly) ) {\n        qCCritical(logCategory) << \"Failed to open file for export:\"\n            << file.fileName() << \"message:\" << file.errorString();\n        return false;\n    }\n\n    QDataStream out(&file);\n    const bool ok = encryptionKey.isValid()\n        ? exportDataV5(&out, tabs, exportConfiguration, exportCommands, encryptionKey)\n        : exportDataV4(&out, tabs, exportConfiguration, exportCommands);\n\n    const char *label = encryptionKey.isValid()\n        ? \"Export (v5) failed\" : \"Export (v4) failed\";\n    if ( !checkFileAndStreamErrors(file, out, label) )\n        return false;\n\n    if (!ok)\n        return false;\n\n    if ( !file.commit() ) {\n        qCCritical(logCategory) << label << \" - failed to save file for export:\"\n            << file.fileName() << \"message:\" << file.errorString();\n        checkFileAndStreamErrors(file, out, label);\n        return false;\n    }\n\n    return true;\n}\n\nbool MainWindow::exportDataV4(QDataStream *out, const QStringList &tabs, bool exportConfiguration, bool exportCommands)\n{\n    COPYQ_LOG(\"Exporting v4 format\");\n\n    out->setVersion(dataStreamImportVersionDefault);\n    (*out) << QByteArray(\"CopyQ v4\");\n\n    const QVariantMap data = exportSettings(tabs, exportConfiguration, exportCommands);\n    (*out) << data;\n\n    for (const auto &tab : tabs) {\n        bool ok;\n        QVariantMap tabMap = exportTabData(tab, &ok);\n        if (!ok)\n            return false;\n        if (!tabMap.isEmpty())\n            (*out) << tabMap;\n    }\n\n    return out->status() == QDataStream::Ok;\n}\n\nbool MainWindow::exportDataV5(QDataStream *out, const QStringList &tabs, bool exportConfiguration, bool exportCommands, const Encryption::EncryptionKey &encryptionKey)\n{\n    COPYQ_LOG(\"Exporting v5 format\");\n\n    out->setVersion(dataStreamImportVersionDefault);\n    (*out) << QByteArray(\"CopyQ v5\");\n    out->setVersion(dataStreamImportVersionForV5);\n\n    const QVariantMap data = exportSettings(tabs, exportConfiguration, exportCommands);\n    QVariantMap dataMap;\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it)\n        dataMap[it.key()] = serializeToByteArray(it.value());\n\n    serializeData(out, dataMap, -1, &encryptionKey);\n\n    for (const auto &tab : tabs) {\n        bool ok;\n        QVariantMap tabMap = exportTabData(tab, &ok);\n        if (!ok)\n            return false;\n        if (!tabMap.isEmpty()) {\n            tabMap.remove(QStringLiteral(\"name\"));\n            serializeData(out, tabMap, -1, &encryptionKey);\n        }\n    }\n\n    return out->status() == QDataStream::Ok;\n}\n\nQVariantMap MainWindow::exportTabData(const QString &tab, bool *ok)\n{\n    *ok = true;\n    const auto i = findTabIndex(tab);\n    if (i == -1)\n        return {};\n\n    auto placeholder = getPlaceholder(i);\n    const bool wasLoaded = placeholder->isDataLoaded();\n    auto c = placeholder->createBrowserAgain();\n    if (!c) {\n        qCCritical(logCategory) << \"Failed to open tab for export\" << tab;\n        *ok = false;\n        return {};\n    }\n\n    const auto &tabName = c->tabName();\n\n    bool saved = false;\n    QByteArray tabBytes;\n    {\n        QDataStream tabOut(&tabBytes, QIODevice::WriteOnly);\n        tabOut.setVersion(dataStreamImportVersionDefault);\n        saved = serializeData(*c->model(), &tabOut);\n    }\n\n    if (!wasLoaded)\n        placeholder->expire();\n\n    if (!saved) {\n        qCCritical(logCategory) << \"Failed to export tab\" << tab;\n        *ok = false;\n        return {};\n    }\n\n    const auto iconName = getIconNameForTabName(tabName);\n\n    QVariantMap tabMap;\n    tabMap[QStringLiteral(\"name\")] = tabName;\n    tabMap[QStringLiteral(\"data\")] = tabBytes;\n    if ( !iconName.isEmpty() )\n        tabMap[QStringLiteral(\"icon\")] = iconName;\n\n    return tabMap;\n}\n\nbool MainWindow::canImport(const ImportSelection &sel)\n{\n    // Configuration dialog shouldn't be open.\n    if (!sel.configuration.isEmpty() && cm) {\n        log(\"Failed to import configuration while configuration dialog is open\", LogError);\n        return false;\n    }\n\n    // Close command dialog.\n    if (!sel.commands.isEmpty() && !maybeCloseCommandDialog()) {\n        log(\"Failed to import command while command dialog is open\", LogError);\n        return false;\n    }\n\n    return true;\n}\n\nvoid MainWindow::importSelected(const ImportSelection &sel)\n{\n    if (!sel.configuration.isEmpty()) {\n        log(\"Importing settings\");\n\n        AppConfig appConfig;\n\n        for (auto it = sel.configuration.constBegin(); it != sel.configuration.constEnd(); ++it)\n            appConfig.settings().setValue( it.key(), it.value() );\n\n        emit configurationChanged(&appConfig);\n    }\n\n    if (!sel.commands.isEmpty()) {\n        log(\"Importing commands\");\n\n        // Re-create command dialog again later.\n        if (m_commandDialog) {\n            m_commandDialog->deleteLater();\n            m_commandDialog = nullptr;\n        }\n\n        Settings settings(getConfigurationFilePath(\"-commands.ini\"));\n\n        const QString commandGroup = QStringLiteral(\"Command\");\n        const QString commandsGroup = QStringLiteral(\"Commands\");\n\n        int i = settings.beginReadArray(commandsGroup);\n        settings.endArray();\n\n        // Replace single Command group with Commands array\n        QVariantMap singleCommand;\n        settings.beginGroup(commandGroup);\n        for ( const auto &key : settings.allKeys() )\n            singleCommand[key] = settings.value(key);\n        settings.endGroup();\n        settings.remove(commandGroup);\n\n        settings.beginWriteArray(commandsGroup);\n\n        if (!singleCommand.isEmpty()) {\n            settings.setArrayIndex(i++);\n            for (auto it = singleCommand.constBegin(); it != singleCommand.constEnd(); ++it)\n                settings.setValue( it.key(), it.value() );\n        }\n\n        for (const auto &commandDataValue : sel.commands) {\n            settings.setArrayIndex(i++);\n            const auto commandMap = commandDataValue.toMap();\n            for (auto it = commandMap.constBegin(); it != commandMap.constEnd(); ++it)\n                settings.setValue( it.key(), it.value() );\n        }\n\n        settings.endArray();\n\n        updateEnabledCommands();\n    }\n}\n\nbool MainWindow::importDataV2(QDataStream *in)\n{\n    COPYQ_LOG(\"Importing v2 format\");\n\n    QString tabName;\n    *in >> tabName;\n    if ( tabName.isEmpty() )\n        return false;\n\n    // Find unique tab name.\n    renameToUnique(&tabName, ui->tabWidget->tabs());\n\n    auto c = createTab(tabName, MatchExactTabName, Tabs())->createBrowser();\n    if (!c) {\n        qCCritical(logCategory) << \"Import (v2) failed: Failed to create tab\" << tabName;\n        return false;\n    }\n\n    if ( !deserializeData(c->model(), in) )\n        return false;\n\n    c->loadItems();\n    c->saveItems();\n\n    ui->tabWidget->setCurrentIndex( ui->tabWidget->count() - 1 );\n\n    return true;\n}\n\nbool MainWindow::importDataV3(QDataStream *in, ImportOptions options)\n{\n    COPYQ_LOG(\"Importing v3 format\");\n\n    QVariantMap data;\n    (*in) >> data;\n    if ( in->status() != QDataStream::Ok )\n        return false;\n\n    const auto tabsList = data.value(\"tabs\").toList();\n\n    QStringList tabs;\n    tabs.reserve( tabsList.size() );\n    for (const auto &tabMapValue : tabsList) {\n        const auto tabMap = tabMapValue.toMap();\n        const auto oldTabName = tabMap[\"name\"].toString();\n        tabs.append(oldTabName);\n    }\n\n    const ImportSelection importSelection = getImportSelection(data, options, this);\n    if (!canImport(importSelection))\n        return false;\n\n    const Tabs tabProps;\n    for (const auto &tabMapValue : tabsList) {\n        const auto tabMap = tabMapValue.toMap();\n        const auto oldTabName = tabMap[\"name\"].toString();\n        if ( !tabs.contains(oldTabName) )\n            continue;\n\n        if ( !importTabData(oldTabName, tabMap, tabProps, {}) )\n            return false;\n    }\n\n    importSelected(importSelection);\n    return true;\n}\n\nbool MainWindow::importDataV4(QDataStream *in, ImportOptions options)\n{\n    COPYQ_LOG(\"Importing v4 format\");\n\n    QVariantMap data;\n    (*in) >> data;\n    if ( in->status() != QDataStream::Ok )\n        return false;\n\n    const ImportSelection importSelection = getImportSelection(data, options, this);\n    if (!canImport(importSelection))\n        return false;\n\n    const Tabs tabProps;\n    while ( !in->atEnd() ) {\n        QVariantMap tabMap;\n        (*in) >> tabMap;\n        if ( in->status() != QDataStream::Ok )\n            return false;\n\n        const auto oldTabName = tabMap[\"name\"].toString();\n        if ( !importSelection.tabs.contains(oldTabName) )\n            continue;\n\n        if ( !importTabData(oldTabName, tabMap, tabProps, {}) )\n            return false;\n    }\n\n    importSelected(importSelection);\n    return true;\n}\n\nbool MainWindow::importDataV5(QDataStream *in, ImportOptions options)\n{\n    in->setVersion(dataStreamImportVersionForV5);\n\n    COPYQ_LOG(\"Importing v5 format\");\n\n    const Encryption::EncryptionKey key = promptForImportPassword(this);\n    if ( !key.isValid() ) {\n        log(\"Failed to derive encryption key from password for V5 import\", LogError);\n        return false;\n    }\n\n    QVariantMap dataMap;\n    if ( !deserializeData(in, &dataMap, &key) ) {\n        log(\"Failed to decrypt V5 metadata - incorrect password or corrupted data\", LogError);\n        return false;\n    }\n\n    QVariantMap data;\n    for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it)\n        data[it.key()] = deserializeFromByteArray(it.value().toByteArray());\n\n    const ImportSelection importSelection = getImportSelection(data, options, this);\n    if (!canImport(importSelection))\n        return false;\n\n    const Tabs tabProps;\n    // Read each tab individually to avoid loading all tabs into memory\n    for (const auto &oldTabName : data.value(\"tabs\").toStringList()) {\n        QVariantMap tabMap;\n        if ( !deserializeData(in, &tabMap, &key) ) {\n            log(QString(\"Failed to decrypt tab data - incorrect password or corrupted data\"), LogError);\n            return false;\n        }\n\n        if ( !importSelection.tabs.contains(oldTabName) )\n            continue;\n\n        if ( !importTabData(oldTabName, tabMap, tabProps, key) )\n            return false;\n    }\n\n    importSelected(importSelection);\n    return true;\n}\n\nbool MainWindow::importTabData(\n    const QString &requestedTabName,\n    const QVariantMap &tabMap,\n    const Tabs &tabProps,\n    const Encryption::EncryptionKey &key)\n{\n    QString tabName = requestedTabName;\n    renameToUnique( &tabName, ui->tabWidget->tabs() );\n\n    const auto iconName = tabMap.value(\"icon\").toString();\n    if ( !iconName.isEmpty() )\n        setIconNameForTabName(tabName, iconName);\n\n    auto placeholder = createTab(tabName, MatchExactTabName, tabProps);\n    auto c = placeholder->createBrowser();\n    if (!c) {\n        qCCritical(logCategory) << \"Failed to create tab\" << tabName << \"for import\";\n        return false;\n    }\n\n    const auto tabBytes = tabMap.value(\"data\").toByteArray();\n    QDataStream tabIn(tabBytes);\n    tabIn.setVersion(dataStreamImportVersionDefault);\n\n    if ( !deserializeData(c->model(), &tabIn, &key) ) {\n        qCCritical(logCategory) << \"Failed to import tab\" << tabName;\n        return false;\n    }\n\n    placeholder->expire();\n    return true;\n}\n\nvoid MainWindow::updateEnabledCommands()\n{\n    updateCommands(loadAllCommands(), false);\n}\n\nvoid MainWindow::updateCommands(QVector<Command> allCommands, bool forceSave)\n{\n    m_overrides = {};\n    m_actionCollectOverrides = runScript(QStringLiteral(\"collectScriptOverrides()\"));\n\n    m_automaticCommands.clear();\n    m_menuCommands.clear();\n    m_scriptCommands.clear();\n    m_trayMenuCommands.clear();\n\n    QVector<Command> displayCommands;\n\n    if ( syncInternalCommands(&allCommands) || forceSave )\n        saveCommands(allCommands);\n\n    const auto disabledPluginCommands = m_sharedData->itemFactory->commands(false);\n    Commands commands;\n    for (const auto &command : allCommands) {\n        if ( command.enable && !hasCommandFuzzy(disabledPluginCommands, command) )\n            commands.append(command);\n    }\n\n    for (const auto &command : commands) {\n        const auto type = command.type();\n\n        if (type & CommandType::Automatic)\n            m_automaticCommands.append(command);\n\n        if (type & CommandType::Display)\n            displayCommands.append(command);\n\n        if (type & CommandType::Menu)\n            m_menuCommands.append(command);\n\n        if (m_options.trayCommands && type & CommandType::GlobalShortcut)\n            m_trayMenuCommands.append(command);\n\n        if (type & CommandType::Script)\n            m_scriptCommands.append(command);\n    }\n\n    if (m_displayCommands != displayCommands) {\n        m_displayItemList.clear();\n        m_displayCommands = displayCommands;\n        reloadBrowsers();\n    }\n\n    updateContextMenu(contextMenuUpdateIntervalMsec);\n    updateTrayMenuCommands();\n\n    emit commandsSaved(commands);\n}\n\nbool MainWindow::syncInternalCommands(QVector<Command> *allCommands)\n{\n    bool changed = false;\n\n    for ( const Command &command : globalShortcutCommands() ) {\n        if ( syncInternalCommandChanges(command, allCommands) )\n            changed = true;\n    }\n\n    for ( const Command &command : m_sharedData->itemFactory->commands(true) ) {\n        if ( syncInternalCommandChanges(command, allCommands) ) {\n            changed = true;\n        } else if ( !hasCommandFuzzy(*allCommands, command) ) {\n            allCommands->append(command);\n            changed = true;\n        }\n    }\n\n    return changed;\n}\n\nvoid MainWindow::disableHideWindowOnUnfocus()\n{\n    m_timerHideWindowIfNotActive.disconnect();\n}\n\nvoid MainWindow::enableHideWindowOnUnfocus()\n{\n    initSingleShotTimer(\n        &m_timerHideWindowIfNotActive, m_timerHideWindowIfNotActive.interval(),\n        this, &MainWindow::hideWindowIfNotActive );\n}\n\nvoid MainWindow::hideWindowIfNotActive()\n{\n    if ( isVisible() && !hasDialogOpen(this) && !isAnyApplicationWindowActive() ) {\n        COPYQ_LOG(\"Auto-hiding unfocused main window\");\n        hideWindow();\n    }\n}\n\nvoid MainWindow::hideWindowOnUnfocus(int intervalMsec)\n{\n    const int currentDelay = m_timerHideWindowIfNotActive.remainingTime();\n    if (currentDelay > intervalMsec)\n        return;\n\n    m_timerHideWindowIfNotActive.start(intervalMsec);\n}\n\nconst Theme &MainWindow::theme() const\n{\n    return m_sharedData->theme;\n}\n\nAction *MainWindow::runScript(const QString &script, const QVariantMap &data)\n{\n    auto act = new Action();\n    act->setCommand(\n        {QStringLiteral(\"copyq\"), QStringLiteral(\"eval\"), QStringLiteral(\"--\"), script});\n    act->setData(data);\n    runInternalAction(act);\n    return act;\n}\n\nbool MainWindow::runEventHandlerScript(const QString &script, const QVariantMap &data)\n{\n    if (m_maxEventHandlerScripts == 0)\n        return false;\n\n    --m_maxEventHandlerScripts;\n    if (m_maxEventHandlerScripts == 0)\n        log(\"Event handler maximum recursion reached\", LogWarning);\n\n    const auto action = runScript(script, data);\n    const bool hasUpdatesEnabled = updatesEnabled();\n    setUpdatesEnabled(false);\n    action->waitForFinished();\n    setUpdatesEnabled(hasUpdatesEnabled || updatesEnabled());\n    ++m_maxEventHandlerScripts;\n    return !action->actionFailed() && action->exitCode() == 0;\n}\n\nvoid MainWindow::runItemHandlerScript(\n    const QString &script, const ClipboardBrowser *browser, int firstRow, int lastRow)\n{\n     QList<QPersistentModelIndex> indexes;\n     indexes.reserve(lastRow - firstRow + 1);\n     for (int row = firstRow; row <= lastRow; ++row) {\n        const auto index = browser->model()->index(row, 0);\n        if (index.isValid())\n            indexes.append(index);\n     }\n\n     QVariantMap data = createDataMap(mimeCurrentTab, browser->tabName());\n     addSelectionData(&data, indexes);\n     runScript(script, data);\n}\n\nint MainWindow::findTabIndex(const QString &name)\n{\n    TabWidget *w = ui->tabWidget;\n\n    const int found = findTabIndexExactMatch(name);\n    if (found != -1)\n        return found;\n\n    // Ignore key hints ('&').\n    if ( !hasKeyHint(name) ) {\n        for( int i = 0; i < w->count(); ++i ) {\n            QString tabName = w->tabName(i);\n            if ( name == removeKeyHint(&tabName) )\n                return i;\n        }\n    }\n\n    return -1;\n}\n\nClipboardBrowser *MainWindow::tab(const QString &name)\n{\n    return createTab(name, MatchSimilarTabName, Tabs())->createBrowser();\n}\n\nbool MainWindow::maybeCloseCommandDialog()\n{\n    return !m_commandDialog || m_commandDialog->maybeClose(this);\n}\n\nvoid MainWindow::showError(const QString &msg)\n{\n    const auto notificationId = qHash(msg);\n    auto notification = createNotification( QString::number(notificationId) );\n    notification->setTitle( tr(\"CopyQ Error\", \"Notification error message title\") );\n    notification->setMessage(msg);\n    notification->setIcon(IconCircleXmark);\n    notification->setUrgency(Notification::Urgency::High);\n    notification->setPersistency(Notification::Persistency::Persistent);\n}\n\nNotification *MainWindow::createNotification(const QString &id)\n{\n    return m_sharedData->notifications->createNotification(id);\n}\n\nvoid MainWindow::addCommands(const QVector<Command> &commands)\n{\n    openCommands();\n    if (m_commandDialog)\n        m_commandDialog->addCommands(commands);\n}\n\nbool MainWindow::eventFilter(QObject *object, QEvent *ev)\n{\n    const QEvent::Type type = ev->type();\n    if (type != QEvent::KeyPress && type != QEvent::ShortcutOverride)\n        return false;\n\n    QKeyEvent *event = static_cast<QKeyEvent *>(ev);\n    const int key = event->key();\n    const Qt::KeyboardModifiers modifiers = event->modifiers();\n\n    // Navigation styles can override shortcuts with Ctrl, because of some\n    // conflict with default shortcuts.\n    // User should be able to override at least the shortcuts without Ctrl.\n    if (type == QEvent::ShortcutOverride && !modifiers.testFlag(Qt::ControlModifier))\n        return false;\n\n    const auto isEscape = (m_options.navigationStyle == NavigationStyle::Vi)\n        ? isViEscape : isEmacsEscape;\n    if (isEscape({key, modifiers})) {\n        return hadleKeyOverride(object, ev, {Qt::Key_Escape});\n    }\n\n    const auto translate = (m_options.navigationStyle == NavigationStyle::Vi)\n        ? translateToVi : translateToEmacs;\n\n    if (object == this || object == browser()) {\n        const KeyMods keyMods = translate({key, modifiers});\n        if ( hadleKeyOverride(object, ev, keyMods) )\n            return true;\n\n        if (m_options.navigationStyle == NavigationStyle::Vi) {\n            switch(key) {\n            case Qt::Key_Slash:\n                if (type != QEvent::ShortcutOverride)\n                    enterSearchMode();\n                event->accept();\n                return true;\n            case Qt::Key_H:\n                if (type != QEvent::ShortcutOverride)\n                    previousTab();\n                event->accept();\n                return true;\n            case Qt::Key_L:\n                if (type != QEvent::ShortcutOverride)\n                    nextTab();\n                event->accept();\n                return true;\n            }\n        }\n    } else if (qobject_cast<QMenu*>(object)\n        && !object->property(\"copyq_disable_navigation\").toBool()\n    ) {\n        const KeyMods keyMods = translate({key, modifiers});\n        return hadleKeyOverride(object, ev, keyMods);\n    }\n\n    return false;\n}\n\nvoid MainWindow::keyPressEvent(QKeyEvent *event)\n{\n    const int key = event->key();\n    const Qt::KeyboardModifiers modifiers = event->modifiers();\n\n    // Search items or text in editor (search previous when Shift is pressed).\n    if ( key == Qt::Key_F3\n         || (modifiers.testFlag(Qt::ControlModifier) && (key == Qt::Key_F || key == Qt::Key_G)) )\n    {\n        findNextOrPrevious();\n        return;\n    }\n\n    auto c = browser();\n    if (c && c->isInternalEditorOpen())\n        return;\n\n    if (m_options.hideTabs && key == Qt::Key_Alt)\n        setHideTabs(false);\n\n    if ( event->matches(QKeySequence::NextChild) ) {\n         nextTab();\n         return;\n    }\n\n    if ( event->matches(QKeySequence::PreviousChild) ) {\n         previousTab();\n         return;\n    }\n\n    // Ctrl/Alt+0 to Ctrl/Alt+9 to focus tabs (0 to focus the last, 1 to focus the first and so on).\n    if (modifiers == Qt::ControlModifier || modifiers == Qt::AltModifier) {\n        if (key >= Qt::Key_0 && key <= Qt::Key_9) {\n            const int index = (key == Qt::Key_0) ? ui->tabWidget->count() - 1\n                                                 : key - Qt::Key_1;\n            ui->tabWidget->setCurrentIndex(index);\n            return;\n        }\n    }\n\n    // Allow browsing items in search mode without focusing item list.\n    if ( c && ui->searchBar->hasFocus() ) {\n        if ( event->matches(QKeySequence::Copy) && ui->searchBar->selectionLength() == 0 ) {\n            copyItems();\n            return;\n        }\n\n        switch(key) {\n            case Qt::Key_Down:\n            case Qt::Key_Up:\n            case Qt::Key_PageDown:\n            case Qt::Key_PageUp:\n                c->setFocus();\n                QCoreApplication::sendEvent(c, event);\n                ui->searchBar->setFocus();\n                return;\n        }\n    }\n\n    if (modifiers == Qt::ControlModifier) {\n        switch(key) {\n            case Qt::Key_Return:\n            case Qt::Key_Enter:\n                if (c)\n                    activateCurrentItem();\n                return;\n            default:\n                QMainWindow::keyPressEvent(event);\n                break;\n        }\n        return;\n    }\n\n    if (modifiers == Qt::AltModifier)\n        return;\n\n    switch(key) {\n        case Qt::Key_Return:\n        case Qt::Key_Enter:\n            if (c)\n                activateCurrentItem();\n            else\n                getPlaceholder()->createBrowser();\n            break;\n\n        case Qt::Key_Tab:\n            QMainWindow::keyPressEvent(event);\n            break;\n\n        case Qt::Key_Escape:\n            onEscape();\n            break;\n\n        default:\n            QMainWindow::keyPressEvent(event);\n            break;\n    }\n}\n\nvoid MainWindow::keyReleaseEvent(QKeyEvent *event)\n{\n    if (m_options.hideTabs && event->key() == Qt::Key_Alt)\n        setHideTabs(true);\n\n    QMainWindow::keyReleaseEvent(event);\n}\n\nbool MainWindow::event(QEvent *event)\n{\n    QEvent::Type type = event->type();\n\n    if (m_options.closeOnUnfocus) {\n        if (\n            type == QEvent::WindowDeactivate\n        ) {\n            hideWindowOnUnfocus(AppConfig().option<Config::close_on_unfocus_delay_ms>());\n        } else if (\n            type == QEvent::Move ||\n            type == QEvent::Resize ||\n            type == QEvent::DragEnter ||\n            type == QEvent::DragLeave ||\n            type == QEvent::DragMove\n        ) {\n            hideWindowOnUnfocus(AppConfig().option<Config::close_on_unfocus_extra_delay_ms>());\n        }\n    }\n\n    if (type == QEvent::Enter) {\n        if ( !isActiveWindow() )\n            updateFocusWindows();\n        updateWindowTransparency(true);\n    } else if (type == QEvent::Leave) {\n        updateWindowTransparency(false);\n        setHideTabs(m_options.hideTabs);\n    } else if (type == QEvent::WindowActivate) {\n        m_isActiveWindow = true;\n        if ( !isActiveWindow() )\n            updateFocusWindows();\n        updateWindowTransparency();\n        enableHideWindowOnUnfocus();\n    } else if (type == QEvent::WindowDeactivate) {\n        updateWindowTransparency();\n        setHideTabs(m_options.hideTabs);\n        m_timerUpdateFocusWindows.start();\n    } else if (type == QEvent::Hide) {\n        if ( !isGeometryGuardBlockedUntilHidden(this) )\n            m_wasMaximized = isMaximized();\n    } else if (type == QEvent::Show && m_showItemPreview) {\n        updateItemPreviewAfterMs(0);\n    }\n\n    return QMainWindow::event(event);\n}\n\nbool MainWindow::nativeEvent(\n    const QByteArray &eventType, void *message, NativeEventResult *result)\n{\n    delayedUpdateForeignFocusWindows();\n    return QMainWindow::nativeEvent(eventType, message, result);\n}\n\nvoid MainWindow::loadSettings(QSettings &settings, AppConfig *appConfig)\n{\n    stopMenuCommandFilters(&m_itemMenuMatchCommands);\n    stopMenuCommandFilters(&m_trayMenuMatchCommands);\n    abortAction(m_displayActionId);\n\n    theme().decorateMainWindow(this);\n    ui->scrollAreaItemPreview->setObjectName(\"ClipboardBrowser\");\n    theme().decorateItemPreview(ui->scrollAreaItemPreview);\n\n    setUseSystemIcons( theme().useSystemIcons() );\n\n    m_options.confirmExit = appConfig->option<Config::confirm_exit>();\n\n    m_options.navigationStyle = appConfig->option<Config::navigation_style>();\n    m_trayMenu->setNavigationStyle(m_options.navigationStyle);\n    m_menu->setNavigationStyle(m_options.navigationStyle);\n    if (m_options.navigationStyle == NavigationStyle::Default)\n        qApp->removeEventFilter(this);\n    else\n        qApp->installEventFilter(this);\n\n    // Number search\n    m_trayMenu->setNumberSearchEnabled(m_sharedData->numberSearch);\n    m_menu->setNumberSearchEnabled(m_sharedData->numberSearch);\n\n    m_trayMenu->setRowIndexFromOne(m_sharedData->rowIndexFromOne);\n    m_menu->setRowIndexFromOne(m_sharedData->rowIndexFromOne);\n    m_sharedData->theme.setRowIndexFromOne(m_sharedData->rowIndexFromOne);\n\n    m_options.transparency = appConfig->option<Config::transparency>();\n    m_options.transparencyFocused = appConfig->option<Config::transparency_focused>();\n    updateWindowTransparency();\n\n    // save unsaved tab data\n    if ( ui->tabWidget->count() != 0 ) {\n        if ( m_timerSaveTabPositions.isActive() )\n            doSaveTabPositions(appConfig);\n        saveTabs();\n    }\n\n    promptForEncryptionPasswordIfNeeded(appConfig);\n    reencryptTabsIfNeeded(appConfig);\n\n    const QStringList tabNames = savedTabs();\n\n    // tab bar position\n    const bool tabTreeEnabled = appConfig->option<Config::tab_tree>();\n    ui->tabWidget->setTreeModeEnabled(tabTreeEnabled);\n    ui->tabWidget->setTabItemCountVisible(appConfig->option<Config::show_tab_item_count>());\n    for ( auto scrollArea : ui->tabWidget->toolBar()->findChildren<QAbstractScrollArea*>() )\n        theme().decorateScrollArea(scrollArea);\n\n    // create tabs\n    const Tabs tabs;\n    for (const auto &name : tabNames)\n        createTab(name, MatchExactTabName, tabs);\n\n    ui->tabWidget->setTabsOrder(tabNames);\n\n    m_options.hideTabs = appConfig->option<Config::hide_tabs>();\n    setHideTabs(m_options.hideTabs);\n\n    bool hideToolbar = appConfig->option<Config::hide_toolbar>();\n    clearActions(m_toolBar);\n    m_toolBar->setHidden(hideToolbar);\n    bool hideToolBarLabels = appConfig->option<Config::hide_toolbar_labels>();\n    m_toolBar->setToolButtonStyle(hideToolBarLabels ? Qt::ToolButtonIconOnly\n                                                      : Qt::ToolButtonTextUnderIcon);\n\n    m_options.hideMainWindow = appConfig->option<Config::hide_main_window>();\n    m_options.closeOnUnfocus = appConfig->option<Config::close_on_unfocus>();\n\n    WindowFlags flags(this);\n    const bool alwaysOnTop = appConfig->option<Config::always_on_top>();\n    flags.set(Qt::WindowStaysOnTopHint, alwaysOnTop);\n    if (m_commandDialog) {\n        WindowFlags dialogFlags(m_commandDialog.data());\n        dialogFlags.set(Qt::WindowStaysOnTopHint, alwaysOnTop);\n        dialogFlags.apply();\n    }\n    flags.set(Qt::Tool, appConfig->option<Config::hide_main_window_in_task_bar>());\n    flags.set(Qt::FramelessWindowHint, appConfig->option<Config::frameless_window>());\n    flags.apply();\n\n    Q_ASSERT( ui->tabWidget->count() > 0 );\n\n    // Save any tabs loaded from new tab files.\n    appConfig->setOption(\"tabs\", tabNames);\n\n    reloadBrowsers();\n\n    ui->tabWidget->updateTabs(settings);\n\n    m_timerSaveTabPositions.stop();\n\n    updateContextMenu(contextMenuUpdateIntervalMsec);\n    updateItemPreviewAfterMs(itemPreviewUpdateIntervalMsec);\n\n    m_options.itemActivationCommands = ActivateNoCommand;\n    if ( appConfig->option<Config::activate_closes>() )\n        m_options.itemActivationCommands |= ActivateCloses;\n    if ( appConfig->option<Config::activate_focuses>() )\n        m_options.itemActivationCommands |= ActivateFocuses;\n    if ( appConfig->option<Config::activate_pastes>() )\n        m_options.itemActivationCommands |= ActivatePastes;\n\n    m_options.trayItems = appConfig->option<Config::tray_items>();\n    m_options.trayItemPaste = appConfig->option<Config::tray_item_paste>();\n    m_options.trayCommands = appConfig->option<Config::tray_commands>();\n    m_options.trayCurrentTab = appConfig->option<Config::tray_tab_is_current>();\n    m_options.trayTabName = appConfig->option<Config::tray_tab>();\n    m_options.trayImages = appConfig->option<Config::tray_images>();\n    m_options.trayMenuOpenOnLeftClick = appConfig->option<Config::tray_menu_open_on_left_click>();\n    m_options.clipboardTab = appConfig->option<Config::clipboard_tab>();\n\n    m_singleClickActivate = appConfig->option<Config::activate_item_with_single_click>();\n\n    const auto menuStyleSheet = theme().getMenuStyleSheet();\n    m_trayMenu->setStyleSheet(menuStyleSheet);\n    m_menu->setStyleSheet(menuStyleSheet);\n\n    if (m_options.nativeTrayMenu != appConfig->option<Config::native_tray_menu>())\n        m_options.nativeTrayMenu = appConfig->option<Config::native_tray_menu>();\n    setTrayEnabled( !appConfig->option<Config::disable_tray>() );\n    updateTrayMenuItems();\n\n    updateIcon();\n\n    menuBar()->setNativeMenuBar( appConfig->option<Config::native_menu_bar>() );\n\n    ui->searchBar->loadSettings();\n\n    settings.beginGroup(\"Shortcuts\");\n    loadShortcuts(&m_sharedData->menuItems, settings);\n    updateActionShortcuts();\n    settings.endGroup();\n\n    enterBrowseMode();\n\n    updateEnabledCommands();\n\n    m_sharedData->notifications->setIconColor( theme().color(\"notification_fg\") );\n}\n\nvoid MainWindow::loadTheme(const QSettings &themeSettings)\n{\n    m_sharedData->theme.loadTheme(themeSettings);\n    if (themeSettings.status() != QSettings::NoError)\n        return;\n\n    {\n        Settings settings;\n        settings.beginGroup(\"Theme\");\n        m_sharedData->theme.saveTheme(&settings);\n        settings.endGroup();\n    }\n\n    AppConfig appConfig;\n    emit configurationChanged(&appConfig);\n}\n\nvoid MainWindow::openHelp()\n{\n    QDesktopServices::openUrl( QUrl(\"https://copyq.readthedocs.io\") );\n}\n\nvoid MainWindow::showWindow()\n{\n    if ( isWindowVisible() )\n        return;\n\n    m_trayMenu->close();\n    m_menu->close();\n\n    updateFocusWindows();\n\n    moveToCurrentWorkspace(this);\n\n    if ( !isGeometryGuardBlockedUntilHidden(this) && (m_wasMaximized || isMaximized()) )\n        showMaximized();\n    else\n        showNormal();\n\n    auto c = browser();\n    if (c) {\n        if ( !c->isInternalEditorOpen() )\n            c->scrollTo( c->currentIndex() );\n        c->setFocus();\n    }\n\n    raiseWindow(this);\n}\n\nvoid MainWindow::hideWindow()\n{\n    if ( closeMinimizes() )\n        minimizeWindow();\n    else\n        hide();\n\n    // It can be unexpected to have search active or random items selected when\n    // reopening main window. This resets search and selection after the window\n    // is closed.\n    if ( !browseMode() ) {\n        enterBrowseMode();\n        auto c = browser();\n        if (c)\n            c->setCurrent(0);\n    }\n}\n\nvoid MainWindow::minimizeWindow()\n{\n    if (m_options.hideMainWindow)\n        hide();\n    else\n        showMinimized();\n}\n\nbool MainWindow::toggleVisible()\n{\n    if ( isWindowVisible() ) {\n        hideWindow();\n        return false;\n    }\n\n    showWindow();\n    return true;\n}\n\nvoid MainWindow::toggleVisibleFromTray()\n{\n    if (!isMinimized() && isVisible()) {\n        hideWindow();\n    } else {\n        showWindow();\n    }\n}\n\nvoid MainWindow::showBrowser(const ClipboardBrowser *browser)\n{\n    int i = 0;\n    for( ; i < ui->tabWidget->count() && getPlaceholder(i)->browser() != browser; ++i ) {}\n    setCurrentTab(i);\n    showWindow();\n}\n\nbool MainWindow::setCurrentTab(int index)\n{\n    if ( index < 0 || ui->tabWidget->count() <= index )\n        return false;\n\n    ui->tabWidget->setCurrentIndex(index);\n    return true;\n}\n\nbool MainWindow::focusPrevious()\n{\n    if ( !m_windowForMainPaste )\n        return false;\n\n    m_windowForMainPaste->raise();\n    return true;\n}\n\nvoid MainWindow::onMenuActionTriggered(const QVariantMap &data, bool omitPaste)\n{\n    m_menu->close();\n    activateMenuItem( getPlaceholderForMenu(), data, omitPaste );\n}\n\nvoid MainWindow::onTrayActionTriggered(const QVariantMap &data, bool omitPaste)\n{\n    m_trayMenu->close();\n    activateMenuItem( getPlaceholderForTrayMenu(), data, omitPaste );\n}\n\nvoid MainWindow::trayActivated(int reason)\n{\n#ifdef Q_OS_MAC\n    if (!m_options.nativeTrayMenu && reason == QSystemTrayIcon::Context) {\n        toggleMenu();\n        return;\n    }\n#endif\n\n    if ( reason == QSystemTrayIcon::MiddleClick\n         || (m_options.trayMenuOpenOnLeftClick && reason == QSystemTrayIcon::Trigger) )\n    {\n        toggleMenu();\n    } else if ( reason == QSystemTrayIcon::Trigger || reason == QSystemTrayIcon::DoubleClick ) {\n        toggleVisibleFromTray();\n    }\n}\n\nbool MainWindow::toggleMenu()\n{\n    m_trayMenu->search(QString());\n\n    if ( !m_trayMenu->isVisible() )\n        updateTrayMenuItemsTimeout();\n\n    return toggleMenu(m_trayMenu);\n}\n\nbool MainWindow::toggleMenu(const QString &tabName, int itemCount, QPoint position)\n{\n    // Just close the previously opened menu if parameters are the same.\n    if ( m_menu->isVisible()\n         && (m_menuTabName == tabName && m_menuMaxItemCount == itemCount) )\n    {\n        m_menu->close();\n        return false;\n    }\n\n    WidgetSizeGuard sizeGuard(m_menu);\n\n    m_menuTabName = tabName;\n    m_menuMaxItemCount = itemCount;\n    if (m_menuMaxItemCount < 0)\n        m_menuMaxItemCount = m_options.trayItems > 0 ? m_options.trayItems : 10;\n\n    m_menu->clearAllActions();\n    filterMenuItems(QString());\n\n    if ( m_menu->isVisible() )\n        m_menu->close();\n\n    if ( m_menu->isEmpty() )\n        return false;\n\n    if (position.x() >= 0 && position.y() >= 0)\n        return toggleMenu(m_menu, position);\n\n    return toggleMenu(m_menu);\n}\n\nvoid MainWindow::tabChanged(int current, int)\n{\n    bool currentIsTabGroup = current == -1;\n\n    emit tabGroupSelected(currentIsTabGroup);\n\n    if (!currentIsTabGroup) {\n        // update item menu (necessary for keyboard shortcuts to work)\n        auto c = browser();\n        if (c) {\n            c->filterItems( browseMode() ? nullptr : ui->searchBar->filter() );\n\n            if ( current >= 0 ) {\n                if( !c->currentIndex().isValid() && isVisible() ) {\n                    c->setCurrent(0);\n                }\n            }\n\n            setTabOrder(ui->searchBar, c);\n\n            if (isScriptOverridden(ScriptOverrides::OnTabSelected)) {\n                runScript(\n                    QStringLiteral(\"onTabSelected()\"),\n                    createDataMap(mimeCurrentTab, c->tabName()));\n            }\n        }\n    }\n\n    updateContextMenu(0);\n    updateItemPreviewAfterMs(0);\n\n    if (m_options.trayCurrentTab)\n        updateTrayMenuItems();\n}\n\nvoid MainWindow::saveTabPositions()\n{\n    m_timerSaveTabPositions.start();\n}\n\nvoid MainWindow::onSaveTabPositionsTimer()\n{\n    AppConfig appConfig;\n    doSaveTabPositions(&appConfig);\n}\n\nvoid MainWindow::doSaveTabPositions(AppConfig *appConfig)\n{\n    m_timerSaveTabPositions.stop();\n    const QStringList tabs = ui->tabWidget->tabs();\n    appConfig->setOption(\"tabs\", tabs);\n}\n\nvoid MainWindow::tabsMoved(const QString &oldPrefix, const QString &newPrefix)\n{\n    const QStringList newTabNames = ui->tabWidget->tabs();\n    Q_ASSERT( oldPrefix == newPrefix || !newTabNames.contains(oldPrefix) );\n    Q_ASSERT( !newTabNames.contains(QString()) );\n\n    AppConfig appConfig;\n    Tabs tabs;\n\n    // The stacked widget was already reordered by onTabsMoved before this\n    // slot fires.  Capture the original tab order from config so we can\n    // restore it if rollback is needed.\n    const QStringList originalTabOrder = appConfig.option<Config::tabs>();\n\n    // Rename tabs if needed, tracking successes for rollback.\n    struct RenamedTab { int index; QString oldName; };\n    QVector<RenamedTab> renamedTabs;\n    bool failed = false;\n\n    for (int i = 0 ; i < newTabNames.size(); ++i) {\n        const QString &newTabName = newTabNames[i];\n        auto placeholder = getPlaceholder(i);\n        const QString oldTabName = placeholder->tabName();\n        if (newTabName != oldTabName) {\n            if ( updateTabName(placeholder, newTabName, &appConfig, &tabs) ) {\n                renamedTabs.append({i, oldTabName});\n            } else {\n                ui->tabWidget->setTabName(i, oldTabName);\n                failed = true;\n                break;\n            }\n        }\n    }\n\n    if (failed && !renamedTabs.isEmpty()) {\n        log(\"Rolling back tab renames after partial failure\", LogWarning);\n        for (auto it = renamedTabs.crbegin(); it != renamedTabs.crend(); ++it) {\n            const auto &r = *it;\n            auto placeholder = getPlaceholder(r.index);\n            if ( !updateTabName(placeholder, r.oldName, &appConfig, &tabs) )\n                log(\"Failed to roll back tab rename\", LogError);\n            ui->tabWidget->setTabName(r.index, r.oldName);\n        }\n        ui->tabWidget->reorderTabs(originalTabOrder);\n    }\n\n    const QStringList tabNames = ui->tabWidget->tabs();\n    tabs.save(&appConfig.settings(), tabNames);\n    appConfig.setOption(Config::tabs::name(), tabNames);\n}\n\nvoid MainWindow::tabBarMenuRequested(QPoint pos, int tab)\n{\n    auto placeholder = getPlaceholder(tab);\n    if (placeholder == nullptr)\n        return;\n    const QString tabName = placeholder->tabName();\n    popupTabBarMenu(pos, tabName);\n}\n\nvoid MainWindow::tabTreeMenuRequested(QPoint pos, const QString &groupPath)\n{\n    popupTabBarMenu(pos, groupPath);\n}\n\nvoid MainWindow::tabCloseRequested(int tab)\n{\n    removeTab(true, tab);\n}\n\nQVariant MainWindow::config(const QVariantList &nameValue)\n{\n    AppConfig appConfig;\n\n    if ( m_timerSaveTabPositions.isActive() )\n        doSaveTabPositions(&appConfig);\n\n    ConfigurationManager configurationManager;\n\n    QStringList unknownOptions;\n    const auto validOptions = configurationManager.options();\n\n    // Check if option names are valid.\n    for (int i = 0; i < nameValue.size(); i += 2) {\n        const QString name = nameValue[i].toString();\n        if ( !validOptions.contains(name) )\n            unknownOptions.append(name);\n    }\n\n    if ( !unknownOptions.isEmpty() )\n        return unknownOptions;\n\n    configurationManager.loadSettings(&appConfig);\n\n    QVariantMap result;\n    bool emitConfigurationChanged = false;\n    for (int i = 0; i < nameValue.size(); i += 2) {\n        const QString name = nameValue[i].toString();\n        const QVariant value = nameValue.value(i + 1);\n        if ( i + 1 < nameValue.size() && configurationManager.setOptionValue(name, value, &appConfig) )\n            emitConfigurationChanged = true;\n\n        result.insert( name, configurationManager.optionValue(name) );\n    }\n\n    if (emitConfigurationChanged) {\n        configurationManager.setAutostartEnable(&appConfig);\n        emit configurationChanged(&appConfig);\n    }\n\n    return result;\n}\n\nQString MainWindow::configDescription()\n{\n    ConfigurationManager configurationManager;\n    QStringList options = configurationManager.options();\n    options.sort();\n    QString opts;\n    AppConfig appConfig;\n    configurationManager.loadSettings(&appConfig);\n    for (const auto &option : options) {\n        const QString description = configurationManager.optionToolTip(option).replace('\\n', \"\\n  \");\n        const QString value = configurationManager.optionValue(option).toString().replace('\\n', \"\\\\n\");\n        opts.append( QStringLiteral(\"%1=%2\\n  %3\\n\").arg(option, value, description) );\n    }\n    return opts;\n}\n\nQVariantMap MainWindow::actionData(int id) const\n{\n    return m_sharedData->actions->actionData(id);\n}\n\nvoid MainWindow::setActionData(int id, const QVariantMap &data)\n{\n    m_sharedData->actions->setActionData(id, data);\n}\n\nvoid MainWindow::setCommands(const QVector<Command> &commands)\n{\n    if ( !maybeCloseCommandDialog() )\n        return;\n\n    updateCommands(commands, true);\n}\n\nvoid MainWindow::setSessionIconColor(QColor color)\n{\n    ::setSessionIconColor(color);\n    updateIcon();\n}\n\nvoid MainWindow::setSessionIconTag(const QString &tag)\n{\n    ::setSessionIconTag(tag);\n    updateIcon();\n}\n\nvoid MainWindow::setSessionIconTagColor(QColor color)\n{\n    ::setSessionIconTagColor(color);\n    updateIcon();\n}\n\nQColor MainWindow::sessionIconColor() const\n{\n    return ::sessionIconColor();\n}\n\nQString MainWindow::sessionIconTag() const\n{\n    return ::sessionIconTag();\n}\n\nQColor MainWindow::sessionIconTagColor() const\n{\n    return ::sessionIconTagColor();\n}\n\nvoid MainWindow::setTrayTooltip(const QString &tooltip)\n{\n    if (m_tray)\n        m_tray->setToolTip(tooltip);\n}\n\nbool MainWindow::setMenuItemEnabled(int actionId, int currentRun, int menuItemMatchCommandIndex, const QVariantMap &menuItem)\n{\n    if (actionId != m_trayMenuMatchCommands.actionId && actionId != m_itemMenuMatchCommands.actionId)\n        return false;\n\n    const auto &menuMatchCommands = actionId == m_trayMenuMatchCommands.actionId\n            ? m_trayMenuMatchCommands\n            : m_itemMenuMatchCommands;\n\n    if (currentRun != menuMatchCommands.currentRun)\n        return false;\n\n    if (menuMatchCommands.actions.size() <= menuItemMatchCommandIndex)\n        return false;\n\n    auto action = menuMatchCommands.actions[menuItemMatchCommandIndex];\n    if (!action)\n        return true;\n\n    for (auto it = menuItem.constBegin(); it != menuItem.constEnd(); ++it) {\n        const auto &key = it.key();\n        if (key == menuItemKeyColor || key == menuItemKeyIcon || key == menuItemKeyTag)\n            continue;\n\n        const auto value = it.value();\n        action->setProperty(key.toLatin1(), value);\n    }\n\n    if ( menuItem.contains(menuItemKeyTag) || menuItem.contains(menuItemKeyIcon) ) {\n        QString icon = menuItem.value(menuItemKeyIcon).toString();\n        if (icon.isEmpty()) {\n            const auto commandAction = qobject_cast<CommandAction*>(action);\n            if (commandAction)\n                icon = commandAction->command().icon;\n        }\n        const QString colorName = menuItem.value(menuItemKeyColor).toString();\n        const QColor color = colorName.isEmpty() ? getDefaultIconColor(*this) : deserializeColor(colorName);\n        const QString tag = menuItem.value(menuItemKeyTag).toString();\n        action->setIcon( iconFromFile(icon, tag, color) );\n    }\n\n    const bool enabled = action->isEnabled();\n    action->setProperty(propertyActionFilterCommandFailed, !enabled);\n\n    const auto shortcuts = action->shortcuts();\n\n    if ( !enabled && (actionId == m_trayMenuMatchCommands.actionId || !m_menuItem->isVisible()) )\n        action->deleteLater();\n\n    if ( !shortcuts.isEmpty() )\n        updateActionShortcuts();\n\n    return true;\n}\n\nQVariantMap MainWindow::setDisplayData(int actionId, const QVariantMap &data)\n{\n    if (m_displayActionId != actionId)\n        return QVariantMap();\n\n    m_currentDisplayItem.setData(data);\n\n    clearHiddenDisplayData();\n\n    if ( m_displayItemList.isEmpty() )\n        return QVariantMap();\n\n    m_currentDisplayItem = m_displayItemList.takeFirst();\n    m_sharedData->actions->setActionData(actionId, m_currentDisplayItem.data());\n    return m_currentDisplayItem.data();\n}\n\nvoid MainWindow::nextTab()\n{\n    ui->tabWidget->nextTab();\n}\n\nvoid MainWindow::previousTab()\n{\n    ui->tabWidget->previousTab();\n}\n\nvoid MainWindow::setClipboard(const QVariantMap &data)\n{\n    setClipboard(data, ClipboardMode::Clipboard);\n#ifdef HAS_MOUSE_SELECTIONS\n    setClipboard(data, ClipboardMode::Selection);\n#endif\n}\n\nvoid MainWindow::setClipboard(const QVariantMap &data, ClipboardMode mode)\n{\n    int &actionId = mode == ClipboardMode::Clipboard\n        ? m_provideClipboardActionId\n        : m_provideSelectionActionId;\n\n    // Abort the previous provider. Returns false if a re-entrant\n    // setClipboard() already handled this mode during the wait.\n    if (!abortAction(actionId, 1000))\n        return;\n\n    m_clipboard->setData(mode, data);\n\n    auto act = new Action();\n    act->setData(data);\n    act->setCommand({\n        QStringLiteral(\"copyq\"),\n        QStringLiteral(\"--clipboard-access\"),\n        mode == ClipboardMode::Clipboard\n          ? QStringLiteral(\"provideClipboard\")\n          : QStringLiteral(\"provideSelection\")\n    });\n    runInternalAction(act);\n    actionId = act->id();\n}\n\nvoid MainWindow::setClipboardAndSelection(const QVariantMap &data)\n{\n    setClipboard(data);\n}\n\nvoid MainWindow::moveToClipboard(ClipboardBrowser *c, int row)\n{\n    const auto index = c ? c->index(row) : QModelIndex();\n    if ( index.isValid() )\n        c->moveToClipboard(index);\n    else\n        setClipboard(QVariantMap());\n}\n\nconst QMimeData *MainWindow::getClipboardData(ClipboardMode mode)\n{\n    return m_clipboard->mimeData(mode);\n}\n\nvoid MainWindow::activateCurrentItem()\n{\n    // Omit activating item multiple times in quick succession.\n    if (m_activatingItem)\n        return;\n\n    m_activatingItem = true;\n    activateCurrentItemHelper();\n    m_activatingItem = false;\n}\n\nvoid MainWindow::activateCurrentItemHelper()\n{\n    if ( QApplication::queryKeyboardModifiers() == Qt::NoModifier\n         && isItemMenuDefaultActionValid() )\n    {\n        m_menuItem->defaultAction()->trigger();\n        return;\n    }\n\n    auto c = browser();\n    if (!c)\n        return;\n\n    // Perform custom actions on item activation.\n    PlatformWindowPtr lastWindow = m_windowForMainPaste;\n    const bool paste = m_options.activatePastes() && canPaste();\n    const bool activateWindow = m_options.activateFocuses();\n\n    // Copy current item or selection to clipboard.\n    // While clipboard is being set (in separate process)\n    // activate target window for pasting.\n    c->moveToClipboard();\n\n    if ( m_options.activateCloses() )\n        hideWindow();\n\n    if (lastWindow && activateWindow)\n        lastWindow->raise();\n\n    enterBrowseMode();\n\n    if (paste) {\n        if (isScriptOverridden(ScriptOverrides::Paste)) {\n            COPYQ_LOG(\"Pasting item with paste()\");\n            runScript(QStringLiteral(\"paste()\"));\n        } else if (lastWindow) {\n            COPYQ_LOG( QStringLiteral(\"Pasting item from main window to: %1\")\n                       .arg(lastWindow->getTitle()) );\n            lastWindow->pasteFromClipboard();\n        }\n    }\n}\n\nvoid MainWindow::onItemClicked()\n{\n    if (m_singleClickActivate && QGuiApplication::keyboardModifiers() == Qt::NoModifier)\n        activateCurrentItem();\n}\n\nvoid MainWindow::onItemDoubleClicked()\n{\n    if (!m_singleClickActivate)\n        activateCurrentItem();\n}\n\nvoid MainWindow::promptForEncryptionPasswordIfNeeded(AppConfig *appConfig)\n{\n    // If key store was disabled, remove password from it - this avoids\n    // removing the password every time when configuration changes - locked key\n    // store would prompt for password to allow that.\n    const bool useKeyStore = appConfig->option<Config::use_key_store>();\n    if (m_usedKeyStore && !useKeyStore)\n        removePasswordFromKeychain();\n    m_usedKeyStore = useKeyStore;\n\n    if ( !appConfig->option<Config::encrypt_tabs>() ) {\n        m_sharedData->encryptionKey.clear();\n    } else if ( !m_sharedData->encryptionKey.isValid() ) {\n        m_sharedData->passwordPrompt->prompt(\n            useKeyStore ? PasswordSource::UseEnvAndKeychain : PasswordSource::UseEnvOnly,\n            [this](const Encryption::EncryptionKey &key){\n                if (key.isValid())\n                    m_sharedData->encryptionKey = key;\n            });\n    }\n}\n\nvoid MainWindow::reencryptTabsIfNeeded(AppConfig *appConfig)\n{\n    if (m_reencrypting)\n        return;\n\n    m_reencrypting = true;\n    reencryptTabsIfNeededHelper(appConfig);\n    m_reencrypting = false;\n}\n\nvoid MainWindow::reencryptTabsIfNeededHelper(AppConfig *appConfig)\n{\n    const bool isEncrypted = appConfig->option<Config::encrypt_tabs>();\n    if (m_wasEncrypted == isEncrypted)\n        return;\n\n    const Encryption::EncryptionKey newEncryptionKey = m_sharedData->encryptionKey;\n\n    // Always ask for the previous password when re-encrypting.\n    Encryption::EncryptionKey oldEncryptionKey;\n    if (m_wasEncrypted) {\n        oldEncryptionKey = m_sharedData->passwordPrompt->prompt(PasswordSource::IgnoreEnvAndKeychain);\n    }\n\n    // Items may change while waiting for password prompt, persist and refresh tab list.\n    saveTabs();\n    const QStringList tabNames = savedTabs();\n\n    // Revert encryption option if password was not provided.\n    if (!oldEncryptionKey.isValid() && !newEncryptionKey.isValid()) {\n        appConfig->setOption(Config::encrypt_tabs::name(), m_wasEncrypted);\n        m_sharedData->tabsEncrypted = m_wasEncrypted;\n        return;\n    }\n\n    const bool allEncrypted = reencryptTabs(\n        tabNames,\n        m_sharedData.get(),\n        oldEncryptionKey,\n        newEncryptionKey,\n        Config::maxItems,\n        this\n    );\n\n    m_wasEncrypted = isEncrypted;\n    m_sharedData->encryptionKey = newEncryptionKey;\n\n    if (allEncrypted)\n        ::cleanDataFiles(tabNames, &m_sharedData->encryptionKey);\n\n    // If saving some tabs failed, keep the keys and the encryption enabled,\n    // otherwise remove unneeded key files.\n    if (oldEncryptionKey.isValid()) {\n        if (allEncrypted) {\n            Encryption::removeEncryptionKeys();\n            if (appConfig->option<Config::use_key_store>())\n                removePasswordFromKeychain();\n        } else {\n            appConfig->setOption(Config::encrypt_tabs::name(), true);\n            m_wasEncrypted = true;\n            m_sharedData->encryptionKey = oldEncryptionKey;\n        }\n    }\n}\n\nbool MainWindow::updateTabName(\n    ClipboardBrowserPlaceholder *placeholder,\n    const QString &newName,\n    AppConfig *appConfig,\n    Tabs *tabs)\n{\n    const QString oldName = placeholder->tabName();\n    if ( !placeholder->setTabName(newName) )\n        return false;\n\n    TabProperties tabProperties = tabs->tabProperties(oldName);\n    tabProperties.name = newName;\n    tabs->setTabProperties(tabProperties);\n\n    if (oldName == m_options.clipboardTab) {\n        m_options.clipboardTab = newName;\n        appConfig->setOption(Config::clipboard_tab::name(), newName);\n        // Restart clipboard monitoring to apply new clipboard tab configuration.\n        if (!m_clipboardStoringDisabled) {\n            emit disableClipboardStoring(true);\n            emit disableClipboardStoring(false);\n        }\n    }\n\n    if (oldName == m_options.trayTabName) {\n        m_options.trayTabName = newName;\n        appConfig->setOption(Config::tray_tab::name(), newName);\n    }\n\n    return true;\n}\n\nvoid MainWindow::disableClipboardStoring(bool disable)\n{\n    if (m_clipboardStoringDisabled == disable)\n        return;\n\n    m_clipboardStoringDisabled = disable;\n    emit disableClipboardStoringRequest(disable);\n\n    ::setSessionIconEnabled(!disable);\n\n    updateIcon();\n\n    runScript(QStringLiteral(\"setTitle(); showDataNotification()\"));\n\n    COPYQ_LOG( QString(\"Clipboard monitoring %1.\")\n               .arg(m_clipboardStoringDisabled ? \"disabled\" : \"enabled\") );\n}\n\nbool MainWindow::isMonitoringEnabled() const\n{\n    return !m_clipboardStoringDisabled;\n}\n\nvoid MainWindow::toggleClipboardStoring()\n{\n    disableClipboardStoring(!m_clipboardStoringDisabled);\n}\n\nQStringList MainWindow::tabs() const\n{\n    return ui->tabWidget->tabs();\n}\n\nClipboardBrowserPlaceholder *MainWindow::getPlaceholderForMenu()\n{\n    const auto i = findTabIndex(m_menuTabName);\n    return i != -1 ? getPlaceholder(i) : nullptr;\n}\n\nClipboardBrowserPlaceholder *MainWindow::getPlaceholderForTrayMenu()\n{\n    if (m_options.trayCurrentTab)\n        return getPlaceholder();\n\n    if ( m_options.trayTabName.isEmpty() )\n        return m_options.clipboardTab.isEmpty() ? nullptr : getPlaceholder(m_options.clipboardTab);\n\n    int i = findTabIndex(m_options.trayTabName);\n    return i != -1 ? getPlaceholder(i) : nullptr;\n}\n\nvoid MainWindow::onFilterChanged()\n{\n    ItemFilterPtr filter = ui->searchBar->filter();\n    if ( filter->matchesAll() )\n        enterBrowseMode();\n    else if ( browseMode() )\n        enterSearchMode();\n\n    auto c = browser();\n    if (c)\n        c->filterItems(filter);\n    updateItemPreviewAfterMs(2 * itemPreviewUpdateIntervalMsec);\n}\n\nvoid MainWindow::raiseLastWindowAfterMenuClosed()\n{\n    if ( m_windowForMenuPaste && !isAnyApplicationWindowActive() )\n        m_windowForMenuPaste->raise();\n}\n\nvoid MainWindow::updateFocusWindows()\n{\n    m_isActiveWindow = isActiveWindow();\n\n    if ( QApplication::activePopupWidget() )\n        return;\n\n    auto platform = platformNativeInterface();\n    PlatformWindowPtr lastWindow = platform->getCurrentWindow();\n    if (lastWindow) {\n        const QWidget *activeWindow = qApp->activeWindow();\n        if (activeWindow) {\n            if (activeWindow == m_trayMenu || activeWindow == m_menu) {\n                COPYQ_LOG(\n                    QStringLiteral(\"Focus window is \\\"%1\\\" - tray menu\")\n                    .arg(lastWindow->getTitle()) );\n            } else if (activeWindow == this) {\n                COPYQ_LOG(QStringLiteral(\"Focus window is the main window\"));\n                m_windowForMenuPaste = lastWindow;\n            } else {\n                COPYQ_LOG(QStringLiteral(\"Focus window is \\\"%1\\\": [%2] %3\").arg(\n                    lastWindow->getTitle(),\n                    QLatin1String(activeWindow->metaObject()->className()),\n                    activeWindow->windowTitle()\n                ));\n                m_windowForMainPaste = lastWindow;\n                m_windowForMenuPaste = lastWindow;\n            }\n        } else {\n            COPYQ_LOG( QStringLiteral(\"Focus window is \\\"%1\\\"\").arg(lastWindow->getTitle()) );\n            m_windowForMainPaste = lastWindow;\n            m_windowForMenuPaste = lastWindow;\n        }\n    }\n}\n\nvoid MainWindow::updateShortcuts()\n{\n    if ( m_timerUpdateContextMenu.isActive() ) {\n        m_timerUpdateContextMenu.stop();\n        updateContextMenuTimeout();\n    }\n}\n\nvoid MainWindow::findNextOrPrevious()\n{\n    if (browseMode()) {\n        enterSearchMode();\n    } else {\n        auto c = browser();\n        if (!c)\n            return;\n\n        const bool next = !QApplication::keyboardModifiers().testFlag(Qt::ShiftModifier);\n        if ( c->isInternalEditorOpen() ) {\n            ui->searchBar->setFocus(Qt::ShortcutFocusReason);\n            if (next)\n                c->findNext();\n            else\n                c->findPrevious();\n        } else {\n            c->setFocus();\n            c->setCurrent( c->currentIndex().row() + (next ? 1 : -1) );\n        }\n    }\n}\n\nvoid MainWindow::enterBrowseMode()\n{\n    getPlaceholder()->setFocus();\n    ui->searchBar->hide();\n\n    auto c = browserOrNull();\n    if (c)\n        c->filterItems(nullptr);\n}\n\nvoid MainWindow::enterSearchMode()\n{\n    ui->searchBar->show();\n    ui->searchBar->setFocus(Qt::ShortcutFocusReason);\n\n    if ( !ui->searchBar->text().isEmpty() ) {\n        auto c = browserOrNull();\n        if (c) {\n            c->filterItems( ui->searchBar->filter() );\n        }\n    }\n}\n\nvoid MainWindow::enterSearchMode(const QString &txt)\n{\n    ui->searchBar->show();\n    ui->searchBar->setFocus(Qt::ShortcutFocusReason);\n    ui->searchBar->setText(txt);\n\n    auto c = browser();\n    if (c)\n        c->filterItems( ui->searchBar->filter() );\n}\n\nvoid MainWindow::updateTrayMenuItemsTimeout()\n{\n    if (!m_trayMenuDirty)\n        return;\n\n    // Update tray only if not currently visible.\n    if ( m_trayMenu->isVisible() ) {\n        updateTrayMenuItems();\n        return;\n    }\n\n    COPYQ_LOG(\"Updating tray menu\");\n    WidgetSizeGuard sizeGuard(m_trayMenu);\n    initTrayMenuItems();\n}\n\nvoid MainWindow::initTrayMenuItems()\n{\n    m_trayMenuDirty = false;\n    interruptMenuCommandFilters(&m_trayMenuMatchCommands);\n    m_trayMenu->clearClipboardItems();\n    filterTrayMenuItems(QString());\n}\n\nvoid MainWindow::filterMenuItems(const QString &searchText)\n{\n    addMenuItems(m_menu, getPlaceholderForMenu(), m_menuMaxItemCount, searchText);\n}\n\nvoid MainWindow::filterTrayMenuItems(const QString &searchText)\n{\n    addMenuItems(m_trayMenu, getPlaceholderForTrayMenu(), m_options.trayItems, searchText);\n    m_trayMenu->markItemInClipboard(m_clipboardData);\n}\n\nvoid MainWindow::openLogDialog()\n{\n    openDialog<LogDialog>(this);\n}\n\nvoid MainWindow::openAboutDialog()\n{\n    openDialog<AboutDialog>(m_sharedData->theme, this);\n}\n\nvoid MainWindow::showClipboardContent()\n{\n    ClipboardDialog *clipboardDialog = openDialog<ClipboardDialog>(this);\n    connect( clipboardDialog, &ClipboardDialog::changeClipboard,\n             this, &MainWindow::setClipboardAndSelection );\n}\n\nvoid MainWindow::showProcessManagerDialog()\n{\n    m_sharedData->actions->showProcessManagerDialog(this);\n}\n\nActionDialog *MainWindow::openActionDialog(const QVariantMap &data)\n{\n    auto actionDialog = openDialog<ActionDialog>(this);\n    actionDialog->setInputData(data);\n\n    const auto tabs = ui->tabWidget->tabs();\n    actionDialog->setOutputTabs(tabs);\n\n    const int currentTabIndex = ui->tabWidget->currentIndex();\n    if (currentTabIndex >= 0) {\n        const auto currentTab = ui->tabWidget->tabName(currentTabIndex);\n        actionDialog->setCurrentTab(currentTab);\n    }\n\n    connect( actionDialog, &ActionDialog::commandAccepted,\n             this, &MainWindow::onActionDialogAccepted );\n\n    raiseWindow(actionDialog);\n\n    return actionDialog;\n}\n\nvoid MainWindow::openActionDialog()\n{\n    auto c = browser();\n    const auto data = c ? selectionData(*c) : QVariantMap();\n    openActionDialog(data);\n}\n\nvoid MainWindow::showItemContent()\n{\n    auto c = browser( ui->tabWidget->currentIndex() );\n    if (!c)\n        return;\n\n    const QModelIndex current = c->currentIndex();\n    if ( current.isValid() )\n        openDialog<ClipboardDialog>(current, c->model(), this);\n}\n\nvoid MainWindow::openPreferences()\n{\n    if ( !isEnabled() )\n        return;\n\n    if (cm) {\n        cm->activateWindow();\n        return;\n    }\n\n    ConfigurationManager configurationManager(m_sharedData, this);\n    WindowGeometryGuard::create(&configurationManager);\n\n    // notify window if configuration changes\n    connect( &configurationManager, &ConfigurationManager::configurationChanged,\n             this, &MainWindow::configurationChanged );\n    connect( &configurationManager, &ConfigurationManager::error,\n             this, &MainWindow::showError );\n\n    cm = &configurationManager;\n    configurationManager.exec();\n    cm = nullptr;\n}\n\nvoid MainWindow::openCommands()\n{\n    if ( !isEnabled() )\n        return;\n\n    if (m_commandDialog) {\n        m_commandDialog->show();\n        m_commandDialog->activateWindow();\n    } else {\n        const QVector<Command> pluginCommands = m_sharedData->itemFactory->commands();\n        QStringList formats = m_sharedData->itemFactory->formatsToSave();\n        formats.prepend(mimeText);\n        formats.removeDuplicates();\n\n        QWidget *parent = this;\n        if (cm)\n            parent = cm;\n\n        m_commandDialog = openDialog<CommandDialog>(pluginCommands, formats, parent);\n        connect(this, &QObject::destroyed, m_commandDialog.data(), &QWidget::close);\n        connect(m_commandDialog.data(), &CommandDialog::commandsSaved, this, &MainWindow::updateEnabledCommands);\n    }\n\n    if (cm && cm->isVisible())\n        m_commandDialog->setWindowModality(Qt::ApplicationModal);\n}\n\nClipboardBrowser *MainWindow::browser(int index)\n{\n    ClipboardBrowserPlaceholder *placeholder = getPlaceholder(index);\n    return placeholder ? placeholder->createBrowser() : nullptr;\n}\n\nClipboardBrowser *MainWindow::browser()\n{\n    return browser( ui->tabWidget->currentIndex() );\n}\n\nClipboardBrowser *MainWindow::browserOrNull()\n{\n    const ClipboardBrowserPlaceholder *currentPlaceholder = getPlaceholder();\n    return currentPlaceholder ? currentPlaceholder->browser() : nullptr;\n}\n\nClipboardBrowser *MainWindow::browserForItem(const QModelIndex &index)\n{\n    if ( index.isValid() ) {\n        auto c = qobject_cast<ClipboardBrowser*>(index.model()->parent());\n        Q_ASSERT(c);\n        return c;\n    }\n\n    return nullptr;\n}\n\nvoid MainWindow::addAndFocusTab(const QString &name)\n{\n    auto placeholder = createTab(name, MatchExactTabName, Tabs());\n    if (!placeholder)\n        return;\n\n    int i = 0;\n    for( ; i < ui->tabWidget->count() && getPlaceholder(i) != placeholder; ++i ) {}\n    setCurrentTab(i);\n\n    saveTabPositions();\n}\n\nvoid MainWindow::editNewItem()\n{\n    auto c = browser( ui->tabWidget->currentIndex() );\n    if (!c)\n        return;\n\n    showWindow();\n    if ( !c->isInternalEditorOpen() ) {\n        c->setFocus();\n        c->editNew(mimeText, {});\n    }\n}\n\nvoid MainWindow::pasteItems()\n{\n    const QMimeData *data = m_clipboard->mimeData(ClipboardMode::Clipboard);\n    if (data == nullptr)\n        return;\n\n    auto c = browser();\n    if (!c)\n        return;\n\n    QModelIndexList list = c->selectionModel()->selectedIndexes();\n    std::sort( list.begin(), list.end() );\n    const int row = list.isEmpty() ? 0 : list.first().row();\n    c->addAndSelect( cloneData(data), row );\n}\n\nvoid MainWindow::copyItems()\n{\n    auto c = browser();\n    if (!c)\n        return;\n\n    const QModelIndexList indexes = c->selectionModel()->selectedRows();\n    if ( indexes.isEmpty() )\n        return;\n\n    const auto data = c->copyIndexes(indexes);\n    setClipboard(data);\n}\n\nbool MainWindow::saveTab(const QString &fileName, int tabIndex)\n{\n    int i = tabIndex >= 0 ? tabIndex : ui->tabWidget->currentIndex();\n    auto c = browser(i);\n    if (!c) {\n        qCCritical(logCategory) << \"Failed to open tab for export (v2)\";\n        return false;\n    }\n\n    QFile file(fileName);\n    if ( !file.open(QIODevice::WriteOnly | QIODevice::Truncate) ) {\n        qCCritical(logCategory) << \"Failed to open file for export (v2):\"\n            << file.fileName() << \"message:\" << file.errorString();\n        return false;\n    }\n\n    QDataStream out(&file);\n    out.setVersion(dataStreamImportVersionDefault);\n\n    out << QByteArray(\"CopyQ v2\") << c->tabName();\n    if ( !serializeData(*c->model(), &out) ) {\n        if (file.error() != QFile::NoError) {\n            qCCritical(logCategory) << \"Export (v2) failed to file:\"\n                << file.fileName() << \"message:\" << file.errorString();\n        }\n\n        if (out.status() != QDataStream::Ok) {\n            qCCritical(logCategory) << \"Export (v2) failed to file:\"\n                << file.fileName() << \"reason:\" << out.status();\n        }\n\n        return false;\n    }\n\n    file.close();\n\n    return true;\n}\n\nbool MainWindow::exportData()\n{\n    ImportExportDialog exportDialog(this);\n    exportDialog.setWindowTitle( tr(\"Options for Export\") );\n    exportDialog.setTabs( ui->tabWidget->tabs() );\n    if ( !ui->tabWidget->isTabGroupSelected() )\n        exportDialog.setCurrentTab( getPlaceholder()->tabName() );\n    if ( exportDialog.exec() != QDialog::Accepted )\n        return false;\n\n    // Prompt for custom password if requested\n#ifdef WITH_QCA_ENCRYPTION\n    bool ok;\n    const Encryption::EncryptionKey key = promptForExportPassword(this, &ok);\n    if (!ok)\n        return false;\n#else\n    const Encryption::EncryptionKey key;\n#endif\n\n    auto fileName = QFileDialog::getSaveFileName(\n                this, QString(), QString(), importExportFileDialogFilter() );\n    if ( fileName.isNull() )\n        return false;\n\n    if ( !fileName.endsWith(\".cpq\") )\n        fileName.append(\".cpq\");\n\n    const auto tabs = exportDialog.selectedTabs();\n    const bool exportConfiguration = exportDialog.isConfigurationEnabled();\n    const bool exportCommands = exportDialog.isCommandsEnabled();\n\n    if ( !exportDataFrom(fileName, tabs, exportConfiguration, exportCommands, key) ) {\n        QMessageBox::critical(\n                    this, tr(\"Export Error\"),\n                    tr(\"Failed to export file %1!\")\n                    .arg(quoteString(fileName)) );\n        return false;\n    }\n\n    return true;\n}\n\nvoid MainWindow::saveTabs()\n{\n    for( int i = 0; i < ui->tabWidget->count(); ++i ) {\n        auto c = getPlaceholder(i)->browser();\n        if (c)\n            c->saveUnsavedItems();\n    }\n    ui->tabWidget->saveTabInfo();\n}\n\nbool MainWindow::loadTab(const QString &fileName)\n{\n    QFile file(fileName);\n    if ( !file.open(QIODevice::ReadOnly) ) {\n        qCCritical(logCategory) << \"Failed to open file for import:\"\n            << file.fileName() << \"message:\" << file.errorString();\n        return false;\n    }\n\n    QDataStream in(&file);\n    in.setVersion(dataStreamImportVersionDefault);\n\n    QByteArray header;\n    in >> header;\n    if ( in.status() != QDataStream::Ok ) {\n        checkFileAndStreamErrors(\n            file, in, \"Import (v2) failed: Failed to read file header for import\");\n        return false;\n    }\n\n    if ( !header.startsWith(\"CopyQ v1\") && !header.startsWith(\"CopyQ v2\") ) {\n        qCCritical(logCategory) << \"Import (v2) failed: Unsupported header\";\n        return false;\n    }\n\n    const bool ok = importDataV2(&in);\n    return checkFileAndStreamErrors(file, in, \"Import (v2) failed\") && ok;\n}\n\nbool MainWindow::importDataFrom(\n    const QString &fileName, ImportOptions options)\n{\n    QFile file(fileName);\n    if ( !file.open(QIODevice::ReadOnly) ) {\n        qCCritical(logCategory) << \"Failed to open file for import:\"\n            << file.fileName() << \"message:\" << file.errorString();\n        return false;\n    }\n\n    QDataStream in(&file);\n    in.setVersion(dataStreamImportVersionDefault);\n\n    QByteArray header;\n    in >> header;\n    if ( in.status() != QDataStream::Ok ) {\n        checkFileAndStreamErrors(\n            file, in, \"Import (v2) failed: Failed to read file header for import\");\n        return false;\n    }\n\n    bool ok = false;\n    const char *label = \"unknown\";\n    if ( header.startsWith(\"CopyQ v5\") ) {\n        ok = importDataV5(&in, options);\n        label = \"Import (v5) failed\";\n    } else if ( header.startsWith(\"CopyQ v4\") ) {\n        ok = importDataV4(&in, options);\n        label = \"Import (v4) failed\";\n    } else if ( header.startsWith(\"CopyQ v3\") ) {\n        ok = importDataV3(&in, options);\n        label = \"Import (v3) failed\";\n    } else if ( header.startsWith(\"CopyQ v2\") || header.startsWith(\"CopyQ v1\") ) {\n        ok = importDataV2(&in);\n        label = \"Import (v2) failed\";\n    } else {\n        qCCritical(logCategory) << \"Unsupported import file format\";\n    }\n\n    return checkFileAndStreamErrors(file, in, label) && ok;\n}\n\nbool MainWindow::exportAllData(const QString &fileName)\n{\n    const auto tabs = ui->tabWidget->tabs();\n    const bool exportConfiguration = true;\n    const bool exportCommands = true;\n\n    return exportDataFrom(\n        fileName, tabs, exportConfiguration, exportCommands, Encryption::EncryptionKey());\n}\n\nbool MainWindow::importData()\n{\n    const auto fileName = QFileDialog::getOpenFileName(\n                this, QString(), QString(), importExportFileDialogFilter() );\n    if ( fileName.isNull() )\n        return false;\n\n    if ( !importDataFrom(fileName, ImportOptions::Select) ) {\n        QMessageBox::critical(\n                    this, tr(\"Import Error\"),\n                    tr(\"Failed to import file %1!\")\n                    .arg(quoteString(fileName)) );\n        return false;\n    }\n\n    return true;\n}\n\nvoid MainWindow::sortSelectedItems()\n{\n    auto c = browser();\n    if (c)\n        c->sortItems( c->selectionModel()->selectedRows() );\n}\n\nvoid MainWindow::reverseSelectedItems()\n{\n    auto c = browser();\n    if (c)\n        c->reverseItems( c->selectionModel()->selectedRows() );\n}\n\nAction *MainWindow::action(const QVariantMap &data, const Command &cmd, const QModelIndex &outputIndex)\n{\n    if (cmd.wait) {\n        auto actionDialog = openActionDialog(data);\n        if ( !cmd.outputTab.isEmpty() )\n            actionDialog->setCurrentTab(cmd.outputTab);\n        actionDialog->setCommand(cmd);\n    } else if ( cmd.cmd.isEmpty() ) {\n        m_sharedData->actions->addFinishedAction(cmd.name);\n    } else {\n        auto act = new Action();\n        act->setCommand( cmd.cmd, QStringList(getTextData(data)) );\n        act->setInputWithFormat(data, cmd.input);\n        act->setName(cmd.localizedName());\n        act->setData(data);\n\n        if ( !cmd.output.isEmpty() ) {\n            if ( outputIndex.isValid() )\n                actionOutput(this, act, cmd.output, outputIndex);\n            else if ( !cmd.sep.isEmpty() )\n                actionOutput(this, act, cmd.output, cmd.outputTab, QRegularExpression(cmd.sep));\n            else\n                actionOutput(this, act, cmd.output, cmd.outputTab);\n        }\n\n        m_sharedData->actions->action(act);\n        return act;\n    }\n\n    return nullptr;\n}\n\nbool MainWindow::triggerMenuCommand(const Command &command, const QString &triggeredShortcut)\n{\n    updateShortcuts();\n\n    Command cmd = command;\n    for (auto act : m_menuItem->findChildren<CommandAction*>()) {\n        if ( !act->isEnabled() || !act->isVisible() )\n            continue;\n\n        const Command &menuCommand = act->command();\n        // Ignore outputTab value overridden in the action.\n        cmd.outputTab = menuCommand.outputTab;\n        if (cmd == menuCommand) {\n            onItemCommandActionTriggered(act, triggeredShortcut);\n            return true;\n        }\n    }\n    return false;\n}\n\nvoid MainWindow::runInternalAction(Action *action)\n{\n    m_sharedData->actions->internalAction(action);\n}\n\nbool MainWindow::isInternalActionId(int id) const\n{\n    return id != -1 && m_sharedData->actions->isInternalActionId(id);\n}\n\nvoid MainWindow::openNewTabDialog(const QString &name)\n{\n    auto d = new TabDialog(TabDialog::TabNew, this);\n    d->setAttribute(Qt::WA_DeleteOnClose, true);\n    d->setTabs(ui->tabWidget->tabs());\n\n    d->setTabName(name);\n\n    connect( d, &TabDialog::newTabNameAccepted,\n             this, &MainWindow::addAndFocusTab );\n\n    d->open();\n}\n\nvoid MainWindow::openNewTabDialog()\n{\n    QString tabPath = ui->tabWidget->getCurrentTabPath();\n    if ( ui->tabWidget->isTabGroup(tabPath) )\n        tabPath.append('/');\n\n    openNewTabDialog(tabPath);\n}\n\nvoid MainWindow::openRenameTabGroupDialog(const QString &name)\n{\n    auto d = new TabDialog(TabDialog::TabGroupRename, this);\n    d->setAttribute(Qt::WA_DeleteOnClose, true);\n    d->setTabs(ui->tabWidget->tabs());\n    d->setTabGroupName(name);\n\n    connect( d, &TabDialog::treeTabNameAccepted,\n             this, &MainWindow::renameTabGroup );\n\n    d->open();\n}\n\nvoid MainWindow::renameTabGroup(const QString &newName, const QString &oldName)\n{\n    const QStringList tabs = ui->tabWidget->tabs();\n    const QString tabPrefix = oldName + '/';\n\n    for ( int i = 0; i < tabs.size(); ++i ) {\n        const QString &tab = tabs[i];\n        if ( tab == oldName || tab.startsWith(tabPrefix) )\n            renameTab( newName + tab.mid(oldName.size()), i );\n    }\n}\n\nvoid MainWindow::openRenameTabDialog(int tabIndex)\n{\n    auto d = new TabDialog(TabDialog::TabRename, this);\n    d->setAttribute(Qt::WA_DeleteOnClose, true);\n    d->setTabIndex(tabIndex);\n    d->setTabs(ui->tabWidget->tabs());\n    d->setTabName( getPlaceholder(tabIndex)->tabName() );\n\n    connect( d, &TabDialog::barTabNameAccepted,\n             this, &MainWindow::renameTab );\n\n    d->open();\n}\n\nvoid MainWindow::openRenameTabDialog()\n{\n    const int tabIndex = ui->tabWidget->currentIndex();\n    if (tabIndex >= 0)\n        openRenameTabDialog(tabIndex);\n}\n\nvoid MainWindow::renameTab(const QString &name, int tabIndex)\n{\n    if ( name.isEmpty() || ui->tabWidget->tabs().contains(name) )\n        return;\n\n    auto placeholder = getPlaceholder(tabIndex);\n    if (!placeholder)\n        return;\n\n    AppConfig appConfig;\n    Tabs tabs;\n    if ( !updateTabName(placeholder, name, &appConfig, &tabs) )\n        return;\n\n    ui->tabWidget->setTabName(tabIndex, name);\n\n    const QStringList tabNames = ui->tabWidget->tabs();\n    tabs.save(&appConfig.settings(), tabNames);\n    appConfig.setOption(Config::tabs::name(), tabNames);\n}\n\nvoid MainWindow::removeTabGroup(const QString &name)\n{\n    int answer = QMessageBox::question(\n                this,\n                tr(\"Remove All Tabs in Group?\"),\n                tr(\"Do you want to remove <strong>all tabs</strong> in group <strong>%1</strong>?\"\n                   ).arg(name),\n                QMessageBox::Yes | QMessageBox::No,\n                QMessageBox::Yes);\n    if (answer == QMessageBox::Yes) {\n        ui->tabWidget->setCurrentIndex(0);\n        const QStringList tabs = ui->tabWidget->tabs();\n        const QString tabPrefix = name + '/';\n        const int currentTabIndex = ui->tabWidget->currentIndex();\n\n        for ( int i = tabs.size() - 1; i >= 0; --i ) {\n            const QString &tab = tabs[i];\n            if ( tab == name || tab.startsWith(tabPrefix) ) {\n                if (currentTabIndex == i)\n                    ui->tabWidget->setCurrentIndex(0);\n\n                auto placeholder = getPlaceholder(i);\n                placeholder->removeItems();\n                placeholder->deleteLater();\n\n                ui->tabWidget->removeTab(i);\n            }\n        }\n\n        saveTabPositions();\n    }\n}\n\nvoid MainWindow::removeTab()\n{\n    removeTab(true, ui->tabWidget->currentIndex());\n}\n\nvoid MainWindow::removeTab(bool ask, int tabIndex)\n{\n    if (tabIndex < 0)\n        return;\n\n    TabWidget *w = ui->tabWidget;\n\n    auto placeholder = getPlaceholder(tabIndex);\n\n    if ( placeholder != nullptr && w->count() > 1 ) {\n        int answer = QMessageBox::Yes;\n        if (ask) {\n            answer = QMessageBox::question(\n                        this,\n                        tr(\"Remove Tab?\"),\n                        tr(\"Do you want to remove tab <strong>%1</strong>?\"\n                           ).arg( w->tabName(tabIndex).remove('&') ),\n                        QMessageBox::Yes | QMessageBox::No,\n                        QMessageBox::Yes);\n        }\n        if (answer == QMessageBox::Yes) {\n            placeholder->removeItems();\n            placeholder->deleteLater();\n            w->removeTab(tabIndex);\n            saveTabPositions();\n        }\n    }\n}\n\nvoid MainWindow::setTabIcon()\n{\n    if ( ui->tabWidget->isTabGroupSelected() )\n        setTabIcon( ui->tabWidget->getCurrentTabPath() );\n    else\n        setTabIcon( getPlaceholder()->tabName() );\n}\n\nvoid MainWindow::setTabIcon(const QString &tabName)\n{\n    IconSelectDialog dialog( getIconNameForTabName(tabName), this );\n\n    if ( dialog.exec() == QDialog::Accepted )\n        setTabIcon(tabName, dialog.selectedIcon());\n}\n\nvoid MainWindow::setTabIcon(const QString &tabName, const QString &icon)\n{\n    if ( tabs().contains(tabName) || ui->tabWidget->isTabGroup(tabName) ) {\n        setIconNameForTabName(tabName, icon);\n        ui->tabWidget->setTabIcon(tabName, icon);\n    }\n}\n\nbool MainWindow::unloadTab(const QString &tabName)\n{\n    ClipboardBrowserPlaceholder *placeholder = getPlaceholder(tabName);\n    return !placeholder || placeholder->expire();\n}\n\nvoid MainWindow::forceUnloadTab(const QString &tabName)\n{\n    ClipboardBrowserPlaceholder *placeholder = getPlaceholder(tabName);\n    if (!placeholder)\n        return;\n\n    placeholder->unloadBrowser();\n\n    placeholder->createLoadButton();\n}\n\nMainWindow::~MainWindow()\n{\n    delete ui;\n}\n\n#include \"mainwindow.moc\"\n"
  },
  {
    "path": "src/gui/mainwindow.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n#include \"common/command.h\"\n#include \"common/navigationstyle.h\"\n#include \"gui/clipboardbrowsershared.h\"\n#include \"gui/menuitems.h\"\n#include \"item/persistentdisplayitem.h\"\n\n#include \"platform/platformnativeinterface.h\"\n\n#include <QMainWindow>\n#include <QPersistentModelIndex>\n#include <QPointer>\n#include <QTimer>\n#include <QtContainerFwd>\n\nenum class PasswordSource;\nclass Action;\nclass ActionDialog;\nclass AppConfig;\nclass ClipboardBrowser;\nclass ClipboardBrowserPlaceholder;\nclass CommandAction;\nclass CommandDialog;\nclass ConfigurationManager;\nclass Notification;\nclass QAction;\nclass QMimeData;\nclass SystemTrayIcon;\nclass Tabs;\nclass Theme;\nclass TrayMenu;\nclass ToolBar;\nclass QModelIndex;\nstruct NotificationButton;\n\nQ_DECLARE_METATYPE(QPersistentModelIndex)\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nusing NativeEventResult = qintptr;\n#else\nQ_DECLARE_METATYPE(QList<QPersistentModelIndex>)\nusing NativeEventResult = long;\n#endif\n\nnamespace Ui\n{\n    class MainWindow;\n}\n\nnamespace Encryption {\n    class EncryptionKey;\n}\n\nenum ItemActivationCommand {\n    ActivateNoCommand = 0x0,\n    ActivateCloses = 0x1,\n    ActivateFocuses = 0x2,\n    ActivatePastes = 0x4\n};\n\nenum class ImportOptions {\n    /// Select what to import/export in dialog.\n    Select,\n    /// Import/export everything without asking.\n    All\n};\n\nstruct ImportSelection {\n    QStringList tabs;\n    QVariantMap configuration;\n    QVariantList commands;\n};\n\nstruct MainWindowOptions {\n    bool activateCloses() const { return itemActivationCommands & ActivateCloses; }\n    bool activateFocuses() const { return itemActivationCommands & ActivateFocuses; }\n    bool activatePastes() const { return itemActivationCommands & ActivatePastes; }\n\n    bool confirmExit = true;\n    NavigationStyle navigationStyle = NavigationStyle::Default;\n    bool trayCommands = false;\n    bool trayCurrentTab = false;\n    QString trayTabName;\n    int trayItems = 5;\n    bool nativeTrayMenu = false;\n    bool trayImages = true;\n    bool trayMenuOpenOnLeftClick = false;\n    int transparency = 0;\n    int transparencyFocused = 0;\n\n    bool hideTabs = false;\n\n    bool hideMainWindow = false;\n    bool closeOnUnfocus = false;\n\n    int itemActivationCommands = ActivateCloses;\n\n    bool clearFirstTab = false;\n\n    bool trayItemPaste = true;\n\n    QString clipboardTab;\n};\n\n/**\n * Application's main window.\n *\n * Contains search bar and tab widget.\n * Each tab contains one clipboard browser widget.\n *\n * It operates in two modes:\n *  * browse mode with search bar hidden and empty (default) and\n *  * search mode with search bar shown and not empty.\n *\n * If user starts typing text the search mode will become active and\n * the search bar focused.\n * If the text is deleted or escape pressed the browse mode will become active.\n */\nclass MainWindow final : public QMainWindow\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList copyqStats READ copyqStats CONSTANT)\n\npublic:\n    explicit MainWindow(\n        const ClipboardBrowserSharedPtr &sharedData, QWidget *parent = nullptr);\n\n    ~MainWindow();\n\n    /** Return true if in browse mode (i.e. search field is hidden). */\n    bool browseMode() const;\n\n    /**\n     * Try to close command dialog and return true on success.\n     *\n     * Note that dialog won't be closed if it has unsaved changes\n     * and user cancels the closing.\n     */\n    bool maybeCloseCommandDialog();\n\n    /**\n     * Return browser widget in given tab @a index.\n     * Load items if not loaded yet.\n     */\n    ClipboardBrowser *browser(int index);\n\n    /**\n     * Return browser widget in current tab.\n     * Load items if not loaded yet.\n     */\n    ClipboardBrowser *browser();\n\n    /**\n     * Return browser widget in current tab or nullptr if not loaded.\n     */\n    ClipboardBrowser *browserOrNull();\n\n    /** Return browser containing item or nullptr. */\n    ClipboardBrowser *browserForItem(const QModelIndex &index);\n\n    /**\n     * Find tab with given @a name.\n     * @return found tab index or -1\n     */\n    int findTabIndex(const QString &name);\n\n    /**\n     * Tries to find tab with exact or similar name (ignores\n     * key hints '&') or creates new one.\n     * @return Existing or new tab with given @a name.\n     */\n    ClipboardBrowser *tab(\n            const QString &name //!< Name of the new tab.\n            );\n\n    /**\n     * Show/hide tray menu. Return true only if menu is shown.\n     */\n    bool toggleMenu();\n    bool toggleMenu(const QString &tabName, int itemCount, QPoint position);\n\n    /** Switch between browse and search mode. */\n    void enterBrowseMode();\n\n    void enterSearchMode();\n\n    void enterSearchMode(const QString &txt);\n\n    /** Show and focus main window. */\n    void showWindow();\n    /** Hide window to tray or minimize if tray is not available. */\n    void hideWindow();\n    /** Minimize window (hide if option is set). */\n    void minimizeWindow();\n    /** Set current tab. */\n    bool setCurrentTab(int index);\n\n    bool focusPrevious();\n\n    /** Open tab group renaming dialog. */\n    void openRenameTabGroupDialog(const QString &name);\n    /** Remove all tab in group. */\n    void removeTabGroup(const QString &name);\n    /** Remove tab. */\n    void removeTab(\n            bool ask, //!< Ask before removing.\n            int tabIndex //!< Tab index or current tab.\n            );\n    /** Set icon for tab or tab group. */\n    void setTabIcon(const QString &tabName);\n\n    void setTabIcon(const QString &tabName, const QString &icon);\n\n    bool unloadTab(const QString &tabName);\n    void forceUnloadTab(const QString &tabName);\n\n    /**\n     * Save all items in tab to file.\n     * @return True only if all items were successfully saved.\n     */\n    bool saveTab(\n            const QString &fileName,\n            int tabIndex = -1 //!< Tab index or current tab.\n            );\n\n    /** Save all unsaved tabs. */\n    Q_SLOT void saveTabs();\n\n    /**\n     * Load saved items to new tab.\n     * @return True only if all items were successfully loaded.\n     */\n    bool loadTab(const QString &fileName);\n\n    /**\n     * Import tabs, settings etc.\n     * @return True only if all data were successfully loaded.\n     */\n    bool importDataFrom(const QString &fileName, ImportOptions options);\n\n    /**\n     * Export tabs, settings etc.\n     * @return True only if all data were successfully saved.\n     */\n    bool exportAllData(const QString &fileName);\n\n    /** Temporarily disable monitoring (i.e. adding new clipboard content to the first tab). */\n    void disableClipboardStoring(bool disable);\n\n    /** Return true only if monitoring is enabled. */\n    bool isMonitoringEnabled() const;\n\n    QStringList tabs() const;\n\n    /// Used by config() command.\n    QVariant config(const QVariantList &nameValue);\n    QString configDescription();\n\n    QVariantMap actionData(int id) const;\n    void setActionData(int id, const QVariantMap &data);\n\n    void setCommands(const QVector<Command> &commands);\n\n    void setSessionIconColor(QColor color);\n\n    void setSessionIconTag(const QString &tag);\n\n    void setSessionIconTagColor(QColor color);\n\n    QColor sessionIconColor() const;\n\n    QString sessionIconTag() const;\n\n    QColor sessionIconTagColor() const;\n\n    void setTrayTooltip(const QString &tooltip);\n\n    bool setMenuItemEnabled(int actionId, int currentRun, int menuItemMatchCommandIndex, const QVariantMap &menuItem);\n\n    QVariantMap setDisplayData(int actionId, const QVariantMap &data);\n\n    QVector<Command> automaticCommands() const { return m_automaticCommands; }\n    QVector<Command> displayCommands() const { return m_displayCommands; }\n    QVector<Command> scriptCommands() const { return m_scriptCommands; }\n    QStringList copyqStats() const;\n\n    /** Close main window and exit the application. */\n    void exit();\n\n    /** Load settings. */\n    void loadSettings(QSettings &settings, AppConfig *appConfig);\n\n    void loadTheme(const QSettings &themeSettings);\n\n    /** Open help. */\n    void openHelp();\n\n    /** Open log dialog. */\n    void openLogDialog();\n\n    /** Open about dialog. */\n    void openAboutDialog();\n\n    /** Open dialog with clipboard content. */\n    void showClipboardContent();\n\n    /** Open dialog with active commands. */\n    void showProcessManagerDialog();\n\n    /** Open action dialog with given input data. */\n    ActionDialog *openActionDialog(const QVariantMap &data);\n\n    /** Open action dialog with input data from selected items. */\n    void openActionDialog();\n\n    void showItemContent();\n\n    /** Open preferences dialog. */\n    void openPreferences();\n\n    /** Open commands dialog. */\n    void openCommands();\n\n    /** Sort selected items. */\n    void sortSelectedItems();\n    /** Reverse order of selected items. */\n    void reverseSelectedItems();\n\n    /**\n     * Import tabs, settings etc. (select file in dialog).\n     * @return True only if all data were successfully loaded.\n     */\n    bool importData();\n\n    /** Create new item in current tab. */\n    void editNewItem();\n    /** Paste items to current tab. */\n    void pasteItems();\n    /** Copy selected items in current tab. */\n    void copyItems();\n\n    /** Activate current item. */\n    void activateCurrentItem();\n\n    /** Show window and given tab and give focus to the tab. */\n    void showBrowser(const ClipboardBrowser *browser);\n\n    /** Show error popup message. */\n    void showError(const QString &msg);\n\n    Notification *createNotification(const QString &id = QString());\n\n    /** Open command dialog and add commands. */\n    void addCommands(const QVector<Command> &commands);\n\n    /** Execute command on given input data. */\n    Action *action(\n            const QVariantMap &data,\n            const Command &cmd,\n            const QModelIndex &outputIndex);\n\n    bool triggerMenuCommand(const Command &command, const QString &triggeredShortcut);\n\n    void runInternalAction(Action *action);\n    bool isInternalActionId(int id) const;\n\n    void setClipboard(const QVariantMap &data);\n    void setClipboard(const QVariantMap &data, ClipboardMode mode);\n    void setClipboardAndSelection(const QVariantMap &data);\n    bool registerClipboardProviderAction(int actionId, ClipboardMode mode);\n    void moveToClipboard(ClipboardBrowser *c, int row);\n\n    const QMimeData *getClipboardData(ClipboardMode mode);\n\n    /** Show/hide main window. Return true only if window is shown. */\n    bool toggleVisible();\n\n    /**\n     * Like toggleVisible() but hide window if visible and not focused, which\n     * seems more reasonable when using mouse.\n     */\n    void toggleVisibleFromTray();\n\n    /** Set icon for current tab or tab group. */\n    void setTabIcon();\n\n    /** Open tab creation dialog. */\n    void openNewTabDialog(const QString &name);\n    void openNewTabDialog();\n\n    /** Remove tab. */\n    void removeTab();\n\n    /** Rename current tab to given name (if possible). */\n    void renameTabGroup(const QString &newName, const QString &oldName);\n    /** Open tab renaming dialog (for given tab index or current tab). */\n    void openRenameTabDialog(int tabIndex);\n    void openRenameTabDialog();\n    /** Rename current tab to given name (if possible). */\n    void renameTab(const QString &name, int tabIndex);\n\n    void addAndFocusTab(const QString &name);\n\n    /** Toggle monitoring (i.e. adding new clipboard content to the first tab). */\n    void toggleClipboardStoring();\n\n    /**\n     * Export tabs, settings etc. (select in file dialog).\n     * @return True only if all data were successfully saved.\n     */\n    bool exportData();\n\n    /** Set next or first tab as current. */\n    void nextTab();\n    /** Set previous or last tab as current. */\n    void previousTab();\n\n    void setClipboardData(const QVariantMap &data);\n\n    /** Set text for filtering items. */\n    void setFilter(const QString &text);\n    QString filter() const;\n\n    void updateShortcuts();\n\n    void setItemPreviewVisible(bool visible);\n    bool isItemPreviewVisible() const;\n\n    void setScriptOverrides(const QVector<int> &overrides, int actionId);\n    bool isScriptOverridden(int id) const;\n\n    QVariant callPlugin(const QVariantList &arguments);\n\nsignals:\n    /** Request clipboard change. */\n    void changeClipboard(const QVariantMap &data, ClipboardMode mode);\n\n    void tabGroupSelected(bool selected);\n\n    void requestExit();\n\n    void commandsSaved(const QVector<Command> &commands);\n\n    void configurationChanged(AppConfig *appConfig);\n\n    void disableClipboardStoringRequest(bool disable);\n\n    void sendActionData(int actionId, const QByteArray &bytes);\n\n    void stopAction(int actionId);\n\n    void clipboardTabChanged();\n\nprotected:\n    bool eventFilter(QObject *object, QEvent *ev) override;\n    void keyPressEvent(QKeyEvent *event) override;\n    void keyReleaseEvent(QKeyEvent *event) override;\n    bool event(QEvent *event) override;\n\n    /** Hide (minimize to tray) window on close. */\n    void closeEvent(QCloseEvent *event) override;\n\n    bool focusNextPrevChild(bool next) override;\n\n    bool nativeEvent(\n        const QByteArray &eventType, void *message, NativeEventResult *result) override;\n\nprivate:\n    ClipboardBrowserPlaceholder *getPlaceholderForMenu();\n    ClipboardBrowserPlaceholder *getPlaceholderForTrayMenu();\n    void filterMenuItems(const QString &searchText);\n    void filterTrayMenuItems(const QString &searchText);\n    void trayActivated(int reason);\n    void onMenuActionTriggered(const QVariantMap &data, bool omitPaste);\n    void onTrayActionTriggered(const QVariantMap &data, bool omitPaste);\n    void findNextOrPrevious();\n    void tabChanged(int current, int previous);\n    void saveTabPositions();\n    void onSaveTabPositionsTimer();\n    void doSaveTabPositions(AppConfig *appConfig);\n    void tabsMoved(const QString &oldPrefix, const QString &newPrefix);\n    void tabBarMenuRequested(QPoint pos, int tab);\n    void tabTreeMenuRequested(QPoint pos, const QString &groupPath);\n    void tabCloseRequested(int tab);\n    void onFilterChanged();\n\n    void raiseLastWindowAfterMenuClosed();\n\n    /** Update WId for paste and last focused window if needed. */\n    void updateFocusWindows();\n\n    /** Update tray and window icon depending on current state. */\n    void updateIcon();\n\n    void updateContextMenuTimeout();\n\n    void updateTrayMenuItemsTimeout();\n    void initTrayMenuItems();\n\n    void updateItemPreviewAfterMs(int ms);\n\n    void updateItemPreviewTimeout();\n\n    void toggleItemPreviewVisible();\n\n    void onAboutToQuit();\n\n    void onItemCommandActionTriggered(CommandAction *commandAction, const QString &triggeredShortcut);\n    void onClipboardCommandActionTriggered(CommandAction *commandAction, const QString &triggeredShortcut);\n\n    void onTabWidgetDropItems(const QString &tabName, const QMimeData *data, bool *accepted);\n\n    void showContextMenuAt(QPoint position);\n\n    void showContextMenu();\n\n    void moveUp();\n    void moveDown();\n    void moveToTop();\n    void moveToBottom();\n\n    void onBrowserCreated(ClipboardBrowser *browser);\n    void onBrowserLoaded(ClipboardBrowser *browser);\n    void onBrowserDestroyed(ClipboardBrowserPlaceholder *placeholder);\n\n    void onItemSelectionChanged(const ClipboardBrowser *browser);\n    void onItemsChanged(const ClipboardBrowser *browser);\n    void onInternalEditorStateChanged(const ClipboardBrowser *self);\n\n    void onItemWidgetCreated(const PersistentDisplayItem &item);\n\n    void onActionDialogAccepted(const Command &command, const QStringList &arguments, const QVariantMap &data);\n\n    void onSearchShowRequest(const QString &text);\n\n    void updateEnabledCommands();\n\n    void updateCommands(QVector<Command> allCommands, bool forceSave);\n    bool syncInternalCommands(QVector<Command> *allCommands);\n\n    void disableHideWindowOnUnfocus();\n    void enableHideWindowOnUnfocus();\n    void hideWindowIfNotActive();\n    void hideWindowOnUnfocus(int intervalMsec);\n\n    template <typename SlotReturnType>\n    using MainWindowActionSlot = SlotReturnType (MainWindow::*)();\n\n    enum TabNameMatching {\n        MatchExactTabName,\n        MatchSimilarTabName\n    };\n\n    struct MenuMatchCommands {\n        int currentRun = 0;\n        int actionId = -1;\n        QStringList matchCommands;\n        QVector< QPointer<QAction> > actions;\n        QMenu *menu = nullptr;\n    };\n\n    void runDisplayCommands();\n\n    void clearHiddenDisplayData();\n\n    void reloadBrowsers();\n\n    ClipboardBrowserPlaceholder *createTab(const QString &name, TabNameMatching nameMatch, const Tabs &tabs);\n\n    int findTabIndexExactMatch(const QString &name);\n\n    /** Create menu bar and tray menu with items. Called once. */\n    void createMenu();\n\n    /** Create context menu for @a tab. It will be automatically deleted after closed. */\n    void popupTabBarMenu(QPoint pos, const QString &tab);\n\n    void updateContextMenu(int intervalMsec);\n\n    void updateTrayMenuItems();\n    void updateTrayMenuCommands();\n\n    void updateWindowTransparency(bool mouseOver = false);\n\n    /** Return browser widget in given tab @a index. */\n    ClipboardBrowserPlaceholder *getPlaceholder(int index) const;\n\n    ClipboardBrowserPlaceholder *getPlaceholder(const QString &tabName) const;\n\n    /** Return browser widget in current tab. */\n    ClipboardBrowserPlaceholder *getPlaceholder() const;\n\n    /** Call updateFocusWindows() after a small delay if main window or menu is not active. */\n    void delayedUpdateForeignFocusWindows();\n\n    /** Show/hide tab bar. **/\n    void setHideTabs(bool hide);\n\n    /**\n     * Return true if window should be minimized instead of closed/hidden.\n     *\n     * If tray icon is not available, window should be minimized so that it can be opened with\n     * mouse.\n     */\n    bool closeMinimizes() const;\n\n    template <typename SlotReturnType>\n    QAction *createAction(Actions::Id id, MainWindowActionSlot<SlotReturnType> slot, QMenu *menu, QWidget *parent = nullptr);\n\n    QAction *addTrayAction(Actions::Id id);\n\n    template <typename Receiver, typename ReturnType>\n    QAction *addItemAction(Actions::Id id, Receiver *receiver, ReturnType (Receiver::* slot)());\n\n    QVector<Command> commandsForMenu(const QVariantMap &data, const QString &tabName, const QVector<Command> &allCommands);\n    void addCommandsToItemMenu(ClipboardBrowser *c);\n    void addCommandsToTrayMenu(const QVariantMap &clipboardData, QList<QAction*> *actions);\n    void addMenuMatchCommand(MenuMatchCommands *menuMatchCommands, const QString &matchCommand, QAction *act);\n    void runMenuCommandFilters(MenuMatchCommands *menuMatchCommands, QVariantMap &data);\n    void interruptMenuCommandFilters(MenuMatchCommands *menuMatchCommands);\n    void stopMenuCommandFilters(MenuMatchCommands *menuMatchCommands);\n\n    bool abortAction(int &actionId, int waitMs = 0, int terminateAfterMs = 5000, int killAfterMs = 5000);\n\n    bool isItemMenuDefaultActionValid() const;\n\n    void updateToolBar();\n\n    void setTrayEnabled(bool enable = true);\n\n    void runDisplayCommand(const Command &command);\n\n    bool isWindowVisible() const;\n\n    void onEscape();\n\n    void updateActionShortcuts();\n\n    QAction *actionForMenuItem(Actions::Id id, QWidget *parent, Qt::ShortcutContext context);\n\n    void addMenuItems(TrayMenu *menu, ClipboardBrowserPlaceholder *placeholder, int maxItemCount, const QString &searchText);\n    void activateMenuItem(ClipboardBrowserPlaceholder *placeholder, const QVariantMap &data, bool omitPaste);\n    bool toggleMenu(TrayMenu *menu, QPoint pos);\n    bool toggleMenu(TrayMenu *menu);\n\n    bool exportDataFrom(const QString &fileName, const QStringList &tabs, bool exportConfiguration, bool exportCommands, const Encryption::EncryptionKey &encryptionKey);\n    bool exportDataV4(QDataStream *out, const QStringList &tabs, bool exportConfiguration, bool exportCommands);\n    bool exportDataV5(QDataStream *out, const QStringList &tabs, bool exportConfiguration, bool exportCommands, const Encryption::EncryptionKey &encryptionKey);\n    QVariantMap exportTabData(const QString &tab, bool *ok);\n\n    bool canImport(const ImportSelection &importSelection);\n    void importSelected(const ImportSelection &importSelection);\n    bool importDataV2(QDataStream *in);\n    bool importDataV3(QDataStream *in, ImportOptions options);\n    bool importDataV4(QDataStream *in, ImportOptions options);\n    bool importDataV5(QDataStream *in, ImportOptions options);\n    bool importTabData(\n        const QString &requestedTabName,\n        const QVariantMap &tabMap,\n        const Tabs &tabProps,\n        const Encryption::EncryptionKey &key);\n\n    const Theme &theme() const;\n\n    Action *runScript(const QString &script, const QVariantMap &data = QVariantMap());\n    bool runEventHandlerScript(const QString &script, const QVariantMap &data);\n    void runItemHandlerScript(\n        const QString &script, const ClipboardBrowser *browser, int firstRow, int lastRow);\n\n    void activateCurrentItemHelper();\n    void onItemClicked();\n    void onItemDoubleClicked();\n\n    void promptForEncryptionPasswordIfNeeded(AppConfig *appConfig);\n    void reencryptTabsIfNeeded(AppConfig *appConfig);\n    void reencryptTabsIfNeededHelper(AppConfig *appConfig);\n\n    /**\n     * Update tab name in placeholder and configuration.\n     * Return true on success, false if setting tab name in placeholder failed\n     * (most likely failure to move the tab data).\n     */\n    bool updateTabName(\n        ClipboardBrowserPlaceholder *placeholder,\n        const QString &newName,\n        AppConfig *appConfig,\n        Tabs *tabs);\n\n    ConfigurationManager *cm;\n    Ui::MainWindow *ui;\n\n    QMenu *m_menuItem;\n    TrayMenu *m_trayMenu;\n\n    SystemTrayIcon *m_tray;\n\n    ToolBar *m_toolBar;\n\n    MainWindowOptions m_options;\n\n    bool m_clipboardStoringDisabled = false;\n\n    ClipboardBrowserSharedPtr m_sharedData;\n    bool m_wasEncrypted = false;\n    bool m_reencrypting = false;\n\n    QVector<Command> m_automaticCommands;\n    QVector<Command> m_displayCommands;\n    QVector<Command> m_menuCommands;\n    QVector<Command> m_trayMenuCommands;\n    QVector<Command> m_scriptCommands;\n\n    PlatformWindowPtr m_windowForMenuPaste;\n    PlatformWindowPtr m_windowForMainPaste;\n\n    QTimer m_timerUpdateFocusWindows;\n    QTimer m_timerUpdateContextMenu;\n    QTimer m_timerUpdatePreview;\n    QTimer m_timerSaveTabPositions;\n    QTimer m_timerHideWindowIfNotActive;\n    QTimer m_timerRaiseLastWindowAfterMenuClosed;\n\n    bool m_trayMenuDirty = true;\n\n    QVariantMap m_clipboardData;\n\n    TrayMenu *m_menu;\n    QString m_menuTabName;\n    int m_menuMaxItemCount;\n\n    QPointer<CommandDialog> m_commandDialog;\n\n    bool m_wasMaximized = false;\n\n    bool m_showItemPreview = false;\n\n    bool m_activatingItem = false;\n\n    QVector< QPointer<QAction> > m_actions;\n\n    QList<PersistentDisplayItem> m_displayItemList;\n    PersistentDisplayItem m_currentDisplayItem;\n    int m_displayActionId = -1;\n\n    MenuMatchCommands m_trayMenuMatchCommands;\n    MenuMatchCommands m_itemMenuMatchCommands;\n\n    PlatformClipboardPtr m_clipboard;\n\n    bool m_isActiveWindow = false;\n    bool m_singleClickActivate = 0;\n    bool m_enteringSearchMode = false;\n\n    QVector<int> m_overrides;\n    int m_maxEventHandlerScripts = 10;\n    QPointer<Action> m_actionCollectOverrides;\n\n    int m_provideClipboardActionId = -1;\n    int m_provideSelectionActionId = -1;\n\n    bool m_usedKeyStore = false;\n};\n"
  },
  {
    "path": "src/gui/menuitems.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"menuitems.h\"\n\n#include \"common/shortcuts.h\"\n#include \"gui/icons.h\"\n\n#include <QStringList>\n#include <QVector>\n\nnamespace {\n\nvoid addMenuItem(\n        MenuItems &items, Actions::Id id, const QString &text, const QString &settingsKey,\n        const QKeySequence &shortcut, const QString &iconName, ushort iconId = 0)\n{\n    Q_ASSERT(items[id].text.isEmpty() && \"Menu item index must be same as its ID.\");\n    Q_UNUSED(id)\n\n    MenuItem &item = items[id];\n    item.text = text;\n    item.settingsKey = settingsKey;\n    item.defaultShortcut = shortcut;\n    item.shortcuts = QList<QKeySequence>() << shortcut;\n    item.iconName = iconName;\n    item.iconId = iconId;\n}\n\nvoid addMenuItem(\n        MenuItems &items, Actions::Id id, const QString &text, const QString &settingsKey,\n        const QString &shortcutText, const QString &iconName, ushort iconId = 0)\n{\n    const QKeySequence shortcut = QKeySequence(shortcutText, QKeySequence::NativeText);\n    addMenuItem(items, id, text, settingsKey, shortcut, iconName, iconId);\n}\n\n} // namespace\n\nMenuItems menuItems()\n{\n    MenuItems items;\n    addMenuItem( items, Actions::File_New, QObject::tr(\"&New Item\"), QStringLiteral(\"new\"), QKeySequence::New,\n                  QStringLiteral(\"document-new\"), IconFileLines );\n    addMenuItem( items, Actions::File_Import, QObject::tr(\"&Import...\"), QStringLiteral(\"import\"), QObject::tr(\"Ctrl+Shift+I\"),\n                  QStringLiteral(\"document-open\"), IconFolderOpen );\n    addMenuItem( items, Actions::File_Export, QObject::tr(\"&Export...\"), QStringLiteral(\"export\"), QKeySequence::Save,\n                  QStringLiteral(\"document-save\"), IconFloppyDisk );\n    addMenuItem( items, Actions::File_Preferences, QObject::tr(\"&Preferences...\"), QStringLiteral(\"preferences\"), QObject::tr(\"Ctrl+P\"),\n                  QStringLiteral(\"preferences-other\"), IconWrench );\n    addMenuItem( items, Actions::File_Commands,\n                  QObject::tr(\"C&ommands...\"),\n                  QStringLiteral(\"commands\"), QObject::tr(\"F6\"), QStringLiteral(\"system-run\"), IconGear );\n\n    addMenuItem( items, Actions::File_ShowClipboardContent, QObject::tr(\"Show &Clipboard Content\"),\n                  QStringLiteral(\"show_clipboard_content\"), QObject::tr(\"Ctrl+Shift+C\"), QStringLiteral(\"dialog-information\"), IconPaste );\n    addMenuItem( items, Actions::File_ShowPreview, QObject::tr(\"&Show Preview\"),\n                 QStringLiteral(\"show_item_preview\"), QObject::tr(\"F7\"), QStringLiteral(\"document-print-preview\"), IconEye );\n    addMenuItem( items, Actions::File_ToggleClipboardStoring, QObject::tr(\"&Toggle Clipboard Storing\"),\n                  QStringLiteral(\"toggle_clipboard_storing\"), QObject::tr(\"Ctrl+Shift+X\"), QStringLiteral(\"\"), IconBan );\n    addMenuItem( items, Actions::File_ProcessManager, QObject::tr(\"P&rocess Manager\"),\n                  QStringLiteral(\"process_manager\"), QObject::tr(\"Ctrl+Shift+Z\"), QStringLiteral(\"system-search\"), IconGears );\n    addMenuItem( items, Actions::File_Exit, QObject::tr(\"E&xit\"), QStringLiteral(\"exit\"), QObject::tr(\"Ctrl+Q\"),\n                  QStringLiteral(\"application-exit\"), IconPowerOff );\n\n    addMenuItem( items, Actions::Edit_SortSelectedItems, QObject::tr(\"&Sort Selected Items\"),\n                  QStringLiteral(\"sort_selected_items\"), QObject::tr(\"Ctrl+Shift+S\"),\n                  QStringLiteral(\"view-sort-ascending\"), IconArrowDownAZ );\n    addMenuItem( items, Actions::Edit_ReverseSelectedItems, QObject::tr(\"&Reverse Selected Items\"),\n                  QStringLiteral(\"reverse_selected_items\"), QObject::tr(\"Ctrl+Shift+R\"),\n                  QStringLiteral(\"view-sort-descending\"), IconArrowUpAZ );\n    addMenuItem( items, Actions::Edit_PasteItems, QObject::tr(\"&Paste Items\"),\n                  QStringLiteral(\"paste_selected_items\"), QKeySequence::Paste, QStringLiteral(\"edit-paste\"), IconPaste );\n    addMenuItem( items, Actions::Edit_CopySelectedItems, QObject::tr(\"&Copy Selected Items\"),\n                  QStringLiteral(\"copy_selected_items\"), QKeySequence::Copy, QStringLiteral(\"edit-copy\"), IconCopy );\n    addMenuItem( items, Actions::Edit_FindItems, QObject::tr(\"&Find\"),\n                  QStringLiteral(\"find_items\"), QKeySequence::FindNext, QStringLiteral(\"edit-find\"), IconMagnifyingGlass );\n\n    addMenuItem(items, Actions::Editor_Save, QObject::tr(\"Save Item\"),\n                QStringLiteral(\"editor_save\"), QObject::tr(\"F2\", \"Shortcut to save item editor changes\"), QStringLiteral(\"document-save\"), IconFloppyDisk);\n    addMenuItem(items, Actions::Editor_Cancel, QObject::tr(\"Cancel Editing\"),\n                QStringLiteral(\"editor_cancel\"), QObject::tr(\"Escape\", \"Shortcut to revert item editor changes\"), QStringLiteral(\"document-revert\"), IconTrash);\n    addMenuItem(items, Actions::Editor_Undo, QObject::tr(\"Undo\"),\n                QStringLiteral(\"editor_undo\"), QKeySequence::Undo, QStringLiteral(\"edit-undo\"), IconRotateLeft);\n    addMenuItem(items, Actions::Editor_Redo, QObject::tr(\"Redo\"),\n                QStringLiteral(\"editor_redo\"), QKeySequence::Redo, QStringLiteral(\"edit-redo\"), IconRotateRight);\n    addMenuItem(items, Actions::Editor_Font, QObject::tr(\"Font\"),\n                QStringLiteral(\"editor_font\"), QKeySequence(), QStringLiteral(\"preferences-desktop-font\"), IconFont);\n    addMenuItem(items, Actions::Editor_Bold, QObject::tr(\"Bold\"),\n                QStringLiteral(\"editor_bold\"), QKeySequence::Bold, QStringLiteral(\"format-text-bold\"), IconBold);\n    addMenuItem(items, Actions::Editor_Italic, QObject::tr(\"Italic\"),\n                QStringLiteral(\"editor_italic\"), QKeySequence::Italic, QStringLiteral(\"format-text-italic\"), IconItalic);\n    addMenuItem(items, Actions::Editor_Underline, QObject::tr(\"Underline\"),\n                QStringLiteral(\"editor_underline\"), QKeySequence::Underline, QStringLiteral(\"format-text-underline\"), IconUnderline);\n    addMenuItem(items, Actions::Editor_Strikethrough, QObject::tr(\"Strikethrough\"),\n                QStringLiteral(\"editor_strikethrough\"), QKeySequence(), QStringLiteral(\"format-text-strikethrough\"), IconStrikethrough);\n    addMenuItem(items, Actions::Editor_Foreground, QObject::tr(\"Foreground\"),\n                QStringLiteral(\"editor_foreground\"), QKeySequence(), QStringLiteral(\"\"), IconPaintbrush);\n    addMenuItem(items, Actions::Editor_Background, QObject::tr(\"Background\"),\n                QStringLiteral(\"editor_background\"), QKeySequence(), QStringLiteral(\"\"), IconSquare);\n    addMenuItem(items, Actions::Editor_EraseStyle, QObject::tr(\"Erase Style\"),\n                QStringLiteral(\"editor_erase_style\"), QKeySequence(), QStringLiteral(\"\"), IconEraser);\n    addMenuItem(items, Actions::Editor_Search, QObject::tr(\"Search\"),\n                QStringLiteral(\"editor_search\"), QKeySequence::Find, QStringLiteral(\"edit-find\"), IconMagnifyingGlass);\n\n    addMenuItem( items, Actions::Item_MoveToClipboard,\n                  QObject::tr(\"A&ctivate Items\",\n                              \"copies selected items to clipboard and moves them to top (depending on settings)\"),\n                  QStringLiteral(\"move_to_clipboard\"), QKeySequence(), QStringLiteral(\"clipboard\"), IconPaste );\n    addMenuItem( items, Actions::Item_ShowContent, QObject::tr(\"&Show Content...\"),\n                  QStringLiteral(\"show_item_content\"), QObject::tr(\"F4\"), QStringLiteral(\"dialog-information\"), IconCircleInfo );\n    addMenuItem( items, Actions::Item_Remove, QObject::tr(\"&Remove\"),\n                  QStringLiteral(\"delete_item\"),  shortcutToRemove(), QStringLiteral(\"list-remove\"), IconTrash );\n    addMenuItem( items, Actions::Item_Edit, QObject::tr(\"&Edit\"), QStringLiteral(\"edit\"), QObject::tr(\"F2\"),\n                  QStringLiteral(\"accessories-text-editor\"), IconPenToSquare );\n    addMenuItem( items, Actions::Item_EditNotes, QObject::tr(\"Edit &Notes\"),\n                  QStringLiteral(\"edit_notes\"), QObject::tr(\"Shift+F2\"), QStringLiteral(\"accessories-text-editor\"), IconPenToSquare );\n    addMenuItem( items, Actions::Item_EditWithEditor, QObject::tr(\"E&dit with Editor\"),\n                  QStringLiteral(\"editor\"), QObject::tr(\"Ctrl+E\"), QStringLiteral(\"accessories-text-editor\"), IconPencil );\n    addMenuItem( items, Actions::Item_Action, QObject::tr(\"&Action...\"), QStringLiteral(\"system-run\"), QObject::tr(\"F5\"),\n                  QStringLiteral(\"action\"), IconBolt );\n\n    addMenuItem( items, Actions::Item_MoveUp, QObject::tr(\"Move Up\"),\n                  QStringLiteral(\"move_up\"),  QObject::tr(\"Ctrl+Up\"), QStringLiteral(\"go-up\"), IconAngleUp );\n    addMenuItem( items, Actions::Item_MoveDown, QObject::tr(\"Move Down\"),\n                  QStringLiteral(\"move_down\"),  QObject::tr(\"Ctrl+Down\"), QStringLiteral(\"go-down\"), IconAngleDown );\n    addMenuItem( items, Actions::Item_MoveToTop, QObject::tr(\"Move to Top\"),\n                  QStringLiteral(\"move_to_top\"),  QObject::tr(\"Ctrl+Home\"), QStringLiteral(\"go-top\"), IconAnglesUp );\n    addMenuItem( items, Actions::Item_MoveToBottom, QObject::tr(\"Move to Bottom\"),\n                  QStringLiteral(\"move_to_bottom\"),  QObject::tr(\"Ctrl+End\"), QStringLiteral(\"go-bottom\"), IconAnglesDown );\n\n    addMenuItem( items, Actions::Tabs_NewTab, QObject::tr(\"&New Tab\"),\n                  QStringLiteral(\"new_tab\"), QObject::tr(\"Ctrl+T\"), QStringLiteral(\":/images/tab_new\") );\n    addMenuItem( items, Actions::Tabs_RenameTab, QObject::tr(\"R&ename Tab\"),\n                  QStringLiteral(\"rename_tab\"), QObject::tr(\"Ctrl+F2\"), QStringLiteral(\":/images/tab_rename\") );\n    addMenuItem( items, Actions::Tabs_RemoveTab, QObject::tr(\"Re&move Tab\"),\n                  QStringLiteral(\"remove_tab\"), QObject::tr(\"Ctrl+W\"), QStringLiteral(\":/images/tab_remove\") );\n    addMenuItem( items, Actions::Tabs_ChangeTabIcon, QObject::tr(\"&Change Tab Icon\"),\n                  QStringLiteral(\"change_tab_icon\"), QObject::tr(\"Ctrl+Shift+T\"), QStringLiteral(\":/images/tab_icon\") );\n    addMenuItem( items, Actions::Tabs_NextTab, QObject::tr(\"Ne&xt Tab\"),\n                  QStringLiteral(\"next_tab\"), QObject::tr(\"Right\", \"Default shortcut to focus next tab\"),\n                  QStringLiteral(\"go-next\"), IconArrowRight );\n    addMenuItem( items, Actions::Tabs_PreviousTab, QObject::tr(\"&Previous Tab\"),\n                  QStringLiteral(\"previous_tab\"), QObject::tr(\"Left\", \"Default shortcut to focus previous tab\"),\n                  QStringLiteral(\"go-previous\"), IconArrowLeft );\n\n    addMenuItem( items, Actions::Help_Help, QObject::tr(\"&Help\"), QStringLiteral(\"help\"), QKeySequence::HelpContents,\n                  QStringLiteral(\"help-contents\"), IconCircleQuestion );\n    addMenuItem( items, Actions::Help_ShowLog, QObject::tr(\"&Show Log\"), QStringLiteral(\"show-log\"), QObject::tr(\"F12\"),\n                  QStringLiteral(\"help-about\"), IconCircleExclamation );\n    addMenuItem( items, Actions::Help_About, QObject::tr(\"&About\"), QStringLiteral(\"about\"), QKeySequence::WhatsThis,\n                  QStringLiteral(\"help-about\"), IconCircleInfo );\n\n    addMenuItem( items, Actions::ItemMenu, QObject::tr(\"Open Item Context Menu\"), QStringLiteral(\"item-menu\"),\n                 QObject::tr(\"Shift+F10\", \"Default shortcut to open item context menu\"),\n                 QStringLiteral(\"\"), IconRectangleList );\n\n    return items;\n}\n\nvoid loadShortcuts(MenuItems *items, const QSettings &settings)\n{\n    for (auto &item : *items) {\n        if ( !item.settingsKey.isEmpty() ) {\n            const QVariant shortcutNames = settings.value(item.settingsKey);\n            if ( shortcutNames.isValid() ) {\n                item.shortcuts.clear();\n                for ( const auto &shortcut : shortcutNames.toStringList() )\n                    item.shortcuts.append(shortcut);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/gui/menuitems.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n\n#include <QList>\n#include <QKeySequence>\n#include <QString>\n#include <QSettings>\n\n#include <array>\n\nnamespace Actions {\n\nenum Id {\n    File_New,\n    File_Import,\n    File_Export,\n    File_Preferences,\n    File_Commands,\n    File_ShowClipboardContent,\n    File_ShowPreview,\n    File_ToggleClipboardStoring,\n    File_ProcessManager,\n    File_Exit,\n\n    Edit_SortSelectedItems,\n    Edit_ReverseSelectedItems,\n    Edit_PasteItems,\n    Edit_CopySelectedItems,\n    Edit_FindItems,\n\n    Editor_Save,\n    Editor_Cancel,\n    Editor_Undo,\n    Editor_Redo,\n    Editor_Font,\n    Editor_Bold,\n    Editor_Italic,\n    Editor_Underline,\n    Editor_Strikethrough,\n    Editor_Foreground,\n    Editor_Background,\n    Editor_EraseStyle,\n    Editor_Search,\n\n    Item_MoveToClipboard,\n    Item_ShowContent,\n    Item_Remove,\n    Item_Edit,\n    Item_EditNotes,\n    Item_EditWithEditor,\n    Item_Action,\n\n    Item_MoveUp,\n    Item_MoveDown,\n    Item_MoveToTop,\n    Item_MoveToBottom,\n\n    Tabs_NewTab,\n    Tabs_RenameTab,\n    Tabs_RemoveTab,\n    Tabs_ChangeTabIcon,\n    Tabs_NextTab,\n    Tabs_PreviousTab,\n\n    Help_Help,\n    Help_ShowLog,\n    Help_About,\n\n    ItemMenu,\n\n    Count\n};\n\n} // Actions\n\nstruct MenuItem {\n    QString iconName;\n    ushort iconId = 0;\n    QString text;\n    QString settingsKey;\n    QKeySequence defaultShortcut;\n    QList<QKeySequence> shortcuts;\n};\n\nusing MenuItems = std::array<MenuItem, Actions::Count>;\n\nMenuItems menuItems();\n\nvoid loadShortcuts(MenuItems *items, const QSettings &settings);\n"
  },
  {
    "path": "src/gui/navigation.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#include \"gui/navigation.h\"\n\nbool isViEscape(KeyMods keyMods)\n{\n    return keyMods.mods == Qt::ControlModifier && keyMods.key == Qt::Key_BracketLeft;\n}\n\nbool isEmacsEscape(KeyMods keyMods)\n{\n    return keyMods.mods == Qt::ControlModifier && keyMods.key == Qt::Key_G;\n}\n\nKeyMods translateToVi(KeyMods keyMods)\n{\n    const int key = keyMods.key;\n    const Qt::KeyboardModifiers mods = keyMods.mods;\n\n    switch ( key ) {\n    case Qt::Key_G:\n        return {\n            mods & Qt::ShiftModifier ? Qt::Key_End : Qt::Key_Home,\n            mods & ~Qt::ShiftModifier\n        };\n    case Qt::Key_J:\n        return {Qt::Key_Down, mods};\n    case Qt::Key_K:\n        return {Qt::Key_Up, mods};\n    case Qt::Key_L:\n        return {Qt::Key_Return};\n    case Qt::Key_F:\n    case Qt::Key_D:\n    case Qt::Key_B:\n    case Qt::Key_U:\n        if (mods & Qt::ControlModifier) {\n            return {\n                (key == Qt::Key_F || key == Qt::Key_D) ? Qt::Key_PageDown : Qt::Key_PageUp,\n                mods & ~Qt::ControlModifier\n            };\n        }\n        return {};\n    case Qt::Key_X:\n        return {Qt::Key_Delete};\n    case Qt::Key_BracketLeft:\n        if (mods & Qt::ControlModifier) {\n            return {Qt::Key_Escape, mods & ~Qt::ControlModifier};\n        }\n        return {};\n    default:\n        return {};\n    }\n}\n\nKeyMods translateToEmacs(KeyMods keyMods)\n{\n    const int key = keyMods.key;\n    const Qt::KeyboardModifiers mods = keyMods.mods;\n\n    switch ( key ) {\n    case Qt::Key_V:\n        if (mods & Qt::ControlModifier) {\n            return {Qt::Key_PageDown, mods & ~Qt::ControlModifier};\n        }\n        if (mods & Qt::AltModifier) {\n            return {Qt::Key_PageUp, mods & ~Qt::AltModifier};\n        }\n        return {};\n    case Qt::Key_N:\n        if (mods & Qt::ControlModifier) {\n            return {Qt::Key_Down, mods & ~Qt::ControlModifier};\n        }\n        return {};\n    case Qt::Key_P:\n        if (mods & Qt::ControlModifier) {\n            return {Qt::Key_Up, mods & ~Qt::ControlModifier};\n        }\n        return {};\n    case Qt::Key_Less:\n        if (mods & Qt::AltModifier) {\n            return {Qt::Key_Home, mods & ~(Qt::ShiftModifier | Qt::AltModifier)};\n        }\n        return {};\n    case Qt::Key_Greater:\n        if ((mods & Qt::AltModifier)) {\n            return {Qt::Key_End, mods & ~(Qt::ShiftModifier | Qt::AltModifier)};\n        }\n        return {};\n    case Qt::Key_G:\n        if (mods & Qt::ControlModifier) {\n            return {Qt::Key_Escape, mods & ~Qt::ControlModifier};\n        }\n        return {};\n    default:\n        return {};\n    }\n}\n"
  },
  {
    "path": "src/gui/navigation.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <Qt>\n\nclass QKeyEvent;\nclass QObject;\n\nstruct KeyMods {\n    int key;\n    Qt::KeyboardModifiers mods;\n\n    KeyMods(int key = 0, Qt::KeyboardModifiers mods = Qt::NoModifier)\n        : key(key), mods(mods) {}\n};\n\nbool isViEscape(KeyMods keyMods);\nbool isEmacsEscape(KeyMods keyMods);\n\nKeyMods translateToVi(KeyMods keyMods);\nKeyMods translateToEmacs(KeyMods keyMods);\n"
  },
  {
    "path": "src/gui/notification.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include <QObject>\n\n#include \"gui/notificationbutton.h\"\n\nclass KNotification;\nclass QWidget;\n\nclass Notification : public QObject\n{\n    Q_OBJECT\n\npublic:\n    // Same values as KNotification::Urgency\n    enum class Urgency {\n        Default = -1,\n        Low = 10,\n        Normal = 50,\n        High = 70,\n        Critical = 90,\n    };\n\n    enum class Persistency {\n        Default = -1,\n        NonPersistent = 0,\n        Persistent = 1,\n    };\n\n    explicit Notification(QObject *parent) : QObject(parent) {}\n    virtual void setTitle(const QString &title) = 0;\n    virtual void setMessage(const QString &msg, Qt::TextFormat format = Qt::PlainText) = 0;\n    virtual void setPixmap(const QPixmap &pixmap) = 0;\n    virtual void setIcon(const QString &icon) = 0;\n    virtual void setIcon(ushort icon) = 0;\n    virtual void setInterval(int msec) = 0;\n    virtual void setOpacity(qreal opacity) = 0;\n    virtual void setButtons(const NotificationButtons &buttons) = 0;\n    virtual void setUrgency(Urgency urgency) = 0;\n    virtual void setPersistency(Persistency persistency) = 0;\n    virtual void adjust() = 0;\n    virtual QWidget *widget() = 0;\n    virtual void show() = 0;\n    virtual void close() = 0;\n\nsignals:\n    /** Emitted if notification needs to be closed. */\n    void closeNotification(Notification *self);\n\n    void buttonClicked(const NotificationButton &button);\n};\n"
  },
  {
    "path": "src/gui/notificationbasic.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/notificationbasic.h\"\n#include \"gui/notification.h\"\n\n#include \"common/common.h\"\n#include \"common/display.h\"\n#include \"common/textdata.h\"\n#include \"common/timer.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/fromiconid.h\"\n#include \"gui/pixelratio.h\"\n\n#include <QApplication>\n#include <QDialog>\n#include <QDialogButtonBox>\n#include <QGridLayout>\n#include <QHBoxLayout>\n#include <QIcon>\n#include <QLabel>\n#include <QMap>\n#include <QMouseEvent>\n#include <QPainter>\n#include <QPushButton>\n#include <QTextEdit>\n\n#include <memory>\n\nnamespace {\n\nclass NotificationButtonWidget final : public QPushButton\n{\n    Q_OBJECT\n\npublic:\n    NotificationButtonWidget(const NotificationButton &button, QWidget *parent)\n        : QPushButton(button.name, parent)\n        , m_button(button)\n    {\n        connect( this, &NotificationButtonWidget::clicked,\n                 this, &NotificationButtonWidget::onClicked );\n    }\n\nsignals:\n    void clickedButton(const NotificationButton &button);\n\nprivate:\n    void onClicked()\n    {\n        emit clickedButton(m_button);\n    }\n\n    NotificationButton m_button;\n};\n\nclass NotificationBasic;\n\nclass NotificationBasicWidget final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    NotificationBasicWidget(NotificationBasic *parent);\n\n    void setTitle(const QString &title);\n    void setMessage(const QString &msg, Qt::TextFormat format = Qt::AutoText);\n    void setPixmap(const QPixmap &pixmap);\n    void setIcon(const QString &icon);\n    void setIcon(ushort icon);\n    void setInterval(int msec);\n    void setOpacity(qreal opacity);\n    void setButtons(const NotificationButtons &buttons);\n\n    void updateIcon();\n\n    void adjust();\n\n    void mousePressEvent(QMouseEvent *event) override;\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    void enterEvent(QEnterEvent *event) override;\n#else\n    void enterEvent(QEvent *event) override;\n#endif\n    void leaveEvent(QEvent *event) override;\n    void paintEvent(QPaintEvent *event) override;\n    void showEvent(QShowEvent *event) override;\n    void hideEvent(QHideEvent *event) override;\n\nprivate:\n    void onTimeout();\n    void onButtonClicked(const NotificationButton &button);\n\n    NotificationBasic *m_parent;\n    QGridLayout *m_layout = nullptr;\n    QHBoxLayout *m_buttonLayout = nullptr;\n    QLabel *m_titleLabel = nullptr;\n    QLabel *m_iconLabel = nullptr;\n    QLabel *m_msgLabel = nullptr;\n    QTimer m_timer;\n    bool m_autoclose = false;\n    qreal m_opacity = 1.0;\n    QString m_icon;\n};\n\nclass NotificationBasic final : public Notification\n{\n    Q_OBJECT\n\n    friend class NotificationBasicWidget;\n\npublic:\n    NotificationBasic(QObject *parent)\n        : Notification(parent)\n        , m_widget(this)\n    {\n        m_widget.setObjectName(\"Notification\");\n    }\n\n    void setTitle(const QString &title) override {\n        m_widget.setTitle(title);\n    }\n    void setMessage(const QString &msg, Qt::TextFormat format = Qt::AutoText) override {\n        m_widget.setMessage(msg, format);\n    }\n    void setPixmap(const QPixmap &pixmap) override {\n        m_widget.setPixmap(pixmap);\n    }\n    void setIcon(const QString &icon) override {\n        m_widget.setIcon(icon);\n    }\n    void setIcon(ushort icon) override {\n        m_widget.setIcon(icon);\n    }\n    void setInterval(int msec) override {\n        m_widget.setInterval(msec);\n    }\n    void setOpacity(qreal opacity) override {\n        m_widget.setOpacity(opacity);\n    }\n    void setButtons(const NotificationButtons &buttons) override {\n        m_widget.setButtons(buttons);\n    }\n\n    void setUrgency(Urgency) override {}\n    void setPersistency(Persistency) override {}\n\n    void adjust() override {\n        m_widget.updateIcon();\n        m_widget.adjust();\n    }\n\n    QWidget *widget() override {\n        m_widget.updateIcon();\n        m_widget.adjust();\n        return &m_widget;\n    }\n\n    void show() override {\n        m_widget.show();\n    }\n\n    void close() override {\n        m_widget.close();\n    }\n\nprivate:\n    NotificationBasicWidget m_widget;\n};\n\n} // namespace\n\nNotificationBasicWidget::NotificationBasicWidget(NotificationBasic *parent)\n    : m_parent(parent)\n{\n    m_layout = new QGridLayout(this);\n    m_layout->setContentsMargins({8,8,8,8});\n\n    m_iconLabel = new QLabel(this);\n    m_iconLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);\n\n    m_msgLabel = new QLabel(this);\n    m_msgLabel->setAlignment(Qt::AlignTop | Qt::AlignAbsolute);\n\n    setTitle(QString());\n\n    setWindowFlags(Qt::ToolTip);\n    setWindowOpacity(m_opacity);\n    setAttribute(Qt::WA_ShowWithoutActivating);\n\n    initSingleShotTimer( &m_timer, 0, this, &NotificationBasicWidget::onTimeout );\n}\n\nvoid NotificationBasicWidget::setTitle(const QString &title)\n{\n    if ( !title.isEmpty() ) {\n        if (!m_titleLabel)\n            m_titleLabel = new QLabel(this);\n\n        m_titleLabel->setObjectName(\"NotificationTitle\");\n        m_titleLabel->setTextFormat(Qt::PlainText);\n        m_titleLabel->setText(title);\n\n        m_layout->addWidget(m_iconLabel, 0, 0);\n        m_layout->addWidget(m_titleLabel, 0, 1, Qt::AlignCenter);\n        m_layout->addWidget(m_msgLabel, 1, 0, 1, 2);\n    } else {\n        if (m_titleLabel) {\n            m_titleLabel->deleteLater();\n            m_titleLabel = nullptr;\n        }\n\n        m_layout->addWidget(m_iconLabel, 0, 0, Qt::AlignTop);\n        m_layout->addWidget(m_msgLabel, 0, 1);\n    }\n}\n\nvoid NotificationBasicWidget::setMessage(const QString &msg, Qt::TextFormat format)\n{\n    m_msgLabel->setTextFormat(format);\n    m_msgLabel->setText(msg);\n    m_msgLabel->setVisible( !msg.isEmpty() );\n}\n\nvoid NotificationBasicWidget::setPixmap(const QPixmap &pixmap)\n{\n    m_msgLabel->setPixmap(pixmap);\n}\n\nvoid NotificationBasicWidget::setIcon(const QString &icon)\n{\n    m_icon = icon;\n}\n\nvoid NotificationBasicWidget::setIcon(ushort icon)\n{\n    m_icon = fromIconId(icon);\n}\n\nvoid NotificationBasicWidget::setInterval(int msec)\n{\n    if (msec >= 0) {\n        m_autoclose = true;\n        m_timer.setInterval(msec);\n        if (isVisible())\n            m_timer.start();\n    } else {\n        m_autoclose = false;\n    }\n}\n\nvoid NotificationBasicWidget::setOpacity(qreal opacity)\n{\n    m_opacity = opacity;\n    setWindowOpacity(m_opacity);\n}\n\nvoid NotificationBasicWidget::setButtons(const NotificationButtons &buttons)\n{\n    for (const auto &buttonWidget : findChildren<NotificationButtonWidget*>())\n        buttonWidget->deleteLater();\n\n    if ( !buttons.isEmpty() ) {\n        if (!m_buttonLayout)\n            m_buttonLayout = new QHBoxLayout();\n\n        m_buttonLayout->addStretch();\n        m_layout->addLayout(m_buttonLayout, 2, 0, 1, 2);\n\n        for (const auto &button : buttons) {\n            const auto buttonWidget = new NotificationButtonWidget(button, this);\n            connect( buttonWidget, &NotificationButtonWidget::clickedButton,\n                     this, &NotificationBasicWidget::onButtonClicked );\n            m_buttonLayout->addWidget(buttonWidget);\n        }\n    } else if (m_buttonLayout) {\n        m_buttonLayout->deleteLater();\n        m_buttonLayout = nullptr;\n    }\n}\n\nvoid NotificationBasicWidget::updateIcon()\n{\n    const QColor color = getDefaultIconColor(*this);\n    const auto height = static_cast<int>( m_msgLabel->fontMetrics().lineSpacing() * 1.2 );\n    const auto iconId = toIconId(m_icon);\n\n    const auto ratio = pixelRatio(this);\n\n    auto pixmap = iconId == 0\n            ? QPixmap(m_icon)\n            : createPixmap(iconId, color, static_cast<int>(height * ratio));\n\n    pixmap.setDevicePixelRatio(ratio);\n\n    m_iconLabel->setPixmap(pixmap);\n    m_iconLabel->resize(pixmap.size());\n}\n\nvoid NotificationBasicWidget::adjust()\n{\n    m_msgLabel->setMaximumSize(maximumSize());\n    if ( !m_msgLabel->isVisible() && m_msgLabel->sizeHint().width() > maximumWidth() ) {\n        m_msgLabel->setWordWrap(true);\n        m_msgLabel->adjustSize();\n    }\n    adjustSize();\n}\n\nvoid NotificationBasicWidget::mousePressEvent(QMouseEvent *)\n{\n    m_timer.stop();\n\n    emit m_parent->closeNotification(m_parent);\n}\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nvoid NotificationBasicWidget::enterEvent(QEnterEvent *event)\n#else\nvoid NotificationBasicWidget::enterEvent(QEvent *event)\n#endif\n{\n    setWindowOpacity(1.0);\n    m_timer.stop();\n    QWidget::enterEvent(event);\n}\n\nvoid NotificationBasicWidget::leaveEvent(QEvent *event)\n{\n    setWindowOpacity(m_opacity);\n    m_timer.start();\n    QWidget::leaveEvent(event);\n}\n\nvoid NotificationBasicWidget::paintEvent(QPaintEvent *event)\n{\n    QWidget::paintEvent(event);\n\n    QPainter p(this);\n\n    // black outer border\n    p.setPen(Qt::black);\n    p.drawRect(rect().adjusted(0, 0, -1, -1));\n\n    // light inner border\n    p.setPen( palette().color(QPalette::Window).lighter(300) );\n    p.drawRect(rect().adjusted(1, 1, -2, -2));\n}\n\nvoid NotificationBasicWidget::showEvent(QShowEvent *event)\n{\n    m_timer.start();\n    QWidget::showEvent(event);\n}\n\nvoid NotificationBasicWidget::hideEvent(QHideEvent *event)\n{\n    QWidget::hideEvent(event);\n    emit m_parent->closeNotification(m_parent);\n}\n\nvoid NotificationBasicWidget::onTimeout()\n{\n    if (m_autoclose)\n        emit m_parent->closeNotification(m_parent);\n}\n\nvoid NotificationBasicWidget::onButtonClicked(const NotificationButton &button)\n{\n    emit m_parent->buttonClicked(button);\n    emit m_parent->closeNotification(m_parent);\n}\n\nNotification *createNotificationBasic(QObject *parent)\n{\n    return new NotificationBasic(parent);\n}\n\n#include \"notificationbasic.moc\"\n"
  },
  {
    "path": "src/gui/notificationbasic.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\nclass Notification;\nclass QObject;\n\nNotification *createNotificationBasic(QObject *parent);\n"
  },
  {
    "path": "src/gui/notificationbutton.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QByteArray>\n#include <QList>\n#include <QMetaType>\n#include <QString>\n\nstruct NotificationButton\n{\n    QString name;\n    QString script;\n    QByteArray data;\n};\n\nQ_DECLARE_METATYPE(NotificationButton)\n\nusing NotificationButtons = QList<NotificationButton>;\n"
  },
  {
    "path": "src/gui/notificationdaemon.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/notificationdaemon.h\"\n\n#include \"common/common.h\"\n#include \"common/display.h\"\n#include \"common/timer.h\"\n#include \"gui/notification.h\"\n#include \"gui/notificationbasic.h\"\n#include \"gui/screen.h\"\n\n#ifdef WITH_NATIVE_NOTIFICATIONS\n#   include \"gui/notificationnative/notificationnative.h\"\n#   include <QSysInfo>\n#endif\n\n#include <QApplication>\n#include <QPixmap>\n#include <QPoint>\n#include <QVariant>\n#include <QWidget>\n\nnamespace {\n\nconst int notificationMarginPoints = 10;\n\nint notificationMargin()\n{\n    return pointsToPixels(notificationMarginPoints);\n}\n\n#ifdef WITH_NATIVE_NOTIFICATIONS\nbool hasNativeNotifications()\n{\n#ifdef Q_OS_WIN\n    static const bool supportsNotifications =\n        !QSysInfo::productVersion().startsWith(QLatin1String(\"7\"));\n    return supportsNotifications;\n#else\n    return true;\n#endif\n}\n#endif\n\n} // namespace\n\nNotificationDaemon::NotificationDaemon(QObject *parent)\n    : QObject(parent)\n    , m_position(BottomRight)\n    , m_notifications()\n    , m_opacity(1.0)\n    , m_horizontalOffsetPoints(0)\n    , m_verticalOffsetPoints(0)\n    , m_maximumWidthPoints(300)\n    , m_maximumHeightPoints(100)\n{\n    initSingleShotTimer( &m_timerUpdate, 100, this, &NotificationDaemon::doUpdateNotificationWidgets );\n}\n\nNotificationDaemon::~NotificationDaemon() = default;\n\nvoid NotificationDaemon::setPosition(NotificationDaemon::Position position)\n{\n    m_position = position;\n}\n\nvoid NotificationDaemon::setOffset(int horizontalPoints, int verticalPoints)\n{\n    m_horizontalOffsetPoints = horizontalPoints;\n    m_verticalOffsetPoints = verticalPoints;\n}\n\nvoid NotificationDaemon::setMaximumSize(int maximumWidthPoints, int maximumHeightPoints)\n{\n    m_maximumWidthPoints = maximumWidthPoints;\n    m_maximumHeightPoints = maximumHeightPoints;\n}\n\nvoid NotificationDaemon::updateNotificationWidgets()\n{\n    if ( !m_timerUpdate.isActive() )\n        m_timerUpdate.start();\n}\n\nvoid NotificationDaemon::setNotificationOpacity(qreal opacity)\n{\n    m_opacity = opacity;\n}\n\nvoid NotificationDaemon::setNotificationStyleSheet(const QString &styleSheet)\n{\n    m_styleSheet = styleSheet;\n}\n\nvoid NotificationDaemon::setIconColor(const QColor &color)\n{\n    m_iconColor = color;\n}\n\nvoid NotificationDaemon::removeNotification(const QString &id)\n{\n    Notification *notification = findNotification(id);\n    if (notification)\n        onNotificationClose(notification);\n}\n\nvoid NotificationDaemon::onNotificationClose(Notification *notification)\n{\n    for (auto it = std::begin(m_notifications); it != std::end(m_notifications); ++it) {\n        if (it->notification == notification) {\n            m_notifications.erase(it);\n            break;\n        }\n    }\n\n    if (notification->widget() != nullptr)\n        updateNotificationWidgets();\n\n    notification->deleteLater();\n}\n\nvoid NotificationDaemon::doUpdateNotificationWidgets()\n{\n    const QPoint cursor = QCursor::pos();\n\n    // Postpone update if mouse cursor is over a notification.\n    for (auto &notificationData : m_notifications) {\n        auto notification = notificationData.notification;\n        QWidget *w = notification->widget();\n        if ( w != nullptr && w->isVisible() && w->geometry().contains(cursor) ) {\n            m_timerUpdate.start();\n            return;\n        }\n    }\n\n    const QRect screen = screenGeometry(0);\n\n    int y = (m_position & Top) ? offsetY() : screen.bottom() - offsetY();\n\n    for (auto &notificationData : m_notifications) {\n        auto notification = notificationData.notification;\n        QWidget *w = notification->widget();\n        if (w == nullptr)\n            continue;\n\n        notification->setOpacity(m_opacity);\n        w->setStyleSheet(m_styleSheet);\n        w->setMaximumSize( pointsToPixels(m_maximumWidthPoints), pointsToPixels(m_maximumHeightPoints) );\n        notification->adjust();\n\n        // Avoid positioning a notification under mouse cursor.\n        QRect rect = w->geometry();\n        do {\n            int x;\n            if (m_position & Left)\n                x = offsetX();\n            else if (m_position & Right)\n                x = screen.right() - rect.width() - offsetX();\n            else\n                x = screen.right() / 2 - rect.width() / 2;\n\n            if (m_position & Bottom)\n                y -= rect.height();\n\n            if (m_position & Top)\n                y += rect.height() + notificationMargin();\n            else\n                y -= notificationMargin();\n\n            rect.moveTo(x, y);\n        } while( rect.contains(cursor) );\n\n        w->move(rect.topLeft());\n        notification->show();\n    }\n}\n\nNotification *NotificationDaemon::findNotification(const QString &id)\n{\n    for (auto &notificationData : m_notifications) {\n        if (notificationData.id == id)\n            return notificationData.notification;\n    }\n\n    return nullptr;\n}\n\nNotification *NotificationDaemon::createNotification(const QString &id)\n{\n    Notification *notification = nullptr;\n    if ( !id.isEmpty() )\n        notification = findNotification(id);\n\n    if (notification == nullptr) {\n#ifdef WITH_NATIVE_NOTIFICATIONS\n        if (m_nativeNotificationsEnabled && hasNativeNotifications())\n            notification = createNotificationNative(m_iconColor, this);\n        else\n            notification = createNotificationBasic(this);\n#else\n        notification = createNotificationBasic(this);\n#endif\n\n        connect(this, &QObject::destroyed, notification, &QObject::deleteLater);\n        connect( notification, &Notification::closeNotification,\n                 this, &NotificationDaemon::onNotificationClose );\n        connect( notification, &Notification::buttonClicked,\n                 this, &NotificationDaemon::notificationButtonClicked );\n\n        m_notifications.append(NotificationData{id, notification});\n    }\n\n    if (notification->widget() != nullptr)\n        updateNotificationWidgets();\n    else\n        QTimer::singleShot(0, notification, &Notification::show);\n\n    return notification;\n}\n\nint NotificationDaemon::offsetX() const\n{\n    return pointsToPixels(m_horizontalOffsetPoints);\n}\n\nint NotificationDaemon::offsetY() const\n{\n    return pointsToPixels(m_verticalOffsetPoints);\n}\n"
  },
  {
    "path": "src/gui/notificationdaemon.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/notificationbutton.h\"\n\n#include <QColor>\n#include <QList>\n#include <QObject>\n#include <QVariantMap>\n#include <QTimer>\n\nclass Notification;\nclass QPixmap;\nclass QPoint;\nclass QWidget;\n\nclass NotificationDaemon final : public QObject\n{\n    Q_OBJECT\npublic:\n    enum Position {\n        Top = 0x2,\n        Bottom = 0x4,\n        Right = 0x8,\n        Left = 0x10,\n        TopRight = Top | Right,\n        BottomRight = Bottom | Right,\n        BottomLeft = Bottom | Left,\n        TopLeft = Top | Left\n    };\n\n    explicit NotificationDaemon(QObject *parent = nullptr);\n\n    ~NotificationDaemon();\n\n    Notification *createNotification(const QString &id = QString());\n    Notification *findNotification(const QString &id);\n\n    void setPosition(Position position);\n\n    void setOffset(int horizontalPoints, int verticalPoints);\n\n    void setMaximumSize(int maximumWidthPoints, int maximumHeightPoints);\n\n    void updateNotificationWidgets();\n\n    void setNotificationOpacity(qreal opacity);\n\n    void setNotificationStyleSheet(const QString &styleSheet);\n\n    void setIconColor(const QColor &color);\n\n    void setNativeNotificationsEnabled(bool enable) { m_nativeNotificationsEnabled = enable; }\n\n    void removeNotification(const QString &id);\n\nsignals:\n    void notificationButtonClicked(const NotificationButton &button);\n\nprivate:\n    void onNotificationClose(Notification *notification);\n    void doUpdateNotificationWidgets();\n\n    struct NotificationData {\n        QString id;\n        Notification *notification;\n    };\n\n    Notification *findNotification(Notification *notification);\n\n    int offsetX() const;\n    int offsetY() const;\n\n    Position m_position;\n    QList<NotificationData> m_notifications;\n    QColor m_iconColor;\n    qreal m_opacity;\n    int m_horizontalOffsetPoints;\n    int m_verticalOffsetPoints;\n    int m_maximumWidthPoints;\n    int m_maximumHeightPoints;\n    QString m_styleSheet;\n    QTimer m_timerUpdate;\n    bool m_nativeNotificationsEnabled = true;\n};\n"
  },
  {
    "path": "src/gui/notificationnative/notificationnative.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"notificationnative.h\"\n\n#include \"common/log.h\"\n#include \"common/timer.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/notification.h\"\n\n#include <KNotification>\n#include <QApplication>\n#include <QDialog>\n#include <QDialogButtonBox>\n#include <QDir>\n#include <QGridLayout>\n#include <QHBoxLayout>\n#include <QIcon>\n#include <QLabel>\n#include <QMap>\n#include <QMouseEvent>\n#include <QPainter>\n#include <QPointer>\n#include <QPushButton>\n#include <QTextEdit>\n\n#include <knotifications_version.h>\n\n#include <memory>\n\nnamespace {\n\nconstexpr auto componentName = \"copyq\";\nconstexpr auto maxTitleLength = 10000;\nconstexpr auto maxBodyLength = 100000;\nconstexpr auto maxLines = 100;\n\nQString limitLength(const QString &text, int maxLength)\n{\n    QString result = text.left(maxLength).split('\\n').mid(0, maxLines).join('\\n');\n    if (result.length() < text.length())\n        result.append(\"\\n…\");\n    return result;\n}\n\nQPixmap defaultIcon()\n{\n    static QPixmap pixmap = appIcon().pixmap(512);\n    return pixmap;\n}\n\nclass NotificationNative final : public Notification\n{\n    Q_OBJECT\n\npublic:\n    explicit NotificationNative(const QColor &iconColor, QObject *parent = nullptr);\n\n    ~NotificationNative();\n\n    void setTitle(const QString &title) override;\n    void setMessage(const QString &msg, Qt::TextFormat format = Qt::PlainText) override;\n    void setPixmap(const QPixmap &pixmap) override;\n    void setIcon(const QString &icon) override;\n    void setIcon(ushort icon) override;\n    void setInterval(int msec) override;\n    void setOpacity(qreal) override {}\n    void setButtons(const NotificationButtons &buttons) override;\n    void setUrgency(Urgency urgency) override;\n    void setPersistency(Persistency persistency) override;\n    void adjust() override {}\n    QWidget *widget() override { return nullptr; }\n    void show() override;\n    void close() override;\n\nprivate:\n    void onButtonClicked(unsigned int id);\n    void onDestroyed();\n    void onClosed();\n    void onIgnored();\n#if KNOTIFICATIONS_VERSION < QT_VERSION_CHECK(5,245,0)\n    void onActivated();\n#endif\n    void update();\n\n    void notificationLog(const char *message);\n\n    KNotification *dropNotification();\n\n    QPointer<KNotification> m_notification;\n    NotificationButtons m_buttons;\n\n    QColor m_iconColor;\n    QTimer m_timer;\n    int m_intervalMsec = -1;\n    QString m_title;\n    QString m_message;\n    QString m_icon;\n    ushort m_iconId;\n    QPixmap m_pixmap;\n    bool m_closed = false;\n    Urgency m_urgency = Urgency::Default;\n    Persistency m_persistency = Persistency::Default;\n};\n\n} // namespace\n\nNotificationNative::NotificationNative(const QColor &iconColor, QObject *parent)\n    : Notification(parent)\n    , m_iconColor(iconColor)\n{\n    initSingleShotTimer( &m_timer, 0, this, &NotificationNative::close );\n}\n\nNotificationNative::~NotificationNative()\n{\n    auto notification = dropNotification();\n    if (notification) {\n        notificationLog(\"Delete\");\n        notification->close();\n    }\n}\n\nvoid NotificationNative::setTitle(const QString &title)\n{\n    m_title = limitLength(title, maxTitleLength);\n}\n\nvoid NotificationNative::setMessage(const QString &msg, Qt::TextFormat format)\n{\n    m_message = limitLength(msg, maxBodyLength);\n\n    if (format == Qt::PlainText) {\n        m_message = m_message.toHtmlEscaped();\n    }\n}\n\nvoid NotificationNative::setPixmap(const QPixmap &pixmap)\n{\n    m_icon.clear();\n    m_iconId = 0;\n    m_pixmap = pixmap;\n}\n\nvoid NotificationNative::setIcon(const QString &icon)\n{\n    m_iconId = toIconId(icon);\n    if (m_iconId == 0)\n        m_icon = icon;\n    else\n        m_icon.clear();\n    m_pixmap = QPixmap();\n}\n\nvoid NotificationNative::setIcon(ushort icon)\n{\n    m_icon.clear();\n    m_iconId = icon;\n    m_pixmap = QPixmap();\n}\n\nvoid NotificationNative::setInterval(int msec)\n{\n    m_intervalMsec = msec;\n}\n\nvoid NotificationNative::setButtons(const NotificationButtons &buttons)\n{\n    m_buttons = buttons;\n}\n\nvoid NotificationNative::setUrgency(Urgency urgency)\n{\n    m_urgency = urgency;\n}\n\nvoid NotificationNative::setPersistency(Persistency persistency)\n{\n    m_persistency = persistency;\n}\n\nvoid NotificationNative::show()\n{\n    if (m_closed)\n        return;\n\n    notificationLog(\"Update\");\n\n    if (m_notification) {\n        update();\n#if KNOTIFICATIONS_VERSION < QT_VERSION_CHECK(5,110,0)\n        if (m_notification)\n            m_notification->update();\n#endif\n        notificationLog(\"Updated\");\n        return;\n    }\n\n    m_notification = new KNotification(QStringLiteral(\"generic\"));\n    notificationLog(\"Create\");\n    m_notification->setComponentName(componentName);\n\n#if KNOTIFICATIONS_VERSION < QT_VERSION_CHECK(5,245,0)\n    connect( m_notification.data(), static_cast<void (KNotification::*)(unsigned int)>(&KNotification::activated),\n             this, &NotificationNative::onButtonClicked );\n#   if KNOTIFICATIONS_VERSION < QT_VERSION_CHECK(5,67,0)\n    connect( m_notification.data(), static_cast<void (KNotification::*)()>(&KNotification::activated),\n             this, &NotificationNative::onActivated );\n#   else\n    connect( m_notification.data(), &KNotification::defaultActivated,\n             this, &NotificationNative::onActivated );\n#   endif\n#endif\n    connect( m_notification.data(), &KNotification::closed,\n             this, &NotificationNative::onClosed );\n    connect( m_notification.data(), &KNotification::ignored,\n             this, &NotificationNative::onIgnored );\n    connect( m_notification.data(), &QObject::destroyed,\n             this, &NotificationNative::onDestroyed );\n\n    update();\n    if (m_notification)\n        m_notification->sendEvent();\n\n    notificationLog(\"Created\");\n}\n\nvoid NotificationNative::close()\n{\n    notificationLog(\"Close\");\n\n    auto notification = dropNotification();\n    if (notification)\n        notification->close();\n\n    notificationLog(\"Closed\");\n}\n\nvoid NotificationNative::onButtonClicked(unsigned int id)\n{\n    notificationLog(QByteArray(\"onButtonClicked \") + QByteArray::number(id));\n\n    if ( id - 1 < static_cast<unsigned int>(m_buttons.size()) ) {\n        emit buttonClicked(m_buttons[id - 1]);\n        emit closeNotification(this);\n    }\n}\n\nvoid NotificationNative::onDestroyed()\n{\n    notificationLog(\"Destroyed\");\n    dropNotification();\n}\n\nvoid NotificationNative::onClosed()\n{\n    notificationLog(\"onClosed\");\n    dropNotification();\n}\n\nvoid NotificationNative::onIgnored()\n{\n    notificationLog(\"onIgnored\");\n    dropNotification();\n}\n\n#if KNOTIFICATIONS_VERSION < QT_VERSION_CHECK(5,245,0)\nvoid NotificationNative::onActivated()\n{\n    notificationLog(\"onActivated\");\n    dropNotification();\n}\n#endif\n\nvoid NotificationNative::update()\n{\n    if (!m_notification)\n        return;\n\n    if (m_intervalMsec == 0) {\n        close();\n        return;\n    }\n\n    m_notification->setTitle(m_title);\n#ifdef Q_OS_WIN\n    // On Windows, notification doesn't show up if the message is empty.\n    if (m_message.isEmpty())\n        m_notification->setText(QLatin1String(\"-\"));\n    else\n        m_notification->setText(m_message);\n#else\n    m_notification->setText(m_message);\n#endif\n\n    if (m_pixmap.isNull() && m_iconId != 0) {\n        const auto height = 64;\n        const auto ratio = qApp->devicePixelRatio();\n        m_pixmap = createPixmap(m_iconId, m_iconColor, static_cast<int>(height * ratio));\n        m_pixmap.setDevicePixelRatio(ratio);\n    }\n\n    if ( !m_icon.isEmpty() ) {\n        m_notification->setIconName(m_icon);\n    } else if ( !m_pixmap.isNull() ) {\n        m_notification->setPixmap(m_pixmap);\n    } else {\n        m_notification->setPixmap(defaultIcon());\n    }\n\n#if KNOTIFICATIONS_VERSION >= QT_VERSION_CHECK(5,245,0)\n    m_notification->clearActions();\n    for (int i = 0; i < m_buttons.size(); ++i) {\n        KNotificationAction* act = m_notification->addAction(m_buttons[i].name);\n        connect( act, &KNotificationAction::activated,\n                 this, [=](){ onButtonClicked(i + 1); } );\n    }\n#else\n    QStringList actions;\n    for (const auto &button : m_buttons)\n        actions.append(button.name);\n    m_notification->setActions(actions);\n#endif\n\n#if KNOTIFICATIONS_VERSION >= QT_VERSION_CHECK(5,58,0)\n    m_notification->setUrgency(static_cast<KNotification::Urgency>(m_urgency));\n#endif\n\n    if (m_persistency == Persistency::Persistent)\n        m_notification->setFlags(KNotification::Persistent);\n    else\n        m_notification->setFlags({});\n\n    if (m_intervalMsec < 0) {\n        m_timer.stop();\n        if (m_persistency == Persistency::Default)\n            m_notification->setFlags(KNotification::Persistent);\n#if KNOTIFICATIONS_VERSION >= QT_VERSION_CHECK(5,58,0)\n        if (m_urgency == Urgency::Default)\n            m_notification->setUrgency(KNotification::HighUrgency);\n#endif\n    } else {\n        // Specific timeout is not supported by KNotifications.\n        m_timer.start(m_intervalMsec);\n        m_notification->setFlags(KNotification::CloseOnTimeout);\n#if KNOTIFICATIONS_VERSION >= QT_VERSION_CHECK(5,58,0)\n        if (m_urgency == Urgency::Default) {\n            const KNotification::Urgency urgency = m_intervalMsec <= 10000\n                ? KNotification::LowUrgency\n                : KNotification::NormalUrgency;\n            m_notification->setUrgency(urgency);\n        }\n#endif\n    }\n}\n\nvoid NotificationNative::notificationLog(const char *message)\n{\n    COPYQ_LOG_VERBOSE(\n        QString(\"Notification [%1:%2]: %3\")\n        .arg(reinterpret_cast<quintptr>(this))\n        .arg(reinterpret_cast<quintptr>(m_notification.data()))\n        .arg(message) );\n}\n\nKNotification *NotificationNative::dropNotification()\n{\n    m_closed = true;\n    auto notification = m_notification;\n    if (notification) {\n        m_notification = nullptr;\n        notification->disconnect(this);\n    }\n    emit closeNotification(this);\n    return notification;\n}\n\nNotification *createNotificationNative(const QColor &iconColor, QObject *parent)\n{\n    return new NotificationNative(iconColor, parent);\n}\n\n#include \"notificationnative.moc\"\n"
  },
  {
    "path": "src/gui/notificationnative/notificationnative.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\nclass Notification;\nclass QColor;\nclass QObject;\n\nNotification *createNotificationNative(const QColor &iconColor, QObject *parent);\n"
  },
  {
    "path": "src/gui/passwordprompt.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"passwordprompt.h\"\n\n#include <QEventLoop>\n#include <QLoggingCategory>\n#include <QPointer>\n#include <QWidget>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(logCategory)\nQ_LOGGING_CATEGORY(logCategory, \"copyq.passwordprompt\")\n\n} // namespace\n\nPasswordPrompt::PasswordPrompt(QWidget *parent)\n    : QObject(parent)\n    , m_parent(parent)\n{\n    m_lastSuccessfulPromptTime = std::chrono::steady_clock::now();\n}\n\nvoid PasswordPrompt::prompt(PasswordSource source, Callback callback)\n{\n    bool done = false;\n    QEventLoop waitLoop;\n\n    m_pendingPrompts.append(PendingPrompt{\n        source,\n        [callback = std::move(callback), &done, &waitLoop](const Encryption::EncryptionKey &key) mutable {\n            callback(key);\n            done = true;\n            waitLoop.quit();\n        }\n    });\n\n    runPromptQueue();\n    if (!done)\n        waitLoop.exec();\n}\n\nEncryption::EncryptionKey PasswordPrompt::prompt(PasswordSource source)\n{\n    Encryption::EncryptionKey key;\n    prompt(source, [&](const Encryption::EncryptionKey &newKey) { key = newKey; });\n    return key;\n}\n\nvoid PasswordPrompt::runPromptQueue()\n{\n    if (m_promptInProgress || m_pendingPrompts.isEmpty())\n        return;\n\n    m_promptInProgress = true;\n    const PasswordSource source = m_pendingPrompts.first().source;\n    qCDebug(logCategory) << \"Prompting for password,\" << (\n            source == PasswordSource::IgnoreEnvAndKeychain ? \"ignoring env and keychain\"\n            : source == PasswordSource::UseEnvOnly ? \"including env\"\n            : \"including env and keychain\"\n    );\n    QPointer<PasswordPrompt> self(this);\n    promptForEncryptionPasswordAsync(\n        m_parent,\n        source,\n        [self](const Encryption::EncryptionKey &key, bool passwordEnteredManually) {\n            if (!self)\n                return;\n\n            qCDebug(logCategory) << \"Prompted password\"\n                << (passwordEnteredManually ? \"from user\" : \"from env/keychain\")\n                << (key.isValid() ? \"with success\" : \"without success\");\n\n            self->m_lastPromptKey = key;\n            if (key.isValid() && passwordEnteredManually) {\n                self->m_lastSuccessfulPromptTime = std::chrono::steady_clock::now();\n            }\n\n            if (!self->m_pendingPrompts.isEmpty()) {\n                PendingPrompt pendingPrompt = std::move(self->m_pendingPrompts.first());\n                self->m_pendingPrompts.removeFirst();\n                pendingPrompt.callback(self->m_lastPromptKey);\n            }\n\n            while (!self->m_pendingPrompts.isEmpty()) {\n                if (self->m_pendingPrompts.first().source == PasswordSource::IgnoreEnvAndKeychain\n                        && !passwordEnteredManually)\n                {\n                    break;\n                }\n                PendingPrompt pendingPrompt = std::move(self->m_pendingPrompts.first());\n                self->m_pendingPrompts.removeFirst();\n                pendingPrompt.callback(self->m_lastPromptKey);\n            }\n\n            self->m_promptInProgress = false;\n            self->runPromptQueue();\n        });\n}\n"
  },
  {
    "path": "src/gui/passwordprompt.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include \"common/encryption.h\"\n#include \"gui/encryptionpassword.h\"\n\n#include <QElapsedTimer>\n#include <QList>\n#include <QObject>\n\n#include <functional>\n\nclass QWidget;\n\nclass PasswordPrompt final : public QObject\n{\npublic:\n    explicit PasswordPrompt(QWidget *parent);\n\n    using Callback = std::function<void(const Encryption::EncryptionKey &)>;\n\n    void prompt(PasswordSource source, Callback callback);\n    Encryption::EncryptionKey prompt(PasswordSource source);\n\n    std::chrono::steady_clock::time_point lastSuccessfulPasswordPromptTime() const\n    { return m_lastSuccessfulPromptTime; }\n\nprivate:\n    struct PendingPrompt {\n        PasswordSource source;\n        Callback callback;\n    };\n\n    void runPromptQueue();\n\n    QWidget *m_parent = nullptr;\n    bool m_promptInProgress = false;\n    Encryption::EncryptionKey m_lastPromptKey;\n    std::chrono::steady_clock::time_point m_lastSuccessfulPromptTime;\n    QList<PendingPrompt> m_pendingPrompts;\n};\n"
  },
  {
    "path": "src/gui/pixelratio.h",
    "content": "#pragma once\n\n\n#include <QPaintDevice>\n\nstatic qreal pixelRatio(QPaintDevice *pd)\n{\n    return pd->devicePixelRatioF();\n}\n"
  },
  {
    "path": "src/gui/pluginwidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"pluginwidget.h\"\n#include \"ui_pluginwidget.h\"\n\n#include \"item/itemwidget.h\"\n\nPluginWidget::PluginWidget(const ItemLoaderPtr &loader, QWidget *parent)\n    : QWidget(parent)\n    , ui(new Ui::PluginWidget)\n    , m_loader(loader)\n{\n    ui->setupUi(this);\n\n    const QString author = m_loader->author();\n    if (author.isEmpty())\n        ui->labelAuthor->hide();\n    else\n        ui->labelAuthor->setText(author);\n\n    const QString description = m_loader->description();\n    if (description.isEmpty())\n        ui->labelDescription->hide();\n    else\n        ui->labelDescription->setText(m_loader->description());\n\n    QWidget *loaderSettings = m_loader->createSettingsWidget(this);\n    if (loaderSettings) {\n        ui->verticalLayout->insertWidget(2, loaderSettings);\n        ui->verticalLayout->setStretch(2, 1);\n    }\n}\n\nPluginWidget::~PluginWidget()\n{\n    delete ui;\n}\n"
  },
  {
    "path": "src/gui/pluginwidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"item/itemwidget.h\"\n\n#include <QWidget>\n\nclass QSettings;\n\nnamespace Ui {\nclass PluginWidget;\n}\n\nclass PluginWidget final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit PluginWidget(const ItemLoaderPtr &loader, QWidget *parent = nullptr);\n    ~PluginWidget();\n\n    const ItemLoaderPtr &loader() const { return m_loader; }\n\nprivate:\n    Ui::PluginWidget *ui;\n    ItemLoaderPtr m_loader;\n};\n"
  },
  {
    "path": "src/gui/screen.cpp",
    "content": "#include \"screen.h\"\n\n#include <QApplication>\n#include <QScreen>\n#include <QWidget>\n#include <QWindow>\n\nnamespace {\n\nQScreen *screenFromNumber(int i)\n{\n    const auto screens = QGuiApplication::screens();\n    if (i < 0 || i >= screens.size())\n        return nullptr;\n    return screens[i];\n}\n\n} // namespace\n\nint screenCount()\n{\n    return QGuiApplication::screens().size();\n}\n\nint screenNumberAt(const QPoint &pos)\n{\n    auto screen = QGuiApplication::screenAt(pos);\n    if (screen == nullptr)\n        screen = QGuiApplication::primaryScreen();\n    return QGuiApplication::screens().indexOf(screen);\n}\n\nQRect screenGeometry(int i)\n{\n    auto screen = screenFromNumber(i);\n    return screen ? screen->availableGeometry() : QRect();\n}\n\nQRect screenAvailableGeometry(const QWidget &w)\n{\n    auto screen = QGuiApplication::screenAt(w.pos());\n    return screen ? screen->availableGeometry() : screenGeometry(0);\n}\n"
  },
  {
    "path": "src/gui/screen.h",
    "content": "#pragma once\n\n\nclass QPoint;\nclass QRect;\nclass QWidget;\n\nint screenCount();\n\nint screenNumberAt(const QPoint &pos);\n\nQRect screenGeometry(int i);\n\nQRect screenAvailableGeometry(const QWidget &w);\n"
  },
  {
    "path": "src/gui/selectiondata.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#include \"selectiondata.h\"\n\n#include \"common/mimetypes.h\"\n#include \"gui/clipboardbrowser.h\"\n\nvoid addSelectionData(\n        QVariantMap *result,\n        const QList<QPersistentModelIndex> &selectedIndexes)\n{\n    result->insert(mimeSelectedItems, QVariant::fromValue(selectedIndexes));\n}\n\nvoid addSelectionData(\n        QVariantMap *result,\n        const QModelIndexList &selectedIndexes)\n{\n    QList<QPersistentModelIndex> selected;\n    selected.reserve(selectedIndexes.size());\n    for (const auto &index : selectedIndexes)\n        selected.append(index);\n    addSelectionData(result, selected);\n}\n\n/// Adds information about current tab and selection if command is triggered by user.\nQVariantMap selectionData(\n        const ClipboardBrowser &c,\n        const QModelIndex &currentIndex,\n        const QModelIndexList &selectedIndexes)\n{\n    auto result = c.copyIndexes(selectedIndexes);\n\n    result.insert(mimeCurrentTab, c.tabName());\n\n    if ( currentIndex.isValid() ) {\n        const QPersistentModelIndex current = currentIndex;\n        result.insert(mimeCurrentItem, QVariant::fromValue(current));\n    }\n\n    if ( !selectedIndexes.isEmpty() ) {\n        addSelectionData(&result, selectedIndexes);\n    }\n\n    return result;\n}\n\nQVariantMap selectionData(const ClipboardBrowser &c)\n{\n    const QModelIndexList selectedIndexes = c.selectionModel()->selectedIndexes();\n    const auto current = c.selectionModel()->currentIndex();\n    return selectionData(c, current, selectedIndexes);\n}\n"
  },
  {
    "path": "src/gui/selectiondata.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QModelIndexList>\n#include <QVariantMap>\n#include <QtContainerFwd>\n\nclass ClipboardBrowser;\n\nvoid addSelectionData(\n        QVariantMap *result,\n        const QList<QPersistentModelIndex> &selectedIndexes);\n\nvoid addSelectionData(\n        QVariantMap *result,\n        const QModelIndexList &selectedIndexes);\n\n/// Adds information about current tab and selection if command is triggered by user.\nQVariantMap selectionData(\n        const ClipboardBrowser &c,\n        const QModelIndex &currentIndex,\n        const QModelIndexList &selectedIndexes);\n\nQVariantMap selectionData(const ClipboardBrowser &c);\n"
  },
  {
    "path": "src/gui/shortcutbutton.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/shortcutbutton.h\"\n\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/shortcutdialog.h\"\n\n#include <QAction>\n#include <QToolButton>\n#include <QVariant>\n\nnamespace {\n\nconst char propertyShortcut[] = \"CopyQ_shortcut\";\n\n} // namespace\n\nShortcutButton::ShortcutButton(QWidget *parent)\n    : QToolBar(parent)\n    , m_defaultShortcut()\n{\n    setFocusPolicy(Qt::WheelFocus);\n    setToolButtonStyle(Qt::ToolButtonTextBesideIcon);\n\n    m_actionAddShortcut = addAction(QString());\n    m_actionAddShortcut->setToolTip( tr(\"Add shortcut\") );\n    connect( m_actionAddShortcut, &QAction::triggered,\n             this, &ShortcutButton::onButtonAddShortcutClicked );\n\n    addShortcut(m_defaultShortcut);\n}\n\nvoid ShortcutButton::addShortcut(const QKeySequence &shortcut)\n{\n    const auto shortcuts = this->shortcuts();\n    if ( shortcut.isEmpty() || shortcuts.contains(shortcut) )\n        return;\n\n    auto button = new QAction(this);\n    insertAction(m_actionAddShortcut, button);\n    connect( button, &QAction::triggered,\n             this, &ShortcutButton::onShortcutButtonClicked );\n    setButtonShortcut(button, shortcut);\n\n    // Non-flat buttons\n    auto toolButton = qobject_cast<QToolButton *>(widgetForAction(button));\n    if (toolButton)\n        toolButton->setAutoRaise(false);\n\n    emit shortcutAdded(shortcut);\n}\n\nvoid ShortcutButton::addShortcut(const QString &shortcutPortableText)\n{\n    QKeySequence shortcut(shortcutPortableText, QKeySequence::PortableText);\n    if ( !shortcut.isEmpty() )\n        addShortcut(shortcut);\n}\n\nvoid ShortcutButton::clearShortcuts()\n{\n    for (auto action : actions()) {\n        if (action == m_actionAddShortcut)\n            continue;\n\n        emit shortcutRemoved( shortcutForButton(*action) );\n        action->deleteLater();\n    }\n}\n\nvoid ShortcutButton::resetShortcuts()\n{\n    clearShortcuts();\n    addShortcut(m_defaultShortcut);\n}\n\nvoid ShortcutButton::setDefaultShortcut(const QKeySequence &defaultShortcut)\n{\n    m_defaultShortcut = defaultShortcut;\n}\n\nQList<QKeySequence> ShortcutButton::shortcuts() const\n{\n    QList<QKeySequence> shortcuts;\n\n    for (auto action : actions()) {\n        if (action == m_actionAddShortcut)\n            continue;\n\n        shortcuts.append( shortcutForButton(*action) );\n    }\n\n    return shortcuts;\n}\n\nvoid ShortcutButton::checkAmbiguousShortcuts(const QList<QKeySequence> &ambiguousShortcuts,\n                                             const QIcon &warningIcon, const QString &warningToolTip)\n{\n    for (auto action : actions()) {\n        if ( ambiguousShortcuts.contains( shortcutForButton(*action) ) ) {\n            action->setProperty(\"icon\", warningIcon);\n            action->setProperty(\"toolTip\", warningToolTip);\n        } else if ( action->property(\"toolTip\").toString() == warningToolTip ) {\n            action->setProperty(\"icon\", QIcon());\n            action->setProperty(\"toolTip\", QString());\n        }\n    }\n}\n\nvoid ShortcutButton::showEvent(QShowEvent *event)\n{\n    if ( m_actionAddShortcut->icon().isNull() )\n        m_actionAddShortcut->setIcon( getIcon(\"list-add\", IconPlus) );\n\n    QWidget::showEvent(event);\n}\n\nvoid ShortcutButton::focusInEvent(QFocusEvent *event)\n{\n    QToolBar::focusInEvent(event);\n\n    if ( !hasFocus() )\n        return;\n\n    focusNextPrevChild(true);\n}\n\nbool ShortcutButton::focusNextPrevChild(bool next)\n{\n    const QList<QAction*> actions = this->actions();\n\n    if ( actions.isEmpty() )\n        return false;\n\n    auto w = focusWidget();\n    if (!w || w == this) {\n        w = widgetForAction( next ? actions.first() : actions.last() );\n    } else if (w && w->hasFocus()) {\n        auto it = std::find_if(std::begin(actions), std::end(actions), [&](QAction *action) {\n            return widgetForAction(action) == w;\n        });\n        if (next && it == std::end(actions))\n            return focusNextPrevious(next);\n\n        if (!next && it == std::begin(actions))\n            return focusNextPrevious(next);\n\n        if (next)\n            ++it;\n        else\n            --it;\n\n        if (it == std::end(actions))\n            return false;\n\n        w = widgetForAction(*it);\n    }\n\n    if (!w)\n        return false;\n\n    if (!w->isVisible())\n        return focusNextPrevious(next);\n\n    w->setFocus();\n\n    return true;\n}\n\nvoid ShortcutButton::onShortcutButtonClicked()\n{\n    QAction *button = qobject_cast<QAction*>(sender());\n    Q_ASSERT(button != nullptr);\n    addShortcut(button);\n}\n\nvoid ShortcutButton::onButtonAddShortcutClicked()\n{\n    addShortcut(nullptr);\n}\n\nvoid ShortcutButton::addShortcut(QAction *shortcutButton)\n{\n    auto dialog = new ShortcutDialog(this);\n    if (dialog->exec() == QDialog::Rejected)\n        return;\n\n    const QKeySequence newShortcut = dialog->shortcut();\n    const QKeySequence oldShortcut = shortcutButton\n            ? shortcutForButton(*shortcutButton)\n            : QKeySequence();\n\n    if (oldShortcut == newShortcut)\n        return;\n\n    // Remove shortcut button if shortcut is removed, unrecognized or already set.\n    if ( newShortcut.isEmpty() || shortcuts().contains(newShortcut) ) {\n        if (shortcutButton) {\n            delete shortcutButton;\n            emit shortcutRemoved(oldShortcut);\n        }\n    } else if (shortcutButton) {\n        emit shortcutRemoved(oldShortcut);\n        setButtonShortcut(shortcutButton, newShortcut);\n        emit shortcutAdded(newShortcut);\n    } else {\n        addShortcut(newShortcut);\n    }\n}\n\nvoid ShortcutButton::setButtonShortcut(QAction *shortcutButton, const QKeySequence &shortcut)\n{\n    QString label = shortcut.toString(QKeySequence::NativeText);\n    label.replace( QLatin1Char('&'), QLatin1String(\"&&\") );\n    shortcutButton->setText(label);\n    shortcutButton->setProperty(propertyShortcut, shortcut);\n}\n\nQKeySequence ShortcutButton::shortcutForButton(const QAction &w) const\n{\n    return w.property(propertyShortcut).value<QKeySequence>();\n}\n\nbool ShortcutButton::focusNextPrevious(bool next)\n{\n    auto w = next ? nextInFocusChain() : previousInFocusChain();\n    if (w) {\n        w->setFocus();\n        return true;\n    }\n    return false;\n}\n"
  },
  {
    "path": "src/gui/shortcutbutton.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QKeySequence>\n#include <QList>\n#include <QToolBar>\n\nclass QAction;\nclass QHBoxLayout;\n\n/**\n * Widget with buttons for defining shortcuts and single button for adding shortcuts.\n */\nclass ShortcutButton final : public QToolBar\n{\n    Q_OBJECT\npublic:\n    explicit ShortcutButton(QWidget *parent = nullptr);\n\n    /** Creates new shortcut button for @a shortcut if it's valid and same button doesn't exist. */\n    void addShortcut(const QKeySequence &shortcut);\n\n    /**\n     * Overloaded method.\n     *\n     * Creates new shortcut from string formatted as QKeySequence::PortableText (if valid).\n     */\n    void addShortcut(const QString &shortcutPortableText);\n\n    /** Remove all shortcut buttons. */\n    void clearShortcuts();\n\n    /** Remove all shortcut buttons and add button with default shortcut if valid. */\n    void resetShortcuts();\n\n    /** Set default shortcut (after reset()). */\n    void setDefaultShortcut(const QKeySequence &defaultShortcut);\n\n    /** Return valid shortcuts defined by buttons. */\n    QList<QKeySequence> shortcuts() const;\n\n    /** Add icon and tooltip to buttons that contain shortcut from @a ambiguousShortcuts list. */\n    void checkAmbiguousShortcuts(const QList<QKeySequence> &ambiguousShortcuts,\n                                 const QIcon &warningIcon, const QString &warningToolTip);\n\nsignals:\n    /** Emitted if new @a shortcut (with button) was added. */\n    void shortcutAdded(const QKeySequence &shortcut);\n    /** Emitted if @a shortcut (with button) was removed. */\n    void shortcutRemoved(const QKeySequence &shortcut);\n\nprotected:\n    void showEvent(QShowEvent *event) override;\n    void focusInEvent(QFocusEvent *event) override;\n    bool focusNextPrevChild(bool next) override;\n\nprivate:\n    void onShortcutButtonClicked();\n    void onButtonAddShortcutClicked();\n    void addShortcut(QAction *shortcutButton);\n    void setButtonShortcut(QAction *shortcutButton, const QKeySequence &shortcut);\n\n    QKeySequence shortcutForButton(const QAction &w) const;\n\n    bool focusNextPrevious(bool next);\n\n    QKeySequence m_defaultShortcut;\n    QAction *m_actionAddShortcut;\n};\n"
  },
  {
    "path": "src/gui/shortcutdialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"shortcutdialog.h\"\n#include \"ui_shortcutdialog.h\"\n\n#include \"common/log.h\"\n#include \"common/shortcuts.h\"\n#include \"gui/icons.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QKeyEvent>\n#include <QPushButton>\n\nShortcutDialog::ShortcutDialog(QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::ShortcutDialog)\n{\n    ui->setupUi(this);\n\n    QPushButton *resetButton = ui->buttonBox->button(QDialogButtonBox::Reset);\n    Q_ASSERT(resetButton);\n    resetButton->setText(tr(\"Remove Shortcut\"));\n    connect(resetButton, &QAbstractButton::clicked,\n            this, &ShortcutDialog::onResetButtonClicked);\n\n    connect(ui->lineEditShortcut, &QKeySequenceEdit::keySequenceChanged,\n            this, [this](const QKeySequence &keySequence) {\n                if ( !keySequence.isEmpty() )\n                    accept();\n            });\n\n    ui->lineEditShortcut->installEventFilter(this);\n\n    setAttribute(Qt::WA_InputMethodEnabled, false);\n}\n\nShortcutDialog::~ShortcutDialog()\n{\n    delete ui;\n}\n\nQKeySequence ShortcutDialog::shortcut() const\n{\n    return ui->lineEditShortcut->keySequence();\n}\n\nbool ShortcutDialog::eventFilter(QObject *object, QEvent *event)\n{\n    if (object != ui->lineEditShortcut)\n        return QDialog::eventFilter(object, event);\n\n    // WORKAROUND: Meta keyboard modifier in QKeySequenceEdit is not handled\n    // correctly on X11 and Wayland (QTBUG-78212, QTBUG-62102).\n    if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {\n        auto keyEvent = static_cast<QKeyEvent*>(event);\n        const int key = keyEvent->key();\n        return key == Qt::Key_Meta\n            || key == Qt::Key_Super_L\n            || key == Qt::Key_Super_R\n            || key == Qt::Key_Hyper_L\n            || key == Qt::Key_Hyper_R;\n    }\n\n    return QDialog::eventFilter(object, event);\n}\n\nvoid ShortcutDialog::onResetButtonClicked()\n{\n    ui->lineEditShortcut->setKeySequence( QKeySequence() );\n    accept();\n}\n"
  },
  {
    "path": "src/gui/shortcutdialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n\nnamespace Ui {\nclass ShortcutDialog;\n}\n\nclass ShortcutDialog final : public QDialog\n{\n    Q_OBJECT\npublic:\n    explicit ShortcutDialog(QWidget *parent = nullptr);\n    ~ShortcutDialog();\n\n    /** Return accepted shortcut or empty one. */\n    QKeySequence shortcut() const;\n\nprotected:\n    bool eventFilter(QObject *object, QEvent *event) override;\n\nprivate:\n    void onResetButtonClicked();\n\n    Ui::ShortcutDialog *ui;\n};\n"
  },
  {
    "path": "src/gui/shortcutswidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/shortcutswidget.h\"\n#include \"ui_shortcutswidget.h\"\n\n#include \"common/command.h\"\n#include \"common/common.h\"\n#include \"common/predefinedcommands.h\"\n#include \"common/shortcuts.h\"\n#include \"common/timer.h\"\n#include \"gui/commanddialog.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/icons.h\"\n#include \"gui/menuitems.h\"\n#include \"gui/shortcutbutton.h\"\n\n#include <QList>\n#include <QPushButton>\n#include <QSettings>\n\n#include <algorithm>\n\nnamespace {\n\nnamespace Columns {\nenum Columns {\n    Icon,\n    Text,\n    Shortcut,\n\n    Count\n};\n}\n\nQString uiText(QString text)\n{\n    return text.remove('&');\n}\n\nCommand *findShortcutCommand(const QString &name, QVector<Command> &commands)\n{\n    for (auto &command2 : commands) {\n        if (command2.name == name)\n            return &command2;\n    }\n\n    return nullptr;\n}\n\nbool hasShortcutCommand(const QString &name, const QVector<MenuAction> &actions)\n{\n    for (auto &action : actions) {\n        if (action.command.name == name)\n            return true;\n    }\n\n    return false;\n}\n\nbool canAddCommandAction(const Command &command, const QVector<MenuAction> &actions)\n{\n    return command.type() & (CommandType::Menu | CommandType::GlobalShortcut)\n            && !hasShortcutCommand(command.name, actions);\n}\n\nconst QStringList &shortcuts(const Command &command)\n{\n    return (command.type() & CommandType::GlobalShortcut)\n            ? command.globalShortcuts\n            : command.shortcuts;\n}\n\nvoid setShortcuts(Command *command, const QStringList &shortcutNames)\n{\n    if (command->type() & CommandType::GlobalShortcut)\n        command->globalShortcuts = shortcutNames;\n    else\n        command->shortcuts = shortcutNames;\n}\n\n} // namespace\n\nShortcutsWidget::ShortcutsWidget(QWidget *parent)\n    : QWidget(parent)\n    , ui(new Ui::ShortcutsWidget)\n{\n    ui->setupUi(this);\n\n    connect(ui->lineEditFilter, &QLineEdit::textChanged,\n            this, &ShortcutsWidget::onLineEditFilterTextChanged);\n\n    const int iconSize = iconFontSizePixels();\n    for (auto table : { ui->tableWidgetApplication, ui->tableWidgetGlobal }) {\n        table->setColumnCount(Columns::Count);\n        table->horizontalHeader()->setStretchLastSection(true);\n        table->horizontalHeader()->hide();\n        table->verticalHeader()->hide();\n        table->setIconSize(QSize(iconSize, iconSize));\n    }\n\n    initSingleShotTimer( &m_timerCheckAmbiguous, 0, this, &ShortcutsWidget::checkAmbiguousShortcuts );\n}\n\nShortcutsWidget::~ShortcutsWidget()\n{\n    delete ui;\n}\n\nvoid ShortcutsWidget::loadShortcuts(const QSettings &settings)\n{\n    MenuItems items = menuItems();\n    ::loadShortcuts(&items, settings);\n\n    m_actions.clear();\n    m_shortcuts.clear();\n\n    for (auto table : { ui->tableWidgetApplication, ui->tableWidgetGlobal }) {\n        while (table->rowCount() > 0)\n            table->removeRow(0);\n    }\n\n    for (const auto &item : items) {\n        MenuAction action;\n        action.iconName = item.iconName;\n        action.iconId = item.iconId;\n        action.text = item.text;\n        action.settingsKey = item.settingsKey;\n\n        addShortcutRow(action);\n\n        action.shortcutButton->setDefaultShortcut(item.defaultShortcut);\n        for (const auto &shortcut : item.shortcuts)\n            action.shortcutButton->addShortcut(shortcut);\n    }\n\n    addCommands( loadAllCommands() );\n    addCommands( predefinedCommands() );\n}\n\nvoid ShortcutsWidget::saveShortcuts(QSettings *settings)\n{\n    auto commands = loadAllCommands();\n    bool needSaveCommands = false;\n\n    for (const auto &action : m_actions) {\n        QStringList shortcutNames;\n        for (const auto &shortcut : action.shortcutButton->shortcuts())\n            shortcutNames.append(portableShortcutText(shortcut));\n\n        if ( action.settingsKey.isEmpty() ) {\n            auto savedCommand = findShortcutCommand(action.command.name, commands);\n            if (savedCommand) {\n                if ( savedCommand->enable ? (shortcuts(*savedCommand) != shortcutNames) : !shortcutNames.empty() ) {\n                    needSaveCommands = true;\n                    savedCommand->enable = true;\n                    setShortcuts(savedCommand, shortcutNames);\n                }\n            } else if ( !shortcutNames.isEmpty() ) {\n                needSaveCommands = true;\n                auto command = action.command;\n                setShortcuts(&command, shortcutNames);\n                commands.append(command);\n            }\n        } else {\n            // Workaround for QTBUG-51237 (saving empty list results in invalid value).\n            if (shortcutNames.isEmpty())\n                settings->setValue(action.settingsKey, QString());\n            else\n                settings->setValue(action.settingsKey, shortcutNames);\n        }\n    }\n\n    if (needSaveCommands) {\n        saveCommands(commands);\n        emit commandsSaved();\n    }\n}\n\nvoid ShortcutsWidget::addCommands(const QVector<Command> &commands)\n{\n    for ( const auto &command : commands ) {\n        if ( canAddCommandAction(command, m_actions) ) {\n            MenuAction action;\n            action.iconId = toIconId(command.icon);\n            action.text = command.name;\n            action.command = command;\n            addShortcutRow(action);\n\n            if (command.enable) {\n                for (const auto &shortcut : shortcuts(command))\n                    action.shortcutButton->addShortcut(shortcut);\n            }\n        }\n    }\n}\n\nvoid ShortcutsWidget::showEvent(QShowEvent *event)\n{\n    for (auto &action : m_actions) {\n        if ( action.tableItem->icon().isNull() )\n            action.tableItem->setIcon( getIcon(action.iconName, action.iconId) );\n    }\n\n    QWidget::showEvent(event);\n\n    for (auto table : { ui->tableWidgetApplication, ui->tableWidgetGlobal }) {\n        table->resizeColumnToContents(Columns::Icon);\n        table->resizeColumnToContents(Columns::Text);\n    }\n    m_timerCheckAmbiguous.start(); // Update because shortcuts for commands may have changed.\n}\n\nvoid ShortcutsWidget::onShortcutAdded(const QKeySequence &shortcut)\n{\n    m_shortcuts.append(shortcut);\n    m_timerCheckAmbiguous.start();\n}\n\nvoid ShortcutsWidget::onShortcutRemoved(const QKeySequence &shortcut)\n{\n    m_shortcuts.removeOne(shortcut);\n    m_timerCheckAmbiguous.start();\n}\n\nvoid ShortcutsWidget::checkAmbiguousShortcuts()\n{\n    const auto iconAmbiguous = getIcon(\"\", IconCircleExclamation);\n    const auto toolTipAmbiguous = tr(\"Shortcut already exists!\");\n\n    std::sort( m_shortcuts.begin(), m_shortcuts.end() );\n    QList<QKeySequence> ambiguousShortcuts;\n    for ( int i = 1; i < m_shortcuts.size(); ++i ) {\n        if (m_shortcuts[i] == m_shortcuts[i - 1])\n            ambiguousShortcuts.append(m_shortcuts[i]);\n    }\n\n    for ( const auto &action : m_actions )\n        action.shortcutButton->checkAmbiguousShortcuts(ambiguousShortcuts, iconAmbiguous, toolTipAmbiguous);\n}\n\nvoid ShortcutsWidget::onLineEditFilterTextChanged(const QString &text)\n{\n    const QString needle = text.toLower();\n\n    for ( const auto &action : m_actions ) {\n        bool found = uiText(action.text).toLower().contains(needle);\n        if (!found) {\n                for ( const auto &shortcut : action.shortcutButton->shortcuts() ) {\n                    if ( shortcut.toString(QKeySequence::NativeText).toLower().contains(needle) ) {\n                        found = true;\n                        break;\n                    }\n                }\n        }\n\n        const int row = action.tableItem->row();\n        QTableWidget *table = action.tableItem->tableWidget();\n        table->setRowHidden(row, !found);\n    }\n}\n\nvoid ShortcutsWidget::addShortcutRow(MenuAction &action)\n{\n    const bool isGlobal = action.command.type() & CommandType::GlobalShortcut;\n\n    QTableWidget *table = isGlobal\n        ? ui->tableWidgetGlobal\n        : ui->tableWidgetApplication;\n\n    const int row = table->rowCount();\n    table->insertRow(row);\n\n    auto tableItem = new QTableWidgetItem();\n    action.tableItem = tableItem;\n    table->setItem(row, Columns::Icon, tableItem);\n    tableItem->setFlags(Qt::ItemIsEnabled);\n\n    tableItem = new QTableWidgetItem(uiText(action.text));\n    table->setItem(row, Columns::Text, tableItem);\n    tableItem->setFlags(Qt::ItemIsEnabled);\n\n    action.shortcutButton = new ShortcutButton(table);\n    table->setCellWidget(row, Columns::Shortcut, action.shortcutButton);\n\n    m_actions.append(action);\n\n    connect( action.shortcutButton, &ShortcutButton::shortcutAdded,\n             this, &ShortcutsWidget::onShortcutAdded );\n    connect( action.shortcutButton, &ShortcutButton::shortcutRemoved,\n             this, &ShortcutsWidget::onShortcutRemoved );\n}\n"
  },
  {
    "path": "src/gui/shortcutswidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/command.h\"\n\n#include <QIcon>\n#include <QTimer>\n#include <QVector>\n#include <QWidget>\n\nnamespace Ui {\nclass ShortcutsWidget;\n}\n\nclass ShortcutButton;\nclass QSettings;\nclass QTableWidgetItem;\n\nstruct MenuAction {\n    QString iconName;\n    ushort iconId{};\n    QString text;\n\n    QString settingsKey;\n    Command command;\n\n    QTableWidgetItem *tableItem{};\n    ShortcutButton *shortcutButton{};\n};\n\n/**\n * Widget with list of modifiable shortcuts and filter field.\n */\nclass ShortcutsWidget final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit ShortcutsWidget(QWidget *parent = nullptr);\n\n    ~ShortcutsWidget();\n\n    /** Load shortcuts from settings file. */\n    void loadShortcuts(const QSettings &settings);\n    /** Save shortcuts to settings file. */\n    void saveShortcuts(QSettings *settings);\n\n    void addCommands(const QVector<Command> &commands);\n\nsignals:\n    void commandsSaved();\n\nprotected:\n    void showEvent(QShowEvent *event) override;\n\nprivate:\n    void onShortcutAdded(const QKeySequence &shortcut);\n    void onShortcutRemoved(const QKeySequence &shortcut);\n    void checkAmbiguousShortcuts();\n\n    void onLineEditFilterTextChanged(const QString &text);\n\n    void addShortcutRow(MenuAction &action);\n\n    Ui::ShortcutsWidget *ui;\n    QTimer m_timerCheckAmbiguous;\n\n    QVector<MenuAction> m_actions;\n    QList<QKeySequence> m_shortcuts;\n};\n"
  },
  {
    "path": "src/gui/tabbar.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"tabbar.h\"\n\n#include \"common/common.h\"\n#include \"common/mimetypes.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/tabicons.h\"\n\n#include <QIcon>\n#include <QMimeData>\n#include <QMouseEvent>\n#include <QLabel>\n#include <QStyle>\n\nnamespace {\n\nint dropItemsTabIndex(const QDropEvent &event, const QTabBar &parent)\n{\n    return canDropToTab(event) ? parent.tabAt( event.pos() ) : -1;\n}\n\nint tabIndex(const QString &tabName, const TabBar &parent)\n{\n    for (int i = 0; i < parent.count(); ++i) {\n        if (parent.tabName(i) == tabName)\n            return i;\n    }\n\n    return -1;\n}\n\n} // namespace\n\nTabBar::TabBar(QWidget *parent)\n    : QTabBar(parent)\n{\n    setFocusPolicy(Qt::NoFocus);\n    setDrawBase(false);\n    setMinimumSize(1, 1);\n    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);\n    setAcceptDrops(true);\n\n    connect( this, &QTabBar::currentChanged,\n             this, &TabBar::onCurrentChanged );\n}\n\nQString TabBar::getCurrentTabPath() const\n{\n    return QString();\n}\n\nQString TabBar::tabName(int tabIndex) const\n{\n    return QTabBar::tabData(tabIndex).toString();\n}\n\nvoid TabBar::setTabName(int tabIndex, const QString &tabName)\n{\n    // Use tab data to store tab name because tab text can change externally,\n    // e.g. Breeze theme adds missing accelerators (renames \"test\" to \"&test).\n    setTabData(tabIndex, tabName);\n    QTabBar::setTabText(tabIndex, tabName);\n}\n\nvoid TabBar::setTabItemCount(const QString &tabName, const QString &itemCount)\n{\n    const int i = tabIndex(tabName, *this);\n    if (i == -1)\n        return;\n\n    QWidget *tabCountLabel = tabButton(i, QTabBar::RightSide);\n\n    if ( itemCount.isEmpty() ) {\n        if (tabCountLabel) {\n            tabCountLabel->deleteLater();\n            setTabButton(i, QTabBar::RightSide, nullptr);\n        }\n    } else {\n        if (!tabCountLabel) {\n            tabCountLabel = new QLabel(this);\n            tabCountLabel->setObjectName(\"tab_item_counter\");\n            setDefaultTabItemCounterStyle(tabCountLabel);\n            setTabButton(i, QTabBar::RightSide, tabCountLabel);\n        }\n\n        tabCountLabel->setProperty(\"text\", itemCount);\n        tabCountLabel->adjustSize();\n    }\n\n    updateTabStyle(i);\n}\n\nvoid TabBar::setTabIcon(int index, const QString &icon)\n{\n    QTabBar::setTabIcon(index, icon.isEmpty() ? QIcon() : iconFromFile(icon));\n}\n\nvoid TabBar::setTabIcon(const QString &tabName, const QString &icon)\n{\n    const int i = tabIndex(tabName, *this);\n    if (i != -1)\n        setTabIcon(i, icon);\n}\n\nvoid TabBar::insertTab(int index, const QString &tabName)\n{\n    const int i = QTabBar::insertTab(index, tabName);\n    setTabData(i, tabName);\n}\n\nvoid TabBar::removeTab(int index)\n{\n    QTabBar::removeTab(index);\n}\n\nvoid TabBar::moveTab(int from, int to)\n{\n    const QSignalBlocker blocker(this);\n    QTabBar::moveTab(from, to);\n}\n\nvoid TabBar::updateTabIcons(const QHash<QString, QString> &tabIcons)\n{\n    for (int i = 0; i < count(); ++i) {\n        const QString name = tabName(i);\n        const QString icon = tabIcons.value(name);\n        setTabIcon(i, icon);\n    }\n}\n\nvoid TabBar::nextTab()\n{\n    const int index = (currentIndex() + 1) % count();\n    setCurrentIndex(index);\n}\n\nvoid TabBar::previousTab()\n{\n    const int index = (count() + currentIndex() - 1) % count();\n    setCurrentIndex(index);\n}\n\nvoid TabBar::setCurrentTab(int index)\n{\n    QTabBar::setCurrentIndex(index);\n}\n\nvoid TabBar::adjustSize()\n{\n    QTabBar::adjustSize();\n}\n\nvoid TabBar::contextMenuEvent(QContextMenuEvent *event)\n{\n    const int tab = tabAt(event->pos());\n    emit tabBarMenuRequested(event->globalPos(), tab);\n    event->accept();\n}\n\nvoid TabBar::mousePressEvent(QMouseEvent *event)\n{\n    if (event->button() == Qt::MiddleButton) {\n        const int tab = tabAt(event->pos());\n        emit tabCloseRequested(tab);\n        event->accept();\n    } else {\n        QTabBar::mousePressEvent(event);\n    }\n}\n\nvoid TabBar::dragEnterEvent(QDragEnterEvent *event)\n{\n    if ( canDropToTab(*event) )\n        acceptDrag(event);\n    else\n        QTabBar::dragEnterEvent(event);\n}\n\nvoid TabBar::dragMoveEvent(QDragMoveEvent *event)\n{\n    if ( dropItemsTabIndex(*event, *this) != -1 )\n        acceptDrag(event);\n    else\n        QTabBar::dragMoveEvent(event);\n}\n\nvoid TabBar::dropEvent(QDropEvent *event)\n{\n    int tabIndex = dropItemsTabIndex(*event, *this);\n\n    if ( tabIndex != -1 ) {\n        bool accepted = false;\n        emit dropItems( tabName(tabIndex), event->mimeData(), &accepted );\n        if (accepted)\n            acceptDrag(event);\n    } else {\n        QTabBar::dropEvent(event);\n    }\n}\n\nvoid TabBar::tabInserted(int index)\n{\n    QTabBar::tabInserted(index);\n    updateTabStyle(index);\n}\n\nvoid TabBar::onCurrentChanged()\n{\n    for ( int i = 0; i < count(); ++i )\n        updateTabStyle(i);\n}\n\nvoid TabBar::updateTabStyle(int index)\n{\n    QWidget *tabCountLabel = tabButton(index, QTabBar::RightSide);\n    if (tabCountLabel) {\n        tabCountLabel->setProperty(\"CopyQ_selected\", index == currentIndex());\n        style()->unpolish(tabCountLabel);\n        style()->polish(tabCountLabel);\n    }\n}\n"
  },
  {
    "path": "src/gui/tabbar.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/tabswidgetinterface.h\"\n\n#include <QTabBar>\n\nclass QMimeData;\nclass QModelIndex;\nclass QMouseEvent;\nclass QPoint;\n\nclass TabBar final : public QTabBar, public TabsWidgetInterface\n{\n    Q_OBJECT\n\npublic:\n    explicit TabBar(QWidget *parent = nullptr);\n\n    QString getCurrentTabPath() const override;\n\n    bool isTabGroup(const QString &) const override { return false; }\n\n    QString tabName(int tabIndex) const override;\n    void setTabName(int tabIndex, const QString &tabName) override;\n\n    void setTabItemCount(const QString &tabName, const QString &itemCount) override;\n\n    void setTabIcon(int index, const QString &icon);\n    void setTabIcon(const QString &tabName, const QString &icon) override;\n\n    void insertTab(int index, const QString &tabName) override;\n    void removeTab(int index) override;\n    void moveTab(int from, int to) override;\n\n    void updateCollapsedTabs(QList<QString> *) const override {}\n    void setCollapsedTabs(const QList<QString> &) override {}\n\n    void updateTabIcons(const QHash<QString, QString> &tabIcons) override;\n\n    void nextTab() override;\n    void previousTab() override;\n\n    void setCurrentTab(int index) override;\n\n    virtual void adjustSize() override;\n\nsignals:\n    void tabBarMenuRequested(const QPoint &pos, int tab);\n    void tabRenamed(const QString &newName, int index);\n    void dropItems(const QString &tabName, const QMimeData *data, bool *accepted);\n\nprotected:\n    void contextMenuEvent(QContextMenuEvent *event) override;\n    void mousePressEvent(QMouseEvent *event) override;\n    void dragEnterEvent(QDragEnterEvent *event) override;\n    void dragMoveEvent(QDragMoveEvent *event) override;\n    void dropEvent(QDropEvent *event) override;\n    void tabInserted(int index) override;\n\nprivate:\n    void onCurrentChanged();\n\n    void updateTabStyle(int index);\n};\n"
  },
  {
    "path": "src/gui/tabdialog.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"tabdialog.h\"\n#include \"ui_tabdialog.h\"\n\n#include <QPushButton>\n\nTabDialog::TabDialog(TabDialog::TabDialogType type, QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::TabDialog)\n    , m_tabGroupName()\n    , m_tabs()\n{\n    ui->setupUi(this);\n\n    if (type == TabNew) {\n        setWindowTitle( tr(\"New Tab\") );\n        setWindowIcon( QIcon(\":/images/tab_new\") );\n    } else if (type == TabRename) {\n        setWindowTitle( tr(\"Rename Tab\") );\n        setWindowIcon( QIcon(\":/images/tab_rename\") );\n    } else {\n        setWindowTitle( tr(\"Rename Tab Group\") );\n        setWindowIcon( QIcon(\":/images/tab_rename\") );\n    }\n\n    connect( this, &TabDialog::accepted,\n             this, &TabDialog::onAccepted );\n\n    connect( ui->lineEditTabName, &QLineEdit::textChanged,\n             this, &TabDialog::validate );\n\n    validate();\n}\n\nTabDialog::~TabDialog()\n{\n    delete ui;\n}\n\nvoid TabDialog::setTabIndex(int tabIndex)\n{\n    m_tabIndex = tabIndex;\n}\n\nvoid TabDialog::setTabs(const QStringList &tabs)\n{\n    m_tabs = tabs;\n    validate();\n}\n\nvoid TabDialog::setTabName(const QString &tabName)\n{\n    ui->lineEditTabName->setText(tabName);\n    ui->lineEditTabName->selectAll();\n}\n\nvoid TabDialog::setTabGroupName(const QString &tabGroupName)\n{\n    m_tabGroupName = tabGroupName;\n    ui->lineEditTabName->setText(m_tabGroupName);\n}\n\nvoid TabDialog::validate()\n{\n    bool ok = true;\n    const QString text = ui->lineEditTabName->text();\n\n    if ( m_tabGroupName.isEmpty() ) {\n        ok = !text.isEmpty() && !m_tabs.contains(text);\n    } else {\n        const QString tabPrefix = m_tabGroupName + '/';\n        for (const auto &tab : m_tabs) {\n            if ( tab == m_tabGroupName || tab.startsWith(tabPrefix) ) {\n                const QString newName = text + tab.mid(m_tabGroupName.size());\n                if ( newName.isEmpty() || m_tabs.contains(newName) ) {\n                    ok = false;\n                    break;\n                }\n            }\n        }\n    }\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok);\n}\n\nvoid TabDialog::onAccepted()\n{\n    const auto newName = ui->lineEditTabName->text();\n\n    if ( m_tabGroupName.isEmpty() && m_tabIndex == -1 )\n        emit newTabNameAccepted(newName);\n    else if ( m_tabGroupName.isEmpty() )\n        emit barTabNameAccepted(newName, m_tabIndex);\n    else\n        emit treeTabNameAccepted(newName, m_tabGroupName);\n}\n"
  },
  {
    "path": "src/gui/tabdialog.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDialog>\n#include <QStringList>\n\nnamespace Ui {\n    class TabDialog;\n}\n\n/**\n * Dialog for naming and renaming tabs.\n */\nclass TabDialog final : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    /** Tab dialog type (new tab or rename existing tab). */\n    enum TabDialogType {\n        TabNew,\n        TabRename,\n        TabGroupRename\n    };\n\n    explicit TabDialog(TabDialogType type, QWidget *parent = nullptr);\n    ~TabDialog();\n\n    /** Set tab index to rename (emitted parameter of accepted()). */\n    void setTabIndex(int tabIndex);\n\n    /** Set existing tabs for validation. */\n    void setTabs(const QStringList &tabs);\n\n    /** Set current tab name. */\n    void setTabName(const QString &tabName);\n\n    /** Set current tab group name. */\n    void setTabGroupName(const QString &tabGroupName);\n\nsignals:\n    void newTabNameAccepted(const QString &newName);\n    void barTabNameAccepted(const QString &newName, int tabIndex);\n    void treeTabNameAccepted(const QString &newName, const QString &oldName);\n\nprivate:\n    void onAccepted();\n\n    /**\n     * Validate tab name.\n     * Tab name should be non-empty and should not be in existing tab list\n     * (see setTabs()).\n     */\n    void validate();\n\n    Ui::TabDialog *ui;\n    int m_tabIndex = -1;\n    QString m_tabGroupName;\n    QStringList m_tabs;\n};\n"
  },
  {
    "path": "src/gui/tabicons.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"tabicons.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/config.h\"\n#include \"common/settings.h\"\n#include \"common/textdata.h\"\n#include \"gui/iconfactory.h\"\n\n#include <QComboBox>\n#include <QDir>\n#include <QHash>\n#include <QIcon>\n\nnamespace {\n\nconst QString tabsGroup = QStringLiteral(\"Tabs\");\n\nQByteArray tabNameFromFileSuffix(QByteArray base64Suffix)\n{\n    return QByteArray::fromBase64(base64Suffix.replace('-', '/'));\n}\n\n} // namespace\n\nQList<QString> savedTabs()\n{\n    QList<QString> tabs = AppConfig().option<Config::tabs>();\n\n    const QString configPath = settingsDirectoryPath();\n\n    QDir configDir(configPath);\n    QList<QString> files = configDir.entryList({QStringLiteral(\"*_tab_*.dat\")});\n    files.append(configDir.entryList({QStringLiteral(\"*_tab_*.dat.tmp\")}));\n\n    QRegularExpression re(\"_tab_([^.]*)\");\n\n    for (const auto &fileName : files) {\n        const auto m = re.match(fileName);\n        if (m.hasMatch()) {\n            const QString tabName =\n                    getTextData(tabNameFromFileSuffix(m.captured(1).toUtf8()));\n            if ( !tabName.isEmpty() && !tabs.contains(tabName) )\n                tabs.append(tabName);\n        }\n    }\n\n    if ( tabs.isEmpty() )\n        tabs.append( AppConfig().option<Config::clipboard_tab>() );\n\n    return tabs;\n}\n\nQString getIconNameForTabName(const QString &tabName)\n{\n    Settings settings;\n    const int size = settings.beginReadArray(tabsGroup);\n    for(int i = 0; i < size; ++i) {\n        settings.setArrayIndex(i);\n        if (settings.value(\"name\").toString() == tabName)\n            return settings.value(\"icon\").toString();\n    }\n\n    return QString();\n}\n\nvoid setIconNameForTabName(const QString &tabName, const QString &icon)\n{\n    Settings settings;\n    const int size = settings.beginReadArray(tabsGroup);\n    for(int i = 0; i < size; ++i) {\n        settings.setArrayIndex(i);\n        if (settings.value(\"name\").toString() == tabName) {\n            settings.setValue(\"icon\", icon);\n            return;\n        }\n    }\n    settings.endArray();\n\n    settings.beginWriteArray(tabsGroup, size + 1);\n    settings.setArrayIndex(size);\n    settings.setValue(\"name\", tabName);\n    settings.setValue(\"icon\", icon);\n    settings.endArray();\n}\n\nQIcon getIconForTabName(const QString &tabName)\n{\n    const QString fileName = getIconNameForTabName(tabName);\n    return fileName.isEmpty() ? QIcon() : iconFromFile(fileName);\n}\n\nvoid initTabComboBox(QComboBox *comboBox)\n{\n    setComboBoxItems(comboBox, AppConfig().option<Config::tabs>());\n\n    for (int i = 1; i < comboBox->count(); ++i) {\n        const QString tabName = comboBox->itemText(i);\n        const QIcon icon = getIconForTabName(tabName);\n        comboBox->setItemIcon(i, icon);\n    }\n}\n\nvoid setDefaultTabItemCounterStyle(QWidget *widget)\n{\n    QFont font = widget->font();\n    const qreal pointSize = font.pointSizeF();\n    if (pointSize > 0.0)\n        font.setPointSizeF(pointSize * 0.7);\n    else\n        font.setPixelSize( static_cast<int>(font.pixelSize() * 0.7) );\n    widget->setFont(font);\n}\n\nvoid setComboBoxItems(QComboBox *comboBox, const QList<QString> &items)\n{\n    const QString text = comboBox->currentText();\n    comboBox->clear();\n    comboBox->addItem(QString());\n    comboBox->addItems(items);\n    comboBox->setEditText(text);\n\n    const int currentIndex = comboBox->findText(text);\n    if (currentIndex != -1)\n        comboBox->setCurrentIndex(currentIndex);\n}\n"
  },
  {
    "path": "src/gui/tabicons.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n\n#include <QtContainerFwd>\n\nclass QIcon;\nclass QComboBox;\nclass QString;\nclass QWidget;\n\n/** Return list of saved tabs (ordered by \"tabs\" option if possible). */\nQList<QString> savedTabs();\n\nQString getIconNameForTabName(const QString &tabName);\n\nvoid setIconNameForTabName(const QString &tabName, const QString &icon);\n\nQIcon getIconForTabName(const QString &tabName);\n\nvoid initTabComboBox(QComboBox *comboBox);\n\nvoid setDefaultTabItemCounterStyle(QWidget *widget);\n\nvoid setComboBoxItems(QComboBox *comboBox, const QList<QString> &items);\n"
  },
  {
    "path": "src/gui/tabpropertieswidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"gui/tabpropertieswidget.h\"\n#include \"ui_tabpropertieswidget.h\"\n\nTabPropertiesWidget::TabPropertiesWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::TabPropertiesWidget)\n{\n    ui->setupUi(this);\n\n    connect( ui->iconButton, &IconSelectButton::currentIconChanged,\n             this, &TabPropertiesWidget::iconNameChanged );\n    connect( ui->maxItems, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),\n             this, &TabPropertiesWidget::maxItemCountChanged );\n    connect( ui->storeItems, &QCheckBox::toggled,\n             this, &TabPropertiesWidget::storeItemsChanged );\n#ifdef WITH_QCA_ENCRYPTION\n    connect( ui->spinBoxExpireEncryptedTabSeconds, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),\n             this, &TabPropertiesWidget::encryptedExpireSecondsChanged );\n#else\n    ui->labelEncryptedExpireSeconds->hide();\n    ui->spinBoxExpireEncryptedTabSeconds->hide();\n#endif\n}\n\nTabPropertiesWidget::~TabPropertiesWidget()\n{\n    delete ui;\n}\n\nvoid TabPropertiesWidget::setTabName(const QString &name)\n{\n    ui->tabName->setText(name);\n}\n\nvoid TabPropertiesWidget::setIconName(const QString &iconName)\n{\n    ui->iconButton->setCurrentIcon(iconName);\n}\n\nvoid TabPropertiesWidget::setMaxItemCount(int maxItemCount)\n{\n    ui->maxItems->setValue(maxItemCount);\n}\n\nvoid TabPropertiesWidget::setStoreItems(bool storeItems)\n{\n    ui->storeItems->setChecked(storeItems);\n}\n\nvoid TabPropertiesWidget::setEncryptedExpireSeconds(int seconds)\n{\n    ui->spinBoxExpireEncryptedTabSeconds->setValue(seconds);\n}\n"
  },
  {
    "path": "src/gui/tabpropertieswidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QWidget>\n\nnamespace Ui {\nclass TabPropertiesWidget;\n}\n\nclass TabPropertiesWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit TabPropertiesWidget(QWidget *parent = nullptr);\n    ~TabPropertiesWidget();\n\n    void setTabName(const QString &name);\n    void setIconName(const QString &iconName);\n    void setMaxItemCount(int maxItemCount);\n    void setStoreItems(bool storeItems);\n    void setEncryptedExpireSeconds(int seconds);\n\nsignals:\n    void iconNameChanged(const QString &iconName);\n    void maxItemCountChanged(int maxItemCount);\n    void storeItemsChanged(bool storeItems);\n    void encryptedExpireSecondsChanged(int seconds);\n\nprivate:\n    Ui::TabPropertiesWidget *ui;\n};\n"
  },
  {
    "path": "src/gui/tabswidgetinterface.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QtContainerFwd>\n\nclass QString;\n\nclass TabsWidgetInterface {\npublic:\n    TabsWidgetInterface() = default;\n\n    virtual ~TabsWidgetInterface() = default;\n\n    /** Return path to current group in tree (empty string if this is not a tree). */\n    virtual QString getCurrentTabPath() const = 0;\n\n    /** Return true only if tree mode is enabled and tab is tab group. */\n    virtual bool isTabGroup(const QString &tab) const = 0;\n\n    /** Return path of tab in tree or label in tab bar. */\n    virtual QString tabName(int tabIndex) const = 0;\n\n    virtual void setTabName(int tabIndex, const QString &tabName) = 0;\n\n    virtual void setTabItemCount(const QString &tabName, const QString &itemCount) = 0;\n\n    virtual void setTabIcon(const QString &tabName, const QString &icon) = 0;\n\n    virtual void insertTab(int tabIndex, const QString &tabName) = 0;\n\n    /** Remove tab with given @a index. */\n    virtual void removeTab(int index) = 0;\n\n    virtual void updateCollapsedTabs(QList<QString> *collapsedTabs) const = 0;\n\n    virtual void setCollapsedTabs(const QList<QString> &collapsedTabs) = 0;\n\n    virtual void updateTabIcons(const QHash<QString, QString> &tabIcons) = 0;\n\n    virtual void nextTab() = 0;\n    virtual void previousTab() = 0;\n\n    virtual void setCurrentTab(int index) = 0;\n    virtual void moveTab(int from, int to) = 0;\n\n    virtual void adjustSize() = 0;\n\n    TabsWidgetInterface(const TabsWidgetInterface &) = delete;\n    TabsWidgetInterface &operator=(const TabsWidgetInterface &) = delete;\n};\n"
  },
  {
    "path": "src/gui/tabtree.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"tabtree.h\"\n\n#include \"common/common.h\"\n#include \"common/display.h\"\n#include \"common/timer.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/iconfont.h\"\n#include \"gui/tabicons.h\"\n\n#include <QApplication>\n#include <QLabel>\n#include <QList>\n#include <QMimeData>\n#include <QMouseEvent>\n#include <QScrollBar>\n#include <QHBoxLayout>\n#include <QTreeWidgetItemIterator>\n\nnamespace {\n\nenum {\n    DataText = Qt::UserRole,\n    DataItemCount\n};\n\nvoid updateItemSize(QTreeWidgetItem *item)\n{\n    QSize size(0, 0);\n\n    QWidget *w = item->treeWidget()->itemWidget(item, 0);\n\n    if (w) {\n        size = w->minimumSizeHint();\n\n        if (!item->icon(0).isNull()) {\n            const QSize iconSize = item->treeWidget()->iconSize();\n            size = QSize(\n                        size.width() + iconSize.width() + 8,\n                        qMax(size.height(), iconSize.height())\n                        );\n        }\n    }\n\n    item->setSizeHint(0, size);\n}\n\nvoid setItemWidgetSelected(QTreeWidgetItem *item)\n{\n    if (item == nullptr)\n        return;\n\n    QTreeWidget *parent = item->treeWidget();\n    if (parent == nullptr)\n        return;\n\n    QWidget *w = parent->itemWidget(item, 0);\n\n    if (w) {\n        QStyle *style = w->style();\n        style->unpolish(w);\n        style->polish(w);\n\n        bool selected = parent->currentItem() == item;\n\n        for (auto child : w->findChildren<QWidget *>()) {\n            child->setProperty(\"CopyQ_selected\", selected);\n            style->unpolish(child);\n            style->polish(child);\n        }\n    }\n\n    updateItemSize(item);\n}\n\nQTreeWidgetItem *findLastTreeItem(const QTreeWidget &tree, QStringList *pathComponents)\n{\n    QTreeWidgetItem *parentItem = nullptr;\n\n    if ( !pathComponents->isEmpty() ) {\n        const QString &text = pathComponents->first();\n\n        for (int i = 0; i < tree.topLevelItemCount(); ++i) {\n            if ( tree.topLevelItem(i)->data(0, DataText).toString() == text ) {\n                parentItem = tree.topLevelItem(i);\n                break;\n            }\n        }\n    }\n\n    if (parentItem != nullptr) {\n        pathComponents->pop_front();\n\n        while ( !pathComponents->isEmpty() ) {\n            const QString &text = pathComponents->first();\n            QTreeWidgetItem *item = nullptr;\n\n            for (int i = 0; i < parentItem->childCount(); ++i) {\n                if ( parentItem->child(i)->data(0, DataText).toString() == text ) {\n                    item = parentItem->child(i);\n                    break;\n                }\n            }\n\n            if (item == nullptr)\n                break;\n\n            parentItem = item;\n            pathComponents->pop_front();\n        }\n    }\n\n    return parentItem;\n}\n\nQTreeWidgetItem *dropItemsTarget(const QDropEvent &event, const QTreeWidget &parent)\n{\n    return canDropToTab(event) ? parent.itemAt( event.pos() ) : nullptr;\n}\n\nint itemLabelPadding()\n{\n    return iconFontSizePixels() / 4;\n}\n\nQLabel *createLabel(const QString &objectName, QWidget *parent)\n{\n    QLabel *label = new QLabel(parent);\n    const int p = itemLabelPadding();\n    label->setContentsMargins({p,p,p,p});\n    label->setObjectName(objectName);\n\n    return label;\n}\n\nclass ItemLabel final : public QWidget {\npublic:\n    explicit ItemLabel(QTreeWidgetItem *item)\n        : QWidget(item->treeWidget())\n        , m_treeWidget(item->treeWidget())\n        , m_label(createLabel(\"tab_tree_item\", this))\n        , m_labelItemCount(nullptr)\n        , m_layout(new QHBoxLayout(this))\n    {\n        m_label->setBuddy(m_treeWidget);\n        m_label->installEventFilter(this);\n\n        m_layout->addWidget(m_label);\n        m_layout->setContentsMargins({});\n        m_layout->addStretch(1);\n        m_layout->setSizeConstraint(QLayout::SetMinimumSize);\n\n        updateFromItem(item);\n    }\n\n    void updateFromItem(QTreeWidgetItem *item)\n    {\n        const QString text = item->data(0, DataText).toString();\n        const QString itemCount = item->data(0, DataItemCount).toString();\n        setText(text);\n        setItemCountLabel(itemCount);\n    }\n\n    void setText(const QString &text)\n    {\n        m_label->setText(text);\n    }\n\n    void setItemCountLabel(const QString &itemCount)\n    {\n        if (itemCount.isEmpty()) {\n            delete m_labelItemCount;\n            m_labelItemCount = nullptr;\n        } else {\n            if (!m_labelItemCount) {\n                m_labelItemCount = createLabel(\"tab_item_counter\", this);\n                setDefaultTabItemCounterStyle(m_labelItemCount);\n                m_layout->insertWidget(1, m_labelItemCount);\n                m_labelItemCount->show();\n            }\n\n            m_labelItemCount->setProperty(\"text\", itemCount);\n        }\n    }\n\nprotected:\n    bool eventFilter(QObject *, QEvent *event) override\n    {\n        if ( event->type() == QEvent::Shortcut ) {\n            for ( QTreeWidgetItemIterator it(m_treeWidget->topLevelItem(0)); *it; ++it ) {\n                auto item = *it;\n                if ( m_treeWidget->itemWidget(item, 0) == this ) {\n                    m_treeWidget->setCurrentItem(item);\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\nprivate:\n    QTreeWidget *m_treeWidget;\n    QLabel *m_label;\n    QLabel *m_labelItemCount;\n    QHBoxLayout *m_layout;\n};\n\nItemLabel *itemLabel(QTreeWidgetItem *item)\n{\n    return static_cast<ItemLabel*>( item->treeWidget()->itemWidget(item, 0) );\n}\n\nvoid labelItem(QTreeWidgetItem *item)\n{\n    ItemLabel *label = itemLabel(item);\n    if (label) {\n        label->updateFromItem(item);\n        return;\n    }\n\n    QTreeWidget *parent = item->treeWidget();\n    label = new ItemLabel(item);\n    label->installEventFilter(parent);\n    item->setTextAlignment(0, Qt::AlignLeft);\n    parent->setItemWidget(item, 0, label);\n\n    setItemWidgetSelected(item);\n}\n\nbool isInside(QWidget *child, QWidget *parent)\n{\n    const QPoint scrollBarPosition = child->mapTo(parent, QPoint(0,0));\n    return parent->contentsRect().contains(scrollBarPosition);\n}\n\n} // namespace\n\nTabTree::TabTree(QWidget *parent)\n    : QTreeWidget(parent)\n{\n    connect( this, &QTreeWidget::currentItemChanged,\n             this, &TabTree::onCurrentItemChanged );\n\n    setDragEnabled(true);\n    setDragDropMode(QAbstractItemView::InternalMove);\n    setDragDropOverwriteMode(false);\n    setDefaultDropAction(Qt::CopyAction); // otherwise tab is lost if moved outside tree\n\n    setFrameShape(QFrame::NoFrame);\n    setHeaderHidden(true);\n    setSelectionMode(QAbstractItemView::SingleSelection);\n\n    const int x = smallIconSize();\n    setIconSize(QSize(x, x));\n\n    setRootIsDecorated(false);\n\n    setMinimumHeight(fontMetrics().lineSpacing() * 3);\n    verticalScrollBar()->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored);\n\n    verticalScrollBar()->installEventFilter(this);\n\n    connect( this, &QTreeWidget::itemCollapsed, this, &TabTree::updateSize );\n    connect( this, &QTreeWidget::itemExpanded, this, &TabTree::updateSize );\n\n    initSingleShotTimer( &m_timerUpdate, 0, this, &TabTree::doUpdateSize );\n}\n\nQString TabTree::getCurrentTabPath() const\n{\n    return getTabPath( currentItem() );\n}\n\nbool TabTree::isTabGroup(const QString &tab) const\n{\n    return isTabGroup( findTreeItem(tab) );\n}\n\nQString TabTree::tabName(int tabIndex) const\n{\n    return getTabPath( findTreeItem(tabIndex) );\n}\n\nvoid TabTree::setTabName(int tabIndex, const QString &tabName)\n{\n    QTreeWidgetItem *oldItem = findTreeItem(tabIndex);\n    Q_ASSERT(oldItem);\n\n    if (getTabPath(oldItem) == tabName)\n        return;\n\n    const QString itemCount = oldItem->data(0, DataItemCount).toString();\n    insertTab(tabIndex, tabName);\n    if (oldItem == currentItem())\n        setCurrentTab(tabIndex);\n\n    // Remove old item if it's an empty group.\n    m_tabs.removeOne(oldItem);\n    if ( isEmptyTabGroup(oldItem) ) {\n        deleteItem(oldItem);\n    } else {\n        // Remove item counter from non-tab group.\n        setTabItemCount(oldItem, QString());\n    }\n\n    QTreeWidgetItem *newItem = findTreeItem(tabIndex);\n    Q_ASSERT(newItem);\n    Q_ASSERT(getTabPath(newItem) == tabName);\n\n    if ( !itemCount.isEmpty() )\n        setTabItemCount(newItem, itemCount);\n\n    updateItemSize(newItem);\n    updateSize();\n}\n\nvoid TabTree::setTabItemCount(const QString &tabName, const QString &itemCount)\n{\n    QTreeWidgetItem *item = findTreeItem(tabName);\n    if (item)\n        setTabItemCount(item, itemCount);\n}\n\nvoid TabTree::setTabItemCount(QTreeWidgetItem *item, const QString &itemCount)\n{\n    item->setData(0, DataItemCount, itemCount);\n\n    ItemLabel *label = itemLabel(item);\n    Q_ASSERT(label);\n    label->setItemCountLabel(itemCount);\n\n    updateItemSize(item);\n    updateSize();\n}\n\nvoid TabTree::setTabIcon(QTreeWidgetItem *item, const QString &icon)\n{\n    item->setIcon(0, icon.isEmpty() ? QIcon() : iconFromFile(icon));\n    updateItemSize(item);\n    updateSize();\n}\n\nvoid TabTree::setTabIcon(const QString &tabName, const QString &icon)\n{\n    QTreeWidgetItem *item = findTreeItem(tabName);\n    if (item)\n        setTabIcon(item, icon);\n}\n\nvoid TabTree::insertTab(int index, const QString &path)\n{\n    QStringList pathComponents = path.split('/');\n    QTreeWidgetItem *item = findLastTreeItem(*this, &pathComponents);\n    const bool selectTab = topLevelItemCount() == 0;\n\n    for (const auto &text : pathComponents) {\n        QTreeWidgetItem *parent = item;\n\n        if (parent != nullptr) {\n            int to = 0;\n            for ( ; to < parent->childCount(); ++to ) {\n                 const int index2 = getTabIndex(parent->child(to));\n                 if (index2 != -1 && index < index2)\n                     break;\n            }\n            int from = parent->childCount();\n            item = new QTreeWidgetItem(parent);\n            if (from != to)\n                parent->insertChild(to, parent->takeChild(from));\n        } else {\n            int to = 0;\n            for ( ; to < topLevelItemCount(); ++to ) {\n                 const int index2 = getTabIndex(topLevelItem(to));\n                 if (index2 != -1 && index < index2)\n                     break;\n            }\n            int from = topLevelItemCount();\n            item = new QTreeWidgetItem(this);\n            if (from != to)\n                insertTopLevelItem(to, takeTopLevelItem(from));\n        }\n\n        item->setExpanded(true);\n        item->setData(0, DataText, text);\n\n        labelItem(item);\n    }\n\n    Q_ASSERT(item != nullptr);\n    m_tabs.insert(index, item);\n\n    if (selectTab)\n        setCurrentItem(item);\n\n    updateSize();\n}\n\nvoid TabTree::removeTab(int index)\n{\n    QTreeWidgetItem *item = findTreeItem(index);\n    if (item == nullptr)\n        return;\n\n    m_tabs.removeOne(item);\n    if (item->childCount() == 0)\n        deleteItem(item);\n\n    updateSize();\n}\n\nvoid TabTree::updateCollapsedTabs(QList<QString> *tabs) const\n{\n    tabs->clear();\n    for ( QTreeWidgetItemIterator it(topLevelItem(0)); *it; ++it ) {\n        auto item = *it;\n        if ( isTabGroup(item) && !item->isExpanded() )\n            tabs->append( getTabPath(item) );\n    }\n}\n\nvoid TabTree::setCollapsedTabs(const QList<QString> &collapsedPaths)\n{\n    m_collapsedPaths = collapsedPaths;\n    for (const auto &path : collapsedPaths) {\n        QTreeWidgetItem *item = findTreeItem(path);\n        if ( isTabGroup(item) )\n            item->setExpanded(false);\n    }\n}\n\nvoid TabTree::updateTabIcons(const QHash<QString, QString> &tabIcons)\n{\n    for ( QTreeWidgetItemIterator it(topLevelItem(0)); *it; ++it ) {\n        const QString name = getTabPath(*it);\n        const QString icon = tabIcons.value(name);\n        setTabIcon(*it, icon);\n    }\n}\n\nvoid TabTree::nextTab()\n{\n    QTreeWidgetItem *item = currentItem();\n    if (item != nullptr)\n        item = itemBelow(item);\n\n    if (item == nullptr)\n        item = topLevelItem(0);\n\n    if (item != nullptr)\n        setCurrentItem(item);\n}\n\nvoid TabTree::previousTab()\n{\n    QTreeWidgetItem *item = currentItem();\n    if (item != nullptr)\n        item = itemAbove(item);\n\n    if (item == nullptr) {\n        item = topLevelItem( topLevelItemCount() - 1 );\n        while ( isTabGroup(item) && item->isExpanded() )\n            item = item->child( item->childCount() - 1 );\n    }\n\n    if (item != nullptr)\n        setCurrentItem(item);\n}\n\nvoid TabTree::setCurrentTab(int index)\n{\n    if (index < 0)\n        return;\n\n    QTreeWidgetItem *item = findTreeItem(index);\n    if (item != nullptr)\n        setCurrentItem(item);\n}\n\nvoid TabTree::moveTab(int from, int to)\n{\n    m_tabs.move(from, to);\n}\n\nvoid TabTree::adjustSize()\n{\n    updateSize();\n}\n\nQTreeWidgetItem *TabTree::findTreeItem(int index) const\n{\n    return m_tabs.value(index);\n}\n\nQTreeWidgetItem *TabTree::findTreeItem(const QString &path) const\n{\n    QStringList pathComponents = path.split('/');\n    QTreeWidgetItem *parentItem = findLastTreeItem(*this, &pathComponents);\n    return pathComponents.isEmpty() ? parentItem : nullptr;\n}\n\nint TabTree::getTabIndex(const QTreeWidgetItem *item) const\n{\n    return (item == nullptr) ? -1 : m_tabs.indexOf( const_cast<QTreeWidgetItem*>(item) );\n}\n\nQString TabTree::getTabPath(const QTreeWidgetItem *item) const\n{\n    QString result;\n    const QTreeWidgetItem *parent = item;\n\n    while (parent != nullptr) {\n        const QString part = parent->data(0, DataText).toString();\n        result.prepend('/');\n        result.prepend(part);\n        parent = parent->parent();\n    }\n\n    result.chop(1);\n\n    return result;\n}\n\nbool TabTree::isTabGroup(const QTreeWidgetItem *item) const\n{\n    return item != nullptr && item->childCount() > 0;\n}\n\nbool TabTree::isEmptyTabGroup(const QTreeWidgetItem *item) const\n{\n    return item->childCount() == 0 && getTabIndex(item) < 0;\n}\n\nQSize TabTree::sizeHint() const\n{\n    return minimumSizeHint();\n}\n\nvoid TabTree::contextMenuEvent(QContextMenuEvent *event)\n{\n    requestTabMenu(event->pos(), event->globalPos());\n    event->accept();\n}\n\nvoid TabTree::dragEnterEvent(QDragEnterEvent *event)\n{\n    if ( canDropToTab(*event) ) {\n        acceptDrag(event);\n    } else {\n        QTreeWidget::dragEnterEvent(event);\n        // Workaround for QTBUG-44939 (Qt 5.4): Don't ignore successive drag move events.\n        event->acceptProposedAction();\n    }\n}\n\nvoid TabTree::dragMoveEvent(QDragMoveEvent *event)\n{\n    if ( dropItemsTarget(*event, *this) )\n        acceptDrag(event);\n    else if ( itemAt(event->pos()) )\n        QTreeWidget::dragMoveEvent(event);\n    else\n        event->ignore();\n}\n\nvoid TabTree::dropEvent(QDropEvent *event)\n{\n    const auto current = currentItem();\n    if (current == nullptr)\n        return;\n\n    const auto targetItem = dropItemsTarget(*event, *this);\n    if (targetItem) {\n        bool accepted = false;\n        emit dropItems( getTabPath(targetItem), event->mimeData(), &accepted );\n        if (accepted)\n            acceptDrag(event);\n    } else if ( itemAt(event->pos()) ) {\n        const QString oldPrefix = getTabPath(current);\n\n        QSet<QTreeWidgetItem*> collapsedItems;\n        for ( QTreeWidgetItemIterator it(topLevelItem(0)); *it; ++it ) {\n            auto item = *it;\n            if ( !item->isExpanded() )\n                collapsedItems.insert(item);\n        }\n\n        blockSignals(true);\n        QTreeWidget::dropEvent(event);\n        setCurrentItem(current);\n        setItemWidgetSelected(current);\n        blockSignals(false);\n\n        // Rename moved item if non-unique.\n        QStringList uniqueTabNames;\n        const auto parent = current->parent();\n        for (int i = 0, count = parent ? parent->childCount() : topLevelItemCount(); i < count; ++i) {\n            QTreeWidgetItem *sibling = parent ? parent->child(i) : topLevelItem(i);\n            if (sibling != current)\n                uniqueTabNames.append( getTabPath(sibling) );\n        }\n\n        auto newPrefix = getTabPath(current);\n        if ( uniqueTabNames.contains(newPrefix) ) {\n            renameToUnique(&newPrefix, uniqueTabNames);\n            const QString text = newPrefix.mid( newPrefix.lastIndexOf(QChar('/')) + 1 );\n            current->setData(0, DataText, text);\n            labelItem(current);\n        }\n\n        QList<QTreeWidgetItem*> newTabs;\n        QList<int> indexes;\n        QList<QPersistentModelIndex> toDelete;\n        for ( QTreeWidgetItemIterator it(topLevelItem(0)); *it; ++it ) {\n            auto item = *it;\n            item->setExpanded( !collapsedItems.contains(item) );\n            // Remove empty groups.\n            if ( isEmptyTabGroup(item) ) {\n                toDelete.append(indexFromItem(item));\n            } else {\n                const int oldIndex = getTabIndex(item);\n                if (oldIndex != -1) {\n                    newTabs.append(item);\n                    indexes.append(oldIndex);\n                }\n            }\n        }\n\n        for (const auto &index : toDelete) {\n            if (!index.isValid())\n                continue;\n\n            QTreeWidgetItem *item = itemFromIndex(index);\n            if (item)\n                deleteItem(item);\n        }\n\n        updateSize();\n\n        m_tabs = std::move(newTabs);\n        emit tabsMoved(oldPrefix, newPrefix, indexes);\n    } else {\n        event->ignore();\n    }\n}\n\nbool TabTree::eventFilter(QObject *obj, QEvent *event)\n{\n    if ( obj == verticalScrollBar() ) {\n        if ( event->type() == QEvent::Show || event->type() == QEvent::Hide )\n            updateSize();\n    }\n\n    return QTreeWidget::eventFilter(obj, event);\n}\n\nvoid TabTree::rowsInserted(const QModelIndex &parent, int start, int end)\n{\n    QTreeWidget::rowsInserted(parent, start, end);\n\n    QList<QTreeWidgetItem *> items;\n\n    for (int row = start; row <= end; ++row) {\n        items.clear();\n        items.append( parent.isValid() ? itemFromIndex(model()->index(row, 0, parent))\n                                       : topLevelItem(row) );\n        while ( !items.isEmpty() ) {\n            QTreeWidgetItem *item = items.takeLast();\n            labelItem(item);\n\n            const int n = item->childCount();\n            items.reserve(items.size() + n);\n            for (int i = 0; i < n; ++i)\n                items.append(item->child(i));\n        }\n    }\n}\n\nvoid TabTree::showEvent(QShowEvent *event)\n{\n    QTreeWidget::showEvent(event);\n\n    // Re-apply collapsed state after the first layout. QTreeWidget may\n    // auto-expand items during deferred layout before the widget is shown.\n    for (const auto &path : m_collapsedPaths) {\n        QTreeWidgetItem *item = findTreeItem(path);\n        if ( isTabGroup(item) )\n            item->setExpanded(false);\n    }\n    m_collapsedPaths.clear();\n\n    updateSize();\n}\n\nvoid TabTree::onCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)\n{\n    emit currentTabChanged( getTabIndex(current) );\n    setItemWidgetSelected(current);\n    setItemWidgetSelected(previous);\n}\n\nvoid TabTree::updateSize()\n{\n    m_timerUpdate.start();\n}\n\nvoid TabTree::doUpdateSize()\n{\n    doItemsLayout();\n\n    const QMargins margins = contentsMargins();\n    int w = margins.left() + margins.right();\n\n    // Some styles put scrollbar outside of parent's contents so there is no need\n    // to resize parent widget.\n    if ( verticalScrollBar()->isVisible() && isInside(verticalScrollBar(), this) )\n        w += verticalScrollBar()->width();\n\n    resizeColumnToContents(0);\n    w += sizeHintForColumn(0);\n\n    setFixedWidth(w);\n}\n\nvoid TabTree::requestTabMenu(QPoint itemPosition, QPoint menuPosition)\n{\n    QTreeWidgetItem *item = itemAt(itemPosition);\n    QString tabPath = getTabPath(item);\n    emit tabTreeMenuRequested(menuPosition, tabPath);\n}\n\nvoid TabTree::deleteItem(QTreeWidgetItem *item)\n{\n    // Recursively remove empty parent item.\n    QTreeWidgetItem *parent = item->parent();\n    while (parent != nullptr && parent->childCount() == 1 && getTabIndex(parent) < 0) {\n        item = parent;\n        parent = item->parent();\n    }\n\n    delete item;\n}\n"
  },
  {
    "path": "src/gui/tabtree.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/tabswidgetinterface.h\"\n\n#include <QList>\n#include <QString>\n#include <QTimer>\n#include <QTreeWidget>\n\nclass QMimeData;\nclass QTreeWidgetItem;\n\nclass TabTree final : public QTreeWidget, public TabsWidgetInterface\n{\n    Q_OBJECT\npublic:\n    explicit TabTree(QWidget *parent = nullptr);\n\n    QString getCurrentTabPath() const override;\n\n    bool isTabGroup(const QString &tab) const override;\n\n    QString tabName(int tabIndex) const override;\n    void setTabName(int tabIndex, const QString &tabName) override;\n\n    void setTabItemCount(const QString &tabName, const QString &itemCount) override;\n\n    void setTabIcon(QTreeWidgetItem *item, const QString &icon);\n    void setTabIcon(const QString &tabName, const QString &icon) override;\n\n    void insertTab(int index, const QString &path) override;\n    void removeTab(int index) override;\n\n    void updateCollapsedTabs(QList<QString> *collapsedTabs) const override;\n    void setCollapsedTabs(const QList<QString> &collapsedTabs) override;\n\n    void updateTabIcons(const QHash<QString, QString> &tabIcons) override;\n\n    void nextTab() override;\n    void previousTab() override;\n\n    void setCurrentTab(int index) override;\n    void moveTab(int from, int to) override;\n\n    void adjustSize() override;\n\n    /** Return item with given @a index or nullptr if it doesn't exist. */\n    QTreeWidgetItem *findTreeItem(int index) const;\n\n    /** Return item with given @a path or nullptr if it doesn't exist. */\n    QTreeWidgetItem *findTreeItem(const QString &path) const;\n\n    /** Get tab index for @a item (-1 if it's a group). */\n    int getTabIndex(const QTreeWidgetItem *item) const;\n\n    /** Return path to item in tree. */\n    QString getTabPath(const QTreeWidgetItem *item) const;\n\n    /** Return true only if tab is tab group. */\n    bool isTabGroup(const QTreeWidgetItem *item) const;\n\n    /** Return true only if tab is tab group and is empty. */\n    bool isEmptyTabGroup(const QTreeWidgetItem *item) const;\n\n    QSize sizeHint() const override;\n\nsignals:\n    void currentTabChanged(int index);\n    void tabTreeMenuRequested(const QPoint &pos, const QString &groupPath);\n    void tabsMoved(const QString &oldPrefix, const QString &newPrefix, const QList<int> &indexes);\n    void dropItems(const QString &tabName, const QMimeData *data, bool *accepted);\n\nprotected:\n    void contextMenuEvent(QContextMenuEvent *event) override;\n    void dragEnterEvent(QDragEnterEvent *event) override;\n    void dragMoveEvent(QDragMoveEvent *event) override;\n    void dropEvent(QDropEvent *event) override;\n    bool eventFilter(QObject *obj, QEvent *event) override;\n    void rowsInserted(const QModelIndex &parent, int start, int end) override;\n    void showEvent(QShowEvent *event) override;\n\nprivate:\n    void onCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);\n    void updateSize();\n    void doUpdateSize();\n\n    void requestTabMenu(QPoint itemPosition, QPoint menuPosition);\n    void deleteItem(QTreeWidgetItem *item);\n\n    void setTabItemCount(QTreeWidgetItem *item, const QString &itemCount);\n\n    QTimer m_timerUpdate;\n    QList<QTreeWidgetItem*> m_tabs;\n    QList<QString> m_collapsedPaths;\n};\n"
  },
  {
    "path": "src/gui/tabwidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"tabwidget.h\"\n#include \"tabbar.h\"\n#include \"tabtree.h\"\n\n#include \"common/config.h\"\n\n#include <QAction>\n#include <QBoxLayout>\n#include <QEvent>\n#include <QMainWindow>\n#include <QMimeData>\n#include <QPoint>\n#include <QSettings>\n#include <QStackedWidget>\n#include <QToolBar>\n\nnamespace {\n\nQString getTabWidgetConfigurationFilePath()\n{\n    return getConfigurationFilePath(\"_tabs.ini\");\n}\n\ntemplate <typename Receiver, typename Slot>\nvoid addTabAction(QWidget *widget, const QKeySequence &shortcut,\n                  Receiver *receiver, Slot slot,\n                  Qt::ShortcutContext context = Qt::WindowShortcut)\n{\n    auto act = new QAction(widget);\n    act->setShortcut(shortcut);\n    act->setShortcutContext(context);\n    QObject::connect(act, &QAction::triggered, receiver, slot);\n    widget->addAction(act);\n}\n\n} // namespace\n\nTabWidget::TabWidget(QWidget *parent)\n    : QWidget(parent)\n    , m_toolBar(new QToolBar(this))\n    , m_toolBarTree(new QToolBar(this))\n    , m_stackedWidget(nullptr)\n    , m_hideTabBar(false)\n    , m_showTabItemCount(false)\n{\n    // Set object name for tool bars so they can be saved with QMainWindow::saveState().\n    m_toolBar->setObjectName(\"toolBarTabBar\");\n    m_toolBarTree->setObjectName(\"toolBarTabTree\");\n\n    m_toolBar->setContextMenuPolicy(Qt::NoContextMenu);\n    m_toolBarTree->setContextMenuPolicy(Qt::NoContextMenu);\n\n    m_toolBar->installEventFilter(this);\n    connect( m_toolBar, &QToolBar::orientationChanged,\n             this, &TabWidget::onToolBarOrientationChanged );\n\n    auto layout = new QBoxLayout(QBoxLayout::TopToBottom, this);\n    setLayout(layout);\n    layout->setContentsMargins(0, 0, 0, 0);\n    layout->setSpacing(0);\n\n    m_stackedWidget = new QStackedWidget(this);\n    layout->addWidget(m_stackedWidget);\n\n    createTabBar();\n\n    addTabAction(this, QKeySequence::PreviousChild, this, &TabWidget::previousTab);\n    addTabAction(this, QKeySequence::NextChild, this, &TabWidget::nextTab);\n}\n\nQString TabWidget::getCurrentTabPath() const\n{\n    return m_tabs->getCurrentTabPath();\n}\n\nbool TabWidget::isTabGroup(const QString &tab) const\n{\n    return m_tabs->isTabGroup(tab);\n}\n\nbool TabWidget::isTabGroupSelected() const\n{\n    QWidget *w = currentWidget();\n    return w != nullptr && w->isHidden();\n}\n\nint TabWidget::currentIndex() const\n{\n    return m_stackedWidget->currentIndex();\n}\n\nQWidget *TabWidget::widget(int tabIndex) const\n{\n    return m_stackedWidget->widget(tabIndex);\n}\n\nint TabWidget::count() const\n{\n    return m_stackedWidget->count();\n}\n\nQString TabWidget::tabName(int tabIndex) const\n{\n    return m_tabs->tabName(tabIndex);\n}\n\nint TabWidget::tabIndex(const QString &tabName) const\n{\n    for (int i = 0; i < count(); ++i) {\n        if ( tabName == this->tabName(i) )\n            return i;\n    }\n    return -1;\n}\n\nvoid TabWidget::setTabName(int tabIndex, const QString &tabName)\n{\n    m_tabs->setTabName(tabIndex, tabName);\n    m_tabs->adjustSize();\n}\n\nvoid TabWidget::setTabItemCountVisible(bool visible)\n{\n    m_showTabItemCount = visible;\n}\n\nvoid TabWidget::setTabIcon(const QString &tabName, const QString &icon)\n{\n    m_tabs->setTabIcon(tabName, icon);\n}\n\nvoid TabWidget::insertTab(int tabIndex, QWidget *widget, const QString &tabName)\n{\n    const bool firstTab = count() == 0;\n    m_stackedWidget->insertWidget(tabIndex, widget);\n\n    m_tabs->insertTab(tabIndex, tabName);\n    m_toolBarCurrent->layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);\n\n    if (firstTab)\n        emit currentChanged(0, -1);\n\n    updateTabItemCount(tabName);\n    updateToolBar();\n}\n\nvoid TabWidget::removeTab(int tabIndex)\n{\n    if (tabIndex == currentIndex())\n        setCurrentIndex(tabIndex == 0 ? 1 : 0);\n\n    // Item count must be updated If tab is removed but tab group remains.\n    const QString tabName = this->tabName(tabIndex);\n    m_tabs->setTabItemCount(tabName, QString());\n\n    QWidget *w = m_stackedWidget->widget(tabIndex);\n    m_tabItemCounters.remove(w);\n    m_stackedWidget->removeWidget(w);\n    delete w;\n\n    m_tabs->removeTab(tabIndex);\n\n    updateToolBar();\n}\n\nQStringList TabWidget::tabs() const\n{\n    QStringList tabs;\n    tabs.reserve( count() );\n    for( int i = 0; i < count(); ++i )\n        tabs.append( tabName(i) );\n\n    return tabs;\n}\n\nvoid TabWidget::addToolBars(QMainWindow *mainWindow)\n{\n    mainWindow->addToolBar(Qt::TopToolBarArea, m_toolBar);\n    mainWindow->addToolBar(Qt::LeftToolBarArea, m_toolBarTree);\n}\n\nvoid TabWidget::saveTabInfo()\n{\n    QSettings settings(getTabWidgetConfigurationFilePath(), QSettings::IniFormat);\n\n    m_tabs->updateCollapsedTabs(&m_collapsedTabs);\n    settings.setValue(\"TabWidget/collapsed_tabs\", m_collapsedTabs);\n\n    QVariantMap tabItemCounters;\n    for (int i = 0; i < count(); ++i) {\n        const int count = m_tabItemCounters.value(widget(i), -1);\n        if (count >= 0)\n            tabItemCounters[tabName(i)] = count;\n    }\n    settings.setValue(\"TabWidget/tab_item_counters\", tabItemCounters);\n}\n\nvoid TabWidget::loadTabInfo()\n{\n    QSettings settings(getTabWidgetConfigurationFilePath(), QSettings::IniFormat);\n\n    m_collapsedTabs = settings.value(\"TabWidget/collapsed_tabs\").toStringList();\n\n    const QVariantMap tabItemCounters = settings.value(\"TabWidget/tab_item_counters\").toMap();\n    for (int i = 0; i < count(); ++i) {\n        const QVariant count = tabItemCounters.value(tabName(i));\n        if (count.isValid())\n            m_tabItemCounters[widget(i)] = count.toInt();\n    }\n}\n\nvoid TabWidget::updateTabs(QSettings &settings)\n{\n    loadTabInfo();\n\n    for (auto it = m_tabItemCounters.constBegin(); it != m_tabItemCounters.constEnd(); ++it) {\n        QWidget *w = it.key();\n        const int i = m_stackedWidget->indexOf(w);\n        if (i != -1)\n            m_tabs->setTabItemCount(m_tabs->tabName(i), itemCountLabel(m_tabs->tabName(i)));\n    }\n\n    m_tabs->setCollapsedTabs(m_collapsedTabs);\n\n    QHash<QString, QString> tabIcons;\n    const int size = settings.beginReadArray(QStringLiteral(\"Tabs\"));\n    for(int i = 0; i < size; ++i) {\n        settings.setArrayIndex(i);\n        const QString name = settings.value(QStringLiteral(\"name\")).toString();\n        const QString icon = settings.value(QStringLiteral(\"icon\")).toString();\n        tabIcons[name] = icon;\n    }\n    settings.endArray();\n    m_tabs->updateTabIcons(tabIcons);\n\n    m_tabs->adjustSize();\n}\n\nvoid TabWidget::setCurrentIndex(int tabIndex)\n{\n    if (m_ignoreCurrentTabChanges)\n        return;\n\n    QWidget *w = currentWidget();\n    const int current = isTabGroupSelected() ? -1 : currentIndex();\n\n    if (tabIndex == current)\n        return;\n\n    if (tabIndex != -1) {\n        m_stackedWidget->setCurrentIndex(tabIndex);\n\n        w = currentWidget();\n        if (w == nullptr)\n            return;\n\n        w->show();\n        if (m_toolBarCurrent->hasFocus())\n            w->setFocus();\n\n        m_tabs->setCurrentTab(tabIndex);\n    } else if (w != nullptr) {\n        if (w->hasFocus())\n            m_toolBarCurrent->setFocus();\n        w->hide();\n    }\n\n    emit currentChanged(tabIndex, current);\n}\n\nvoid TabWidget::nextTab()\n{\n    m_tabs->nextTab();\n}\n\nvoid TabWidget::previousTab()\n{\n    m_tabs->previousTab();\n}\n\nvoid TabWidget::setTabBarHidden(bool hidden)\n{\n    m_hideTabBar = hidden;\n    updateToolBar();\n}\n\nvoid TabWidget::setTreeModeEnabled(bool enabled)\n{\n    setTreeModeEnabled(enabled, this->tabs());\n}\n\nvoid TabWidget::setTabItemCount(const QString &tabName, int itemCount)\n{\n    QWidget *w = m_stackedWidget->widget(tabIndex(tabName));\n    if ( m_tabItemCounters.value(w, -1) == itemCount)\n        return;\n\n    m_tabItemCounters[w] = itemCount;\n\n    updateTabItemCount(tabName);\n}\n\nvoid TabWidget::setTabsOrder(const QStringList &tabs)\n{\n    if (this->tabs() == tabs)\n        return;\n\n    reorderTabs(tabs);\n    setTreeModeEnabled(m_toolBarCurrent == m_toolBarTree, this->tabs());\n}\n\nvoid TabWidget::reorderTabs(const QStringList &tabs)\n{\n    QStringList currentTabs = this->tabs();\n    if (tabs == currentTabs)\n        return;\n\n    m_ignoreCurrentTabChanges = true;\n\n    for (int i = 0; i < tabs.size(); ++i) {\n        const int tabIndex = currentTabs.indexOf(tabs[i]);\n        if (tabIndex != -1 && tabIndex != i) {\n            QWidget *widget = m_stackedWidget->widget(tabIndex);\n            m_stackedWidget->removeWidget(widget);\n            m_stackedWidget->insertWidget(i, widget);\n            currentTabs.move(tabIndex, i);\n            m_tabs->moveTab(tabIndex, i);\n        }\n    }\n\n    m_stackedWidget->setCurrentIndex( currentIndex() );\n\n    m_ignoreCurrentTabChanges = false;\n}\n\nbool TabWidget::eventFilter(QObject *, QEvent *event)\n{\n    if (event->type() == QEvent::Move)\n        updateToolBar();\n\n    return false;\n}\n\nvoid TabWidget::onTabMoved(int from, int to)\n{\n    m_stackedWidget->insertWidget(to, m_stackedWidget->widget(from));\n    emit tabMoved(from, to);\n}\n\nvoid TabWidget::onTabsMoved(const QString &oldPrefix, const QString &newPrefix, const QList<int> &indexes)\n{\n    const int newCurrentIndex = indexes.indexOf(currentIndex());\n    Q_ASSERT(newCurrentIndex != -1);\n\n    m_stackedWidget->hide();\n\n    QVector<QWidget*> widgets;\n    widgets.reserve(m_stackedWidget->count());\n\n    while ( m_stackedWidget->count() > 0 ) {\n        QWidget *w = m_stackedWidget->widget(0);\n        widgets.append(w);\n        m_stackedWidget->removeWidget(w);\n    }\n\n    for (int index : indexes) {\n        Q_ASSERT(index >= 0);\n        Q_ASSERT(index < widgets.count());\n        m_stackedWidget->insertWidget(-1, widgets[index]);\n    }\n\n    m_stackedWidget->setCurrentIndex(newCurrentIndex);\n\n    m_stackedWidget->show();\n\n    saveTabInfo();\n\n    emit tabsMoved(oldPrefix, newPrefix);\n}\n\nvoid TabWidget::onToolBarOrientationChanged(Qt::Orientation orientation)\n{\n    if (m_tabBar) {\n        if (orientation == Qt::Vertical)\n            m_tabBar->setShape(QTabBar::RoundedWest);\n        else\n            m_tabBar->setShape(QTabBar::RoundedNorth);\n    }\n}\n\nvoid TabWidget::onTreeItemClicked()\n{\n    auto w = currentWidget();\n    if (w)\n        w->setFocus(Qt::MouseFocusReason);\n}\n\nvoid TabWidget::createTabBar()\n{\n    auto tabBar = new TabBar(this);\n\n    tabBar->setObjectName(\"tab_bar\");\n\n    tabBar->setExpanding(false);\n    tabBar->setMovable(true);\n\n    connect( tabBar, &TabBar::tabBarMenuRequested,\n             this, &TabWidget::tabBarMenuRequested );\n    connect( tabBar, &TabBar::tabRenamed,\n             this, &TabWidget::tabRenamed );\n    connect( tabBar, &QTabBar::tabCloseRequested,\n             this, &TabWidget::tabCloseRequested );\n    connect( tabBar, &TabBar::dropItems,\n             this, &TabWidget::dropItems );\n    connect( tabBar, &QTabBar::currentChanged,\n             this, &TabWidget::setCurrentIndex );\n    connect( tabBar, &QTabBar::tabMoved,\n             this, &TabWidget::onTabMoved );\n\n    delete m_tabs;\n    m_tabs = tabBar;\n    m_tabBar = tabBar;\n\n    m_toolBarCurrent = m_toolBar;\n    m_toolBarCurrent->addWidget(tabBar);\n}\n\nvoid TabWidget::createTabTree()\n{\n    auto tabTree = new TabTree(this);\n    tabTree->setObjectName(\"tab_tree\");\n\n    connect( tabTree, &TabTree::tabTreeMenuRequested,\n             this, &TabWidget::tabTreeMenuRequested );\n    connect( tabTree, &TabTree::tabsMoved,\n             this, &TabWidget::onTabsMoved );\n    connect( tabTree, &TabTree::dropItems,\n             this, &TabWidget::dropItems );\n    connect( tabTree, &TabTree::currentTabChanged,\n             this, &TabWidget::setCurrentIndex );\n    connect( tabTree, &QTreeWidget::itemClicked,\n             this, &TabWidget::onTreeItemClicked );\n\n    delete m_tabs;\n    m_tabs = tabTree;\n    m_tabBar = nullptr;\n\n    m_toolBarCurrent = m_toolBarTree;\n    m_toolBarCurrent->addWidget(tabTree);\n}\n\nvoid TabWidget::updateToolBar()\n{\n    bool forceHide = count() == 1;\n    m_toolBar->setVisible(!forceHide && !m_hideTabBar && m_toolBarCurrent == m_toolBar);\n    m_toolBarTree->setVisible(!forceHide && !m_hideTabBar && m_toolBarCurrent == m_toolBarTree);\n\n    if (m_tabBar) {\n        QMainWindow *mainWindow = qobject_cast<QMainWindow*>(m_toolBar->window());\n        if (mainWindow) {\n            Qt::ToolBarArea area = mainWindow->toolBarArea(m_toolBar);\n            if (area == Qt::LeftToolBarArea)\n                m_tabBar->setShape(QTabBar::RoundedWest);\n            else if (area == Qt::RightToolBarArea)\n                m_tabBar->setShape(QTabBar::RoundedEast);\n            else if (area == Qt::TopToolBarArea)\n                m_tabBar->setShape(QTabBar::RoundedNorth);\n            else if (area == Qt::BottomToolBarArea)\n                m_tabBar->setShape(QTabBar::RoundedSouth);\n        }\n    }\n\n    m_tabs->adjustSize();\n}\n\nvoid TabWidget::updateTabItemCount(const QString &name)\n{\n    m_tabs->setTabItemCount(name, itemCountLabel(name));\n    m_tabs->adjustSize();\n}\n\nQString TabWidget::itemCountLabel(const QString &name)\n{\n    if (!m_showTabItemCount)\n        return QString();\n\n    QWidget *w = m_stackedWidget->widget(tabIndex(name));\n    const int count = m_tabItemCounters.value(w, -1);\n    return count >= 0 ? QString::number(count) : QLatin1String(\"?\");\n}\n\nvoid TabWidget::setTreeModeEnabled(bool enabled, const QStringList &tabs)\n{\n    if (enabled)\n        createTabTree();\n    else\n        createTabBar();\n\n    m_ignoreCurrentTabChanges = true;\n    for (int i = 0; i < tabs.size(); ++i) {\n        const QString &tabName = tabs[i];\n        m_tabs->insertTab(i, tabName);\n    }\n    m_tabs->setCurrentTab( currentIndex() );\n    m_ignoreCurrentTabChanges = false;\n\n    updateToolBar();\n}\n"
  },
  {
    "path": "src/gui/tabwidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QMap>\n#include <QTabBar>\n#include <QWidget>\n\nclass QMainWindow;\nclass QMimeData;\nclass QPoint;\nclass QSettings;\nclass QStackedWidget;\nclass QToolBar;\nclass TabsWidgetInterface;\n\nclass TabWidget final : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit TabWidget(QWidget *parent = nullptr);\n\n    /** Return path to current group in tree (empty string if tree mode is disabled). */\n    QString getCurrentTabPath() const;\n\n    /** Return true only if tree mode is enabled and tab is tab group. */\n    bool isTabGroup(const QString &tab) const;\n\n    /** Return true only if tab froup is selected in tree mode. */\n    bool isTabGroupSelected() const;\n\n    /** Return current tab. */\n    int currentIndex() const;\n\n    QWidget *widget(int tabIndex) const;\n\n    QWidget *currentWidget() const { return widget( currentIndex() ); }\n\n    /** Return number of tabs. */\n    int count() const;\n\n    /** Return path of tab in tree or label in tab bar. */\n    QString tabName(int tabIndex) const;\n\n    int tabIndex(const QString &tabName) const;\n\n    void setTabName(int tabIndex, const QString &tabName);\n\n    void setTabItemCountVisible(bool visible);\n\n    void setTabIcon(const QString &tabName, const QString &icon);\n\n    void insertTab(int tabIndex, QWidget *widget, const QString &tabName);\n\n    void addTab(QWidget *widget, const QString &tabName) { insertTab( count(), widget, tabName); }\n\n    void removeTab(int tabIndex);\n\n    /** Return tab names. */\n    QStringList tabs() const;\n\n    void addToolBars(QMainWindow *mainWindow);\n\n    void saveTabInfo();\n\n    void loadTabInfo();\n\n    void updateTabs(QSettings &settings);\n\n    QToolBar *toolBar() const { return m_toolBarCurrent; }\n\n    void setCurrentIndex(int tabIndex);\n    void nextTab();\n    void previousTab();\n    void setTabBarHidden(bool hidden);\n    void setTreeModeEnabled(bool enabled);\n    void setTabItemCount(const QString &tabName, int itemCount);\n\n    void setTabsOrder(const QStringList &tabs);\n    void reorderTabs(const QStringList &tabs);\n\nsignals:\n    /// Tabs moved in tab bar.\n    void tabMoved(int from, int to);\n    /// Tabs moved in tab tree (@a oldPrefix path changed to @a newPrefix).\n    void tabsMoved(const QString &oldPrefix, const QString &newPrefix);\n    void tabBarMenuRequested(const QPoint &pos, int tab);\n    void tabTreeMenuRequested(const QPoint &pos, const QString &groupPath);\n    void tabRenamed(const QString &newName, int index);\n    void currentChanged(int tabIndex, int oldTabIndex);\n    void tabCloseRequested(int);\n    void dropItems(const QString &tabName, const QMimeData *data, bool *accepted);\n\nprotected:\n    bool eventFilter(QObject *object, QEvent *event) override;\n\nprivate:\n    void onTabMoved(int from, int to);\n    void onTabsMoved(const QString &oldPrefix, const QString &newPrefix, const QList<int> &indexes);\n    void onToolBarOrientationChanged(Qt::Orientation orientation);\n    void onTreeItemClicked();\n\n    void createTabBar();\n    void createTabTree();\n    void updateToolBar();\n    void updateTabItemCount(const QString &name);\n    QString itemCountLabel(const QString &name);\n\n    void setTreeModeEnabled(bool enabled, const QStringList &tabs);\n\n    QToolBar *m_toolBar;\n    QToolBar *m_toolBarTree;\n    QToolBar *m_toolBarCurrent;\n    TabsWidgetInterface *m_tabs = nullptr;\n    QTabBar *m_tabBar = nullptr;\n    QStackedWidget *m_stackedWidget;\n    bool m_hideTabBar;\n\n    QStringList m_collapsedTabs;\n    QMap<QWidget*, int> m_tabItemCounters;\n\n    bool m_showTabItemCount;\n\n    bool m_ignoreCurrentTabChanges = false;\n};\n"
  },
  {
    "path": "src/gui/theme.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"theme.h\"\n\n#include \"ui_configtabappearance.h\"\n\n#include \"common/config.h\"\n#include \"common/log.h\"\n#include \"gui/iconfont.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QApplication>\n#include <QDir>\n#include <QFile>\n#include <QListView>\n#include <QScreen>\n#include <QSettings>\n#include <QStyleFactory>\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,8,0)\n#   include <QStyleHints>\n#endif\n\n#include <cmath>\n\nnamespace {\n\n/// Up to this value of background lightness, window title style would be light.\nconst int lightThreshold = 100;\n\nconst QLatin1String defaultColorVarBase(\"default_bg\");\nconst QLatin1String defaultColorVarText(\"default_text\");\nconst QLatin1String defaultColorVarPlaceholderText(\"default_placeholder_text\");\nconst QLatin1String defaultColorVarAlternateBase(\"default_alt_bg\");\nconst QLatin1String defaultColorVarHighlight(\"default_highlight_bg\");\nconst QLatin1String defaultColorVarHighlightText(\"default_highlight_text\");\nconst QLatin1String defaultColorVarToolTipBase(\"default_tooltip_bg\");\nconst QLatin1String defaultColorVarToolTipText(\"default_tooltip_text\");\nconst QLatin1String defaultColorVarWindow(\"default_window\");\nconst QLatin1String defaultColorVarWindowText(\"default_window_text\");\nconst QLatin1String defaultColorVarButton(\"default_button\");\nconst QLatin1String defaultColorVarButtonText(\"default_button_text\");\nconst QLatin1String defaultColorVarBrightText(\"default_bright_text\");\nconst QLatin1String defaultColorVarLight(\"default_light\");\nconst QLatin1String defaultColorVarMidlight(\"default_midlight\");\nconst QLatin1String defaultColorVarDark(\"default_dark\");\nconst QLatin1String defaultColorVarMid(\"default_mid\");\nconst QLatin1String defaultColorVarShadow(\"default_shadow\");\nconst QLatin1String defaultColorLink(\"default_link\");\nconst QLatin1String defaultColorLinkVisited(\"default_link_visited\");\n\nQPalette::ColorRole defaultColorVarToRole(const QString &varName)\n{\n    static QHash<QString, QPalette::ColorRole> map = {\n        {defaultColorVarBase, QPalette::Base},\n        {defaultColorVarText, QPalette::Text},\n        {defaultColorVarPlaceholderText, QPalette::PlaceholderText},\n        {defaultColorVarAlternateBase, QPalette::AlternateBase},\n        {defaultColorVarHighlight, QPalette::Highlight},\n        {defaultColorVarHighlightText, QPalette::HighlightedText},\n        {defaultColorVarToolTipBase, QPalette::ToolTipBase},\n        {defaultColorVarToolTipText, QPalette::ToolTipText},\n        {defaultColorVarWindow, QPalette::Window},\n        {defaultColorVarWindowText, QPalette::WindowText},\n        {defaultColorVarButton, QPalette::Button},\n        {defaultColorVarButtonText, QPalette::ButtonText},\n        {defaultColorVarBrightText, QPalette::BrightText},\n        {defaultColorVarLight, QPalette::Light},\n        {defaultColorVarMidlight, QPalette::Midlight},\n        {defaultColorVarDark, QPalette::Dark},\n        {defaultColorVarMid, QPalette::Mid},\n        {defaultColorVarShadow, QPalette::Shadow},\n        {defaultColorLink, QPalette::Link},\n        {defaultColorLinkVisited, QPalette::LinkVisited},\n    };\n    const auto it = map.find(varName);\n    return (it == std::end(map)) ? QPalette::NoRole : it.value();\n}\n\ndouble normalizeFactor(double value)\n{\n    return qBound( 0.0, value, 1.0 );\n}\n\nint normalizeColorValue(int value)\n{\n    return qBound(0, value, 255);\n}\n\n/// Add RGB components properly.\nint addColor(int c1, float multiply, int c2)\n{\n    const float f1 = static_cast<float>(c1);\n    const float f2 = static_cast<float>(c2);\n    return multiply > 0.0f\n            ? static_cast<int>( std::sqrt(f1*f1 + multiply * f2*f2) )\n            : c1 + static_cast<int>(multiply * f2);\n}\n\nvoid addColor(\n        const QString &color, float multiply, int *r, int *g, int *b, int *a,\n        const Theme &theme, const Values &values, int maxRecursion)\n{\n    if (color.isEmpty())\n        return;\n\n    QColor toAdd;\n    float x = multiply;\n\n    if (color.at(0).isDigit()) {\n        bool ok;\n        x = multiply * color.toFloat(&ok);\n        if (!ok)\n            return;\n        toAdd = QColor(1, 1, 1);\n    } else if ( color.startsWith('#') || color.startsWith(\"rgba(\") ) {\n        toAdd = deserializeColor(color);\n        if ( !toAdd.isValid() )\n            toAdd = QColor(Qt::black);\n    } else if ( color.startsWith(QStringLiteral(\"default_\")) ) {\n        const QPalette::ColorRole role = defaultColorVarToRole(color);\n        toAdd = QPalette().color(role);\n    } else if (QColor col(color); col.isValid()) {\n        toAdd = col;\n    } else if (maxRecursion > 0) {\n        const QVariant v = values.contains(color)\n                ? values.value(color) : theme.value(color);\n        toAdd = evalColor(v.toString(), theme, values, maxRecursion - 1);\n    }\n\n    *r = normalizeColorValue( addColor(*r, x, toAdd.red()) );\n    *g = normalizeColorValue( addColor(*g, x, toAdd.green()) );\n    *b = normalizeColorValue( addColor(*b, x, toAdd.blue()) );\n    if (multiply > 0.0f) {\n        const float fa = static_cast<float>(*a);\n        const float fad = static_cast<float>(toAdd.alpha());\n        *a = normalizeColorValue( static_cast<int>(fa + x * fad) );\n    }\n}\n\nint fitFontWeight(int weight, int low, int high, int highCss)\n{\n    const int diffCss = 100;\n    const int lowCss = highCss - diffCss;\n    if (weight == low)\n        return lowCss;\n\n    const int diff = high - low;\n    return lowCss + diffCss * weight / diff;\n}\n\nint getFontWeightForStyleSheet(int weight)\n{\n    if (weight < QFont::ExtraLight)\n        return fitFontWeight(weight, QFont::Thin, QFont::ExtraLight, 200);\n    if (weight < QFont::Light)\n        return fitFontWeight(weight, QFont::ExtraLight, QFont::Light, 300);\n    if (weight < QFont::Normal)\n        return fitFontWeight(weight, QFont::Light, QFont::Normal, 400);\n    if (weight < QFont::Medium)\n        return fitFontWeight(weight, QFont::Normal, QFont::Medium, 500);\n    if (weight < QFont::DemiBold)\n        return fitFontWeight(weight, QFont::Medium, QFont::DemiBold, 600);\n    if (weight < QFont::Bold)\n        return fitFontWeight(weight, QFont::DemiBold, QFont::Bold, 700);\n    if (weight < QFont::ExtraBold)\n        return fitFontWeight(weight, QFont::Bold, QFont::ExtraBold, 800);\n    if (weight < QFont::Black)\n        return fitFontWeight(weight, QFont::ExtraBold, QFont::Black, 900);\n\n    return 900;\n}\n\nQString getFontStyleSheet(const QString &fontString, double scale = 1.0)\n{\n    QFont font;\n    if (!fontString.isEmpty())\n        font.fromString(fontString);\n\n    qreal size = font.pointSizeF() * scale;\n    QString sizeUnits = \"pt\";\n    if (size < 0.0) {\n        size = font.pixelSize() * scale;\n        sizeUnits = \"px\";\n    }\n    size = qBound(0.1, size, 50.0);\n\n    QString result;\n    result.append( QString::fromLatin1(\";font-family: \\\"%1\\\"\").arg(font.family()) );\n    result.append( QString::fromLatin1(\";font:%1 %2 %3%4\")\n                   .arg(font.style() == QFont::StyleItalic\n                        ? \"italic\" : font.style() == QFont::StyleOblique ? \"oblique\" : \"normal\",\n                        font.bold() ? \"bold\" : \"\")\n                   .arg(size)\n                   .arg(sizeUnits)\n                   );\n    result.append( QString::fromLatin1(\";text-decoration:%1 %2 %3\")\n                   .arg(font.strikeOut() ? \"line-through\" : \"\",\n                        font.underline() ? \"underline\" : \"\",\n                        font.overline() ? \"overline\" : \"\")\n                   );\n\n    const int w = getFontWeightForStyleSheet( font.weight() );\n    result.append( QString::fromLatin1(\";font-weight:%1\").arg(w) );\n\n    result.append(\";\");\n\n    return result;\n}\n\nQString themePrefix()\n{\n#ifdef COPYQ_THEME_PREFIX\n    return COPYQ_THEME_PREFIX;\n#else\n    return platformNativeInterface()->themePrefix();\n#endif\n}\n\ndouble getFactor(const QString &name, const QHash<QString, QVariant> &values)\n{\n    bool ok;\n    const double scale = values.value(name).toDouble(&ok);\n    return ok ? scale : 1.0;\n}\n\n} // namespace\n\nTheme::Theme(const QSettings &settings)\n{\n    loadTheme(settings);\n}\n\nTheme::Theme(Ui::ConfigTabAppearance *ui)\n    : ui(ui)\n{\n}\n\nvoid Theme::loadTheme(const QSettings &settings)\n{\n    resetTheme();\n\n    for ( auto key = m_theme.keyBegin(); key != m_theme.keyEnd(); ++key ) {\n        const auto value = settings.value(*key);\n        if ( value.isValid() )\n            m_theme[*key].setValue(value);\n    }\n\n    updateTheme();\n}\n\nvoid Theme::saveTheme(QSettings *settings) const\n{\n    QStringList keys = m_theme.keys();\n    keys.sort();\n\n    for (const auto &key : keys)\n        settings->setValue( key, value(key) );\n}\n\nQVariant Theme::value(const QString &name) const\n{\n    return m_theme.value(name).value();\n}\n\nQColor Theme::color(const QString &name) const\n{\n    return evalColor( value(name).toString(), *this );\n}\n\nQFont Theme::font(const QString &name) const\n{\n    return themeFontFromString( value(name).toString() );\n}\n\nQColor Theme::evalColorExpression(const QString &expr) const\n{\n    return evalColor( expr, *this );\n}\n\nvoid Theme::decorateBrowser(QListView *c) const\n{\n    QAbstractScrollArea *c2 = c;\n    decorateBrowser(c2);\n\n    bool ok;\n    const int itemSpacing = value(\"item_spacing\").toInt(&ok);\n    c->setSpacing( ok ? itemSpacing : c->fontMetrics().lineSpacing() / 6 );\n}\n\nvoid Theme::decorateMainWindow(QWidget *mainWindow) const\n{\n    QPalette palette = QApplication::palette();\n\n    // This seems to properly reset icon colors.\n    mainWindow->setStyleSheet(QString());\n    mainWindow->setPalette(palette);\n\n    const auto bg = color(\"bg\");\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,8,0)\n    // Change window dark/light title scheme if supported.\n    QStyleHints *styleHints = QGuiApplication::styleHints();\n    if ( !isMainWindowThemeEnabled() )\n        styleHints->unsetColorScheme();\n    else if (bg.lightness() < lightThreshold)\n        styleHints->setColorScheme(Qt::ColorScheme::Dark);\n    else\n        styleHints->setColorScheme(Qt::ColorScheme::Light);\n#endif\n\n    if ( !isMainWindowThemeEnabled() ) {\n        const QString cssTemplate = QStringLiteral(\"main_window_simple\");\n        mainWindow->setStyleSheet(getStyleSheet(cssTemplate));\n        return;\n    }\n\n    const auto fg = color(\"fg\");\n    palette.setColor( QPalette::Base, bg );\n    palette.setColor( QPalette::AlternateBase, color(\"alt_bg\") );\n    palette.setColor( QPalette::Text, fg );\n    palette.setColor( QPalette::Window, bg );\n    palette.setColor( QPalette::WindowText, fg );\n    palette.setColor( QPalette::Button, bg );\n    palette.setColor( QPalette::ButtonText, fg );\n    palette.setColor( QPalette::Highlight, color(\"sel_bg\") );\n    palette.setColor( QPalette::HighlightedText, color(\"sel_fg\") );\n\n    mainWindow->setPalette(palette);\n    const QString cssTemplate = value(\"css_template_main_window\").toString();\n    mainWindow->setStyleSheet(getStyleSheet(cssTemplate));\n}\n\nvoid Theme::decorateScrollArea(QAbstractScrollArea *scrollArea) const\n{\n    const auto scrollbarPolicy = this->scrollbarPolicy();\n    scrollArea->setVerticalScrollBarPolicy(scrollbarPolicy);\n    scrollArea->setHorizontalScrollBarPolicy(scrollbarPolicy);\n}\n\nvoid Theme::decorateItemPreview(QAbstractScrollArea *itemPreview) const\n{\n    decorateBrowser(itemPreview);\n}\n\nQString Theme::getMenuStyleSheet() const\n{\n    const QString cssTemplate = value(\"css_template_menu\").toString();\n    return getStyleSheet(cssTemplate);\n}\n\nQString Theme::getNotificationStyleSheet() const\n{\n    const QString cssTemplate = value(\"css_template_notification\").toString();\n    return getStyleSheet(cssTemplate);\n}\n\nQt::ScrollBarPolicy Theme::scrollbarPolicy() const\n{\n    return value(\"show_scrollbars\").toBool()\n            ? Qt::ScrollBarAsNeeded\n            : Qt::ScrollBarAlwaysOff;\n}\n\nbool Theme::useSystemIcons() const\n{\n    return value(\"use_system_icons\").toBool();\n}\n\nQFont Theme::themeFontFromString(const QString &fontString) const\n{\n    QFont font;\n    if ( !fontString.isEmpty() )\n        font.fromString(fontString);\n    if ( !isAntialiasingEnabled() )\n        font.setStyleStrategy(QFont::NoAntialias);\n    return font;\n}\n\nbool Theme::isAntialiasingEnabled() const\n{\n    return m_antialiasing;\n}\n\nvoid Theme::resetTheme()\n{\n    m_theme[\"bg\"]        = Option(defaultColorVarBase, \"VALUE\", ui ? ui->pushButtonColorBg : nullptr);\n    m_theme[\"edit_bg\"]   = Option(defaultColorVarBase, \"VALUE\", ui ? ui->pushButtonColorEditorBg : nullptr);\n    m_theme[\"fg\"]        = Option(defaultColorVarText, \"VALUE\", ui ? ui->pushButtonColorFg : nullptr);\n    m_theme[\"edit_fg\"]   = Option(defaultColorVarText, \"VALUE\", ui ? ui->pushButtonColorEditorFg : nullptr);\n    m_theme[\"num_fg\"]    = Option(defaultColorVarPlaceholderText, \"VALUE\", ui ? ui->pushButtonColorNumberFg : nullptr);\n    m_theme[\"alt_bg\"]    = Option(defaultColorVarAlternateBase, \"VALUE\", ui ? ui->pushButtonColorAltBg : nullptr);\n    m_theme[\"sel_bg\"]    = Option(defaultColorVarHighlight, \"VALUE\", ui ? ui->pushButtonColorSelBg : nullptr);\n    m_theme[\"sel_fg\"]    = Option(defaultColorVarHighlightText, \"VALUE\", ui ? ui->pushButtonColorSelFg : nullptr);\n    m_theme[\"find_bg\"]   = Option(\"yellow\", \"VALUE\", ui ? ui->pushButtonColorFoundBg : nullptr);\n    m_theme[\"find_fg\"]   = Option(\"black\", \"VALUE\", ui ? ui->pushButtonColorFoundFg : nullptr);\n    m_theme[\"notes_bg\"]  = Option(defaultColorVarToolTipBase, \"VALUE\", ui ? ui->pushButtonColorNotesBg : nullptr);\n    m_theme[\"notes_fg\"]  = Option(defaultColorVarToolTipText, \"VALUE\", ui ? ui->pushButtonColorNotesFg : nullptr);\n    m_theme[\"notification_bg\"]  = Option(\"#333\", \"VALUE\", ui ? ui->pushButtonColorNotificationBg : nullptr);\n    m_theme[\"notification_fg\"]  = Option(\"#ddd\", \"VALUE\", ui ? ui->pushButtonColorNotificationFg : nullptr);\n\n    m_theme[\"font\"]        = Option(\"\", \"VALUE\", ui ? ui->pushButtonFont : nullptr);\n    m_theme[\"edit_font\"]   = Option(\"\", \"VALUE\", ui ? ui->pushButtonEditorFont : nullptr);\n    m_theme[\"find_font\"]   = Option(\"\", \"VALUE\", ui ? ui->pushButtonFoundFont : nullptr);\n    m_theme[\"num_font\"]    = Option(\"\", \"VALUE\", ui ? ui->pushButtonNumberFont : nullptr);\n    m_theme[\"notes_font\"]  = Option(\"\", \"VALUE\", ui ? ui->pushButtonNotesFont : nullptr);\n    m_theme[\"notification_font\"]  = Option(\"\", \"VALUE\", ui ? ui->pushButtonNotificationFont : nullptr);\n    m_theme[\"show_number\"] = Option(true, \"checked\", ui ? ui->checkBoxShowNumber : nullptr);\n    m_theme[\"show_scrollbars\"] = Option(true, \"checked\", ui ? ui->checkBoxScrollbars : nullptr);\n\n    m_theme[\"css\"] = Option(\"\");\n    m_theme[\"menu_css\"] = Option(\n                \"\\n    ;border: 1px solid ${sel_bg}\"\n                \"\\n    ;background: ${bg}\"\n                \"\\n    ;color: ${fg}\"\n                );\n    m_theme[\"menu_bar_css\"] = Option(\n                \"\\n    ;background: ${bg}\"\n                \"\\n    ;color: ${fg}\"\n                );\n    m_theme[\"menu_bar_selected_css\"] = Option(\n                \"\\n    ;background: ${sel_bg}\"\n                \"\\n    ;color: ${sel_fg}\"\n                );\n    m_theme[\"menu_bar_disabled_css\"] = Option(\n                \"\\n    ;color: ${bg - #666}\"\n                );\n\n    m_theme[\"item_css\"] = Option(\"\");\n    m_theme[\"alt_item_css\"] = Option(\"\");\n    m_theme[\"sel_item_css\"] = Option(\"\");\n    m_theme[\"hover_item_css\"] = Option(\"\");\n    m_theme[\"cur_item_css\"] = Option(\n                \"\\n    ;border: 0.1em solid ${sel_bg}\"\n                );\n    m_theme[\"item_spacing\"] = Option(\"\");\n    m_theme[\"notes_css\"] = Option(\"\");\n\n    m_theme[\"tab_bar_css\"] = Option(\n                \"\\n    ;background: ${bg - #222}\"\n                );\n    m_theme[\"tab_bar_tab_selected_css\"] = Option(\n                \"\\n    ;padding: 0.5em\"\n                \"\\n    ;background: ${bg}\"\n                \"\\n    ;border: 0.05em solid ${bg}\"\n                \"\\n    ;color: ${fg}\"\n                );\n    m_theme[\"tab_bar_tab_unselected_css\"] = Option(\n                \"\\n    ;border: 0.05em solid ${bg}\"\n                \"\\n    ;padding: 0.5em\"\n                \"\\n    ;background: ${bg - #222}\"\n                \"\\n    ;color: ${fg - #333}\"\n                );\n    m_theme[\"tab_bar_scroll_buttons_css\"] = Option(\n                \"\\n    ;background: ${bg - #222}\"\n                \"\\n    ;color: ${fg}\"\n                \"\\n    ;border: 0\"\n                );\n    m_theme[\"tab_bar_item_counter\"] = Option(\n                \"\\n    ;color: ${fg - #044 + #400}\"\n                \"\\n    ;font-size: 6pt\"\n                );\n    m_theme[\"tab_bar_sel_item_counter\"] = Option(\n                \"\\n    ;color: ${sel_bg - #044 + #400}\"\n                );\n\n    m_theme[\"tab_tree_css\"] = Option(\n                \"\\n    ;color: ${fg}\"\n                \"\\n    ;background-color: ${bg}\"\n                );\n    m_theme[\"tab_tree_sel_item_css\"] = Option(\n                \"\\n    ;color: ${sel_fg}\"\n                \"\\n    ;background-color: ${sel_bg}\"\n                \"\\n    ;border-radius: 2px\"\n                );\n    m_theme[\"tab_tree_item_counter\"] = Option(\n                \"\\n    ;color: ${fg - #044 + #400}\"\n                \"\\n    ;font-size: 6pt\"\n                );\n    m_theme[\"tab_tree_sel_item_counter\"] = Option(\n                \"\\n    ;color: ${sel_fg - #044 + #400}\"\n                );\n\n    m_theme[\"tool_bar_css\"] = Option(\n                \"\\n    ;color: ${fg}\"\n                \"\\n    ;background-color: ${bg}\"\n                \"\\n    ;border: 0\"\n                );\n    m_theme[\"tool_button_css\"] = Option(\n                \"\\n    ;color: ${fg}\"\n                \"\\n    ;background: ${bg}\"\n                \"\\n    ;border: 0\"\n                \"\\n    ;border-radius: 2px\"\n                );\n    m_theme[\"tool_button_selected_css\"] = Option(\n                \"\\n    ;background: ${sel_bg - #222}\"\n                \"\\n    ;color: ${sel_fg}\"\n                \"\\n    ;border: 1px solid ${sel_bg}\"\n                );\n    m_theme[\"tool_button_pressed_css\"] = Option(\n                \"\\n    ;background: ${sel_bg}\"\n                );\n\n    m_theme[\"search_bar\"] = Option(\n                \"\\n    ;background: ${edit_bg}\"\n                \"\\n    ;color: ${edit_fg}\"\n                \"\\n    ;border: 1px solid ${alt_bg}\"\n                \"\\n    ;margin: 2px\"\n                );\n    m_theme[\"search_bar_focused\"] = Option(\n                \"\\n    ;border: 1px solid ${sel_bg}\"\n                );\n\n    m_theme[\"use_system_icons\"] = Option(false, \"checked\", ui ? ui->checkBoxSystemIcons : nullptr);\n    m_theme[\"font_antialiasing\"] = Option(true, \"checked\", ui ? ui->checkBoxAntialias : nullptr);\n    m_theme[\"style_main_window\"] = Option(false, \"checked\", ui ? ui->checkBoxStyleMainWindow : nullptr);\n\n    const int iconSize = iconFontSizePixels();\n    m_theme[\"icon_size\"] = Option( QString::number(iconSize) );\n\n    m_theme[\"css_template_items\"] = Option(\"items\");\n    m_theme[\"css_template_main_window\"] = Option(\"main_window\");\n    m_theme[\"css_template_notification\"] = Option(\"notification\");\n    m_theme[\"css_template_menu\"] = Option(\"menu\");\n\n    m_theme[\"num_margin\"] = Option(2);\n    m_theme[\"num_sel_fg\"] = Option(QString());\n}\n\nvoid Theme::updateTheme()\n{\n    m_margins = QSize(2, 2);\n\n    // search style\n    m_searchPalette.setColor(QPalette::Base, color(\"find_bg\"));\n    m_searchPalette.setColor(QPalette::Text, color(\"find_fg\"));\n    m_searchFont = font(\"find_font\");\n\n    // editor style\n    m_editorPalette.setColor(QPalette::Base, color(\"edit_bg\"));\n    m_editorPalette.setColor(QPalette::Text, color(\"edit_fg\"));\n    m_editorFont = font(\"edit_font\");\n\n    // number style\n    m_showRowNumber = value(\"show_number\").toBool();\n    m_rowNumberPalette.setColor(QPalette::Text, color(\"num_fg\"));\n    const QString numSelFgValue = value(\"num_sel_fg\").toString();\n    const QColor numSelFg =\n        numSelFgValue.isEmpty() ? color(\"sel_fg\") : evalColor(numSelFgValue, *this);\n    m_rowNumberPalette.setColor(QPalette::HighlightedText, numSelFg);\n    m_rowNumberFont = font(\"num_font\");\n    m_rowNumberFontMetrics = QFontMetrics(m_rowNumberFont);\n    const QVariant rowNumberMargin = value(\"num_margin\");\n    m_rowNumberMargin = rowNumberMargin.canConvert<int>() ? rowNumberMargin.toInt() : 2;\n\n    m_antialiasing = value(\"font_antialiasing\").toBool();\n}\n\nQSize Theme::rowNumberSize(int n) const\n{\n    if (!m_showRowNumber)\n        return QSize(0, 0);\n\n    const QString number = QString::number(n + m_rowIndexFromOne);\n    return m_rowNumberFontMetrics.boundingRect(number).size()\n        + m_margins + QSize(m_rowNumberMargin, 0);\n}\n\nvoid Theme::decorateBrowser(QAbstractScrollArea *c) const\n{\n    decorateScrollArea(c);\n    const QString cssTemplate = value(\"css_template_items\").toString();\n    c->setStyleSheet(getStyleSheet(cssTemplate));\n}\n\nbool Theme::isMainWindowThemeEnabled() const\n{\n    return m_theme.value(\"style_main_window\").value().toBool();\n}\n\nQString Theme::themeColorString(const QString &name) const\n{\n    return serializeColor( color(name) );\n}\n\nQString Theme::getStyleSheet(const QString &name, Values values, int maxRecursion) const\n{\n    const QString fileName = findThemeFile(name + \".css\");\n\n    if ( fileName.isEmpty() )\n        return QString();\n\n    QFile file(fileName);\n    if ( !file.open(QIODevice::ReadOnly) ) {\n        log( QString(\"Failed to open stylesheet \\\"%1\\\": %2\")\n             .arg(fileName, file.errorString()), LogError );\n        return QString();\n    }\n\n    const QString css = QString::fromUtf8( file.readAll() );\n    return parseStyleSheet(css, values, maxRecursion - 1);\n}\n\nQString Theme::parseStyleSheet(const QString &css, Values values, int maxRecursion) const\n{\n    QString output;\n    const QString variableBegin(\"${\");\n    const QString variableEnd(\"}\");\n    for ( int i = 0; i < css.size(); ++i ) {\n        const int a = css.indexOf(variableBegin, i);\n        if (a == -1) {\n            output.append(css.mid(i));\n            break;\n        }\n\n        const int b = css.indexOf(variableEnd, a + variableBegin.size());\n        if (b == -1) {\n            output.append(css.mid(i));\n            break;\n        }\n\n        output.append(css.mid(i, a - i));\n        i = b + variableEnd.size() - 1;\n\n        const QString name = css\n                .mid(a + variableBegin.size(), b - a - variableBegin.size())\n                .trimmed();\n        const QString result = parsePlaceholder(name, &values, maxRecursion);\n        output.append(result);\n    }\n\n    return output;\n}\n\nQString Theme::parsePlaceholder(const QString &name, Values *values, int maxRecursion) const\n{\n    if (maxRecursion < 0) {\n        log(\"Max recursion reached when parsing style sheet\", LogError);\n        return QString();\n    }\n\n    if ( name.contains(\"=\") ) {\n        const int i = name.indexOf('=');\n        const QString k = name.mid(0, i).trimmed();\n        const QString v = name.mid(i + 1).trimmed();\n        if (k == \"scale\")\n            (*values)[k] = 1.0;\n        (*values)[k] = parsePlaceholder(v, values, maxRecursion - 1);\n        return QString();\n    }\n\n    if ( name.startsWith(\"css:\") )\n        return getStyleSheet(name.mid(4), *values, maxRecursion - 1);\n\n    const double scale = getFactor(\"scale\", *values);\n\n    const QString value = this->value(name).toString();\n    if (name.contains(\"font\"))\n        return getFontStyleSheet(value, scale);\n\n    if (name.contains(\"css\") || value.contains(\":\"))\n        return parseStyleSheet(value, *values, maxRecursion - 1);\n\n    {\n        bool ok;\n        const double v = name.toDouble(&ok);\n        if (ok)\n            return QString::number(v * scale);\n    }\n\n    {\n        bool ok;\n        const double v = value.toDouble(&ok);\n        if (ok)\n            return QString::number(v * scale);\n    }\n\n    QColor color = evalColor(name, *this, *values);\n    const double saturationF = getFactor(\"hsv_saturation_factor\", *values);\n    const double valueF = getFactor(\"hsv_value_factor\", *values);\n    if ( !qFuzzyCompare(saturationF, 1.0) || !qFuzzyCompare(valueF, 1.0) ) {\n        color.setHsvF(\n            color.hueF(),\n            normalizeFactor(color.saturationF() * saturationF),\n            normalizeFactor(color.valueF() * valueF),\n            color.alphaF()\n        );\n    }\n    return serializeColor(color);\n}\n\nQString serializeColor(const QColor &color)\n{\n    if (color.alpha() == 255)\n        return color.name();\n\n    return QString::fromLatin1(\"rgba(%1,%2,%3,%4)\")\n            .arg(color.red())\n            .arg(color.green())\n            .arg(color.blue())\n            .arg(color.alpha());\n}\n\nQColor deserializeColor(const QString &colorName)\n{\n    QColor color;\n\n    if ( colorName.startsWith(QStringLiteral(\"rgba(\")) ) {\n        QStringList list = colorName.mid(5, colorName.indexOf(')') - 5).split(',');\n        int r = list.value(0).toInt();\n        int g = list.value(1).toInt();\n        int b = list.value(2).toInt();\n        int a = static_cast<int>( list.value(3).toDouble() * 255 );\n\n        color = QColor(r, g, b, a > 255 ? a / 255 : a);\n    } else if ( colorName.startsWith(QStringLiteral(\"default_\")) ) {\n        const QPalette::ColorRole role = defaultColorVarToRole(colorName);\n        color = QPalette().color(role);\n    } else {\n        color = QColor(colorName);\n    }\n\n    if ( !color.isValid() )\n        log( QString(\"Failed to deserialize color \\\"%1\\\"\").arg(colorName) );\n\n    return color;\n}\n\nQColor evalColor(const QString &expression, const Theme &theme, const Values &values, int maxRecursion)\n{\n    int r = 0;\n    int g = 0;\n    int b = 0;\n    int a = 0;\n\n    QStringList addList = QString(expression).remove(' ').split('+');\n    for (const auto &add : addList) {\n        QStringList subList = add.split('-');\n        float multiply = 1;\n        for (const auto &sub : subList) {\n            addColor(sub, multiply, &r, &g, &b, &a, theme, values, maxRecursion);\n            multiply = -1;\n        }\n    }\n\n    return QColor(r, g, b, a);\n}\n\nQString defaultUserThemePath()\n{\n    return QDir::cleanPath(settingsDirectoryPath() + \"/themes\");\n}\n\nQStringList themePaths()\n{\n    QStringList paths;\n\n    const QString customThemsPath = qEnvironmentVariable(\"COPYQ_THEME_PREFIX\");\n    if ( !customThemsPath.isEmpty() )\n        paths.append(customThemsPath);\n\n    const QString userThemesPath = defaultUserThemePath();\n    QDir themesDir(userThemesPath);\n    if ( themesDir.mkpath(\".\") )\n        paths.append(userThemesPath);\n\n    const QString themesPath = themePrefix();\n    if ( !themesPath.isEmpty() )\n        paths.append(themesPath);\n\n    return paths;\n}\n\nQString findThemeFile(const QString &fileName)\n{\n    for (const QString &path : themePaths()) {\n        const QDir dir(path);\n        if ( dir.exists(fileName) )\n            return dir.absoluteFilePath(fileName);\n    }\n    return QString();\n}\n"
  },
  {
    "path": "src/gui/theme.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/option.h\"\n\n#include <QFont>\n#include <QFontMetrics>\n#include <QHash>\n#include <QPalette>\n#include <QStringList>\n\nnamespace Ui {\nclass ConfigTabAppearance;\n}\n\nclass QAbstractScrollArea;\nclass QListView;\nclass QSettings;\nclass QString;\nclass QVariant;\n\nstruct ClipboardBrowserShared;\n\nusing Values = QHash<QString, QVariant>;\n\nclass Theme final {\npublic:\n    Theme() = default;\n    explicit Theme(const QSettings &settings);\n    explicit Theme(Ui::ConfigTabAppearance *ui);\n\n    /** Load theme from settings file. */\n    void loadTheme(const QSettings &settings);\n    /** Save theme to settings file. */\n    void saveTheme(QSettings *settings) const;\n\n    /** Return value for theme option with given @a name. */\n    QVariant value(const QString &name) const;\n\n    /** Return parsed color. */\n    QColor color(const QString &name) const;\n\n    /** Return parsed font. */\n    QFont font(const QString &name) const;\n\n    /** Returt evaluated color expression. */\n    QColor evalColorExpression(const QString &expr) const;\n\n    /** Set fonts and color for ClipboardBrowser object. */\n    void decorateBrowser(QListView *c) const;\n\n    /** Decorate main window. */\n    void decorateMainWindow(QWidget *mainWindow) const;\n\n    /** Decorate scroll area (toggle scroll bar). */\n    void decorateScrollArea(QAbstractScrollArea *scrollArea) const;\n\n    /** Decorate item preview. */\n    void decorateItemPreview(QAbstractScrollArea *itemPreview) const;\n\n    /** Return stylesheet for menus. */\n    QString getMenuStyleSheet() const;\n\n    QString getNotificationStyleSheet() const;\n\n    Qt::ScrollBarPolicy scrollbarPolicy() const;\n\n    bool useSystemIcons() const;\n\n    QFont themeFontFromString(const QString &fontString) const;\n\n    bool isAntialiasingEnabled() const;\n\n    void resetTheme();\n\n    void updateTheme();\n\n    QSize rowNumberSize(int n) const;\n    bool showRowNumber() const { return m_showRowNumber; }\n    const QFont &rowNumberFont() const { return m_rowNumberFont; }\n    const QPalette &rowNumberPalette() const { return m_rowNumberPalette; }\n\n    const QFont &editorFont() const { return m_editorFont; }\n    const QPalette &editorPalette() const { return m_editorPalette; }\n\n    const QFont &searchFont() const { return m_searchFont; }\n    const QPalette &searchPalette() const { return m_searchPalette; }\n\n    QSize margins() const { return m_margins; }\n\n    void setRowIndexFromOne(bool enabled) { m_rowIndexFromOne = enabled; }\n\nprivate:\n    void decorateBrowser(QAbstractScrollArea *c) const;\n\n    bool isMainWindowThemeEnabled() const;\n\n    /** Return style sheet with given @a name. */\n    QString themeStyleSheet(const QString &name) const;\n\n    /** Return parsed color name. */\n    QString themeColorString(const QString &name) const;\n\n    QString getStyleSheet(const QString &name, Values values = Values(), int maxRecursion = 8) const;\n    QString parseStyleSheet(const QString &css, Values values, int maxRecursion) const;\n    QString parsePlaceholder(const QString &name, Values *values, int maxRecursion) const;\n\n    QHash<QString, Option> m_theme;\n    Ui::ConfigTabAppearance *ui = nullptr;\n\n    QFont m_rowNumberFont;\n    QFontMetrics m_rowNumberFontMetrics = QFontMetrics(m_rowNumberFont);\n    QPalette m_rowNumberPalette;\n    bool m_showRowNumber = false;\n    int m_rowNumberMargin = 2;\n\n    QFont m_editorFont;\n    QPalette m_editorPalette;\n\n    QFont m_searchFont;\n    QPalette m_searchPalette;\n\n    bool m_antialiasing = true;\n    QSize m_margins;\n\n    bool m_rowIndexFromOne = true;\n};\n\nQString serializeColor(const QColor &color);\n\nQColor deserializeColor(const QString &colorName);\n\nQColor evalColor(const QString &expression, const Theme &theme, const Values &values = Values(), int maxRecursion = 8);\n\nQString findThemeFile(const QString &fileName);\n\nQString defaultUserThemePath();\n\nQStringList themePaths();\n"
  },
  {
    "path": "src/gui/traymenu.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"traymenu.h\"\n\n#include \"common/contenttype.h\"\n#include \"common/common.h\"\n#include \"common/display.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"common/timer.h\"\n#include \"gui/icons.h\"\n#include \"gui/iconfactory.h\"\n\n#include <QAction>\n#include <QApplication>\n#include <QKeyEvent>\n#include <QModelIndex>\n#include <QPixmap>\n#include <QRegularExpression>\n\nnamespace {\n\nconst char propertyTextFormat[] = \"CopyQ_text_format\";\n\nconst QIcon iconClipboard() { return getIcon(\"clipboard\", IconPaste); }\n\nbool canActivate(const QAction &action)\n{\n    return !action.isSeparator() && action.isEnabled();\n}\n\nQAction *firstEnabledAction(QMenu *menu)\n{\n    // First action is active when menu pops up.\n    for (auto action : menu->actions()) {\n        if ( canActivate(*action) )\n            return action;\n    }\n\n    return nullptr;\n}\n\nQAction *lastEnabledAction(QMenu *menu)\n{\n    // First action is active when menu pops up.\n    QList<QAction *> actions = menu->actions();\n    for (int i = actions.size() - 1; i >= 0; --i) {\n        if ( canActivate(*actions[i]) )\n            return actions[i];\n    }\n\n    return nullptr;\n}\n\n} // namespace\n\nTrayMenu::TrayMenu(QWidget *parent)\n    : QMenu(parent)\n    , m_clipboardItemActionCount(0)\n    , m_omitPaste(false)\n    , m_numberSearch(false)\n{\n    m_clipboardItemActionsSeparator = addSeparator();\n    m_customActionsSeparator = addSeparator();\n    initSingleShotTimer( &m_timerUpdateActiveAction, 0, this, &TrayMenu::doUpdateActiveAction );\n    setAttribute(Qt::WA_InputMethodEnabled);\n}\n\nvoid TrayMenu::updateTextFromData(QAction *act, const QVariantMap &data)\n{\n    const QString format = act->property(propertyTextFormat).toString();\n    const QString label = textLabelForData( data, act->font(), format, true );\n    act->setText(label);\n}\n\nbool TrayMenu::updateIconFromData(QAction *act, const QVariantMap &data)\n{\n    if ( !act->parentWidget() )\n        return false;\n\n    const QString icon = data.value(mimeIcon).toString();\n    const QString tag = data.value(COPYQ_MIME_PREFIX \"item-tag\").toString();\n\n    if ( icon.isEmpty() && tag.isEmpty() ) {\n        const QString colorName = data.value(mimeColor).toString();\n        if ( colorName.isEmpty() )\n            return false;\n\n        const QColor color(colorName);\n        if ( !color.isValid() )\n            return false;\n\n        QPixmap pix(16, 16);\n        pix.fill(color);\n        act->setIcon(pix);\n        return true;\n    }\n\n    const QColor color = getDefaultIconColor(*act->parentWidget());\n    act->setIcon( iconFromFile(icon, tag, color) );\n    return true;\n}\n\nQAction *TrayMenu::addClipboardItemAction(const QVariantMap &data, bool showImages)\n{\n    // Show search text at top of the menu.\n    if ( m_clipboardItemActionCount == 0 && m_searchText.isEmpty() ) {\n        if (m_navigationStyle == NavigationStyle::Vi) {\n            setSearchMenuItem( tr(\"Press '/' to search\") );\n        } else {\n            setSearchMenuItem( tr(\"Type to search\") );\n        }\n    }\n\n    QAction *act = addAction(QString());\n    m_clipboardActions.append(act);\n\n    act->setData(data);\n\n    insertAction(m_clipboardItemActionsSeparator, act);\n\n    QString format;\n\n    // Add number key hint.\n    const int rowNumber = m_clipboardItemActionCount + static_cast<int>(m_rowIndexFromOne);\n    if (rowNumber < 10) {\n        format = tr(\"&%1. %2\",\n                    \"Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)\")\n                .arg(rowNumber);\n        act->setProperty(propertyTextFormat, format);\n    }\n\n    m_clipboardItemActionCount++;\n\n    updateTextFromData(act, data);\n\n    // Menu item icon from image.\n    if (!updateIconFromData(act, data) && showImages) {\n        const QStringList formats = data.keys();\n        static const QRegularExpression reImage(\"^image/.*\");\n        const int imageIndex = formats.indexOf(reImage);\n        if (imageIndex != -1) {\n            const auto &mime = formats[imageIndex];\n            QPixmap pix;\n            pix.loadFromData( data.value(mime).toByteArray(), mime.toLatin1().data() );\n            const int iconSize = smallIconSize();\n            int x = 0;\n            int y = 0;\n            if (pix.width() > pix.height()) {\n                pix = pix.scaledToHeight(iconSize);\n                x = (pix.width() - iconSize) / 2;\n            } else {\n                pix = pix.scaledToWidth(iconSize);\n                y = (pix.height() - iconSize) / 2;\n            }\n            pix = pix.copy(x, y, iconSize, iconSize);\n            act->setIcon(pix);\n        }\n    }\n\n    connect(act, &QAction::triggered, this, &TrayMenu::onClipboardItemActionTriggered);\n\n    return act;\n}\n\nvoid TrayMenu::clearClipboardItems()\n{\n    const auto actions = m_clipboardActions;\n    m_clipboardActions = {};\n    for (QAction *action : actions) {\n        removeAction(action);\n        action->setVisible(false);\n        action->setDisabled(true);\n        action->setShortcuts({});\n        action->deleteLater();\n    }\n\n    m_clipboardItemActionCount = 0;\n\n    // Show search text at top of the menu.\n    if ( !m_searchText.isEmpty() )\n        setSearchMenuItem(m_searchText);\n}\n\nvoid TrayMenu::clearCustomActions()\n{\n    const auto actions = m_customActions;\n    m_customActions = {};\n    for (QAction *action : actions) {\n        removeAction(action);\n        action->setVisible(false);\n        action->setDisabled(true);\n        action->setShortcuts({});\n        action->deleteLater();\n    }\n}\n\nvoid TrayMenu::setCustomActions(QList<QAction*> actions)\n{\n    clearCustomActions();\n    m_customActions = actions;\n    insertActions(m_customActionsSeparator, actions);\n}\n\nvoid TrayMenu::clearAllActions()\n{\n    m_clipboardActions = {};\n    m_customActions = {};\n    clear();\n    m_clipboardItemActionCount = 0;\n    m_searchText.clear();\n}\n\nvoid TrayMenu::setNavigationStyle(NavigationStyle style)\n{\n    m_navigationStyle = style;\n}\n\nvoid TrayMenu::setNumberSearchEnabled(bool enabled)\n{\n    m_numberSearch = enabled;\n}\n\nvoid TrayMenu::keyPressEvent(QKeyEvent *event)\n{\n    const int key = event->key();\n    m_omitPaste = false;\n\n    // Movement in tray menu.\n    switch (key) {\n    case Qt::Key_PageDown:\n    case Qt::Key_End: {\n        QAction *action = lastEnabledAction(this);\n        if (action != nullptr)\n            setActiveAction(action);\n        break;\n    }\n    case Qt::Key_PageUp:\n    case Qt::Key_Home: {\n        QAction *action = firstEnabledAction(this);\n        if (action != nullptr)\n            setActiveAction(action);\n        break;\n    }\n    case Qt::Key_Escape:\n        close();\n        break;\n    case Qt::Key_Backspace:\n        search( m_searchText.left(m_searchText.size() - 1) );\n        break;\n    case Qt::Key_Delete:\n        search(QString());\n        break;\n    case Qt::Key_Alt:\n        return;\n    default:\n        // Type text for search.\n        if ( (m_clipboardItemActionCount > 0 || !m_searchText.isEmpty())\n                && (m_navigationStyle != NavigationStyle::Vi || !m_searchText.isEmpty() || key == Qt::Key_Slash)\n                && !event->modifiers().testFlag(Qt::AltModifier)\n                && !event->modifiers().testFlag(Qt::ControlModifier) )\n        {\n            const QString txt = event->text();\n            if ( !txt.isEmpty() && txt[0].isPrint() ) {\n                // Activate item at row when number is entered.\n                if ( !m_numberSearch && m_searchText.isEmpty() ) {\n                    bool ok;\n                    const int row = txt.toInt(&ok);\n                    const int start = static_cast<int>(m_rowIndexFromOne);\n                    if (ok && start <= row && row < start + m_clipboardItemActionCount) {\n                        // Allow keypad digit to activate appropriate item in context menu.\n                        if (event->modifiers() == Qt::KeypadModifier)\n                            event->setModifiers(Qt::NoModifier);\n                        break;\n                    }\n                }\n                search(m_searchText + txt);\n                return;\n            }\n        }\n        break;\n    }\n\n    QMenu::keyPressEvent(event);\n}\n\nvoid TrayMenu::mousePressEvent(QMouseEvent *event)\n{\n    m_omitPaste = (event->button() == Qt::RightButton);\n    QMenu::mousePressEvent(event);\n}\n\nvoid TrayMenu::showEvent(QShowEvent *event)\n{\n    search(QString());\n\n    // If appmenu is used to handle the menu, most events won't be received\n    // so search won't work.\n    // This shows the search menu item only if show event is received.\n    if ( !m_searchAction.isNull() )\n        m_searchAction->setVisible(true);\n\n    if ( m_timerUpdateActiveAction.isActive() )\n        doUpdateActiveAction();\n\n    QMenu::showEvent(event);\n}\n\nvoid TrayMenu::hideEvent(QHideEvent *event)\n{\n    QMenu::hideEvent(event);\n\n    if ( !m_searchAction.isNull() )\n        m_searchAction->setVisible(false);\n}\n\nvoid TrayMenu::actionEvent(QActionEvent *event)\n{\n    delayedUpdateActiveAction();\n    QMenu::actionEvent(event);\n}\n\nvoid TrayMenu::leaveEvent(QEvent *event)\n{\n    // Omit clearing active action if menu is resizes and mouse pointer leaves menu.\n    auto action = activeAction();\n    QMenu::leaveEvent(event);\n    setActiveAction(action);\n}\n\nvoid TrayMenu::inputMethodEvent(QInputMethodEvent *event)\n{\n    if (!event->commitString().isEmpty())\n        search(m_searchText + event->commitString());\n    event->ignore();\n}\n\nvoid TrayMenu::search(const QString &text)\n{\n    if (m_searchText == text)\n        return;\n\n    m_searchText = text;\n    setProperty(\"copyq_disable_navigation\", !text.isEmpty());\n    emit searchRequest((m_navigationStyle == NavigationStyle::Vi) ? m_searchText.mid(1) : m_searchText);\n}\n\nvoid TrayMenu::markItemInClipboard(const QVariantMap &clipboardData)\n{\n    const auto text = getTextData(clipboardData);\n\n    for ( auto action : actions() ) {\n        const auto actionData = action->data().toMap();\n        const auto itemText = getTextData(actionData);\n        if ( !itemText.isEmpty() ) {\n            const auto hideIcon = itemText != text;\n            const auto isIconHidden = action->icon().isNull();\n            if ( isIconHidden != hideIcon )\n                action->setIcon(hideIcon ? QIcon() : iconClipboard());\n        }\n    }\n}\n\nvoid TrayMenu::setSearchMenuItem(const QString &text)\n{\n    if ( m_searchAction.isNull() ) {\n        const QIcon icon = getIcon(\"edit-find\", IconMagnifyingGlass);\n        m_searchAction = new QAction(icon, text, this);\n        m_searchAction->setEnabled(false);\n        // Search menu item is hidden by default, see showEvent().\n        m_searchAction->setVisible( isVisible() );\n        insertAction( actions().value(0), m_searchAction );\n    } else {\n        m_searchAction->setText(text);\n    }\n}\n\nvoid TrayMenu::onClipboardItemActionTriggered()\n{\n    QAction *act = qobject_cast<QAction *>(sender());\n    Q_ASSERT(act != nullptr);\n\n    const auto actionData = act->data().toMap();\n    emit clipboardItemActionTriggered(actionData, m_omitPaste);\n    close();\n}\n\nvoid TrayMenu::delayedUpdateActiveAction()\n{\n    if ( !isVisible() || activeAction() == nullptr )\n        m_timerUpdateActiveAction.start();\n}\n\nvoid TrayMenu::doUpdateActiveAction()\n{\n    m_timerUpdateActiveAction.stop();\n    const auto action = firstEnabledAction(this);\n    if (action != nullptr)\n        setActiveAction(action);\n}\n"
  },
  {
    "path": "src/gui/traymenu.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/navigationstyle.h\"\n\n#include <QMenu>\n#include <QPointer>\n#include <QTimer>\n\nclass QAction;\nclass QModelIndex;\n\nclass TrayMenu final : public QMenu\n{\n    Q_OBJECT\npublic:\n    explicit TrayMenu(QWidget *parent = nullptr);\n\n    static void updateTextFromData(QAction *act, const QVariantMap &data);\n    static bool updateIconFromData(QAction *act, const QVariantMap &data);\n\n    /**\n     * Add clipboard item action with number key hint.\n     *\n     * Triggering this action emits clipboardItemActionTriggered() signal.\n     */\n    QAction *addClipboardItemAction(const QVariantMap &data, bool showImages);\n\n    void clearClipboardItems();\n\n    void clearCustomActions();\n\n    /** Add custom action. */\n    void setCustomActions(QList<QAction*> actions);\n\n    /** Clear clipboard item actions and curstom actions. */\n    void clearAllActions();\n\n    void setNavigationStyle(NavigationStyle style);\n\n    /** Enable searching for numbers. */\n    void setNumberSearchEnabled(bool enabled);\n\n    /** Filter clipboard items. */\n    void search(const QString &text);\n\n    void markItemInClipboard(const QVariantMap &clipboardData);\n\n    /** Row numbers start from one instead of zero? */\n    void setRowIndexFromOne(bool rowIndexFromOne) { m_rowIndexFromOne = rowIndexFromOne; }\n\nsignals:\n    /** Emitted if numbered action triggered. */\n    void clipboardItemActionTriggered(const QVariantMap &itemData, bool omitPaste);\n\n    void searchRequest(const QString &text);\n\nprotected:\n    void keyPressEvent(QKeyEvent *event) override;\n    void mousePressEvent(QMouseEvent *event) override;\n\n    void showEvent(QShowEvent *event) override;\n    void hideEvent(QHideEvent *event) override;\n    void actionEvent(QActionEvent *event) override;\n\n    void leaveEvent(QEvent *event) override;\n\n    void inputMethodEvent(QInputMethodEvent *event) override;\n\nprivate:\n    void onClipboardItemActionTriggered();\n\n    void delayedUpdateActiveAction();\n    void doUpdateActiveAction();\n\n    void setSearchMenuItem(const QString &text);\n\n    QPointer<QAction> m_clipboardItemActionsSeparator;\n    QPointer<QAction> m_customActionsSeparator;\n    QPointer<QAction> m_searchAction;\n    int m_clipboardItemActionCount;\n\n    bool m_omitPaste;\n    bool m_numberSearch;\n    NavigationStyle m_navigationStyle = NavigationStyle::Default;\n\n    QString m_searchText;\n\n    QTimer m_timerUpdateActiveAction;\n\n    bool m_rowIndexFromOne = true;\n\n    QList<QAction*> m_clipboardActions;\n    QList<QAction*> m_customActions;\n};\n"
  },
  {
    "path": "src/gui/windowgeometryguard.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"windowgeometryguard.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/timer.h\"\n#include \"gui/geometry.h\"\n#include \"gui/screen.h\"\n#include \"platform/platformnativeinterface.h\"\n#include \"platform/platformwindow.h\"\n\n#include <QApplication>\n#include <QDebug>\n#include <QEvent>\n#include <QLoggingCategory>\n#include <QMoveEvent>\n#include <QScreen>\n#include <QVariant>\n#include <QWidget>\n#include <QWindow>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(geometryGuardCategory)\nQ_LOGGING_CATEGORY(geometryGuardCategory, \"copyq.geometryguard\")\n\nbool openOnCurrentScreen()\n{\n    return AppConfig().option<Config::open_windows_on_current_screen>();\n}\n\nbool isRestoreGeometryEnabled()\n{\n    return AppConfig().option<Config::restore_geometry>();\n}\n\nbool isMousePositionSupported()\n{\n    // On Wayland, getting mouse position can return\n    // the last known mouse position in an own Qt application window.\n    static const bool supported = !QCursor::pos().isNull();\n    return supported;\n}\n\nQScreen *currentScreen()\n{\n    if (!isMousePositionSupported())\n        return nullptr;\n\n    const int i = screenNumberAt(QCursor::pos());\n    const auto screens = QGuiApplication::screens();\n    if (0 <= i && i < screens.size())\n        return screens[i];\n\n    return nullptr;\n}\n\n} // namespace\n\nvoid raiseWindow(QWidget *window)\n{\n    window->raise();\n\n    // When the app is already active (e.g. dialog opened from the main\n    // window), the activation calls are redundant and can interfere with\n    // focus/key dispatch on some platforms.\n    if (QApplication::applicationState() != Qt::ApplicationActive) {\n        window->activateWindow();\n        QApplication::setActiveWindow(window);\n    }\n\n    // Synchronous platform raise: the window manager must process the\n    // raise before we return, otherwise macOS (and potentially other\n    // platforms) can suppress or hide the window before the raise takes\n    // effect.  A previous version deferred this via QTimer::singleShot(0),\n    // which caused tray menus and windows triggered by global shortcuts to\n    // require multiple attempts to appear.  (See issue #3445.)\n    const auto wid = window->winId();\n    const auto platformWindow = platformNativeInterface()->getWindow(wid);\n    if (platformWindow)\n        platformWindow->raise();\n}\n\nvoid WindowGeometryGuard::create(QWidget *window)\n{\n    static const bool enabled = isRestoreGeometryEnabled();\n    if (enabled)\n        new WindowGeometryGuard(window);\n}\n\nbool WindowGeometryGuard::eventFilter(QObject *, QEvent *event)\n{\n    const QEvent::Type type = event->type();\n\n    switch (type) {\n    case QEvent::Show: {\n        m_timerSaveGeometry.stop();\n\n        QWindow *window = m_window->windowHandle();\n        if (window) {\n            connect( window, &QWindow::screenChanged,\n                     this, &WindowGeometryGuard::onScreenChanged, Qt::UniqueConnection );\n\n            if ( !isWindowGeometryLocked() && openOnCurrentScreen() && isMousePositionSupported() ) {\n                QScreen *screen = currentScreen();\n                if (screen && window->screen() != screen) {\n                    qCDebug(geometryGuardCategory) << \"Moving to screen:\" << screen->name();\n                    m_window->move(screen->availableGeometry().topLeft());\n                }\n            }\n        }\n        break;\n    }\n\n    case QEvent::Move:\n    case QEvent::Resize:\n        if ( !isWindowGeometryLocked() && m_window->isVisible() )\n            m_timerSaveGeometry.start();\n        break;\n\n    case QEvent::Hide:\n        if ( isGeometryGuardBlockedUntilHidden(m_window) ) {\n            setGeometryGuardBlockedUntilHidden(m_window, false);\n            restoreWindowGeometry();\n        }\n        break;\n\n    default:\n        break;\n    }\n\n    return false;\n}\n\nWindowGeometryGuard::WindowGeometryGuard(QWidget *window)\n    : QObject(window)\n    , m_window(window)\n{\n    initSingleShotTimer(&m_timerSaveGeometry, 250, this, &WindowGeometryGuard::saveWindowGeometry);\n    initSingleShotTimer(&m_timerRestoreGeometry, 0, this, &WindowGeometryGuard::restoreWindowGeometry);\n    initSingleShotTimer(&m_timerUnlockGeometry, 250, this, &WindowGeometryGuard::unlockWindowGeometry);\n\n    m_window->installEventFilter(this);\n    restoreWindowGeometry();\n}\n\nbool WindowGeometryGuard::isWindowGeometryLocked() const\n{\n    return m_timerUnlockGeometry.isActive() || isGeometryGuardBlockedUntilHidden(m_window);\n}\n\nbool WindowGeometryGuard::lockWindowGeometry()\n{\n    if ( isWindowGeometryLocked() )\n        return false;\n\n    m_timerUnlockGeometry.start();\n\n    return true;\n}\n\nvoid WindowGeometryGuard::saveWindowGeometry()\n{\n    if ( !lockWindowGeometry() )\n        return;\n\n    ::saveWindowGeometry(m_window, openOnCurrentScreen());\n    unlockWindowGeometry();\n}\n\nvoid WindowGeometryGuard::restoreWindowGeometry()\n{\n    if ( !lockWindowGeometry() )\n        return;\n\n    ::restoreWindowGeometry(m_window, openOnCurrentScreen());\n}\n\nvoid WindowGeometryGuard::unlockWindowGeometry()\n{\n    m_timerUnlockGeometry.stop();\n}\n\nvoid WindowGeometryGuard::onScreenChanged()\n{\n    if (!openOnCurrentScreen())\n        return;\n\n    if ( !lockWindowGeometry() )\n        return;\n\n    QWindow *window = m_window->windowHandle();\n    if (!window)\n        return;\n\n    QScreen *screen = window->screen();\n    if (!screen)\n        return;\n\n    qCDebug(geometryGuardCategory) << \"Screen changed:\" << screen->name();\n\n    const bool isMousePositionSupported = ::isMousePositionSupported();\n    if ( window && isMousePositionSupported && screen != currentScreen() ) {\n        qCDebug(geometryGuardCategory) << \"Avoiding geometry-restore on incorrect screen\";\n        return;\n    }\n\n    if (isMousePositionSupported || m_window->isModal()) {\n        ::restoreWindowGeometry(m_window, true);\n    } else if ( m_window->isVisible() ) {\n        // WORKAROUND: Center window position on Sway window compositor which\n        // does not support changing window position.\n        m_window->hide();\n        ::restoreWindowGeometry(m_window, true);\n        m_window->show();\n    } else {\n        ::restoreWindowGeometry(m_window, true);\n    }\n}\n"
  },
  {
    "path": "src/gui/windowgeometryguard.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n\n#include <QObject>\n#include <QTimer>\n\nclass QWidget;\n\nvoid raiseWindow(QWidget *window);\n\nclass WindowGeometryGuard final : public QObject\n{\npublic:\n    static void create(QWidget *window);\n\n    bool eventFilter(QObject *object, QEvent *event) override;\n\nprivate:\n    explicit WindowGeometryGuard(QWidget *window);\n\n    bool isWindowGeometryLocked() const;\n\n    bool lockWindowGeometry();\n\n    void saveWindowGeometry();\n    void restoreWindowGeometry();\n    void unlockWindowGeometry();\n\n    void onScreenChanged();\n\n    QWidget *m_window;\n\n    QTimer m_timerSaveGeometry;\n    QTimer m_timerRestoreGeometry;\n    QTimer m_timerUnlockGeometry;\n};\n"
  },
  {
    "path": "src/item/clipboarditem.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboarditem.h\"\n\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"item/serialize.h\"\n\n#include <QBrush>\n#include <QByteArray>\n#include <QString>\n#include <QStringList>\n#include <QVariant>\n\nnamespace {\n\nvoid clearDataExceptInternal(QVariantMap *data)\n{\n    QMutableMapIterator<QString, QVariant> it(*data);\n    while (it.hasNext()) {\n        const auto item = it.next();\n        if ( !item.key().startsWith(COPYQ_MIME_PREFIX) )\n            it.remove();\n    }\n}\n\n} // namespace\n\nClipboardItem::ClipboardItem()\n    : m_data()\n    , m_hash(0)\n{\n}\n\nClipboardItem::ClipboardItem(const QVariantMap &data)\n    : m_data(data)\n    , m_hash(0)\n{\n}\n\nbool ClipboardItem::operator ==(const ClipboardItem &item) const\n{\n    return dataHash() == item.dataHash();\n}\n\nvoid ClipboardItem::setText(const QString &text)\n{\n    QMutableMapIterator<QString, QVariant> it(m_data);\n    while (it.hasNext()) {\n        const auto item = it.next();\n        if ( item.key().startsWith(\"text/\") )\n            it.remove();\n    }\n\n    setTextData(&m_data, text);\n\n    invalidateDataHash();\n}\n\nbool ClipboardItem::setData(const QVariantMap &data)\n{\n    if (m_data == data)\n        return false;\n\n    const auto oldData = m_data;\n    m_data = data;\n\n    for (auto it = oldData.constBegin(); it != oldData.constEnd(); ++it) {\n        if (it.key().startsWith(mimePrivatePrefix) && !m_data.contains(it.key()))\n            m_data[it.key()] = it.value();\n    }\n\n    invalidateDataHash();\n    return true;\n}\n\nbool ClipboardItem::updateData(const QVariantMap &data)\n{\n    const int oldSize = m_data.size();\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        const auto &format = it.key();\n        if ( !format.startsWith(COPYQ_MIME_PREFIX) ) {\n            clearDataExceptInternal(&m_data);\n            break;\n        }\n    }\n\n    bool changed = (oldSize != m_data.size());\n\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        const auto &format = it.key();\n        const auto &value = it.value();\n        if ( !value.isValid() ) {\n            m_data.remove(format);\n            changed = true;\n        } else if ( m_data.value(format) != value ) {\n            m_data.insert(format, value);\n            changed = true;\n        }\n    }\n\n    invalidateDataHash();\n\n    return changed;\n}\n\nvoid ClipboardItem::removeData(const QString &mimeType)\n{\n    m_data.remove(mimeType);\n    invalidateDataHash();\n}\n\nbool ClipboardItem::removeData(const QStringList &mimeTypeList)\n{\n    bool removed = false;\n\n    for (const auto &mimeType : mimeTypeList) {\n        if ( m_data.contains(mimeType) ) {\n            m_data.remove(mimeType);\n            removed = true;\n        }\n    }\n\n    if (removed)\n        invalidateDataHash();\n\n    return removed;\n}\n\nvoid ClipboardItem::setData(const QString &mimeType, const QByteArray &data)\n{\n    m_data.insert(mimeType, data);\n    invalidateDataHash();\n}\n\nQVariant ClipboardItem::data(int role) const\n{\n    switch(role) {\n    case Qt::DisplayRole:\n    case Qt::EditRole:\n        return getTextData(m_data);\n\n    case contentType::data:\n        return m_data; // copy-on-write, so this should be fast\n    case contentType::text:\n        return getTextData(m_data);\n    case contentType::html:\n        return getTextData(m_data, mimeHtml);\n    case contentType::notes:\n        return getTextData(m_data, mimeItemNotes);\n    case contentType::color:\n        return getTextData(m_data, mimeColor);\n    case contentType::isHidden:\n        return m_data.contains(mimeHidden);\n    }\n\n    return QVariant();\n}\n\nunsigned int ClipboardItem::dataHash() const\n{\n    if (m_hash == 0)\n        m_hash = hash(m_data);\n\n    return m_hash;\n}\n\nvoid ClipboardItem::invalidateDataHash()\n{\n    m_hash = 0;\n}\n"
  },
  {
    "path": "src/item/clipboarditem.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QVariant>\n\nclass QByteArray;\nclass QString;\n\n/**\n * Class for clipboard items in ClipboardModel.\n *\n * Clipboard item stores data of different MIME types and has single default\n * MIME type for displaying the contents.\n */\nclass ClipboardItem final\n{\npublic:\n    ClipboardItem();\n\n    explicit ClipboardItem(const QVariantMap &data);\n\n    /** Compare with other item (using hash). */\n    bool operator ==(const ClipboardItem &item) const;\n\n    /** Set item's MIME type data. */\n    void setData(const QString &mimeType, const QByteArray &data);\n\n    /**\n     * Set item's text data.\n     * Clears all other text data and saves @a text as text/plain MIME type.\n     */\n    void setText(const QString &text);\n\n    /**\n     * Set formats from map with MIME type as key and data as value.\n     */\n    bool setData(const QVariantMap &data);\n\n    /**\n     * Update current data.\n     * Clears non-internal data if passed data map contains non-internal data.\n     * @return true if any data were changed\n     */\n    bool updateData(const QVariantMap &data);\n\n    /** Remove item's MIME type data. */\n    void removeData(const QString &mimeType);\n\n    /** Remove item's MIME type data. */\n    bool removeData(const QStringList &mimeTypeList);\n\n    /** Return data for given @a role. */\n    QVariant data(int role) const;\n\n    /** Return data for format. */\n    QByteArray data(const QString &format) const { return m_data.value(format).toByteArray(); }\n\n    /** Return hash for item's data. */\n    unsigned int dataHash() const;\n\nprivate:\n    void invalidateDataHash();\n\n    QVariantMap m_data;\n    mutable unsigned int m_hash;\n};\n"
  },
  {
    "path": "src/item/clipboardmodel.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"clipboardmodel.h\"\n\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n\n#include <QStringList>\n\n#include <algorithm>\n\nnamespace {\n\nQList<QPersistentModelIndex> validIndeces(const QModelIndexList &indexList)\n{\n    QList<QPersistentModelIndex> list;\n    list.reserve(indexList.size());\n\n    for (const auto &index : indexList) {\n        if ( index.isValid() )\n            list.append(index);\n    }\n\n    return list;\n}\n\nint topMostRow(const QList<QPersistentModelIndex> &indexList)\n{\n    int row = indexList.value(0).row();\n\n    for (const auto &index : indexList)\n        row = qMin(row, index.row());\n\n    return row;\n}\n\n} // namespace\n\nvoid ClipboardItemList::move(int from, int count, int to)\n{\n    if (to < from) {\n        std::swap(from, to);\n        to += count;\n        count = to - from - count;\n    }\n\n    const auto start1 = std::begin(m_items) + from;\n    const auto start2 = start1 + count;\n    const auto end2 = std::begin(m_items) + to;\n    std::rotate(start1, start2, end2);\n}\n\nClipboardModel::ClipboardModel(QObject *parent)\n    : QAbstractListModel(parent)\n{\n}\n\nint ClipboardModel::rowCount(const QModelIndex&) const\n{\n    return m_clipboardList.size();\n}\n\nQVariant ClipboardModel::data(const QModelIndex &index, int role) const\n{\n    if (!index.isValid() || index.row() >= m_clipboardList.size())\n        return QVariant();\n\n    return m_clipboardList[index.row()].data(role);\n}\n\nQt::ItemFlags ClipboardModel::flags(const QModelIndex &index) const\n{\n    if (!index.isValid())\n        return Qt::ItemIsEnabled;\n\n    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;\n}\n\nbool ClipboardModel::setData(const QModelIndex &index, const QVariant &value, int role)\n{\n    if ( !index.isValid() )\n        return false;\n\n    int row = index.row();\n\n    if (role == Qt::EditRole) {\n        m_clipboardList[row].setText(value.toString());\n    } else if (role == contentType::notes) {\n        const QString notes = value.toString();\n        if ( notes.isEmpty() )\n            m_clipboardList[row].removeData(mimeItemNotes);\n        else\n            m_clipboardList[row].setData( mimeItemNotes, notes.toUtf8() );\n    } else if (role == contentType::updateData) {\n        if ( !m_clipboardList[row].updateData(value.toMap()) )\n            return false;\n    } else if (role == contentType::data) {\n        ClipboardItem &item = m_clipboardList[row];\n        const QVariantMap dataMap = value.toMap();\n        // Emit dataChanged() only if really changed.\n        if ( !item.setData(dataMap) )\n            return true;\n    } else if (role >= contentType::removeFormats) {\n        if ( !m_clipboardList[row].removeData(value.toStringList()) )\n            return false;\n    } else {\n        return false;\n    }\n\n    emit dataChanged(index, index);\n\n    return true;\n}\n\nvoid ClipboardModel::insertItem(const QVariantMap &data, int row)\n{\n    ClipboardItem item;\n    item.setData(data);\n\n    beginInsertRows(QModelIndex(), row, row);\n\n    m_clipboardList.insert(row, item);\n\n    endInsertRows();\n}\n\nvoid ClipboardModel::insertItems(const QVector<QVariantMap> &dataList, int row)\n{\n    if ( dataList.isEmpty() )\n        return;\n\n    int targetRow = row;\n    m_clipboardList.reserve( m_clipboardList.size() + dataList.size() );\n\n    beginInsertRows(QModelIndex(), row, row + dataList.size() - 1);\n\n    for ( auto it = std::begin(dataList); it != std::end(dataList); ++it ) {\n        m_clipboardList.insert(targetRow, ClipboardItem(*it));\n        ++targetRow;\n    }\n\n    endInsertRows();\n}\n\nvoid ClipboardModel::setItemsData(const QMap<QPersistentModelIndex, QVariantMap> &itemsData)\n{\n    QPersistentModelIndex topIndex;\n    QPersistentModelIndex bottomIndex;\n\n    for (auto it = std::begin(itemsData); it != std::end(itemsData); ++it) {\n        const QPersistentModelIndex &index = it.key();\n        if ( !index.isValid() )\n            continue;\n\n        const int row = index.row();\n        ClipboardItem &item = m_clipboardList[row];\n\n        // Emit dataChanged() only if really changed.\n        if ( item.setData(it.value()) ) {\n            if ( !topIndex.isValid() ) {\n                topIndex = index;\n                bottomIndex = index;\n            } else {\n                topIndex = std::min(topIndex, index);\n                bottomIndex = std::max(bottomIndex, index);\n            }\n        }\n    }\n\n    if ( topIndex.isValid() )\n        emit dataChanged(topIndex, bottomIndex);\n}\n\nbool ClipboardModel::insertRows(int position, int rows, const QModelIndex&)\n{\n    if ( rows <= 0 || position < 0 )\n        return false;\n\n    beginInsertRows(QModelIndex(), position, position + rows - 1);\n\n    for (int row = 0; row < rows; ++row)\n        m_clipboardList.insert(position, ClipboardItem());\n\n    endInsertRows();\n\n    return true;\n}\n\nbool ClipboardModel::removeRows(int position, int rows, const QModelIndex&)\n{\n    if ( rows <= 0 || position < 0 || position + rows > rowCount() )\n        return false;\n\n    int last = qMin( position + rows, rowCount() ) - 1;\n\n    beginRemoveRows(QModelIndex(), position, last);\n\n    m_clipboardList.remove(position, last - position + 1);\n\n    endRemoveRows();\n\n    return true;\n}\n\nbool ClipboardModel::moveRows(\n        const QModelIndex &sourceParent, int sourceRow, int rows,\n        const QModelIndex &destinationParent, int destinationRow)\n{\n    if (sourceParent.isValid() || destinationParent.isValid())\n        return false;\n\n    if (sourceRow < 0 || destinationRow < 0 || destinationRow > rowCount()\n            || rows <= 0 || sourceRow + rows > rowCount())\n    {\n        return false;\n    }\n\n    const int last = sourceRow + rows - 1;\n    if (sourceRow <= destinationRow && destinationRow <= last + 1)\n        return false;\n\n    beginMoveRows(sourceParent, sourceRow, last, destinationParent, destinationRow);\n    m_clipboardList.move(sourceRow, rows, destinationRow);\n    endMoveRows();\n\n    return true;\n}\n\nvoid ClipboardModel::sortItems(const QModelIndexList &indexList, CompareItems *compare)\n{\n    QList<QPersistentModelIndex> list = validIndeces(indexList);\n    std::sort( list.begin(), list.end(), compare );\n    sortItems(list);\n}\n\nvoid ClipboardModel::sortItems(const QList<QPersistentModelIndex> &sorted)\n{\n    int targetRow = topMostRow(sorted);\n\n    for (const auto &ind : sorted) {\n        if (ind.isValid()) {\n            const int sourceRow = ind.row();\n\n            if (targetRow != sourceRow) {\n                beginMoveRows(QModelIndex(), sourceRow, sourceRow, QModelIndex(), targetRow);\n                m_clipboardList.move(sourceRow, targetRow);\n                endMoveRows();\n\n                // If the moved item was removed or moved further (as reaction on moving the item),\n                // stop sorting.\n                if (!ind.isValid() || ind.row() != targetRow)\n                    break;\n            }\n\n            ++targetRow;\n        }\n    }\n}\n\nint ClipboardModel::findItem(uint itemHash) const\n{\n    for (int i = 0; i < m_clipboardList.size(); ++i) {\n        if ( m_clipboardList[i].dataHash() == itemHash )\n            return i;\n    }\n\n    return -1;\n}\n"
  },
  {
    "path": "src/item/clipboardmodel.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"item/clipboarditem.h\"\n\n#include <QAbstractListModel>\n#include <QList>\n\n/**\n * Container with clipboard items.\n *\n * Item prepending is optimized.\n */\nclass ClipboardItemList final {\npublic:\n    ClipboardItem &operator [](int i)\n    {\n        return m_items[i];\n    }\n\n    const ClipboardItem &operator [](int i) const\n    {\n        return m_items[i];\n    }\n\n    void insert(int row, const ClipboardItem &item)\n    {\n        m_items.insert(row, item);\n    }\n\n    void remove(int row, int count)\n    {\n        const QList<ClipboardItem>::iterator from = m_items.begin() + row;\n        const QList<ClipboardItem>::iterator to = from + count;\n        m_items.erase(from, to);\n    }\n\n    int size() const\n    {\n        return m_items.size();\n    }\n\n    void move(int from, int to)\n    {\n        const ClipboardItem item = m_items[from];\n        m_items.removeAt(from);\n        m_items.insert(to, item);\n    }\n\n    void move(int from, int count, int to);\n\n    void reserve(int maxItems)\n    {\n        m_items.reserve(maxItems);\n    }\n\n    void resize(int size)\n    {\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n        m_items.resize(size);\n#else\n        if (size < this->size())\n            remove(size, this->size());\n\n        while (size > this->size())\n            m_items.append(ClipboardItem());\n#endif\n    }\n\nprivate:\n    QList<ClipboardItem> m_items;\n};\n\n/**\n * Model containing ClipboardItem objects.\n *\n * Class implements QAbstractListModel interface.\n *\n * Clipboard item in model can be serialized and deserialized using\n * operators << and >> (see @ref clipboard_model_serialization_operators).\n */\nclass ClipboardModel final : public QAbstractListModel\n{\npublic:\n    /** Return true if @a lhs is less than @a rhs. */\n    using CompareItems = bool (const QModelIndex &, const QModelIndex &);\n\n    explicit ClipboardModel(QObject *parent = nullptr);\n\n    /** Return number of items in model. */\n    int rowCount(const QModelIndex &parent = QModelIndex()) const override;\n\n    /** Return data for given @a index. */\n    QVariant data(const QModelIndex &index, int role) const override;\n\n    /** Return flags for given @a index. */\n    Qt::ItemFlags flags(const QModelIndex &index) const override;\n\n    bool setData(const QModelIndex &index, const QVariant &value,\n                 int role = Qt::EditRole) override;\n    bool insertRows(int position, int rows,\n                    const QModelIndex &index = QModelIndex()) override;\n    bool removeRows(int position, int rows,\n                    const QModelIndex &index = QModelIndex()) override;\n    bool moveRows(const QModelIndex &sourceParent, int sourceRow, int rows,\n            const QModelIndex &destinationParent, int destinationRow) override;\n\n    /** insert new item to model. */\n    void insertItem(const QVariantMap &data, int row);\n\n    void insertItems(const QVector<QVariantMap> &dataList, int row);\n\n    void setItemsData(const QMap<QPersistentModelIndex, QVariantMap> &itemsData);\n\n    /**\n     * Sort items in ascending order.\n     */\n    void sortItems(const QModelIndexList &indexList, CompareItems *compare);\n    void sortItems(const QList<QPersistentModelIndex> &sorted);\n\n    /**\n     * Find item with given @a hash.\n     * @return Row number with found item or -1 if no item was found.\n     */\n    int findItem(uint itemHash) const;\n\nprivate:\n    ClipboardItemList m_clipboardList;\n};\n"
  },
  {
    "path": "src/item/indexes.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"indexes.h\"\n\n#include <QAbstractItemModel>\n\nQList<QPersistentModelIndex> toPersistentModelIndexList(const QList<QModelIndex> &indexes)\n{\n    QList<QPersistentModelIndex> result;\n    result.reserve( indexes.size() );\n\n    for (const auto &index : indexes) {\n        if ( index.isValid() )\n            result.append(index);\n    }\n\n    return result;\n}\n\nint dropIndexes(const QModelIndexList &indexes, QAbstractItemModel *model)\n{\n    auto toRemove = toPersistentModelIndexList(indexes);\n    return dropIndexes(toRemove, model);\n}\n\nint dropIndexes(QList<QPersistentModelIndex> &indexes, QAbstractItemModel *model)\n{\n    const int first = indexes.value(0).row();\n\n    std::sort( std::begin(indexes), std::end(indexes) );\n\n    // Remove ranges of rows instead of a single rows.\n    for (auto it1 = std::begin(indexes); it1 != std::end(indexes); ) {\n        if ( it1->isValid() ) {\n            const auto firstRow = it1->row();\n            auto rowCount = 0;\n\n            for ( ++it1, ++rowCount; it1 != std::end(indexes)\n                  && it1->isValid()\n                  && it1->row() == firstRow + rowCount; ++it1, ++rowCount ) {}\n\n            model->removeRows(firstRow, rowCount);\n        } else {\n            ++it1;\n        }\n    }\n\n    return first;\n}\n"
  },
  {
    "path": "src/item/indexes.h",
    "content": "#pragma once\n\n#include <QtContainerFwd>\n\nclass QAbstractItemModel;\nclass QModelIndex;\nclass QPersistentModelIndex;\ntypedef QList<QModelIndex> QModelIndexList;\n\nQList<QPersistentModelIndex> toPersistentModelIndexList(const QList<QModelIndex> &indexes);\n\nint dropIndexes(const QModelIndexList &indexes, QAbstractItemModel *model);\n\nint dropIndexes(QList<QPersistentModelIndex> &indexes, QAbstractItemModel *model);\n"
  },
  {
    "path": "src/item/itemdelegate.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemdelegate.h\"\n\n#include \"common/client_server.h\"\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"common/timer.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/iconfactory.h\"\n#include \"item/itemfactory.h\"\n#include \"item/itemwidget.h\"\n#include \"item/itemeditorwidget.h\"\n#include \"item/persistentdisplayitem.h\"\n\n#include <QEvent>\n#include <QPainter>\n#include <QResizeEvent>\n#include <QScrollArea>\n#include <QVBoxLayout>\n\n#include <algorithm>\n\nnamespace {\n\nconst char propertySelectedItem[] = \"CopyQ_selected\";\nconstexpr int defaultMaxItemHeight = 2048 * 8;\n\n} // namespace\n\nItemDelegate::ItemDelegate(ClipboardBrowser *view, const ClipboardBrowserSharedPtr &sharedData, QWidget *parent)\n    : QItemDelegate(parent)\n    , m_view(view)\n    , m_sharedData(sharedData)\n    , m_maxWidth(2048)\n    , m_idealWidth(m_view->viewport()->contentsRect().width())\n{\n    initSingleShotTimer(\n        &m_timerInvalidateHidden, 0, this, &ItemDelegate::invalidateAllHiddenNow );\n}\n\nItemDelegate::~ItemDelegate() = default;\n\nQSize ItemDelegate::sizeHint(const QModelIndex &index) const\n{\n    return m_items[index.row()].size;\n}\n\nQSize ItemDelegate::sizeHint(const QStyleOptionViewItem &,\n                             const QModelIndex &index) const\n{\n    return sizeHint(index);\n}\n\nbool ItemDelegate::eventFilter(QObject *obj, QEvent *event)\n{\n    // resize event for items\n    if ( event->type() == QEvent::Resize ) {\n        const int row = findWidgetRow(obj);\n        Q_ASSERT(row != -1);\n        const auto index = m_view->index(row);\n        updateLater();\n        const auto ev = static_cast<QResizeEvent*>(event);\n        updateItemSize(index, ev->size());\n    }\n\n    return QItemDelegate::eventFilter(obj, event);\n}\n\nvoid ItemDelegate::dataChanged(const QModelIndex &a, const QModelIndex &b)\n{\n    for ( int row = a.row(); row <= b.row(); ++row )\n        m_items[row].item.reset();\n\n    updateLater();\n}\n\nvoid ItemDelegate::rowsRemoved(const QModelIndex &, int start, int end)\n{\n    for (int row = start; row <= end; ++row) {\n        if ( m_view->isRowHidden(row) )\n            continue;\n\n        if (m_items[row]) {\n            const auto index = m_view->index(row);\n            m_items[row]->widget()->removeEventFilter(this);\n            setIndexWidget(index, nullptr);\n        }\n    }\n\n    m_items.erase(std::begin(m_items) + start, std::begin(m_items) + end + 1);\n\n    updateLater();\n}\n\nvoid ItemDelegate::rowsMoved(const QModelIndex &, int sourceStart, int sourceEnd,\n                             const QModelIndex &, int destinationRow)\n{\n    auto count = sourceEnd - sourceStart + 1;\n    auto from = sourceStart;\n    auto to = destinationRow;\n\n    if (to < from) {\n        std::swap(from, to);\n        to += count;\n        count = to - from - count;\n    }\n\n    const auto start1 = std::begin(m_items) + from;\n    const auto start2 = start1 + count;\n    const auto end2 = std::begin(m_items) + to;\n    std::rotate(start1, start2, end2);\n\n    updateLater();\n}\n\nQWidget *ItemDelegate::createPreview(const QVariantMap &data, QWidget *parent)\n{\n    auto widget = createPreviewNoEmit(data, parent);\n    emit itemWidgetCreated(PersistentDisplayItem(this, data, widget));\n    return widget;\n}\n\nQWidget *ItemDelegate::createPreviewNoEmit(const QVariantMap &data, QWidget *parent)\n{\n    const bool antialiasing = m_sharedData->theme.isAntialiasingEnabled();\n    ItemWidget *itemWidget =\n            m_sharedData->itemFactory->createItem(data, parent, antialiasing, false, true);\n\n    const auto height = 2048 * 8;\n    const auto idealWidth = parent->contentsRect().width();\n    const auto maxSize = m_sharedData->textWrap ? QSize(idealWidth, height) : QSize(2048, height);\n    itemWidget->updateSize(maxSize, idealWidth);\n\n    highlightMatches(itemWidget);\n\n    parent->setFocusProxy( itemWidget->widget() );\n\n    return itemWidget->widget();\n}\n\nvoid ItemDelegate::rowsInserted(const QModelIndex &, int start, int end)\n{\n    const auto count = static_cast<size_t>(end - start + 1);\n    const auto oldSize = m_items.size();\n    m_items.resize(oldSize + count);\n    std::rotate( std::begin(m_items) + start,\n                 std::begin(m_items) + oldSize,\n                 std::end(m_items) );\n\n    updateLater();\n}\n\nvoid ItemDelegate::createItemWidget(const QModelIndex &index)\n{\n    const int row = index.row();\n    ItemWidget *w = m_items[row].get();\n    if (w == nullptr) {\n        QVariantMap data = index.data(contentType::data).toMap();\n        data.insert(mimeCurrentTab, m_view->tabName());\n        w = updateWidget(index, data);\n        emit itemWidgetCreated(PersistentDisplayItem(this, data, w->widget()));\n    }\n}\n\nvoid ItemDelegate::updateWidget(QObject *widget, const QVariantMap &data)\n{\n    if ( widget->parent() != m_view->viewport() ) {\n        auto previewParent = qobject_cast<QWidget*>( widget->parent() );\n        Q_ASSERT(previewParent);\n        if (!previewParent)\n            return;\n\n        auto scrollArea = qobject_cast<QScrollArea*>( previewParent->parentWidget() );\n        Q_ASSERT(scrollArea);\n        if (!scrollArea)\n            return;\n\n        auto newPreview = createPreviewNoEmit(data, scrollArea);\n        scrollArea->setWidget(newPreview);\n        newPreview->show();\n        return;\n    }\n\n    const auto row = findWidgetRow(widget);\n    if (row == -1)\n        return;\n\n    const auto index = m_view->index(row);\n    updateWidget(index, data);\n}\n\nvoid ItemDelegate::setItemSizes(int maxWidth, int idealWidth)\n{\n    const auto margins = m_sharedData->theme.margins();\n    const int margin = 2 * margins.width() + 2 * m_view->spacing();\n    m_maxWidth = maxWidth - margin;\n    m_idealWidth = idealWidth - margin;\n    m_fontHeight = m_view->viewport()->fontMetrics().height();\n\n    for (int row = 0; static_cast<size_t>(row) < m_items.size(); ++row) {\n        if (m_items[row])\n            updateItemWidgetSize(row);\n    }\n}\n\nvoid ItemDelegate::updateItemWidgetSize(int row)\n{\n    const int rowNumberWidth = m_sharedData->theme.rowNumberSize(row).width();\n    ItemWidget *w = m_items[row].get();\n    w->updateSize(\n        QSize(m_maxWidth - rowNumberWidth, defaultMaxItemHeight),\n        m_idealWidth - rowNumberWidth\n    );\n}\n\nvoid ItemDelegate::updateItemSize(const QModelIndex &index, QSize itemWidgetSize)\n{\n    const int row = index.row();\n    const auto margins = m_sharedData->theme.margins();\n    const auto rowNumberSize = m_sharedData->theme.rowNumberSize(row);\n    const int width = itemWidgetSize.width() + 2 * margins.width() + rowNumberSize.width();\n    const int height = std::max(\n        itemWidgetSize.height() + 2 * margins.height(),\n        rowNumberSize.height()\n    );\n\n    QSize newSize = QSize(width, height);\n    const QSize oldSize = m_items[row].size;\n    if (oldSize == newSize)\n        return;\n\n    // Avoid small height changes to make the item positions more stable\n    if (oldSize.isValid()) {\n        const int deltaH = newSize.height() - oldSize.height();\n        if ((-m_fontHeight < deltaH && deltaH < 0) || (0 < deltaH && deltaH < m_fontHeight / 3))\n            newSize.setHeight(oldSize.height());\n    }\n    m_items[row].size = newSize;\n    emit sizeHintChanged(index);\n}\n\nItemEditorWidget *ItemDelegate::createCustomEditor(\n        QWidget *parent, const QModelIndex &index, const QString &format)\n{\n    // If format is empty, try to find most suitable text format to edit.\n    if ( format.isEmpty() ) {\n        const QVariantMap data = m_sharedData->itemFactory->data(index);\n        for (const auto &format2 : {mimeTextUtf8, mimeText, mimeUriList, mimeHtml}) {\n            if ( data.contains(format2) )\n                return createCustomEditor(parent, index, format2);\n        }\n        return nullptr;\n    }\n\n    // Refuse editing non-text data\n    if ( format != mimeItemNotes && !format.startsWith(QLatin1String(\"text/\")) )\n        return nullptr;\n\n    const QVariantMap data = m_sharedData->itemFactory->data(index);\n    if ( format != mimeItemNotes && !data.contains(format) )\n        return nullptr;\n\n    auto editorParent = new QWidget(parent);\n    auto editor = new ItemEditorWidget(index, format, editorParent);\n\n    connect(editor, &QObject::destroyed, editorParent, &QObject::deleteLater);\n\n    // Prefer editing rich text\n    if ( (format == mimeText || format == mimeTextUtf8 || format == mimeHtml)\n         && data.contains(mimeHtml) )\n    {\n        const QString html = getTextData(data, mimeHtml);\n        editor->setHtml(html);\n    } else {\n        const QString text = getTextData(data, format);\n        editor->setPlainText(text);\n    }\n\n    editor->selectAll();\n\n    auto toolBar = editor->createToolbar(editorParent, m_sharedData->menuItems);\n    auto palette = m_sharedData->theme.editorPalette();\n    editorParent->setBackgroundRole(QPalette::Base);\n    editorParent->setAutoFillBackground(true);\n    editorParent->setPalette(palette);\n    editor->setPalette(palette);\n    editor->setStyleSheet(\"QTextEdit{background:transparent}\");\n\n    palette.setColor(QPalette::Base, Qt::transparent);\n    editor->setPalette(palette);\n\n    const auto font = m_sharedData->theme.editorFont();\n    editorParent->setFont(font);\n    editor->setFont(font);\n    toolBar->setFont(font);\n\n    editor->setSaveOnReturnKey(m_sharedData->saveOnReturnKey);\n\n    auto layout = new QVBoxLayout(editorParent);\n    layout->setSpacing(0);\n    layout->setContentsMargins(0, 0, 0, 0);\n    layout->addWidget(toolBar);\n    layout->addWidget(editor);\n\n    editorParent->show();\n\n    return editor;\n}\n\nvoid ItemDelegate::highlightMatches(ItemWidget *itemWidget) const\n{\n    QWidget *w = itemWidget->widget();\n    const auto textEdits = w->findChildren<QTextEdit*>();\n    auto maybeTextEdit = qobject_cast<QTextEdit*>(w);\n    if (m_filter) {\n        QTextCharFormat format;\n        format.setFont( m_sharedData->theme.searchFont() );\n        QPalette palette = m_sharedData->theme.searchPalette();\n        format.setBackground( palette.base() );\n        format.setForeground( palette.text() );\n\n        for (QTextEdit *edit : textEdits)\n            m_filter->highlight(edit, format);\n        if (maybeTextEdit)\n            m_filter->highlight(maybeTextEdit, format);\n    } else {\n        for (QTextEdit *edit : textEdits)\n            edit->setExtraSelections({});\n        if (maybeTextEdit)\n            maybeTextEdit->setExtraSelections({});\n    }\n}\n\nvoid ItemDelegate::updateAllRows()\n{\n    const int s = m_view->spacing();\n    const int space = 2 * s;\n    int y = -m_view->verticalOffset() + s;\n\n    for (int row = 0; static_cast<size_t>(row) < m_items.size(); ++row) {\n        const bool hide = m_view->isRowHidden(row);\n        auto &item = m_items[row];\n        if (item) {\n            QWidget *ww = item->widget();\n            if (hide) {\n                ww->removeEventFilter(this);\n                ww->hide();\n            } else {\n                if (item.appliedFilterId != m_filterId) {\n                    highlightMatches(item.get());\n                    item.appliedFilterId = m_filterId;\n                }\n                ww->move( QPoint(ww->x(), y) );\n                if ( ww->isHidden() ) {\n                    ww->show();\n                    updateItemWidgetSize(row);\n                    ww->installEventFilter(this);\n                    const auto index = m_view->index(row);\n                    updateItemSize(index, ww->size());\n                }\n            }\n        }\n\n        if (!hide)\n            y += m_items[row].size.height() + space;\n    }\n}\n\nvoid ItemDelegate::updateLater()\n{\n    m_timerInvalidateHidden.start();\n}\n\nvoid ItemDelegate::updateIfNeeded()\n{\n    if ( m_timerInvalidateHidden.isActive() )\n        invalidateAllHiddenNow();\n}\n\nvoid ItemDelegate::setItemWidgetCurrent(const QModelIndex &index, bool isCurrent)\n{\n    ItemWidget *w;\n\n    const int row = index.row();\n\n    if (isCurrent) {\n        createItemWidget(index);\n        w = m_items[row].get();\n        auto ww = w->widget();\n        QPalette palette( ww->palette() );\n        const auto highlightPalette = m_sharedData->theme.searchPalette();\n        palette.setColor(QPalette::Highlight, highlightPalette.base().color());\n        palette.setColor(QPalette::HighlightedText, highlightPalette.text().color());\n        ww->setPalette(palette);\n        for ( auto childWidget : ww->findChildren<QWidget*>() )\n            childWidget->setPalette(palette);\n    } else {\n        w = m_items[row].get();\n        if (!w)\n            return;\n    }\n\n    w->setCurrent(isCurrent);\n}\n\nvoid ItemDelegate::setItemWidgetSelected(const QModelIndex &index, bool isSelected)\n{\n    const int row = index.row();\n    auto w = m_items[row].get();\n    if (!w)\n        return;\n\n    auto ww = w->widget();\n    setWidgetSelected(ww, isSelected);\n}\n\nvoid ItemDelegate::setIndexWidget(const QModelIndex &index, ItemWidget *w)\n{\n    const int row = index.row();\n    const QPoint pos = w ? findPositionForWidget(index) : QPoint();\n    const bool show = w && !m_view->isIndexHidden(index);\n\n    auto &item = m_items[row];\n    item.item.reset(w);\n    item.appliedFilterId = 0;\n    if (w) {\n        QWidget *ww = w->widget();\n\n        // Make background transparent.\n        ww->setAttribute(Qt::WA_NoSystemBackground);\n\n        const bool isCurrent = m_view->currentIndex() == index;\n        setItemWidgetCurrent(index, isCurrent);\n\n        const bool isSelected = m_view->selectionModel()->isSelected(index);\n        setWidgetSelected(ww, isSelected);\n\n        ww->move(pos);\n\n        if (show) {\n            ww->show();\n            updateItemWidgetSize(row);\n        }\n\n        ww->installEventFilter(this);\n        updateItemSize(index, ww->size());\n        updateLater();\n    }\n}\n\nQPoint ItemDelegate::findPositionForWidget(const QModelIndex &index) const\n{\n    const QSize margins = m_sharedData->theme.margins();\n    const QSize rowNumberSize = m_sharedData->theme.rowNumberSize(index.row());\n    const int s = m_view->spacing();\n\n    int y = 0;\n    int skipped = 0;\n    for (int row = index.row() - 1; row >= 0; --row) {\n        if (!m_items[row]) {\n            if ( !m_view->isRowHidden(row) )\n                ++skipped;\n            continue;\n        }\n\n        QWidget *ww = m_items[row]->widget();\n        if ( ww->isHidden() )\n            continue;\n\n        y = ww->geometry().top() - margins.height() + m_items[row].size.height()\n            + skipped * (defaultItemHeight + 2 * s);\n        break;\n    }\n\n    return QPoint(\n        s + margins.width() + rowNumberSize.width(),\n        s + margins.height() + y\n    );\n}\n\nvoid ItemDelegate::setCurrentRow(int row, bool current)\n{\n    ItemWidget *item = m_items[row].get();\n    if (!item)\n        return;\n\n    item->setCurrent(false);\n    item->setCurrent(current);\n}\n\nvoid ItemDelegate::setWidgetSelected(QWidget *ww, bool selected)\n{\n    if ( ww->property(propertySelectedItem).toBool() == selected )\n        return;\n\n    ww->setProperty(propertySelectedItem, selected);\n    ww->setStyleSheet(m_view->styleSheet());\n}\n\nint ItemDelegate::findWidgetRow(const QObject *obj) const\n{\n    for (int row = 0; static_cast<size_t>(row) < m_items.size(); ++row) {\n        auto w = m_items[row].get();\n        if (w && w->widget() == obj)\n            return row;\n    }\n\n    return -1;\n}\n\nItemWidget *ItemDelegate::updateWidget(const QModelIndex &index, const QVariantMap &data)\n{\n    const bool antialiasing = m_sharedData->theme.isAntialiasingEnabled();\n    QWidget *parent = m_view->viewport();\n\n    auto w = m_sharedData->showSimpleItems\n            ? m_sharedData->itemFactory->createSimpleItem(data, parent, antialiasing)\n            : m_sharedData->itemFactory->createItem(data, parent, antialiasing);\n\n    setIndexWidget(index, w);\n\n    return w;\n}\n\nbool ItemDelegate::invalidateHidden(QWidget *widget)\n{\n    if ( widget->isVisible() && m_view->isVisible() )\n        return false;\n\n    const auto row = findWidgetRow(widget);\n    if (row == -1)\n        return true;\n\n    const auto index = m_view->index(row);\n    if ( m_view->currentIndex() == index )\n        return false;\n\n    setIndexWidget(index, nullptr);\n    return true;\n}\n\nvoid ItemDelegate::invalidateAllHiddenNow()\n{\n    m_timerInvalidateHidden.stop();\n\n    // Make sure item widgets have up-to-date positions for invalidation.\n    updateAllRows();\n\n    const QRect viewRect = m_view->viewport()->contentsRect();\n    const int maxY = viewRect.bottom() + viewRect.height() + defaultItemHeight;\n    const int minY = viewRect.top() - viewRect.height() - defaultItemHeight;\n    const int currentRow = m_view->currentIndex().row();\n    const auto isRowAlmostVisible = [&](int row){\n        if (row < 0 || static_cast<size_t>(row) >= m_items.size() || !m_items[row])\n            return false;\n\n        QWidget *ww = m_items[row]->widget();\n        if ( ww->isHidden() )\n            return false;\n\n        const QRect g = ww->geometry();\n        return minY < g.bottom() && g.top() < maxY;\n    };\n\n    for (int row = 0; static_cast<size_t>(row) < m_items.size(); ++row) {\n        if (!m_items[row] || row == currentRow)\n            continue;\n\n        if ( isRowAlmostVisible(row) )\n            continue;\n\n        if ( isRowAlmostVisible(row + 1) || isRowAlmostVisible(row - 1) )\n            continue;\n\n        const auto index = m_view->index(row);\n        m_items[row]->widget()->removeEventFilter(this);\n        setIndexWidget(index, nullptr);\n    }\n}\n\nvoid ItemDelegate::setItemFilter(const ItemFilterPtr &filter)\n{\n    m_filter = filter;\n    ++m_filterId;\n}\n\nvoid ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,\n                         const QModelIndex &index) const\n{\n    const bool isSelected = option.state & QStyle::State_Selected;\n\n    // Render background (selected, alternate, ...).\n    QStyle *style = m_view->style();\n    style->drawControl(QStyle::CE_ItemViewItem, &option, painter, m_view);\n\n    // Colorize item.\n    const QString colorExpr = index.data(contentType::color).toString();\n    if (!colorExpr.isEmpty()) {\n        const QColor color = m_sharedData->theme.evalColorExpression(colorExpr);\n        if (color.isValid()) {\n            const auto oldMode = painter->compositionMode();\n            painter->setCompositionMode(QPainter::CompositionMode_Multiply);\n            painter->fillRect(option.rect, color);\n            painter->setCompositionMode(oldMode);\n        }\n    }\n\n    const auto margins = m_sharedData->theme.margins();\n\n    // Render number.\n    if ( m_sharedData->theme.showRowNumber() ) {\n        const int rowNumber = index.row() + static_cast<int>(m_sharedData->rowIndexFromOne);\n        const QString num = QString::number(rowNumber);\n        QPalette::ColorRole role = isSelected ? QPalette::HighlightedText : QPalette::Text;\n        painter->save();\n        painter->setFont( m_sharedData->theme.rowNumberFont() );\n        const auto rowNumberPalette = m_sharedData->theme.rowNumberPalette();\n        style->drawItemText(painter, option.rect.translated(margins.width(), margins.height()),\n                            Qt::AlignTop | Qt::AlignLeft,\n                            rowNumberPalette, true, num,\n                            role);\n        painter->restore();\n    }\n}\n"
  },
  {
    "path": "src/item/itemdelegate.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"gui/clipboardbrowsershared.h\"\n\n#include <QItemDelegate>\n#include <QTimer>\n\n#include <memory>\n#include <vector>\n\nclass ClipboardBrowser;\nclass Item;\nclass ItemEditorWidget;\nclass ItemFactory;\nclass ItemFilter;\nclass ItemWidget;\nclass PersistentDisplayItem;\nusing ItemFilterPtr = std::shared_ptr<ItemFilter>;\n\nconstexpr int defaultItemHeight = 100;\n\n/**\n * Delegate for items in ClipboardBrowser.\n *\n * Creates editor on demand and draws contents of all items.\n *\n * To achieve better performance the first call to get sizeHint() value for\n * an item returns some default value (so it doesn't have to render all items).\n *\n * Before calling paint() for an index item on given index must be cached\n * using cache().\n */\nclass ItemDelegate final : public QItemDelegate\n{\n    Q_OBJECT\n\n    public:\n        ItemDelegate(ClipboardBrowser *view, const ClipboardBrowserSharedPtr &sharedData, QWidget *parent = nullptr);\n\n        ~ItemDelegate();\n\n        QSize sizeHint(const QModelIndex &index) const;\n        QSize sizeHint(const QStyleOptionViewItem &option,\n                       const QModelIndex &index) const override;\n\n        bool eventFilter(QObject *obj, QEvent *event) override;\n\n        /** Remove item widget if not currently visible and return true if removed. */\n        bool invalidateHidden(QWidget *widget);\n\n        /** Set regular expression for highlighting. */\n        void setItemFilter(const ItemFilterPtr &filter);\n\n        /** Return regular expression for highlighting. */\n        const ItemFilterPtr &itemFilter() const { return m_filter; }\n\n        /** Creates item widget if not created already. */\n        void createItemWidget(const QModelIndex &index);\n\n        /**\n         * Update data to display.\n         */\n        void updateWidget(QObject *widget, const QVariantMap &data);\n\n        /** Set maximum size for all items. */\n        void setItemSizes(int maxWidth, int idealWidth);\n\n        /** Create internal item editor widget. */\n        ItemEditorWidget *createCustomEditor(\n                QWidget *parent, const QModelIndex &index, const QString &format);\n\n        /**\n         * Highlight matched text with current search expression, font and color.\n         */\n        void highlightMatches(ItemWidget *itemWidget) const;\n\n        /// Update positions of all widgets\n        /// (after filtering out items or invalidating).\n        void updateAllRows();\n        void updateLater();\n        void updateIfNeeded();\n\n        /**\n         * Set or unset item widget as current.\n         *\n         * Only current item widget should receive mouse events (e.g. text selection).\n         *\n         * This allows interaction only for current item widget.\n         */\n        void setItemWidgetCurrent(const QModelIndex &index, bool isCurrent);\n\n        /**\n         * Set or unset item widget as selected.\n         *\n         * This changes item appearace according to current theme/style.\n         */\n        void setItemWidgetSelected(const QModelIndex &index, bool isSelected);\n\n        void dataChanged(const QModelIndex &a, const QModelIndex &b);\n        void rowsRemoved(const QModelIndex &parent, int start, int end);\n        void rowsInserted(const QModelIndex &parent, int start, int end);\n        void rowsMoved(const QModelIndex &parent, int sourceStart, int sourceEnd,\n                       const QModelIndex &destination, int destinationRow);\n\n        QWidget *createPreview(const QVariantMap &data, QWidget *parent);\n\n        void setCurrentRow(int row, bool current);\n\n    signals:\n        void itemWidgetCreated(const PersistentDisplayItem &selection);\n\n    protected:\n        void paint(QPainter *painter, const QStyleOptionViewItem &option,\n                   const QModelIndex &index) const override;\n\n    private:\n        struct Item {\n            ItemWidget *operator->() const noexcept { return item.get(); }\n            ItemWidget *get() const noexcept { return item.get(); }\n            operator bool() const noexcept { return static_cast<bool>(item); }\n\n            std::shared_ptr<ItemWidget> item;\n            int appliedFilterId = 0;\n            QSize size = QSize(0, defaultItemHeight);\n        };\n\n        QWidget *createPreviewNoEmit(const QVariantMap &data, QWidget *parent);\n\n        void setIndexWidget(const QModelIndex &index, ItemWidget *w);\n\n        /// Updates style for selected/unselected widgets.\n        void setWidgetSelected(QWidget *ww, bool selected);\n\n        int findWidgetRow(const QObject *obj) const;\n\n        ItemWidget *updateWidget(const QModelIndex &index, const QVariantMap &data);\n\n        void updateItemWidgetSize(int row);\n        void updateItemSize(const QModelIndex &index, QSize itemWidgetSize);\n\n        QPoint findPositionForWidget(const QModelIndex &index) const;\n\n        void invalidateAllHiddenNow();\n\n        ClipboardBrowser *m_view;\n        ClipboardBrowserSharedPtr m_sharedData;\n        ItemFilterPtr m_filter;\n        int m_filterId = 0;\n        int m_maxWidth;\n        int m_idealWidth;\n        int m_fontHeight;\n\n        QTimer m_timerInvalidateHidden;\n\n        std::vector<Item> m_items;\n};\n"
  },
  {
    "path": "src/item/itemeditor.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemeditor.h\"\n\n#include \"common/action.h\"\n#include \"common/mimetypes.h\"\n#include \"common/temporaryfile.h\"\n\n#include <QDir>\n#include <QFile>\n#include <QHash>\n#include <QLoggingCategory>\n#include <QTemporaryFile>\n#include <QTimer>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(editorCategory)\nQ_LOGGING_CATEGORY(editorCategory, \"copyq.itemeditor\")\n\nQString getFileSuffixFromMime(const QString &mime)\n{\n    if (mime == mimeText)\n        return QLatin1String(\".txt\");\n    if (mime == \"text/html\")\n        return QLatin1String(\".html\");\n    if (mime == \"text/xml\")\n        return QLatin1String(\".xml\");\n    if (mime == \"image/bmp\")\n        return QLatin1String(\".bmp\");\n    if (mime == \"image/jpeg\")\n        return QLatin1String(\".jpg\");\n    if (mime == \"image/png\")\n        return QLatin1String(\".png\");\n    if (mime == \"image/gif\")\n        return QLatin1String(\".gif\");\n    if (mime == \"image/svg+xml\" || mime == \"image/x-inkscape-svg-compressed\")\n        return QLatin1String(\".svg\");\n    if (mime == COPYQ_MIME_PREFIX \"theme\")\n        return QLatin1String(\".ini\");\n    return QString();\n}\n\n} // namespace\n\nItemEditor::ItemEditor(const QByteArray &data, const QString &mime, const QString &editor,\n                       QObject *parent)\n    : QObject(parent)\n    , m_data(data)\n    , m_mime(mime)\n    , m_hash( qHash(m_data) )\n    , m_editorcmd(editor)\n    , m_editor(nullptr)\n    , m_timer( new QTimer(this) )\n    , m_info()\n    , m_lastmodified()\n    , m_lastSize(0)\n    , m_modified(false)\n{\n    if ( !m_editorcmd.contains(\"%1\") )\n        m_editorcmd.append(\" %1\");\n}\n\nItemEditor::~ItemEditor()\n{\n    if (m_editor && m_editor->isRunning())\n        m_editor->terminate();\n\n    QString tmpPath = m_info.filePath();\n    if ( !tmpPath.isEmpty() ) {\n        QFile f(tmpPath);\n        if ( !f.remove() )\n            qCCritical(editorCategory) << \"Failed to remove editor temporary file:\" << f.errorString();\n    }\n}\n\nvoid ItemEditor::setIndex(const QModelIndex &index)\n{\n    m_index = index;\n}\n\nbool ItemEditor::start()\n{\n    // create temp file\n    QTemporaryFile tmpfile;\n    const auto suffix = getFileSuffixFromMime(m_mime);\n    if ( !openTemporaryFile(&tmpfile, suffix) ) {\n        qCCritical(editorCategory) << \"Failed to create editor temporary file\";\n        return false;\n    }\n\n    const auto fileName = tmpfile.fileName();\n\n    // write text to temp file\n    tmpfile.write(m_data);\n\n    // Close file before launching editor (this is required on Windows).\n    tmpfile.setAutoRemove(false);\n    tmpfile.close();\n\n    // monitor file\n    m_info.setFile(fileName);\n    m_lastmodified = m_info.lastModified();\n    m_lastSize = m_info.size();\n    m_timer->start(500);\n    connect( m_timer, &QTimer::timeout,\n             this, &ItemEditor::onTimer );\n\n    // create editor process\n    m_editor = new Action(this);\n    connect(m_editor, &Action::actionFinished, this, &ItemEditor::close);\n\n    // use native path for filename to edit\n    const auto nativeFilePath = QDir::toNativeSeparators( m_info.absoluteFilePath() );\n\n    // execute editor\n    m_editor->setCommand(m_editorcmd, {nativeFilePath});\n    qCDebug(editorCategory) << \"Starting editor command:\" << m_editor->commandLine();\n    m_editor->start();\n\n    return true;\n}\n\nvoid ItemEditor::close()\n{\n    if (m_editor && (m_editor->actionFailed() || m_editor->exitCode() != 0) ) {\n        const QString errorString = m_editor->errorString();\n        if ( !errorString.isEmpty() )\n            qCWarning(editorCategory) << \"Editor command error:\" << errorString;\n\n        const int exitCode = m_editor->exitCode();\n        if (exitCode != 0)\n            qCWarning(editorCategory) << \"Editor command exit code:\" << exitCode;\n\n        const QString errorOutput = QString::fromUtf8(m_editor->errorOutput());\n        if ( !errorOutput.isEmpty() )\n            qCWarning(editorCategory) << \"Editor command stderr:\" << errorOutput;\n\n        if ( m_editor->actionFailed() )\n            emit error( tr(\"Editor command failed (see logs)\") );\n    }\n\n    if ( m_modified || wasFileModified() )\n        emit fileModified(m_data, m_mime, m_index);\n\n    emit closed(this, m_index);\n}\n\nbool ItemEditor::wasFileModified()\n{\n    m_info.refresh();\n    if ( m_lastmodified != m_info.lastModified() ||  m_lastSize != m_info.size() ) {\n        m_lastmodified = m_info.lastModified();\n        m_lastSize = m_info.size();\n\n        // read text\n        QFile file( m_info.filePath() );\n        if ( file.open(QIODevice::ReadOnly) ) {\n            m_data = file.readAll();\n            file.close();\n        } else {\n            qCCritical(editorCategory) << \"Failed to read editor temporary file:\" << file.errorString();\n        }\n\n        // new hash\n        uint newhash = qHash(m_data);\n\n        return newhash != m_hash;\n    }\n\n    return false;\n}\n\nvoid ItemEditor::onTimer()\n{\n    if (m_modified) {\n        // Wait until file is fully overwritten.\n        if ( !wasFileModified() ) {\n            m_modified = false;\n            emit fileModified(m_data, m_mime, m_index);\n            m_hash = qHash(m_data);\n        }\n    } else {\n        m_modified = wasFileModified();\n    }\n}\n"
  },
  {
    "path": "src/item/itemeditor.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDateTime>\n#include <QFileInfo>\n#include <QObject>\n#include <QPersistentModelIndex>\n#include <QString>\n\nclass Action;\nclass QModelIndex;\nclass QTimer;\n\nclass ItemEditor final : public QObject\n{\n    Q_OBJECT\n\n    public:\n        ItemEditor(const QByteArray &data, const QString &mime, const QString &editor,\n                   QObject *parent = nullptr);\n        ~ItemEditor();\n\n        /**\n         * Set index to edited item (will be emitted with fileModified()).\n         */\n        void setIndex(const QModelIndex &index);\n\n        /**\n         * Execute editor process.\n         * @retval true   Editor successfully opened.\n         * @retval false  An error occurred (failed to create temporary file), editor was not opened.\n         */\n        Q_SLOT bool start();\n\n    signals:\n        /**\n         * File was modified.\n         * @param data  modified data\n         * @param mime  MIME type of the data\n         * @param index  index of edited item or invalid\n         */\n        void fileModified(const QByteArray &data, const QString &mime, const QModelIndex &index);\n\n        /**\n         * Editor was closed.\n         * @param who  pointer to this object\n         */\n        void closed(QObject *who, const QModelIndex &index);\n\n        /**\n         * Failed to run editor command.\n         */\n        void error(const QString &errorString);\n\n    private:\n        /**\n         * Close editor.\n         */\n        void close();\n\n        void onTimer();\n\n        /** Return true only if file was modified and reset this status. */\n        bool wasFileModified();\n\n        QByteArray m_data;\n        QString m_mime;\n        // hash of original string (saves some memory)\n        uint m_hash;\n\n        QString m_editorcmd;\n        Action *m_editor;\n        QTimer *m_timer;\n\n        QFileInfo m_info;\n        QDateTime m_lastmodified;\n        qint64 m_lastSize;\n        bool m_modified;\n\n        QPersistentModelIndex m_index;\n};\n"
  },
  {
    "path": "src/item/itemeditorwidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"item/itemeditorwidget.h\"\n\n#include \"item/itemwidget.h\"\n\n#include \"common/contenttype.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n\n#include <QAbstractItemModel>\n#include <QAction>\n#include <QColorDialog>\n#include <QFontDialog>\n#include <QIcon>\n#include <QMimeData>\n#include <QPlainTextEdit>\n#include <QTextCharFormat>\n#include <QTextCursor>\n#include <QTextDocument>\n#include <QTextFrame>\n#include <QToolBar>\n\nnamespace {\n\nbool containsRichText(const QTextDocument &document)\n{\n    return document.allFormats().size() > 3;\n}\n\nQString findImageFormat(const QMimeData &data)\n{\n    const auto imageFormats = {\"image/svg+xml\", \"image/png\", \"image/bmp\", \"image/jpeg\", \"image/gif\"};\n    for (const auto &format : imageFormats) {\n        if ( data.hasFormat(format) )\n            return format;\n    }\n\n    return QString();\n}\n\nQAction *addMenuItem(const MenuItem &menuItem, QToolBar *toolBar, ItemEditorWidget *parent)\n{\n    QAction *act = new QAction( getIcon(menuItem.iconName, menuItem.iconId), menuItem.text, parent );\n    act->setShortcuts(menuItem.shortcuts);\n    toolBar->addAction(act);\n    return act;\n}\n\n} // namespace\n\nItemEditorWidget::ItemEditorWidget(const QModelIndex &index, const QString &format, QWidget *parent)\n    : QTextEdit(parent)\n    , m_index(index)\n    , m_saveOnReturnKey(false)\n    , m_format(format)\n{\n    setFrameShape(QFrame::NoFrame);\n    setFocusPolicy(Qt::StrongFocus);\n}\n\nbool ItemEditorWidget::isValid() const\n{\n    return m_index.isValid();\n}\n\nbool ItemEditorWidget::hasChanges() const\n{\n    return isValid() && document()->isModified();\n}\n\nvoid ItemEditorWidget::setHasChanges(bool hasChanges)\n{\n    document()->setModified(hasChanges);\n}\n\nvoid ItemEditorWidget::setSaveOnReturnKey(bool enabled)\n{\n    m_saveOnReturnKey = enabled;\n}\n\nQVariantMap ItemEditorWidget::data() const\n{\n    QVariantMap data;\n    if (m_format == mimeText) {\n        setTextData( &data, toPlainText(), mimeText );\n        if ( containsRichText(*document()) )\n            setTextData( &data, toHtml(), mimeHtml );\n    } else {\n        setTextData( &data, toPlainText(), m_format );\n    }\n    return data;\n}\n\nvoid ItemEditorWidget::search(const ItemFilterPtr &filter)\n{\n    if ( !filter || filter->matchesNone() )\n        return;\n\n    auto tc = textCursor();\n    tc.setPosition(tc.selectionStart());\n    setTextCursor(tc);\n    m_filter = filter;\n    findNext();\n}\n\nvoid ItemEditorWidget::findNext()\n{\n    search(false);\n}\n\nvoid ItemEditorWidget::findPrevious()\n{\n    search(true);\n}\n\nvoid ItemEditorWidget::keyPressEvent(QKeyEvent *event)\n{\n    QKeyEvent *keyevent = static_cast<QKeyEvent *>(event);\n    int k = keyevent->key();\n\n    if (k == Qt::Key_Return || k == Qt::Key_Enter) {\n        Qt::KeyboardModifiers mods = keyevent->modifiers();\n        if ( (mods & (Qt::ShiftModifier | Qt::AltModifier | Qt::MetaModifier)) == 0 ) {\n            bool controlPressed = mods.testFlag(Qt::ControlModifier);\n            if (m_saveOnReturnKey && controlPressed ) {\n                keyevent->setModifiers(mods & ~Qt::ControlModifier);\n            } else if ( m_saveOnReturnKey || controlPressed ) {\n                saveAndExit();\n                return;\n            }\n        }\n    }\n\n    QTextEdit::keyPressEvent(event);\n}\n\nbool ItemEditorWidget::canInsertFromMimeData(const QMimeData *source) const\n{\n    return source->hasImage() || QTextEdit::canInsertFromMimeData(source);\n}\n\nvoid ItemEditorWidget::insertFromMimeData(const QMimeData *source)\n{\n    const QString mime = findImageFormat(*source);\n\n    if (!mime.isEmpty()) {\n        const QByteArray imageData = source->data(mime);\n        textCursor().insertHtml(\n                    \"<img src=\\\"data:\" + mime + \";base64,\" + imageData.toBase64() + \"\\\" />\");\n    } else {\n        QTextEdit::insertFromMimeData(source);\n    }\n}\n\nvoid ItemEditorWidget::saveAndExit()\n{\n    emit save();\n    emit invalidate();\n}\n\nvoid ItemEditorWidget::changeSelectionFont()\n{\n    QTextCursor tc = textCursor();\n    QTextCharFormat format = tc.charFormat();\n\n    QFontDialog dialog(this);\n    dialog.setOptions(dialog.options() | QFontDialog::DontUseNativeDialog);\n    dialog.setCurrentFont( format.font() );\n\n    if ( dialog.exec() == QDialog::Accepted ) {\n        const QFont font = dialog.selectedFont();\n        format.setFont(font);\n        tc.setCharFormat(format);\n        setTextCursor(tc);\n    }\n}\n\nvoid ItemEditorWidget::toggleBoldText()\n{\n    QTextCursor tc = textCursor();\n    QTextCharFormat format = tc.charFormat();\n    const int weight = format.fontWeight() == QFont::Bold ? QFont::Normal : QFont::Bold;\n    format.setFontWeight(weight);\n    tc.setCharFormat(format);\n    setTextCursor(tc);\n}\n\nvoid ItemEditorWidget::toggleItalicText()\n{\n    QTextCursor tc = textCursor();\n    QTextCharFormat format = tc.charFormat();\n    format.setFontItalic( !format.fontItalic() );\n    tc.setCharFormat(format);\n    setTextCursor(tc);\n}\n\nvoid ItemEditorWidget::toggleUnderlineText()\n{\n    QTextCursor tc = textCursor();\n    QTextCharFormat format = tc.charFormat();\n    format.setFontUnderline( !format.fontUnderline() );\n    tc.setCharFormat(format);\n    setTextCursor(tc);\n}\n\nvoid ItemEditorWidget::toggleStrikethroughText()\n{\n    QTextCursor tc = textCursor();\n    QTextCharFormat format = tc.charFormat();\n    format.setFontStrikeOut( !format.fontStrikeOut() );\n    tc.setCharFormat(format);\n    setTextCursor(tc);\n}\n\nvoid ItemEditorWidget::setForeground()\n{\n    QTextCursor tc = textCursor();\n    QTextCharFormat format = tc.charFormat();\n\n    QColorDialog dialog(this);\n    dialog.setOptions(dialog.options() | QColorDialog::ShowAlphaChannel | QColorDialog::DontUseNativeDialog);\n    dialog.setCurrentColor( format.foreground().color() );\n\n    if ( dialog.exec() == QDialog::Accepted ) {\n        const QColor color = dialog.selectedColor();\n        format.setForeground(color);\n        tc.setCharFormat(format);\n        setTextCursor(tc);\n    }\n}\n\nvoid ItemEditorWidget::setBackground()\n{\n    QTextCursor tc = textCursor();\n    QTextCharFormat format = tc.charFormat();\n\n    QColorDialog dialog(this);\n    dialog.setOptions(dialog.options() | QColorDialog::ShowAlphaChannel | QColorDialog::DontUseNativeDialog);\n    dialog.setCurrentColor( format.background().color() );\n\n    if ( dialog.exec() == QDialog::Accepted ) {\n        const QColor color = dialog.selectedColor();\n        format.setBackground(color);\n        tc.setCharFormat(format);\n        setTextCursor(tc);\n    }\n}\n\nvoid ItemEditorWidget::eraseStyle()\n{\n    QTextCursor tc = textCursor();\n    tc.setCharFormat( QTextCharFormat() );\n    setTextCursor(tc);\n}\n\nQWidget *ItemEditorWidget::createToolbar(QWidget *parent, const MenuItems &menuItems)\n{\n    auto toolBar = new QToolBar(parent);\n\n    QAction *act;\n    act = addMenuItem(menuItems[Actions::Editor_Save], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::saveAndExit );\n\n    act = addMenuItem(menuItems[Actions::Editor_Cancel], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::cancel );\n\n    auto doc = document();\n\n    toolBar->addSeparator();\n\n    act = addMenuItem(menuItems[Actions::Editor_Undo], toolBar, this);\n    act->setEnabled(false);\n    connect( act, &QAction::triggered, doc, static_cast<void (QTextDocument::*)()>(&QTextDocument::undo) );\n    connect( doc, &QTextDocument::undoAvailable, act, &QAction::setEnabled );\n\n    act = addMenuItem(menuItems[Actions::Editor_Redo], toolBar, this);\n    act->setEnabled(false);\n    connect( act, &QAction::triggered, doc, static_cast<void (QTextDocument::*)()>(&QTextDocument::redo) );\n    connect( doc, &QTextDocument::redoAvailable, act, &QAction::setEnabled );\n\n    toolBar->addSeparator();\n\n    act = addMenuItem(menuItems[Actions::Editor_Font], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::changeSelectionFont );\n\n    act = addMenuItem(menuItems[Actions::Editor_Bold], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::toggleBoldText );\n\n    act = addMenuItem(menuItems[Actions::Editor_Italic], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::toggleItalicText );\n\n    act = addMenuItem(menuItems[Actions::Editor_Underline], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::toggleUnderlineText );\n\n    act = addMenuItem(menuItems[Actions::Editor_Strikethrough], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::toggleStrikethroughText );\n\n    toolBar->addSeparator();\n\n    act = addMenuItem(menuItems[Actions::Editor_Foreground], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::setForeground );\n\n    act = addMenuItem(menuItems[Actions::Editor_Background], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::setBackground );\n\n    toolBar->addSeparator();\n\n    act = addMenuItem(menuItems[Actions::Editor_EraseStyle], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::eraseStyle );\n\n    toolBar->addSeparator();\n\n    act = addMenuItem(menuItems[Actions::Editor_Search], toolBar, this);\n    connect( act, &QAction::triggered,\n             this, &ItemEditorWidget::searchRequest );\n\n    return toolBar;\n}\n\nvoid ItemEditorWidget::search(bool backwards)\n{\n    if (m_filter)\n        m_filter->search(this, backwards);\n}\n"
  },
  {
    "path": "src/item/itemeditorwidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"item/itemfilter.h\"\n#include \"gui/menuitems.h\"\n\n#include <QPersistentModelIndex>\n#include <QTextEdit>\n\nclass ItemWidget;\nclass QAbstractItemModel;\nclass QPlainTextEdit;\nclass QTextCursor;\nclass QTextDocument;\nclass QWidget;\n\n/**\n * Internal editor widget for items.\n */\nclass ItemEditorWidget final : public QTextEdit\n{\n    Q_OBJECT\npublic:\n    ItemEditorWidget(const QModelIndex &index, const QString &format, QWidget *parent = nullptr);\n\n    bool isValid() const;\n\n    bool hasChanges() const;\n\n    void setHasChanges(bool hasChanges);\n\n    void setSaveOnReturnKey(bool enabled);\n\n    QVariantMap data() const;\n\n    QModelIndex index() const { return m_index; }\n\n    void search(const ItemFilterPtr &filter);\n\n    void findNext();\n\n    void findPrevious();\n\n    QWidget *createToolbar(QWidget *parent, const MenuItems &menuItems);\n\nsignals:\n    void save();\n    void cancel();\n    void invalidate();\n    void searchRequest();\n\nprotected:\n    void keyPressEvent(QKeyEvent *event) override;\n\n    bool canInsertFromMimeData(const QMimeData *source) const override;\n\n    void insertFromMimeData(const QMimeData *source) override;\n\nprivate:\n    void saveAndExit();\n\n    void changeSelectionFont();\n    void toggleBoldText();\n    void toggleItalicText();\n    void toggleUnderlineText();\n    void toggleStrikethroughText();\n    void setForeground();\n    void setBackground();\n    void eraseStyle();\n\n    void search(bool backwards);\n\n    QPersistentModelIndex m_index;\n    bool m_saveOnReturnKey;\n    QString m_format;\n    ItemFilterPtr m_filter;\n};\n"
  },
  {
    "path": "src/item/itemfactory.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemfactory.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/command.h\"\n#include \"common/common.h\"\n#include \"common/config.h\"\n#include \"common/contenttype.h\"\n#include \"common/encryption.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"gui/clipboardbrowsershared.h\"\n#include \"gui/encryptionpassword.h\"\n#include \"item/indexes.h\"\n#include \"item/itemfilter.h\"\n#include \"item/itemstore.h\"\n#include \"item/itemwidget.h\"\n#include \"item/serialize.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QCoreApplication>\n#include <QDir>\n#include <QFile>\n#include <QIODevice>\n#include <QLabel>\n#include <QMessageBox>\n#include <QMetaObject>\n#include <QModelIndex>\n#include <QSettings>\n#include <QPluginLoader>\n\n#include <algorithm>\n\nnamespace {\n\nbool findPluginDir(QDir *pluginsDir)\n{\n#ifdef COPYQ_PLUGIN_PREFIX\n    pluginsDir->setPath(COPYQ_PLUGIN_PREFIX);\n    if ( pluginsDir->isReadable() )\n        return true;\n#endif\n\n    return platformNativeInterface()->findPluginDir(pluginsDir)\n            && pluginsDir->isReadable();\n}\n\nbool priorityLessThan(const ItemLoaderPtr &lhs, const ItemLoaderPtr &rhs)\n{\n    return lhs->priority() > rhs->priority();\n}\n\nvoid trySetPixmap(QLabel *label, const QVariantMap &data, int height)\n{\n    const auto imageFormats = {\n        \"image/svg+xml\",\n        \"image/png\",\n        \"image/bmp\",\n        \"image/jpeg\",\n        \"image/gif\"\n    };\n\n    for (const auto &format : imageFormats) {\n        QPixmap pixmap;\n        if (pixmap.loadFromData(data.value(format).toByteArray())) {\n            if (height > 0)\n                pixmap = pixmap.scaledToHeight(height, Qt::SmoothTransformation);\n            label->setPixmap(pixmap);\n            break;\n        }\n    }\n}\n\nbool askToKeepCorruptedTab(const QString &tabName)\n{\n    const int answer = QMessageBox::question(\n        nullptr,\n        ItemFactory::tr(\"Corrupted Tab\"),\n        ItemFactory::tr(\n            \"Not all items in the tab <strong>%1</strong> were loaded successfully. \"\n            \"Do you still want to load the tab and potentially lose some items?\")\n            .arg(quoteString(tabName)),\n        QMessageBox::Yes | QMessageBox::No,\n        QMessageBox::Yes);\n    return answer == QMessageBox::Yes;\n}\n\n/** Sort plugins by prioritized list of names. */\nclass PluginSorter final {\npublic:\n    explicit PluginSorter(const QStringList &pluginNames) : m_order(pluginNames) {}\n\n    int value(const ItemLoaderPtr &item) const\n    {\n        const int i = m_order.indexOf( item->id() );\n        return i == -1 ? m_order.indexOf( item->name() ) : i;\n    }\n\n    bool operator()(const ItemLoaderPtr &lhs, const ItemLoaderPtr &rhs) const\n    {\n        const int l = value(lhs);\n        const int r = value(rhs);\n\n        if (l == -1)\n            return (r == -1) && lhs->priority() > rhs->priority();\n\n        if (r == -1)\n            return true;\n\n        return l < r;\n    }\n\nprivate:\n    const QStringList &m_order;\n};\n\nclass DummyItem final : public QLabel, public ItemWidget {\npublic:\n    DummyItem(const QVariantMap &data, QWidget *parent, bool preview)\n        : QLabel(parent)\n        , ItemWidget(this)\n        , m_hasText( data.contains(mimeText)\n                  || data.contains(mimeTextUtf8)\n                  || data.contains(mimeUriList) )\n        , m_data(data)\n        , m_preview(preview)\n    {\n        setMargin(0);\n        setWordWrap(true);\n        setTextFormat(Qt::PlainText);\n        setFocusPolicy(Qt::NoFocus);\n        setContextMenuPolicy(Qt::NoContextMenu);\n\n        if (!preview)\n            setFixedHeight(sizeHint().height());\n\n        if ( !data.value(mimeHidden).toBool() ) {\n            const int height = preview ? -1 : contentsRect().height();\n            trySetPixmap(this, m_data, height);\n        }\n\n        if (preview && !hasPixmap()) {\n            setTextInteractionFlags(\n                    textInteractionFlags()\n                    | Qt::TextSelectableByMouse\n                    | Qt::TextSelectableByKeyboard\n                    | Qt::LinksAccessibleByMouse\n                    | Qt::LinksAccessibleByKeyboard\n                    );\n            setAlignment(Qt::AlignLeft | Qt::AlignTop);\n            QString label = getTextData(m_data);\n            if (label.isEmpty())\n                label = textLabelForData(m_data);\n            setText(label);\n        }\n\n        m_data.remove(mimeItemNotes);\n    }\n\n    void updateSize(QSize, int idealWidth) override\n    {\n        setFixedWidth(idealWidth);\n\n        if (!m_preview && !hasPixmap()) {\n            const int width = contentsRect().width();\n            const QString label =\n                    textLabelForData(m_data, font(), QString(), false, width, 1);\n            setText(label);\n        }\n    }\n\n    void setTagged(bool tagged) override\n    {\n        setVisible( !tagged || (m_hasText && !m_data.contains(mimeHidden)) );\n    }\n\nprivate:\n    bool hasPixmap() const\n    {\n        return !pixmap(Qt::ReturnByValue).isNull();\n    }\n\n    bool m_hasText;\n    QVariantMap m_data;\n    QString m_imageFormat;\n    bool m_preview;\n};\n\nclass DummySaver final : public ItemSaverInterface\n{\npublic:\n    explicit DummySaver(int itemDataThreshold, const ClipboardBrowserSharedPtr &sharedData)\n        : m_itemDataThreshold(itemDataThreshold)\n        , m_sharedData(sharedData)\n    {}\n\n    bool saveItems(const QString & /* tabName */, const QAbstractItemModel &model, QIODevice *file) override\n    {\n        const Encryption::EncryptionKey &encKey = m_sharedData->encryptionKey;\n        return serializeData(model, file, m_itemDataThreshold, &encKey);\n    }\n\nprivate:\n    int m_itemDataThreshold = -1;\n    ClipboardBrowserSharedPtr m_sharedData;\n};\n\nclass DummyLoader final : public ItemLoaderInterface\n{\npublic:\n    DummyLoader(const ClipboardBrowserSharedPtr &sharedData)\n        : m_sharedData(sharedData)\n    {}\n\n    int priority() const override { return std::numeric_limits<int>::min(); }\n\n    QString id() const override { return {}; }\n    QString name() const override { return {}; }\n    QString author() const override { return {}; }\n    QString description() const override { return {}; }\n    QVariant icon() const override { return {}; }\n\n    void setEnabled(bool) override {}\n    void loadSettings(const QSettings &) override\n    {\n        m_itemDataThreshold = AppConfig().option<Config::item_data_threshold>();\n    }\n\n    ItemWidget *create(const QVariantMap &data, QWidget *parent, bool preview) const override\n    {\n        return new DummyItem(data, parent, preview);\n    }\n\n    bool canLoadItems(QIODevice *) const override { return true; }\n\n    bool canSaveItems(const QString &) const override { return true; }\n\n    ItemSaverPtr loadItems(const QString &tabName, QAbstractItemModel *model, QIODevice *file, int) override\n    {\n        if ( file->size() > 0 ) {\n            if ( !deserializeData(model, file, &m_sharedData->encryptionKey) ) {\n                const int itemsLoadedCount = model->rowCount();\n                if ( itemsLoadedCount > 0 && askToKeepCorruptedTab(tabName) ) {\n                    log(QStringLiteral(\"Keeping corrupted tab on user request\"));\n                    file->close();\n                    file->open(QIODevice::WriteOnly);\n                    ItemSaverPtr saver = std::make_shared<DummySaver>(m_itemDataThreshold, m_sharedData);\n                    saver->saveItems(tabName, *model, file);\n                    return saver;\n                }\n\n                model->removeRows(0, itemsLoadedCount);\n                return nullptr;\n            }\n        }\n\n        return std::make_shared<DummySaver>(m_itemDataThreshold, m_sharedData);\n    }\n\n    ItemSaverPtr initializeTab(const QString &, QAbstractItemModel *, int) override\n    {\n        return std::make_shared<DummySaver>(m_itemDataThreshold, m_sharedData);\n    }\n\n    bool matches(const QModelIndex &index, const ItemFilter &filter) const override\n    {\n        const QString text = index.data(contentType::text).toString();\n        return filter.matches(text) || filter.matches(accentsRemoved(text));\n    }\n\n    bool supportsEncryption() const override { return true; }\n\nprivate:\n    int m_itemDataThreshold = -1;\n    ClipboardBrowserSharedPtr m_sharedData;\n};\n\nItemSaverPtr transformSaver(\n        QAbstractItemModel *model,\n        const ItemSaverPtr &saverToTransform, const ItemLoaderPtr &currentLoader,\n        const ItemLoaderList &loaders)\n{\n    ItemSaverPtr newSaver = saverToTransform;\n\n    for ( auto &loader : loaders ) {\n        if (loader != currentLoader && loader->isEnabled())\n            newSaver = loader->transformSaver(newSaver, model);\n    }\n\n    return newSaver;\n}\n\nstd::pair<ItemSaverPtr, ItemLoaderPtr> saveWithOther(\n        const QString &tabName,\n        QAbstractItemModel *model,\n        const ItemSaverPtr &currentSaver,\n        const ItemLoaderPtr &currentLoader,\n        const ItemLoaderList &loaders,\n        int maxItems)\n{\n    ItemLoaderPtr newLoader;\n\n    for ( auto &loader : loaders ) {\n        if ( loader->isEnabled() && loader->canSaveItems(tabName) ) {\n            newLoader = loader;\n            break;\n        }\n    }\n\n    if (!newLoader || newLoader == currentLoader)\n        return {currentSaver, currentLoader};\n\n    COPYQ_LOG( QString(\"Tab \\\"%1\\\": Saving items using other plugin\")\n               .arg(tabName) );\n\n    auto newSaver = newLoader->initializeTab(tabName, model, maxItems);\n    if ( !newSaver || !saveItems(tabName, *model, newSaver) ) {\n        COPYQ_LOG( QString(\"Tab \\\"%1\\\": Failed to re-save items\")\n                   .arg(tabName) );\n        return {currentSaver, currentLoader};\n    }\n\n    return {newSaver, newLoader};\n}\n\nvoid cropToSize(const ItemSaverPtr &saver, QAbstractItemModel *model, int maxItems)\n{\n    const auto toRemove = model->rowCount() - maxItems;\n    if (toRemove <= 0)\n        return;\n\n    QList<QPersistentModelIndex> indexesToRemove;\n    for (int row = model->rowCount() - 1; row >= 0 && indexesToRemove.size() < toRemove; --row) {\n        const auto index = model->index(row, 0);\n        if ( saver->canDropItem(index) )\n            indexesToRemove.append(index);\n    }\n\n    dropIndexes(indexesToRemove, model);\n}\n\n} // namespace\n\nItemFactory::ItemFactory(const ClipboardBrowserSharedPtr &sharedData, QObject *parent)\n    : QObject(parent)\n    , m_sharedData(sharedData ? sharedData : std::make_shared<ClipboardBrowserShared>())\n    , m_dummyLoader(std::make_shared<DummyLoader>(sharedData))\n    , m_loaderChildren()\n{\n}\n\nItemWidget *ItemFactory::createItem(\n        const ItemLoaderPtr &loader, const QVariantMap &data,\n        QWidget *parent, bool antialiasing, bool transform, bool preview)\n{\n    ItemWidget *item = loader->create(data, parent, preview);\n\n    if (item != nullptr) {\n        if (transform)\n            item = transformItem(item, data);\n        QWidget *w = item->widget();\n        const auto notes = getTextData(data, mimeItemNotes);\n        if (!notes.isEmpty())\n            w->setToolTip(notes);\n\n        if (!antialiasing) {\n            QFont f = w->font();\n            f.setStyleStrategy(QFont::NoAntialias);\n            w->setFont(f);\n            for (auto child : w->findChildren<QWidget *>(\"item_child\"))\n                child->setFont(f);\n        }\n\n        m_loaderChildren[w] = loader;\n        connect(w, &QObject::destroyed, this, &ItemFactory::loaderChildDestroyed);\n        return item;\n    }\n\n    return nullptr;\n}\n\nItemWidget *ItemFactory::createItem(\n        const QVariantMap &data, QWidget *parent, bool antialiasing, bool transform, bool preview)\n{\n    for ( auto &loader : m_loaders ) {\n        if ( !loader->isEnabled() )\n            continue;\n\n        ItemWidget *item = createItem(loader, data, parent, antialiasing, transform, preview);\n        if (item != nullptr)\n            return item;\n    }\n\n    return createSimpleItem(data, parent, antialiasing);\n}\n\nItemWidget *ItemFactory::createSimpleItem(\n        const QVariantMap &data, QWidget *parent, bool antialiasing)\n{\n    return createItem(m_dummyLoader, data, parent, antialiasing);\n}\n\nQStringList ItemFactory::formatsToSave() const\n{\n    QStringList formats;\n\n    for (const auto &loader : m_loaders) {\n        if ( !loader->isEnabled() )\n            continue;\n\n        for ( const auto &format : loader->formatsToSave() ) {\n            if ( !formats.contains(format) )\n                formats.append(format);\n        }\n    }\n\n    if ( !formats.contains(mimeText) )\n        formats.prepend(mimeText);\n\n    if ( !formats.contains(mimeItemNotes) )\n        formats.append(mimeItemNotes);\n    if ( !formats.contains(mimeItems) )\n        formats.append(mimeItems);\n    if ( !formats.contains(mimeTextUtf8) )\n        formats.append(mimeTextUtf8);\n\n    return formats;\n}\n\nvoid ItemFactory::setPluginPriority(const QStringList &pluginNames)\n{\n    m_loaders.removeOne(m_dummyLoader);\n    std::sort( m_loaders.begin(), m_loaders.end(), PluginSorter(pluginNames) );\n    m_loaders.append(m_dummyLoader);\n}\n\nItemSaverPtr ItemFactory::loadItems(const QString &tabName, QAbstractItemModel *model, QIODevice *file, int maxItems)\n{\n    for (auto &loader : m_loaders) {\n        file->seek(0);\n        if ( loader->canLoadItems(file) ) {\n            if ( !loader->isEnabled() ) {\n                log(QStringLiteral(\"Cannot load tab %1, plugin %2 must be enabled\")\n                    .arg(quoteString(tabName), loader->name()));\n                return nullptr;\n            }\n            file->seek(0);\n            auto saver = loader->loadItems(tabName, model, file, maxItems);\n            if (!saver)\n                return nullptr;\n            file->close();\n            ItemLoaderPtr newLoader;\n            std::tie(saver, newLoader) = saveWithOther(tabName, model, saver, loader, m_loaders, maxItems);\n            saver = transformSaver(model, saver, newLoader, m_loaders);\n            cropToSize(saver, model, maxItems);\n            return saver;\n        }\n    }\n\n    const auto errorString =\n            QObject::tr(\"Tab %1 is corrupted or some CopyQ plugins are missing!\")\n            .arg( quoteString(tabName) );\n    emitError(errorString);\n\n    return nullptr;\n}\n\nItemSaverPtr ItemFactory::initializeTab(const QString &tabName, QAbstractItemModel *model, int maxItems)\n{\n    for (const auto &loader : m_loaders) {\n        if ( loader->isEnabled() && loader->canSaveItems(tabName) ) {\n            const auto saver = loader->initializeTab(tabName, model, maxItems);\n            return saver ? transformSaver(model, saver, loader, m_loaders) : nullptr;\n        }\n    }\n\n    return nullptr;\n}\n\nbool ItemFactory::matches(const QModelIndex &index, const ItemFilter &filter) const\n{\n    if ( filter.matchesIndex(index) )\n        return true;\n\n    for (const auto &loader : m_loaders) {\n        if ( loader->isEnabled() && loader->matches(index, filter) )\n            return true;\n    }\n\n    return false;\n}\n\nItemScriptable *ItemFactory::scriptableObject(const QString &name) const\n{\n    for (const auto &loader : m_loaders) {\n        if (loader->id() == name)\n            return loader->isEnabled() ? loader->scriptableObject() : nullptr;\n    }\n    return nullptr;\n}\n\nQVector<Command> ItemFactory::commands(bool enabled) const\n{\n    QVector<Command> commands;\n\n    for (const auto &loader : m_loaders) {\n        if (loader->isEnabled() == enabled)\n            commands << loader->commands();\n    }\n\n    return commands;\n}\n\nvoid ItemFactory::emitError(const QString &errorString)\n{\n    log(errorString, LogError);\n    emit error(errorString);\n}\n\nvoid ItemFactory::loaderChildDestroyed(QObject *obj)\n{\n    m_loaderChildren.remove(obj);\n}\n\nbool ItemFactory::loadPlugins()\n{\n    QDir pluginsDir;\n    if ( !findPluginDir(&pluginsDir) )\n        return false;\n\n    // Plugins can be loaded only once.\n    static bool pluginsLoaded = false;\n    Q_ASSERT(!pluginsLoaded);\n    if (pluginsLoaded)\n        return true;\n    pluginsLoaded = true;\n\n    const QStringList plugins = qEnvironmentVariable(\"COPYQ_PLUGINS\").split(';', Qt::SkipEmptyParts);\n    for (const auto &path : plugins) {\n        auto loader = loadPlugin(path, QString());\n        if (loader)\n            addLoader(loader);\n        else\n            log(QStringLiteral(\"Failed to load plugin: %1\").arg(path), LogError);\n    }\n\n    const QStringList allowPlugins =\n        qEnvironmentVariable(\"COPYQ_ALLOW_PLUGINS\")\n        .split(QChar(','), Qt::SkipEmptyParts);\n    pluginsDir.setNameFilters(allowPlugins);\n\n    for (const auto &fileName : pluginsDir.entryList(QDir::Files)) {\n        const QString path = pluginsDir.absoluteFilePath(fileName);\n        auto loader = loadPlugin(path, QString());\n        if (loader)\n            addLoader(loader);\n    }\n\n    std::sort(m_loaders.begin(), m_loaders.end(), priorityLessThan);\n    addLoader(m_dummyLoader);\n\n    return true;\n}\n\nvoid ItemFactory::loadItemFactorySettings(QSettings *settings)\n{\n    // load settings for each plugin\n    settings->beginGroup(\"Plugins\");\n    for (const auto &loader : m_loaders) {\n        const bool enabled = loadItemFactorySettings(loader, settings);\n        loader->setEnabled(enabled);\n    }\n    settings->endGroup();\n\n    // load plugin priority\n    const QStringList pluginPriority =\n            settings->value(\"plugin_priority\", QStringList()).toStringList();\n    setPluginPriority(pluginPriority);\n}\n\nQObject *ItemFactory::createExternalEditor(const QModelIndex &index, const QVariantMap &data, QWidget *parent) const\n{\n    for (const auto &loader : m_loaders) {\n        if ( !loader->isEnabled() )\n            continue;\n\n        QObject *editor = loader->createExternalEditor(index, data, parent);\n        if (editor != nullptr)\n            return editor;\n    }\n\n    return nullptr;\n}\n\nQVariantMap ItemFactory::data(const QModelIndex &index) const\n{\n    QVariantMap data = index.data(contentType::data).toMap();\n    for (const auto &loader : m_loaders) {\n        if ( loader->isEnabled() && !loader->data(&data, index) )\n            return QVariantMap();\n    }\n    return data;\n}\n\nbool ItemFactory::setData(const QVariantMap &data, const QModelIndex &index, QAbstractItemModel *model) const\n{\n    for (const auto &loader : m_loaders) {\n        if ( loader->isEnabled() && loader->setData(data, index, model) )\n            return true;\n    }\n\n    return model->setData(index, data, contentType::updateData);\n}\n\nItemWidget *ItemFactory::transformItem(ItemWidget *item, const QVariantMap &data)\n{\n    for (const auto &loader : m_loaders) {\n        if ( !loader->isEnabled() )\n            continue;\n\n        ItemWidget *newItem = loader->transform(item, data);\n        if (newItem != nullptr)\n            item = newItem;\n    }\n\n    return item;\n}\n\nvoid ItemFactory::addLoader(const ItemLoaderPtr &loader)\n{\n    m_loaders.append(loader);\n    const QObject *signaler = loader->signaler();\n    if (signaler) {\n        const auto loaderMetaObject = signaler->metaObject();\n\n        if ( loaderMetaObject->indexOfSignal(\"error(QString)\") != -1 )\n            connect( signaler, SIGNAL(error(QString)), this, SIGNAL(error(QString)) );\n\n        if ( loaderMetaObject->indexOfSignal(\"addCommands(QVector<Command>)\") != -1 )\n            connect( signaler, SIGNAL(addCommands(QVector<Command>)), this, SIGNAL(addCommands(QVector<Command>)) );\n    }\n}\n\nItemLoaderPtr ItemFactory::loadPlugin(const QString &path, const QString &id) const\n{\n    if ( !QLibrary::isLibrary(path) )\n        return ItemLoaderPtr();\n\n    COPYQ_LOG_VERBOSE( QString(\"Loading plugin: %1\").arg(path) );\n    QPluginLoader pluginLoader(path);\n    QObject *plugin = pluginLoader.instance();\n    if (plugin == nullptr) {\n        log( pluginLoader.errorString(), LogError );\n        return ItemLoaderPtr();\n    }\n\n    ItemLoaderPtr loader( qobject_cast<ItemLoaderInterface *>(plugin) );\n    if ( loader == nullptr || (!id.isEmpty() && id != loader->id()) ) {\n        COPYQ_LOG_VERBOSE( QString(\"Unloading plugin: %1\").arg(path) );\n        loader = nullptr;\n        pluginLoader.unload();\n        return ItemLoaderPtr();\n    }\n\n    return loader;\n}\n\nbool ItemFactory::loadItemFactorySettings(const ItemLoaderPtr &loader, QSettings *settings) const\n{\n    if (loader == m_dummyLoader) {\n        loader->loadSettings(*settings);\n        return true;\n    }\n\n    settings->beginGroup(loader->id());\n\n    const auto enabled = settings->value(\"enabled\", true).toBool();\n    loader->loadSettings(*settings);\n\n    settings->endGroup();\n\n    return enabled;\n}\n\nQStringList ItemFactory::copyqStats() const\n{\n    QStringList lines;\n    for (const auto &loader : m_loaders) {\n        if (loader == m_dummyLoader)\n            continue;\n        lines.append(QStringLiteral(\"PLUGIN %1: %2\")\n            .arg(loader->id(), loader->isEnabled() ? \"enabled\" : \"disabled\"));\n    }\n    return lines;\n}\n"
  },
  {
    "path": "src/item/itemfactory.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/encryption.h\"\n#include \"item/itemwidget.h\"\n\n#include <QMap>\n#include <QObject>\n#include <QtContainerFwd>\n\nclass ItemLoaderInterface;\nclass ItemWidget;\nclass ScriptableProxy;\nclass QAbstractItemModel;\nclass QIODevice;\nclass QModelIndex;\nclass QSettings;\nclass QWidget;\nstruct Command;\nstruct CommandMenu;\n\nnamespace Encryption {\n    class EncryptionKey;\n}\n\nstruct ClipboardBrowserShared;\nusing ClipboardBrowserSharedPtr = std::shared_ptr<ClipboardBrowserShared>;\n\nusing ItemLoaderList = QList<ItemLoaderPtr>;\n\n/**\n * Loads item plugins (loaders) and instantiates ItemWidget objects using appropriate\n * ItemLoaderInterface::create().\n */\nclass ItemFactory final : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList copyqStats READ copyqStats CONSTANT)\n\npublic:\n    /**\n     * Loads item plugins.\n     */\n    explicit ItemFactory(\n        const ClipboardBrowserSharedPtr &sharedData = nullptr, QObject *parent = nullptr);\n\n    /**\n     * Instantiate ItemWidget using given @a loader if possible.\n     */\n    ItemWidget *createItem(\n            const ItemLoaderPtr &loader, const QVariantMap &data, QWidget *parent,\n            bool antialiasing, bool transform = true, bool preview = false);\n\n    /**\n     * Instantiate ItemWidget using appropriate loader or creates simple ItemWidget (DummyItem).\n     */\n    ItemWidget *createItem(const QVariantMap &data, QWidget *parent, bool antialiasing,\n            bool transform = true, bool preview = false);\n\n    ItemWidget *createSimpleItem(const QVariantMap &data, QWidget *parent, bool antialiasing);\n\n    /**\n     * Formats to save in history, union of enabled ItemLoaderInterface objects.\n     */\n    QStringList formatsToSave() const;\n\n    /**\n     * Return list of loaders.\n     */\n    const ItemLoaderList &loaders() const { return m_loaders; }\n\n    /**\n     * Sort loaders by priority.\n     *\n     * Method createItem() tries to instantiate ItemWidget with loader in this order.\n     *\n     * If priority of a loader is not set here, it is sorted after using\n     * ItemLoaderInterface::priority() after all loader explicitly sorted.\n     */\n    void setPluginPriority(const QStringList &pluginNames);\n\n    /**\n     * Return true if no plugins were loaded.\n     */\n    bool hasLoaders() const { return !m_loaders.isEmpty(); }\n\n    QStringList copyqStats() const;\n\n    /**\n     * Load items using a plugin.\n     * @return the first plugin (or nullptr) for which ItemLoaderInterface::loadItems() returned true\n     */\n    ItemSaverPtr loadItems(const QString &tabName, QAbstractItemModel *model, QIODevice *file, int maxItems);\n\n    /**\n     * Initialize tab.\n     * @return the first plugin (or nullptr) for which ItemLoaderInterface::initializeTab() returned true\n     */\n    ItemSaverPtr initializeTab(const QString &tabName, QAbstractItemModel *model, int maxItems);\n\n    /**\n     * Return true only if any plugin (ItemLoaderInterface::matches()) returns true;\n     */\n    bool matches(const QModelIndex &index, const ItemFilter &filter) const;\n\n    ItemScriptable* scriptableObject(const QString &name) const;\n\n    /**\n     * Adds commands from scripts for command dialog.\n     */\n    QVector<Command> commands(bool enabled = true) const;\n\n    void emitError(const QString &errorString);\n\n    bool loadPlugins();\n\n    void loadItemFactorySettings(QSettings *settings);\n\n    QObject *createExternalEditor(const QModelIndex &index, const QVariantMap &data, QWidget *parent) const;\n\n    QVariantMap data(const QModelIndex &index) const;\n\n    bool setData(const QVariantMap &data, const QModelIndex &index, QAbstractItemModel *model) const;\n\nsignals:\n    void error(const QString &errorString);\n    void addCommands(const QVector<Command> &commands);\n\nprivate:\n    /** Called if child ItemWidget destroyed. **/\n    void loaderChildDestroyed(QObject *obj);\n\n    /** Calls ItemLoaderInterface::transform() for all plugins in reverse order. */\n    ItemWidget *transformItem(ItemWidget *item, const QVariantMap &data);\n\n    void addLoader(const ItemLoaderPtr &loader);\n\n    ItemLoaderPtr loadPlugin(const QString &fileName, const QString &id) const;\n\n    bool loadItemFactorySettings(const ItemLoaderPtr &loader, QSettings *settings) const;\n\n    ClipboardBrowserSharedPtr m_sharedData;\n    ItemLoaderList m_loaders;\n    ItemLoaderPtr m_dummyLoader;\n    QMap<QObject *, ItemLoaderPtr> m_loaderChildren;\n};\n"
  },
  {
    "path": "src/item/itemfilter.h",
    "content": "#pragma once\n\n#include <memory>\n\nclass QModelIndex;\nclass QString;\nclass QTextCharFormat;\nclass QTextEdit;\n\nclass ItemFilter\n{\npublic:\n    virtual ~ItemFilter() = default;\n    virtual bool matchesAll() const = 0;\n    virtual bool matchesNone() const = 0;\n    virtual bool matches(const QString &text) const = 0;\n    virtual bool matchesIndex(const QModelIndex &index) const = 0;\n    virtual void highlight(QTextEdit *edit, const QTextCharFormat &format) const = 0;\n    virtual void search(QTextEdit *edit, bool backwards) const = 0;\n    virtual QString searchString() const = 0;\n};\n\nusing ItemFilterPtr = std::shared_ptr<ItemFilter>;\n"
  },
  {
    "path": "src/item/itemsaverwrapper.cpp",
    "content": "#include \"itemsaverwrapper.h\"\n\n#include <QVariantMap>\n\nItemSaverWrapper::ItemSaverWrapper(const ItemSaverPtr &saver)\n    : m_saver(saver)\n{\n}\n\nbool ItemSaverWrapper::saveItems(const QString &tabName, const QAbstractItemModel &model, QIODevice *file)\n{\n    return m_saver->saveItems(tabName, model, file);\n}\n\nbool ItemSaverWrapper::canRemoveItems(const QList<QModelIndex> &indexList, QString *error)\n{\n    return m_saver->canRemoveItems(indexList, error);\n}\n\nbool ItemSaverWrapper::canDropItem(const QModelIndex &index)\n{\n    return m_saver->canDropItem(index);\n}\n\nbool ItemSaverWrapper::canMoveItems(const QList<QModelIndex> &indexList)\n{\n    return m_saver->canMoveItems(indexList);\n}\n\nvoid ItemSaverWrapper::itemsRemovedByUser(const QList<QPersistentModelIndex> &indexList)\n{\n    return m_saver->itemsRemovedByUser(indexList);\n}\n\nQVariantMap ItemSaverWrapper::copyItem(const QAbstractItemModel &model, const QVariantMap &itemData)\n{\n    return m_saver->copyItem(model, itemData);\n}\n\nvoid ItemSaverWrapper::setFocus(bool focus)\n{\n    return m_saver->setFocus(focus);\n}\n"
  },
  {
    "path": "src/item/itemsaverwrapper.h",
    "content": "#pragma once\n\n#include \"item/itemwidget.h\"\n\nclass ItemSaverWrapper : public ItemSaverInterface\n{\npublic:\n    explicit ItemSaverWrapper(const ItemSaverPtr &saver);\n\n    bool saveItems(const QString &tabName, const QAbstractItemModel &model, QIODevice *file) override;\n\n    bool canRemoveItems(const QList<QModelIndex> &indexList, QString *error) override;\n\n    bool canDropItem(const QModelIndex &index) override;\n\n    bool canMoveItems(const QList<QModelIndex> &indexList) override;\n\n    void itemsRemovedByUser(const QList<QPersistentModelIndex> &indexList) override;\n\n    QVariantMap copyItem(const QAbstractItemModel &model, const QVariantMap &itemData) override;\n\n    void setFocus(bool focus) override;\n\nprotected:\n    ItemSaverInterface *wrapped() const { return m_saver.get(); }\n\nprivate:\n    ItemSaverPtr m_saver;\n};\n"
  },
  {
    "path": "src/item/itemstore.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemstore.h\"\n\n#include \"common/config.h\"\n#include \"common/log.h\"\n#include \"common/textdata.h\"\n#include \"item/itemfactory.h\"\n#include \"item/serialize.h\"\n\n#include <QAbstractItemModel>\n#include <QDir>\n#include <QFile>\n#include <QSaveFile>\n#include <QSet>\n\nnamespace {\n\n/// @return File name for data file with items.\nQString itemFileName(const QString &id)\n{\n    QString part( id.toUtf8().toBase64() );\n    part.replace( QChar('/'), QChar('-') );\n    return getConfigurationFilePath(\"_tab_\") + part + QLatin1String(\".dat\");\n}\n\nvoid printItemFileError(\n        const QString &action, const QString &id, const QFileDevice &file)\n{\n    log( QString(\"Tab %1: Failed to %2, file %3: %4\").arg(\n             quoteString(id),\n             action,\n             quoteString(file.fileName()),\n             file.errorString()\n         ), LogError );\n}\n\nItemSaverPtr loadItems(\n        const QString &tabName, const QString &tabFileName,\n        QAbstractItemModel &model, ItemFactory *itemFactory, int maxItems)\n{\n    COPYQ_LOG( QString(\"Tab \\\"%1\\\": Loading items from: %2\").arg(tabName, tabFileName) );\n\n    QFile tabFile(tabFileName);\n    if ( !tabFile.open(QIODevice::ReadOnly) ) {\n        printItemFileError(\"load tab\", tabName, tabFile);\n        return nullptr;\n    }\n\n    return itemFactory->loadItems(tabName, &model, &tabFile, maxItems);\n}\n\nItemSaverPtr createTab(\n        const QString &tabName, QAbstractItemModel &model, ItemFactory *itemFactory, int maxItems)\n{\n    COPYQ_LOG( QString(\"Tab \\\"%1\\\": Creating new tab\").arg(tabName) );\n\n    auto saver = itemFactory->initializeTab(tabName, &model, maxItems);\n    if (!saver) {\n        log( QString(\"Tab \\\"%1\\\": Failed to create new tab\"), LogError );\n        return nullptr;\n    }\n\n    if ( !saveItems(tabName, model, saver) )\n        return nullptr;\n\n    return saver;\n}\n\nbool itemDataFiles(const QString &tabName, QStringList *files, const Encryption::EncryptionKey *encryptionKey = nullptr)\n{\n    const QString tabFileName = itemFileName(tabName);\n    if ( !QFile::exists(tabFileName) )\n        return true;\n\n    QFile tabFile(tabFileName);\n    if ( !tabFile.open(QIODevice::ReadOnly) ) {\n        printItemFileError(\"read tab\", tabName, tabFile);\n        return false;\n    }\n\n    return itemDataFiles(&tabFile, files, encryptionKey);\n}\n\nvoid cleanDataDir(QDir *dir)\n{\n    if ( dir->isEmpty() )\n        QDir().rmdir( dir->absolutePath() );\n}\n\n} // namespace\n\nItemSaverPtr loadItems(const QString &tabName, QAbstractItemModel &model, ItemFactory *itemFactory, int maxItems)\n{\n    const QString tabFileName = itemFileName(tabName);\n    if ( !QFile::exists(tabFileName) )\n        return createTab(tabName, model, itemFactory, maxItems);\n\n    ItemSaverPtr saver = loadItems(tabName, tabFileName, model, itemFactory, maxItems);\n    if (saver) {\n        COPYQ_LOG( QStringLiteral(\"Tab \\\"%1\\\": %2 items loaded from: %3\")\n                      .arg(tabName, QString::number(model.rowCount()), tabFileName) );\n        return saver;\n    }\n\n    log( QStringLiteral(\"Tab \\\"%1\\\": Cannot load tab file: %2\")\n            .arg(tabName, tabFileName) );\n    model.removeRows(0, model.rowCount());\n    return nullptr;\n}\n\nbool saveItems(const QString &tabName, const QAbstractItemModel &model, const ItemSaverPtr &saver)\n{\n    const QString tabFileName = itemFileName(tabName);\n\n    if ( !ensureSettingsDirectoryExists() )\n        return false;\n\n    // Save tab data to a new temporary file.\n    QSaveFile tabFile(tabFileName);\n    tabFile.setDirectWriteFallback(false);\n    if ( !tabFile.open(QIODevice::WriteOnly) ) {\n        printItemFileError(\"save tab (open temporary file)\", tabName, tabFile);\n        return false;\n    }\n\n    COPYQ_LOG( QStringLiteral(\"Tab \\\"%1\\\": Saving %2 items\")\n                  .arg(tabName, QString::number(model.rowCount())) );\n\n    if ( !saver->saveItems(tabName, model, &tabFile) ) {\n        tabFile.cancelWriting();\n        printItemFileError(\"save tab (save items to temporary file)\", tabName, tabFile);\n        return false;\n    }\n\n    if ( !tabFile.flush() ) {\n        tabFile.cancelWriting();\n        printItemFileError(\"save tab (flush to temporary file)\", tabName, tabFile);\n        return false;\n    }\n\n    if ( !tabFile.commit() ) {\n        printItemFileError(\"save tab (commit)\", tabName, tabFile);\n        return false;\n    }\n\n    COPYQ_LOG( QStringLiteral(\"Tab \\\"%1\\\": Items saved\").arg(tabName) );\n\n    return true;\n}\n\nvoid removeItems(const QString &tabName)\n{\n    const QString tabFileName = itemFileName(tabName);\n    QFile::remove(tabFileName);\n}\n\nbool moveItems(const QString &oldId, const QString &newId)\n{\n    const QString oldFileName = itemFileName(oldId);\n    const QString newFileName = itemFileName(newId);\n\n    QString error;\n    if (oldFileName == newFileName) {\n        error = QStringLiteral(\"Cannot move to the same destination\");\n    } else {\n        QFile source(oldFileName);\n\n        // Skip if source tab was not yet saved\n        if (!source.exists())\n            return true;\n\n        if ( source.open(QFile::ReadOnly) && source.copy(newFileName) ) {\n            QFile::remove(oldFileName);\n            return true;\n        }\n        error = source.errorString();\n    }\n\n    log( QStringLiteral(\"Failed to move \\\"%1\\\" (tab \\\"%2\\\") to \\\"%3\\\" (tab \\\"%4\\\"): %5\")\n         .arg(oldFileName, oldId, newFileName, newId, error), LogError );\n    return false;\n}\n\nvoid cleanDataFiles(const QStringList &tabNames, const Encryption::EncryptionKey *encryptionKey)\n{\n    QDir dir(itemDataPath());\n    if ( !dir.exists() )\n        return;\n\n    QStringList files;\n    for (const QString &tabName : tabNames) {\n        if ( !itemDataFiles(tabName, &files, encryptionKey) ) {\n            COPYQ_LOG( QStringLiteral(\"Stopping data file cleanup: failed to load or decrypt some files for tab %1\")\n                    .arg(tabName) );\n            return;\n        }\n    }\n\n    const QSet<QString> fileSet(files.constBegin(), files.constEnd());\n    for ( const auto &i1 : dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot) ) {\n        QDir d1(i1.absoluteFilePath());\n        for ( const auto &i2 : d1.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot) ) {\n            QDir d2(i2.absoluteFilePath());\n            for ( const auto &i3 : d2.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot) ) {\n                QDir d3(i3.absoluteFilePath());\n                for ( const auto &f : d3.entryInfoList(QDir::Files) ) {\n                    const QString path = f.absoluteFilePath();\n                    if ( !fileSet.contains(path) ) {\n                        COPYQ_LOG( QStringLiteral(\"Cleaning: %1\").arg(path) );\n                        QFile::remove(path);\n                    }\n                }\n                cleanDataDir(&d3);\n            }\n            cleanDataDir(&d2);\n        }\n        cleanDataDir(&d1);\n    }\n}\n"
  },
  {
    "path": "src/item/itemstore.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QtContainerFwd>\n#include <memory>\n\nclass ItemFactory;\nclass ItemSaverInterface;\nclass QAbstractItemModel;\nclass QString;\nusing ItemSaverPtr = std::shared_ptr<ItemSaverInterface>;\n\nnamespace Encryption {\n    class EncryptionKey;\n}\n\n/** Load items from configuration file. */\nItemSaverPtr loadItems(const QString &tabName, QAbstractItemModel &model //!< Model for items.\n        , ItemFactory *itemFactory, int maxItems);\n\n/** Save items to configuration file. */\nbool saveItems(const QString &tabName, const QAbstractItemModel &model //!< Model containing items to save.\n        , const ItemSaverPtr &saver);\n\n/** Remove configuration file for items. */\nvoid removeItems(const QString &tabName //!< See ClipboardBrowser::getID().\n        );\n\n/** Move configuration file for items. */\nbool moveItems(\n        const QString &oldId, //!< See ClipboardBrowser::getID().\n        const QString &newId //!< See ClipboardBrowser::getID().\n        );\n\nvoid cleanDataFiles(const QStringList &tabNames, const Encryption::EncryptionKey *encryptionKey = nullptr);\n"
  },
  {
    "path": "src/item/itemwidget.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemwidget.h\"\n\n#include \"common/command.h\"\n#include \"item/itemeditor.h\"\n\n#include <QAbstractItemModel>\n#include <QDesktopServices>\n#include <QEvent>\n#include <QMimeData>\n#include <QModelIndex>\n#include <QMouseEvent>\n#include <QPersistentModelIndex>\n#include <QTextEdit>\n#include <QUrl>\n#include <QWidget>\n\nnamespace {\n\nbool canMouseInteract(const QMouseEvent &event)\n{\n    return event.modifiers() & Qt::ShiftModifier;\n}\n\n} // namespace\n\nItemWidget::ItemWidget(QWidget *widget)\n    : m_widget(widget)\n{\n    Q_ASSERT(widget != nullptr);\n\n    // Object name for style sheet.\n    widget->setObjectName(\"item\");\n\n    // Item widgets are not focusable.\n    widget->setFocusPolicy(Qt::NoFocus);\n\n    // Limit size of items.\n    widget->setMaximumSize(2048, 2048);\n\n    // Disable drag'n'drop by default.\n    widget->setAcceptDrops(false);\n}\n\nvoid ItemWidget::updateSize(QSize maximumSize, int idealWidth)\n{\n    QWidget *w = widget();\n    w->setMaximumSize(maximumSize);\n    const int idealHeight = w->heightForWidth(idealWidth);\n    const int maximumHeight = w->heightForWidth(maximumSize.width());\n    if (idealHeight <= 0 && maximumHeight <= 0)\n        w->resize(w->sizeHint());\n    else if (idealHeight != maximumHeight)\n        w->setFixedSize( maximumSize.width(), maximumHeight );\n    else\n        w->setFixedSize(idealWidth, idealHeight);\n}\n\nvoid ItemWidget::setCurrent(bool current)\n{\n    // Propagate mouse events to item list until the item is selected.\n    widget()->setAttribute(Qt::WA_TransparentForMouseEvents, !current);\n}\n\nbool ItemWidget::filterMouseEvents(QTextEdit *edit, QEvent *event)\n{\n    const auto type = event->type();\n\n    bool allowMouseInteraction = true;\n\n    switch (type) {\n    case QEvent::Enter:\n        edit->setMouseTracking(true);\n        edit->viewport()->setCursor( QCursor() );\n        return false;\n\n    case QEvent::MouseButtonPress:\n    case QEvent::MouseButtonDblClick: {\n        QMouseEvent *e = static_cast<QMouseEvent*>(event);\n\n        if ( !canMouseInteract(*e) )\n            allowMouseInteraction = false;\n        else if (e->button() == Qt::LeftButton)\n            edit->setTextCursor( edit->cursorForPosition(e->pos()) );\n\n        break;\n    }\n\n    case QEvent::MouseMove: {\n        QMouseEvent *e = static_cast<QMouseEvent*>(event);\n\n        if ( !canMouseInteract(*e) )\n            allowMouseInteraction = false;\n\n        break;\n    }\n\n    case QEvent::MouseButtonRelease: {\n        QMouseEvent *e = static_cast<QMouseEvent*>(event);\n\n        if ( canMouseInteract(*e) && edit->textCursor().hasSelection() )\n            edit->copy();\n\n        allowMouseInteraction = false;\n\n        break;\n    }\n\n    default:\n        return false;\n    }\n\n    Qt::TextInteractionFlags flags = edit->textInteractionFlags();\n    if (allowMouseInteraction) {\n        flags |= Qt::TextSelectableByMouse;\n        flags |= Qt::LinksAccessibleByMouse;\n    } else {\n        flags &= ~Qt::TextSelectableByMouse;\n        flags &= ~Qt::LinksAccessibleByMouse;\n    }\n    edit->setTextInteractionFlags(flags);\n\n    if (type == QEvent::MouseButtonPress || type == QEvent::MouseMove) {\n        const auto e = static_cast<QMouseEvent*>(event);\n        if (allowMouseInteraction) {\n            const auto anchor = edit->anchorAt(e->pos());\n            if ( anchor.isEmpty() ) {\n                edit->viewport()->setCursor( QCursor(Qt::IBeamCursor) );\n            } else {\n                edit->viewport()->setCursor( QCursor(Qt::PointingHandCursor) );\n                if (type == QEvent::MouseButtonPress) {\n                    QDesktopServices::openUrl( QUrl(anchor) );\n                    e->accept();\n                    return true;\n                }\n            }\n        } else {\n            edit->viewport()->setCursor( QCursor() );\n        }\n    }\n\n    return false;\n}\n\nQVariant ItemScriptable::call(const QString &method, const QVariantList &arguments)\n{\n    QVariant result;\n    QMetaObject::invokeMethod(\n                m_scriptable, \"call\", Qt::DirectConnection,\n                Q_RETURN_ARG(QVariant, result),\n                Q_ARG(QString, method),\n                Q_ARG(QVariantList, arguments));\n    return result;\n}\n\nQVariant ItemScriptable::eval(const QString &script)\n{\n    return call(\"eval\", {script});\n}\n\nQVariantList ItemScriptable::currentArguments()\n{\n    QVariantList arguments;\n    QMetaObject::invokeMethod(\n                m_scriptable, \"currentArguments\", Qt::DirectConnection,\n                Q_RETURN_ARG(QVariantList, arguments) );\n    return arguments;\n}\n\nvoid ItemScriptable::throwError(const QString &message)\n{\n    QMetaObject::invokeMethod(\n                m_scriptable, \"throwException\", Qt::DirectConnection,\n                Q_ARG(QString, message) );\n}\n\nbool ItemSaverInterface::saveItems(const QString &, const QAbstractItemModel &, QIODevice *)\n{\n    return false;\n}\n\nbool ItemSaverInterface::canRemoveItems(const QList<QModelIndex> &, QString *)\n{\n    return true;\n}\n\nbool ItemSaverInterface::canDropItem(const QModelIndex &)\n{\n    return true;\n}\n\nbool ItemSaverInterface::canMoveItems(const QList<QModelIndex> &)\n{\n    return true;\n}\n\nvoid ItemSaverInterface::itemsRemovedByUser(const QList<QPersistentModelIndex> &)\n{\n}\n\nQVariantMap ItemSaverInterface::copyItem(const QAbstractItemModel &, const QVariantMap &itemData)\n{\n    return itemData;\n}\n\nvoid ItemSaverInterface::setFocus(bool)\n{\n}\n\nItemWidget *ItemLoaderInterface::create(const QVariantMap &, QWidget *, bool) const\n{\n    return nullptr;\n}\n\nQStringList ItemLoaderInterface::formatsToSave() const\n{\n    return {};\n}\n\nbool ItemLoaderInterface::canLoadItems(QIODevice *) const\n{\n    return false;\n}\n\nbool ItemLoaderInterface::canSaveItems(const QString &) const\n{\n    return false;\n}\n\nItemSaverPtr ItemLoaderInterface::loadItems(const QString &, QAbstractItemModel *, QIODevice *, int)\n{\n    return nullptr;\n}\n\nItemSaverPtr ItemLoaderInterface::initializeTab(const QString &, QAbstractItemModel *, int)\n{\n    return nullptr;\n}\n\nItemWidget *ItemLoaderInterface::transform(ItemWidget *, const QVariantMap &)\n{\n    return nullptr;\n}\n\nItemSaverPtr ItemLoaderInterface::transformSaver(const ItemSaverPtr &saver, QAbstractItemModel *)\n{\n    return saver;\n}\n\nbool ItemLoaderInterface::matches(const QModelIndex &, const ItemFilter &) const\n{\n    return false;\n}\n\nconst QObject *ItemLoaderInterface::signaler() const\n{\n    return nullptr;\n}\n\nItemScriptable *ItemLoaderInterface::scriptableObject()\n{\n    return nullptr;\n}\n\nQVariant ItemLoaderInterface::scriptCallback(const QVariantList &)\n{\n    return {};\n}\n\nQVector<Command> ItemLoaderInterface::commands() const\n{\n    return QVector<Command>();\n}\n\nbool ItemLoaderInterface::data(QVariantMap *, const QModelIndex &) const\n{\n    return true;\n}\n\nbool ItemLoaderInterface::setData(const QVariantMap &, const QModelIndex &, QAbstractItemModel *) const\n{\n    return false;\n}\n\nQObject *ItemLoaderInterface::createExternalEditor(const QModelIndex &, const QVariantMap &, QWidget *) const\n{\n    return nullptr;\n}\n"
  },
  {
    "path": "src/item/itemwidget.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QObject>\n#include <QtContainerFwd>\n\n#include <memory>\n\nstruct Command;\n\nclass ItemFilter;\nclass QAbstractItemModel;\nclass QIODevice;\nclass QModelIndex;\nclass QPersistentModelIndex;\nclass QSettings;\nclass QTextEdit;\nclass QWidget;\n\nclass ItemLoaderInterface;\nusing ItemLoaderPtr = std::shared_ptr<ItemLoaderInterface>;\n\nclass ItemSaverInterface;\nusing ItemSaverPtr = std::shared_ptr<ItemSaverInterface>;\n\nclass ItemScriptableFactoryInterface;\nusing ItemScriptableFactoryPtr = std::shared_ptr<ItemScriptableFactoryInterface>;\n\n#define COPYQ_PLUGIN_ITEM_LOADER_ID \"com.github.hluk.copyq.itemloader/13.0.0\"\n\n/**\n * Handles item in list.\n */\nclass ItemWidget\n{\npublic:\n    explicit ItemWidget(QWidget *widget);\n\n    virtual ~ItemWidget() = default;\n\n    /**\n     * Return widget to render.\n     */\n    QWidget *widget() const { return m_widget; }\n\n    /**\n     * Size of widget needs to be updated (because maximum size changed).\n     */\n    virtual void updateSize(QSize maximumSize, int idealWidth);\n\n    /**\n     * Called if widget is set or unset as current.\n     */\n    virtual void setCurrent(bool current);\n\n    /**\n     * Mark item as tagged/untagged.\n     *\n     * Used to hide unimportant data when notes or tags are present.\n     */\n    virtual void setTagged(bool) {}\n\n    ItemWidget(const ItemWidget &) = delete;\n    ItemWidget &operator=(const ItemWidget &) = delete;\n\nprotected:\n    /**\n     * Filter mouse events for QTextEdit widgets.\n     *\n     * With Shift modifier pressed (item should be selected first), text in QTextEdit widget\n     * can be selected.\n     *\n     * Without Shift modifier pressed, mouse press selects item and mouse move with left button\n     * pressed drags item.\n     *\n     * Use QWidget::installEventFilter() on QTextEdit::viewport() and call this method from\n     * overridden QWidget::eventFilter().\n     */\n    bool filterMouseEvents(QTextEdit *edit, QEvent *event);\n\nprivate:\n    QWidget *m_widget;\n};\n\n/**\n * Adss functions and variables accessible from scripts/commands.\n *\n * New functions and variables will be available in scripts under `plugins.<PLUGIN_ID>`.\n *\n * Public slots will be available as functions.\n *\n * Public QObject properties will be available as variables.\n *\n * Important: The slots and properties are used in different than main thread.\n */\nclass ItemScriptable : public QObject\n{\npublic:\n    /** Return scriptable object (nullptr before start() is called). */\n    QObject *scriptable() const { return m_scriptable; }\n\n    /** Set scriptable (used internally before scripts starts). */\n    void setScriptable(QObject *scriptable) { m_scriptable = scriptable; }\n\n    /** Called before script starts (and scriptable is valid). */\n    virtual void start() {}\n\nprotected:\n    /**\n     * Call scriptable function by name with given @a arguments.\n     *\n     * Shouldn't be called before start().\n     */\n    QVariant call(const QString &method, const QVariantList &arguments);\n\n    /**\n     * Evaluate script.\n     *\n     * Shouldn't be called before start().\n     */\n    QVariant eval(const QString &script);\n\n    /**\n     * Return arguments passed to slots from script.\n     *\n     * Shouldn't be called before start().\n     */\n    QVariantList currentArguments();\n\n    void throwError(const QString &message);\n\nprivate:\n    QObject *m_scriptable = nullptr;\n};\n\n/**\n * Factory for creating script objects.\n */\nclass ItemScriptableFactoryInterface\n{\npublic:\n    virtual ~ItemScriptableFactoryInterface() = default;\n\n    /**\n     * Create script object.\n     *\n     * This method must be thread-safe.\n     */\n    virtual ItemScriptable *create() const = 0;\n\n    /**\n     * Variable name for scriptable object in script.\n     *\n     * This method is thread-safe.\n     */\n    QString name() const { return m_name; }\n\n    void setName(const QString &name) { m_name = name; }\n\nprivate:\n    QString m_name;\n};\n\n/**\n * Handles saving and modifying item models.\n */\nclass ItemSaverInterface\n{\npublic:\n    ItemSaverInterface() = default;\n\n    virtual ~ItemSaverInterface() = default;\n\n    /**\n     * Save items.\n     * @return true only if items were saved\n     */\n    virtual bool saveItems(const QString &tabName, const QAbstractItemModel &model, QIODevice *file);\n\n    /**\n     * Called before items are deleted by user.\n     * @return true if items can be removed, false to cancel the removal\n     */\n    virtual bool canRemoveItems(const QList<QModelIndex> &indexList, QString *error);\n\n    /**\n     * Called before item is deleted from end so new items can be inserted.\n     * @return true if item can be dropped, false to disallow the drop\n     */\n    virtual bool canDropItem(const QModelIndex &index);\n\n    /**\n     * Called before items are moved out of list (i.e. deleted) by user.\n     * @return true if items can be moved, false to cancel the removal\n     */\n    virtual bool canMoveItems(const QList<QModelIndex> &);\n\n    /**\n     * Called when items are being deleted by user.\n     */\n    virtual void itemsRemovedByUser(const QList<QPersistentModelIndex> &indexList);\n\n    /**\n     * Return copy of items data.\n     */\n    virtual QVariantMap copyItem(const QAbstractItemModel &model, const QVariantMap &itemData);\n\n    virtual void setFocus(bool focus);\n\n    ItemSaverInterface(const ItemSaverInterface &) = delete;\n    ItemSaverInterface &operator=(const ItemSaverInterface &) = delete;\n};\n\n/**\n * Main class for plugins (needs to be implemented).\n *\n * Identifies the plugin (id, name, author, description) and optionally:\n * - loads items from file (creates ItemSaverInterface instance),\n * - creates item widgets (creates ItemWidget instance),\n * - adds scripting capabilities (creates ItemScriptable instance),\n * - matches/filters items,\n * - provides commands for Command dialog,\n * - provides settings widget for Configuration dialog.\n */\nclass ItemLoaderInterface\n{\npublic:\n    ItemLoaderInterface() = default;\n\n    virtual ~ItemLoaderInterface() = default;\n\n    /**\n     * Return priority.\n     *\n     * Use this loader before all others with lower priority.\n     */\n    virtual int priority() const { return 0; }\n\n    /**\n     * Create ItemWidget instance from index data.\n     *\n     * @return nullptr if index hasn't appropriate data\n     */\n    virtual ItemWidget *create(const QVariantMap &data, QWidget *parent, bool preview) const;\n\n    /**\n     * Simple ID of plugin.\n     *\n     * Name configuration sub-section and plugin object in scripts (`plugins.<PLUGIN_ID>`).\n     *\n     * Should be short and contain only lower case letters.\n     */\n    virtual QString id() const = 0;\n\n    /**\n     * Return descriptive name (translatable).\n     */\n    virtual QString name() const = 0;\n\n    /**\n     * Return author's name.\n     */\n    virtual QString author() const = 0;\n\n    /**\n     * Return plugin description (translatable).\n     */\n    virtual QString description() const = 0;\n\n    /**\n     * Return icon representing the plugin.\n     *\n     * Return value can be QIcon or UInt (to render a character from icon font).\n     *\n     * Default is no icon.\n     */\n    virtual QVariant icon() const = 0;\n\n    /**\n     * Provide formats to save (possibly configurable).\n     *\n     * The values are stored into user QSettings, under group with name same as value of id().\n     */\n    virtual QStringList formatsToSave() const;\n\n    /**\n     * Save and return configuration values to save from current settings widget.\n     */\n    virtual void applySettings(QSettings &) {}\n\n    virtual void setEnabled(bool enabled) { m_enabled = enabled; }\n    bool isEnabled() const { return m_enabled; }\n\n    /**\n     * Load stored configuration values.\n     */\n    virtual void loadSettings(const QSettings &) {}\n\n    /**\n     * Create settings widget.\n     */\n    virtual QWidget *createSettingsWidget(QWidget *) { return nullptr; }\n\n    /**\n     * @return true only if items can be loaded\n     */\n    virtual bool canLoadItems(QIODevice *file) const;\n\n    /**\n     * @return true only if items can be saved\n     */\n    virtual bool canSaveItems(const QString &tabName) const;\n\n    /**\n     * Load items.\n     * @return true only if items were saved by this plugin (or just not to load them any further)\n     */\n    virtual ItemSaverPtr loadItems(\n            const QString &tabName, QAbstractItemModel *model, QIODevice *file, int maxItems);\n\n    /**\n     * Initialize tab (tab was not yet saved or loaded).\n     * @return true only if successful\n     */\n    virtual ItemSaverPtr initializeTab(const QString &tabName, QAbstractItemModel *model, int maxItems);\n\n    /**\n     * Allow to transform item widget (wrap around a new widget).\n     * By default returns nullptr not to wrap the widget.\n     * New ItemWidget must take care of deleting the old one!\n     */\n    virtual ItemWidget *transform(ItemWidget *itemWidget, const QVariantMap &data);\n\n    /**\n     * Transform loader.\n     */\n    virtual ItemSaverPtr transformSaver(const ItemSaverPtr &saver, QAbstractItemModel *model);\n\n    /**\n     * Return true if regular expression matches items content.\n     * Returns false by default.\n     */\n    virtual bool matches(const QModelIndex &index, const ItemFilter &filter) const;\n\n    /**\n     * Return QObject instance with signals (by default null pointer).\n     *\n     * Returned QObject can have signal error(QString) for signaling errors.\n     */\n    virtual const QObject *signaler() const;\n\n    /**\n     * Return scriptable object.\n     */\n    virtual ItemScriptable *scriptableObject();\n\n    /**\n     * Callback from scripts/clients, run in the server process.\n     */\n    virtual QVariant scriptCallback(const QVariantList &arguments);\n\n    /**\n     * Adds commands from scripts for command dialog.\n     */\n    virtual QVector<Command> commands() const;\n\n    virtual bool data(QVariantMap *data, const QModelIndex &index) const;\n\n    virtual bool setData(const QVariantMap &data, const QModelIndex &index, QAbstractItemModel *model) const;\n\n    /**\n     * Create external editor for @a index.\n     *\n     * Default implementation returns nullptr.\n     *\n     * @param index  index for which the editor is opened\n     *\n     * @return Editor object -- see documentation for public signals and slots of ItemEditor class --\n     *         nullptr so default text editor is opened.\n     */\n    virtual QObject *createExternalEditor(const QModelIndex &index, const QVariantMap &data, QWidget *parent) const;\n\n    virtual bool supportsEncryption() const { return false; }\n\n    ItemLoaderInterface(const ItemLoaderInterface &) = delete;\n    ItemLoaderInterface &operator=(const ItemLoaderInterface &) = delete;\n\nprivate:\n    bool m_enabled = true;\n};\n\nQ_DECLARE_INTERFACE(ItemLoaderInterface, COPYQ_PLUGIN_ITEM_LOADER_ID)\n"
  },
  {
    "path": "src/item/itemwidgetwrapper.cpp",
    "content": "#include \"itemwidgetwrapper.h\"\n\n#include <QSize>\n\nItemWidgetWrapper::ItemWidgetWrapper(ItemWidget *childItem, QWidget *widget)\n    : ItemWidget(widget)\n    , m_childItem(childItem)\n{\n}\n\nvoid ItemWidgetWrapper::updateSize(QSize maximumSize, int idealWidth)\n{\n    childItem()->updateSize(maximumSize, idealWidth);\n}\n\nvoid ItemWidgetWrapper::setCurrent(bool current)\n{\n    childItem()->setCurrent(current);\n}\n\nvoid ItemWidgetWrapper::setTagged(bool tagged)\n{\n    childItem()->setTagged(tagged);\n}\n"
  },
  {
    "path": "src/item/itemwidgetwrapper.h",
    "content": "#pragma once\n\n\n#include \"itemwidget.h\"\n\n#include <memory>\n\nclass ItemWidgetWrapper : public ItemWidget\n{\npublic:\n    ItemWidgetWrapper(ItemWidget *childItem, QWidget *widget);\n\n    void updateSize(QSize maximumSize, int idealWidth) override;\n\n    void setCurrent(bool current) override;\n\n    void setTagged(bool tagged) override;\n\nprotected:\n    ItemWidget *childItem() const { return m_childItem.get(); }\n\nprivate:\n    std::unique_ptr<ItemWidget> m_childItem;\n};\n"
  },
  {
    "path": "src/item/persistentdisplayitem.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"persistentdisplayitem.h\"\n\n#include \"common/mimetypes.h\"\n#include \"gui/traymenu.h\"\n#include \"item/itemdelegate.h\"\n\n#include <QAction>\n\nnamespace {\n\nbool dataEquals(const QVariantMap &lhs, const QVariantMap &rhs)\n{\n    for (auto it = lhs.constBegin(); it != lhs.constEnd(); ++it) {\n        if ( it.value().toByteArray() != rhs.value(it.key()).toByteArray() )\n            return false;\n    }\n    return true;\n}\n\n} // namespace\n\nPersistentDisplayItem::PersistentDisplayItem(ItemDelegate *delegate,\n        const QVariantMap &data,\n        QWidget *widget)\n    : m_data(data)\n    , m_widget(widget)\n    , m_delegate(delegate)\n{\n    // Avoid accessing current selection in Display commands.\n    if ( !m_data.contains(mimeCurrentTab) )\n        m_data[mimeSelectedItems] = QByteArray();\n}\n\nPersistentDisplayItem::PersistentDisplayItem(QAction *action, const QVariantMap &data)\n    : m_data(data)\n    , m_action(action)\n{\n}\n\nbool PersistentDisplayItem::isValid()\n{\n    return !m_action.isNull() || (\n        !m_widget.isNull() && !m_delegate.isNull()\n        && !m_delegate->invalidateHidden(m_widget.data()) );\n}\n\nvoid PersistentDisplayItem::setData(const QVariantMap &data)\n{\n    if ( data.isEmpty() || dataEquals(data, m_data) )\n        return;\n\n    if ( !m_action.isNull() ) {\n        TrayMenu::updateTextFromData(m_action, data);\n        TrayMenu::updateIconFromData(m_action, data);\n    } else if ( !m_widget.isNull() && !m_delegate.isNull() ) {\n        m_delegate->updateWidget(m_widget, data);\n    }\n}\n"
  },
  {
    "path": "src/item/persistentdisplayitem.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QMetaType>\n#include <QPointer>\n#include <QString>\n#include <QVariantMap>\n\nclass ItemDelegate;\nclass QAction;\nclass QModelIndex;\nclass QWidget;\nclass QString;\n\n/**\n * Holds data for currently displayed item.\n *\n * Can be used to change the data for displaying without altering the item data itself.\n */\nclass PersistentDisplayItem final\n{\npublic:\n    PersistentDisplayItem() = default;\n\n    PersistentDisplayItem(\n            ItemDelegate *delegate, const QVariantMap &data, QWidget *widget);\n\n    PersistentDisplayItem(QAction *action, const QVariantMap &data);\n\n    /**\n     * Returns display data of the item.\n     *\n     * This method is thread-safe.\n     */\n    const QVariantMap &data() const noexcept { return m_data; }\n\n    /**\n     * Returns true only if display item widget is still available.\n     */\n    bool isValid();\n\n    /**\n     * Sets display data.\n     *\n     * If data is empty, the item will be displayed later again.\n     */\n    void setData(const QVariantMap &data);\n\nprivate:\n    QVariantMap m_data;\n    QPointer<QWidget> m_widget;\n    QPointer<QAction> m_action;\n    QPointer<ItemDelegate> m_delegate;\n};\n\nQ_DECLARE_METATYPE(PersistentDisplayItem)\n"
  },
  {
    "path": "src/item/serialize.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"serialize.h\"\n\n#include \"common/contenttype.h\"\n#include \"common/encryption.h\"\n#include \"common/mimetypes.h\"\n\n#include <QAbstractItemModel>\n#include <QCoreApplication>\n#include <QByteArray>\n#include <QCryptographicHash>\n#include <QDataStream>\n#include <QDir>\n#include <QFile>\n#include <QFileInfo>\n#include <QIODevice>\n#include <QList>\n#include <QLoggingCategory>\n#include <QPair>\n#include <QSaveFile>\n#include <QStringList>\n\n#include <unordered_map>\n\nconstexpr const int MAX_ITEMS = 100'000;\n\nconstexpr auto dataStreamVersionDefault = QDataStream::Qt_4_7;\nconstexpr auto dataStreamVersionForV3 = QDataStream::Qt_5_15;\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(serializeCategory)\nQ_LOGGING_CATEGORY(serializeCategory, \"copyq.serialize\")\n\n} // namespace\n\nclass DataFile {\npublic:\n    DataFile() {}\n\n    explicit DataFile(const QString &path, const Encryption::EncryptionKey &encryptionKey = {})\n        : m_path(path)\n#ifdef WITH_QCA_ENCRYPTION\n        , m_encryptionKey(encryptionKey)\n#endif\n    {\n#ifndef WITH_QCA_ENCRYPTION\n        Q_UNUSED(encryptionKey)\n#endif\n    }\n\n    const QString &path() const { return m_path; }\n    void setPath(const QString &path) { m_path = path; }\n\n#ifdef WITH_QCA_ENCRYPTION\n    void setEncryptionKey(const Encryption::EncryptionKey &key)\n    {\n        m_encryptionKey = key;\n    }\n\n    const Encryption::EncryptionKey &encryptionKey() const { return m_encryptionKey; }\n#endif\n\n    qint64 size() const\n    {\n        return QFileInfo(m_path).size();\n    }\n\n    QString toString() const { return m_path; }\n\n    QByteArray readAll() const\n    {\n        QFile f(m_path);\n        if ( !f.open(QIODevice::ReadOnly) ) {\n            qCCritical(serializeCategory) << \"Failed to read file\" << m_path << \":\" << f.errorString();\n            return QByteArray();\n        }\n        QByteArray data = f.readAll();\n\n#ifdef WITH_QCA_ENCRYPTION\n        // Decrypt if encryption key is present\n        if (m_encryptionKey.isValid()) {\n            const QByteArray decryptedData = Encryption::decrypt(data, m_encryptionKey);\n            if ( decryptedData.isEmpty() ) {\n                qCCritical(serializeCategory) << \"Failed to decrypt data file\" << m_path;\n                return QByteArray();\n            }\n            return decryptedData;\n        }\n#endif\n\n        return data;\n    }\n\n    bool operator==(const DataFile &other) const {\n        return m_path == other.m_path;\n    }\n\nprivate:\n    QString m_path;\n#ifdef WITH_QCA_ENCRYPTION\n    Encryption::EncryptionKey m_encryptionKey;\n#endif\n};\nQ_DECLARE_METATYPE(DataFile)\n\nQDataStream &operator<<(QDataStream &out, DataFile value)\n{\n    out << value.path();\n#ifdef WITH_QCA_ENCRYPTION\n    const bool hasKey = value.encryptionKey().isValid();\n    out << hasKey;\n    if (hasKey) {\n        out << value.encryptionKey().exportDEK();\n    }\n#else\n    out << false; // No encryption key\n#endif\n    return out;\n}\n\nQDataStream &operator>>(QDataStream &in, DataFile &value)\n{\n    QString path;\n    in >> path;\n    value.setPath(path);\n\n    bool hasKey = false;\n    in >> hasKey;\n    if (hasKey) {\n#ifdef WITH_QCA_ENCRYPTION\n        if (!Encryption::initialize()) {\n            qCCritical(serializeCategory) << \"Failed to initialize encryption for DataFile deserialization\";\n            in.setStatus(QDataStream::ReadCorruptData);\n            return in;\n        }\n\n        QByteArray dekBytes;\n        in >> dekBytes;\n\n        Encryption::EncryptionKey key;\n        if (!key.importDEK(dekBytes)) {\n            qCCritical(serializeCategory) << \"Failed to import encryption key for DataFile\";\n            in.setStatus(QDataStream::ReadCorruptData);\n            return in;\n        }\n\n        value.setEncryptionKey(key);\n#else\n        qCCritical(serializeCategory) << \"Cannot deserialize encrypted DataFile: encryption support not compiled\";\n        in.setStatus(QDataStream::ReadCorruptData);\n#endif\n    }\n    return in;\n}\n\nnamespace {\n\nconst QLatin1String mimeFilePrefix(\"FILE:\");\n\ntemplate <typename T>\nbool readOrError(QDataStream *out, T *value, const char *error)\n{\n    *out >> *value;\n    if ( out->status() == QDataStream::Ok )\n        return true;\n\n    qCCritical(serializeCategory) << \"Corrupted data:\" << error;\n    return false;\n}\n\nconst std::unordered_map<int, QString> &idToMime()\n{\n    static const std::unordered_map<int, QString> map({\n        {1, QLatin1String(mimeWindowTitle)},\n        {2, QLatin1String(mimeItemNotes)},\n\n        {3, QLatin1String(COPYQ_MIME_PREFIX)},\n\n        {4, QLatin1String(mimeText)},\n        {5, QLatin1String(mimeHtml)},\n        {6, QLatin1String(mimeUriList)},\n\n        {7, QLatin1String(\"image/\")},\n        {8, QLatin1String(\"text/\")},\n        {9, QLatin1String(\"application/\")},\n        {10, QLatin1String(\"audio/\")},\n        {11, QLatin1String(\"video/\")}\n    });\n    return map;\n}\n\nQString decompressMime(QDataStream *out)\n{\n    QString mime;\n    if ( !readOrError(out, &mime, \"Failed to read MIME type\") )\n        return QString();\n\n    bool ok;\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    const int id = mime.midRef(0, 1).toInt(&ok, 16);\n#else\n    const int id = QStringView(mime).mid(0, 1).toInt(&ok, 16);\n#endif\n    if (!ok) {\n        qCCritical(serializeCategory) << \"Corrupted data: Failed to parse MIME type ID\";\n        out->setStatus(QDataStream::ReadCorruptData);\n        return QString();\n    }\n\n    if (id == 0)\n        return mime.mid(1);\n\n    const auto it = idToMime().find(id);\n    if ( it != std::end(idToMime()) )\n        return it->second + mime.mid(1);\n\n    qCCritical(serializeCategory) << \"Corrupted data: Failed to decompress MIME type\";\n    out->setStatus(QDataStream::ReadCorruptData);\n    return QString();\n}\n\nQString compressMime(const QString &mime)\n{\n    for (const auto &idMime : idToMime()) {\n        if ( mime.startsWith(idMime.second) ) {\n            const auto prefixSize = idMime.second.size();\n            return QString::number(idMime.first, 16) + mime.mid(prefixSize);\n        }\n    }\n\n    return \"0\" + mime;\n}\n\nbool deserializeDataV2(QDataStream *out, QVariantMap *data, const Encryption::EncryptionKey *encryptionKey = nullptr)\n{\n#ifndef WITH_QCA_ENCRYPTION\n    Q_UNUSED(encryptionKey)\n#endif\n\n    qint32 size;\n    if ( !readOrError(out, &size, \"Failed to read size (v2)\") )\n        return false;\n\n    QByteArray tmpBytes;\n    bool compress = false;\n    for (qint32 i = 0; i < size; ++i) {\n        QString mime = decompressMime(out);\n        if ( out->status() != QDataStream::Ok )\n            return false;\n\n        const bool hasDataFile = mime.startsWith(mimeFilePrefix);\n\n        if ( !readOrError(out, &compress, \"Failed to read compression flag (v2)\") )\n            return false;\n\n        if (hasDataFile) {\n            mime = mime.mid( mimeFilePrefix.size() );\n\n            // When encryption key is provided, data file info includes the encryption key\n            // Otherwise, it's just the path for backward compatibility\n            if (encryptionKey && encryptionKey->isValid()) {\n                DataFile dataFile;\n                *out >> dataFile;\n                if (out->status() != QDataStream::Ok) {\n                    qCCritical(serializeCategory) << \"Failed to deserialize encrypted DataFile\";\n                    return false;\n                }\n                const QVariant value = QVariant::fromValue(dataFile);\n                Q_ASSERT(value.canConvert<QByteArray>());\n                data->insert(mime, value);\n            } else {\n                if ( !readOrError(out, &tmpBytes, \"Failed to read item data (v2)\") )\n                    return false;\n\n                const QString path = QString::fromUtf8(tmpBytes);\n                const QVariant value = QVariant::fromValue(DataFile(path));\n                Q_ASSERT(value.canConvert<QByteArray>());\n                Q_ASSERT(value.value<DataFile>().path() == path);\n                data->insert(mime, value);\n            }\n        } else {\n            if ( !readOrError(out, &tmpBytes, \"Failed to read item data (v2)\") )\n                return false;\n\n            if (compress) {\n                tmpBytes = qUncompress(tmpBytes);\n                if ( tmpBytes.isEmpty() ) {\n                    qCCritical(serializeCategory) << \"Corrupted data: Failed to decompress data (v2)\";\n                    out->setStatus(QDataStream::ReadCorruptData);\n                    return false;\n                }\n            }\n\n            data->insert(mime, tmpBytes);\n        }\n    }\n\n    return out->status() == QDataStream::Ok;\n}\n\nbool deserializeDataV3(QDataStream *out, QVariantMap *data, const Encryption::EncryptionKey *encryptionKey = nullptr)\n{\n#ifdef WITH_QCA_ENCRYPTION\n    qint32 encryptedSize;\n    if ( !readOrError(out, &encryptedSize, \"Failed to read encrypted data size (v3)\") )\n        return false;\n\n    if (encryptedSize < 0 || encryptedSize > 100'000'000) {\n        qCCritical(serializeCategory) << \"Corrupted data: Invalid encrypted data size (v3)\";\n        out->setStatus(QDataStream::ReadCorruptData);\n        return false;\n    }\n\n    QByteArray encryptedBytes;\n    if ( !readOrError(out, &encryptedBytes, \"Failed to read encrypted data (v3)\") )\n        return false;\n\n    if ( encryptedBytes.size() != encryptedSize ) {\n        qCCritical(serializeCategory) << \"Corrupted data: Encrypted data size mismatch (v3)\";\n        out->setStatus(QDataStream::ReadCorruptData);\n        return false;\n    }\n\n    if ( !encryptionKey || !encryptionKey->isValid() ) {\n        qCCritical(serializeCategory) << \"Cannot decrypt data (v3): no valid encryption key provided\";\n        out->setStatus(QDataStream::ReadCorruptData);\n        return false;\n    }\n\n    const QByteArray decryptedBytes = Encryption::decrypt(\n        encryptedBytes,\n        *encryptionKey\n    );\n\n    if ( decryptedBytes.isEmpty() ) {\n        qCCritical(serializeCategory) << \"Failed to decrypt data (v3) - wrong password or corrupted data\";\n        out->setStatus(QDataStream::ReadCorruptData);\n        return false;\n    }\n\n    QDataStream decryptedStream(decryptedBytes);\n    decryptedStream.setVersion(dataStreamVersionForV3);\n    return deserializeDataV2(&decryptedStream, data, encryptionKey);\n#else\n    Q_UNUSED(out)\n    Q_UNUSED(data)\n    Q_UNUSED(encryptionKey)\n    qCCritical(serializeCategory) << \"Cannot deserialize encrypted data: encryption support not compiled\";\n    out->setStatus(QDataStream::ReadCorruptData);\n    return false;\n#endif\n}\n\nQString dataFilePath(const QByteArray &bytes, bool create = false)\n{\n    QDir dir(itemDataPath());\n    QCryptographicHash hash(QCryptographicHash::Sha256);\n    hash.addData(QByteArrayLiteral(\"copyq_salt\"));\n    hash.addData(bytes);\n    const QString sha = QString::fromUtf8( hash.result().toHex() );\n    const QString subpath = QStringLiteral(\"%1/%2/%3\").arg(\n            sha.mid(0, 16),\n            sha.mid(16, 16),\n            sha.mid(32, 16)\n    );\n    if (create && !dir.mkpath(subpath)) {\n        qCCritical(serializeCategory) << \"Failed to create data directory:\"\n            << dir.absoluteFilePath(subpath);\n        return QString();\n    }\n    return dir.absoluteFilePath(\n            QStringLiteral(\"%1/%2.dat\").arg(subpath, sha.mid(48)) );\n}\n\nvoid serializeDataItems(QDataStream *stream, const QVariantMap &data, int itemDataThreshold, const Encryption::EncryptionKey *encryptionKey = nullptr)\n{\n    const qint32 size = data.size();\n    *stream << size;\n\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        const QString &mime = it.key();\n        const QVariant &value = it.value();\n\n        const DataFile dataFile = value.value<DataFile>();\n        const int dataLength = dataFile.path().isEmpty()\n            ? value.toByteArray().size() : dataFile.size();\n\n        if ( (itemDataThreshold >= 0 && dataLength > itemDataThreshold) || mime.startsWith(mimeFilePrefix) ) {\n            QString path = dataFile.path();\n            const bool shouldEncrypt = encryptionKey && encryptionKey->isValid();\n#ifdef WITH_QCA_ENCRYPTION\n            const bool hasEncryptedDataFile = dataFile.encryptionKey().isValid();\n#else\n            const bool hasEncryptedDataFile = false;\n#endif\n\n            auto writeDataFile = [&](const QByteArray &bytes) -> bool {\n                path = dataFilePath(bytes, true);\n                if ( path.isEmpty() ) {\n                    stream->setStatus(QDataStream::WriteFailed);\n                    return false;\n                }\n\n                if ( !QFile::exists(path) ) {\n                    QSaveFile f(path);\n                    f.setDirectWriteFallback(false);\n                    if ( !f.open(QIODevice::WriteOnly) || !f.write(bytes) || !f.commit() ) {\n                        qCCritical(serializeCategory) << \"Failed to create data file\" << path << \":\"\n                            << f.errorString();\n                        stream->setStatus(QDataStream::WriteFailed);\n                        f.cancelWriting();\n                        return false;\n                    }\n                }\n\n                return true;\n            };\n\n            if (shouldEncrypt\n#ifdef WITH_QCA_ENCRYPTION\n                && (!hasEncryptedDataFile || path.isEmpty())\n#endif\n            ) {\n                QByteArray bytes = value.toByteArray();\n\n                // Encrypt data if encryption key is provided\n                const QByteArray encryptedBytes = Encryption::encrypt(bytes, *encryptionKey);\n                if ( encryptedBytes.isEmpty() ) {\n                    qCCritical(serializeCategory) << \"Failed to encrypt data file content\";\n                    stream->setStatus(QDataStream::WriteFailed);\n                    return;\n                }\n                bytes = encryptedBytes;\n\n                if (!writeDataFile(bytes))\n                    return;\n            } else if (!shouldEncrypt && hasEncryptedDataFile) {\n                const QByteArray bytes = value.toByteArray();\n                if (!writeDataFile(bytes))\n                    return;\n            } else if (path.isEmpty()) {\n                QByteArray bytes = value.toByteArray();\n                if (!writeDataFile(bytes))\n                    return;\n            }\n\n            // Always use FILE prefix in MIME type\n            if ( mime.startsWith(mimeFilePrefix) )\n                *stream << compressMime(mime);\n            else\n                *stream << compressMime(mimeFilePrefix + mime);\n\n            *stream << /* compressData = */ false;\n\n            // When encryption is enabled, serialize DataFile with encryption key\n            // Otherwise, serialize just the path for backward compatibility\n            if (shouldEncrypt) {\n                const DataFile df(path, *encryptionKey);\n                *stream << df;\n            } else {\n                *stream << path.toUtf8();\n            }\n        } else {\n            const QByteArray bytes = value.toByteArray();\n            *stream << compressMime(mime)\n                    << /* compressData = */ false\n                    << bytes;\n        }\n    }\n}\n\n} // namespace\n\nvoid registerDataFileConverter()\n{\n    QMetaType::registerConverter(&DataFile::readAll);\n    QMetaType::registerConverter(&DataFile::toString);\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    qRegisterMetaTypeStreamOperators<DataFile>(\"DataFile\");\n#else\n    qRegisterMetaType<DataFile>(\"DataFile\");\n#endif\n}\n\nvoid serializeData(QDataStream *stream, const QVariantMap &data, int itemDataThreshold, const Encryption::EncryptionKey *encryptionKey)\n{\n#ifdef WITH_QCA_ENCRYPTION\n    // Check if encryption should be used\n    // Use encryption if a valid key is provided, or if encryption is enabled and we have a key\n    const bool useEncryption = encryptionKey && encryptionKey->isValid();\n\n    if (useEncryption) {\n        // Use version -3 for encrypted data\n        *stream << static_cast<qint32>(-3);\n\n        // Serialize data to a temporary buffer using V2 format\n        QByteArray unencryptedBytes;\n        {\n            QDataStream tempStream(&unencryptedBytes, QIODevice::WriteOnly);\n            tempStream.setVersion(dataStreamVersionForV3);\n            serializeDataItems(&tempStream, data, itemDataThreshold, encryptionKey);\n            if (tempStream.status() != QDataStream::Ok) {\n                stream->setStatus(tempStream.status());\n                return;\n            }\n        }\n\n        const QByteArray encryptedBytes = Encryption::encrypt(\n            unencryptedBytes,\n            *encryptionKey\n        );\n\n        if ( encryptedBytes.isEmpty() ) {\n            qCCritical(serializeCategory) << \"Failed to encrypt data\";\n            stream->setStatus(QDataStream::WriteFailed);\n            return;\n        }\n\n        *stream << static_cast<qint32>(encryptedBytes.size());\n        *stream << encryptedBytes;\n        return;\n    }\n#else\n    Q_UNUSED(encryptionKey)\n#endif\n\n    // Use version -2 for unencrypted data (original format)\n    *stream << static_cast<qint32>(-2);\n    serializeDataItems(stream, data, itemDataThreshold);\n}\n\nbool deserializeData(QDataStream *stream, QVariantMap *data, const Encryption::EncryptionKey *encryptionKey)\n{\n    try {\n        qint32 length;\n        if ( !readOrError(stream, &length, \"Failed to read length\") )\n            return false;\n\n        if (length == -3)\n            return deserializeDataV3(stream, data, encryptionKey);\n\n        if (length == -2)\n            return deserializeDataV2(stream, data, encryptionKey);\n\n        if (length < 0) {\n            qCCritical(serializeCategory) << \"Corrupted data: Invalid length (v1)\";\n            stream->setStatus(QDataStream::ReadCorruptData);\n            return false;\n        }\n\n        // Deprecated format.\n        // TODO: Data should be saved again in new format.\n        QString mime;\n        QByteArray tmpBytes;\n        for (qint32 i = 0; i < length; ++i) {\n            if ( !readOrError(stream, &mime, \"Failed to read MIME type (v1)\") )\n                return false;\n\n            if ( !readOrError(stream, &tmpBytes, \"Failed to read item data (v1)\") )\n                return false;\n\n            if( !tmpBytes.isEmpty() ) {\n                tmpBytes = qUncompress(tmpBytes);\n                if ( tmpBytes.isEmpty() ) {\n                    qCCritical(serializeCategory) << \"Corrupted data: Failed to decompress data (v1)\";\n                    stream->setStatus(QDataStream::ReadCorruptData);\n                    return false;\n                }\n            }\n            data->insert(mime, tmpBytes);\n        }\n    } catch (const std::exception &e) {\n        qCCritical(serializeCategory) << \"Data deserialization failed:\" << e.what();\n        stream->setStatus(QDataStream::ReadCorruptData);\n        return false;\n    }\n\n    return stream->status() == QDataStream::Ok;\n}\n\nQByteArray serializeData(const QVariantMap &data)\n{\n    QByteArray bytes;\n    QDataStream out(&bytes, QIODevice::WriteOnly);\n    serializeData(&out, data);\n    return bytes;\n}\n\nbool deserializeData(QVariantMap *data, const QByteArray &bytes, const Encryption::EncryptionKey *encryptionKey)\n{\n    QDataStream out(bytes);\n    return deserializeData(&out, data, encryptionKey);\n}\n\nbool serializeData(const QAbstractItemModel &model, QDataStream *stream, int itemDataThreshold, const Encryption::EncryptionKey *encryptionKey)\n{\n    qint32 length = model.rowCount();\n    *stream << length;\n\n    for(qint32 i = 0; i < length && stream->status() == QDataStream::Ok; ++i) {\n        const QVariantMap data = model.data(model.index(i, 0), contentType::data).toMap();\n        serializeData(stream, data, itemDataThreshold, encryptionKey);\n    }\n\n    return stream->status() == QDataStream::Ok;\n}\n\nbool deserializeData(QAbstractItemModel *model, QDataStream *stream, const Encryption::EncryptionKey *encryptionKey)\n{\n    qint32 length;\n    if ( !readOrError(stream, &length, \"Failed to read length\") )\n        return false;\n\n    if (length < 0) {\n        qCCritical(serializeCategory) << \"Corrupted data: Invalid length\";\n        stream->setStatus(QDataStream::ReadCorruptData);\n        return false;\n    }\n\n    // Limit the loaded number of items to model's maximum.\n    length = qMin(length, MAX_ITEMS) - model->rowCount();\n\n    if ( length != 0 && !model->insertRows(0, length) )\n        return false;\n\n    for(qint32 i = 0; i < length; ++i) {\n        QVariantMap data;\n        if ( !deserializeData(stream, &data, encryptionKey) ) {\n            model->removeRows(i, length);\n            return false;\n        }\n\n        if ( !model->setData(model->index(i, 0), data, contentType::data) ) {\n            qCCritical(serializeCategory) << \"Failed to set model data\";\n            stream->setStatus(QDataStream::ReadCorruptData);\n            return false;\n        }\n    }\n\n    return stream->status() == QDataStream::Ok;\n}\n\nbool serializeData(const QAbstractItemModel &model, QIODevice *file, int itemDataThreshold, const Encryption::EncryptionKey *encryptionKey)\n{\n    QDataStream stream(file);\n    stream.setVersion(dataStreamVersionDefault);\n    return serializeData(model, &stream, itemDataThreshold, encryptionKey);\n}\n\nbool deserializeData(QAbstractItemModel *model, QIODevice *file, const Encryption::EncryptionKey *encryptionKey)\n{\n    QDataStream stream(file);\n    stream.setVersion(dataStreamVersionDefault);\n    return deserializeData(model, &stream, encryptionKey);\n}\n\nbool itemDataFiles(QIODevice *file, QStringList *files, const Encryption::EncryptionKey *encryptionKey)\n{\n#ifndef WITH_QCA_ENCRYPTION\n    Q_UNUSED(encryptionKey)\n#endif\n\n    QDataStream out(file);\n    out.setVersion(dataStreamVersionDefault);\n\n    qint32 length;\n    if ( !readOrError(&out, &length, \"Failed to read length\") )\n        return false;\n\n    if (length < 0) {\n        qCCritical(serializeCategory) << \"Corrupted data: Invalid length\";\n        return false;\n    }\n\n    for(qint32 i = 0; i < length; ++i) {\n        qint32 version;\n        if ( !readOrError(&out, &version, \"Failed to read version\") )\n            return false;\n\n        if (version == -3) {\n#ifdef WITH_QCA_ENCRYPTION\n            // Encrypted data - decrypt and enumerate files\n            qint32 encryptedSize;\n            if ( !readOrError(&out, &encryptedSize, \"Failed to read encrypted size\") )\n                return false;\n            QByteArray encryptedBytes;\n            if ( !readOrError(&out, &encryptedBytes, \"Failed to read encrypted data\") )\n                return false;\n\n            if ( !encryptionKey || !encryptionKey->isValid() ) {\n                qCWarning(serializeCategory)\n                    << \"Cannot enumerate encrypted item files: missing valid encryption key\";\n                return false;\n            }\n\n            const QByteArray decryptedBytes = Encryption::decrypt(encryptedBytes, *encryptionKey);\n            if ( decryptedBytes.isEmpty() ) {\n                qCWarning(serializeCategory)\n                    << \"Cannot enumerate encrypted item files: decryption failed\";\n                return false;\n            }\n\n            // Parse decrypted data to extract file paths\n            QDataStream decryptedStream(decryptedBytes);\n            decryptedStream.setVersion(dataStreamVersionForV3);\n\n            qint32 size;\n            if ( !readOrError(&decryptedStream, &size, \"Failed to read size (v3)\") )\n                continue;\n\n            for (qint32 j = 0; j < size; ++j) {\n                QString mime = decompressMime(&decryptedStream);\n                if ( decryptedStream.status() != QDataStream::Ok )\n                    continue;\n\n                const bool hasDataFile = mime.startsWith(mimeFilePrefix);\n\n                bool compress;\n                if ( !readOrError(&decryptedStream, &compress, \"Failed to read compression flag (v3)\") )\n                    continue;\n\n                if (hasDataFile) {\n                    // For encrypted data files, we need to deserialize the DataFile object\n                    DataFile dataFile;\n                    decryptedStream >> dataFile;\n                    if (decryptedStream.status() == QDataStream::Ok && !dataFile.path().isEmpty()) {\n                        files->append(dataFile.path());\n                    }\n                } else {\n                    // Skip non-file data\n                    QByteArray tmpBytes;\n                    if ( !readOrError(&decryptedStream, &tmpBytes, \"Failed to read item data (v3)\") )\n                        continue;\n                }\n            }\n            continue;\n#else\n            // Cannot handle encrypted data without QCA - skip\n            qint32 encryptedSize;\n            if ( !readOrError(&out, &encryptedSize, \"Failed to read encrypted size\") )\n                return false;\n            QByteArray encryptedBytes;\n            if ( !readOrError(&out, &encryptedBytes, \"Failed to read encrypted data\") )\n                return false;\n            continue;\n#endif\n        }\n\n        if (version != -2)\n            return true;\n\n        qint32 size;\n        if ( !readOrError(&out, &size, \"Failed to read size (v2)\") )\n            return false;\n\n        QByteArray tmpBytes;\n        bool compress;\n        for (qint32 j = 0; j < size; ++j) {\n            QString mime = decompressMime(&out);\n            if ( out.status() != QDataStream::Ok )\n                return false;\n\n            const bool hasDataFile = mime.startsWith(mimeFilePrefix);\n\n            if ( !readOrError(&out, &compress, \"Failed to read compression flag (v2)\") )\n                return false;\n\n            if ( !readOrError(&out, &tmpBytes, \"Failed to read item data (v2)\") )\n                return false;\n\n            if (hasDataFile) {\n                const QString path = QString::fromUtf8(tmpBytes);\n                files->append(path);\n            }\n        }\n    }\n\n    return out.status() == QDataStream::Ok;\n}\n\nQString itemDataPath()\n{\n    return qApp->property(\"CopyQ_item_data_path\").toString();\n}\n\nqint64 estimateDataSize(const QVariantMap &data)\n{\n    qint64 totalSize = 0;\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        totalSize += it.key().size() * 2; // QString is UTF-16\n        const QVariant &value = it.value();\n        const DataFile dataFile = value.value<DataFile>();\n        if (!dataFile.path().isEmpty()) {\n            totalSize += dataFile.size(); // QFileInfo::size(), no data load\n        } else {\n            totalSize += value.toByteArray().size();\n        }\n    }\n    return totalSize;\n}\n"
  },
  {
    "path": "src/item/serialize.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include <QByteArray>\n#include <QtContainerFwd>\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n#include <QVariantMap>\n#endif\n\nclass QAbstractItemModel;\nclass QDataStream;\nclass QIODevice;\n\nnamespace Encryption {\n    class EncryptionKey;\n}\n\nclass DataFile;\nQDataStream &operator<<(QDataStream &out, DataFile value);\nQDataStream &operator>>(QDataStream &in, DataFile &value);\nvoid registerDataFileConverter();\n\nvoid serializeData(QDataStream *stream, const QVariantMap &data, int itemDataThreshold = -1, const Encryption::EncryptionKey *encryptionKey = nullptr);\nbool deserializeData(QDataStream *stream, QVariantMap *data, const Encryption::EncryptionKey *encryptionKey = nullptr);\nQByteArray serializeData(const QVariantMap &data);\nbool deserializeData(QVariantMap *data, const QByteArray &bytes, const Encryption::EncryptionKey *encryptionKey = nullptr);\n\nbool serializeData(const QAbstractItemModel &model, QDataStream *stream, int itemDataThreshold = -1, const Encryption::EncryptionKey *encryptionKey = nullptr);\nbool deserializeData(QAbstractItemModel *model, QDataStream *stream, const Encryption::EncryptionKey *encryptionKey = nullptr);\nbool serializeData(const QAbstractItemModel &model, QIODevice *file, int itemDataThreshold = -1, const Encryption::EncryptionKey *encryptionKey = nullptr);\nbool deserializeData(QAbstractItemModel *model, QIODevice *file, const Encryption::EncryptionKey *encryptionKey = nullptr);\n\nQString itemDataPath();\nbool itemDataFiles(QIODevice *file, QStringList *files, const Encryption::EncryptionKey *encryptionKey = nullptr);\n\nqint64 estimateDataSize(const QVariantMap &data);\n"
  },
  {
    "path": "src/knotifications5/copyq.notifyrc",
    "content": "[Global]\nIconName=copyq\nComment=CopyQ Clipboard Manager\nName=CopyQ\n\n[Event/generic]\nName=Generic event\nAction=Popup\n"
  },
  {
    "path": "src/main.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"app/app.h\"\n#include \"app/applicationexceptionhandler.h\"\n#include \"app/clipboardclient.h\"\n#include \"app/clipboardserver.h\"\n#include \"common/commandstatus.h\"\n#include \"common/log.h\"\n#include \"common/messagehandlerforqt.h\"\n#include \"common/textdata.h\"\n#include \"platform/platformnativeinterface.h\"\n#ifdef Q_OS_UNIX\n#   include \"platform/unix/unixsignalhandler.h\"\n#endif\n#include \"scriptable/scriptable.h\"\n\n#include <QApplication>\n#include <QFile>\n#include <QJSEngine>\n#include <QProcess>\n#include <QSettings>\n\n#include <exception>\n\nQ_DECLARE_METATYPE(QByteArray*)\n\nnamespace {\n\nenum class AppType {\n    Version,\n    Help,\n    Info,\n    Logs,\n    Server,\n    StartServerInBackground,\n    Client\n};\n\nstruct AppArguments {\n    AppType appType;\n    QString sessionName;\n    QStringList arguments;\n};\n\nint evaluate(\n        const QString &functionName,\n        const QStringList &arguments, int argc, char **argv,\n        const QString &sessionName)\n{\n    App app( platformNativeInterface()->createConsoleApplication(argc, argv), sessionName );\n\n    QJSEngine engine;\n    Scriptable scriptable(&engine, nullptr, nullptr);\n\n    QJSValue function = engine.globalObject().property(functionName);\n    QJSValueList functionArguments;\n\n    functionArguments.reserve( arguments.size() );\n    for (const auto &argument : arguments)\n        functionArguments.append(argument);\n\n    const auto result = function.call(functionArguments);\n    const bool hasUncaughtException = result.isError() || scriptable.hasUncaughtException();\n\n    const auto output = scriptable.serializeScriptValue(result);\n    if ( !output.isEmpty() ) {\n        QFile f;\n        if ( f.open(hasUncaughtException ? stderr : stdout, QIODevice::WriteOnly) ) {\n            f.write(output);\n            if ( !output.endsWith(\"\\n\") )\n                f.write(\"\\n\");\n            f.close();\n        }\n    }\n\n    const int exitCode = hasUncaughtException ? CommandException : 0;\n    app.exit(exitCode);\n    return exitCode;\n}\n\nbool containsOnlyValidCharacters(const QString &sessionName)\n{\n    for (const auto &c : sessionName) {\n        if ( !c.isLetterOrNumber() && c != '-' && c != '_' )\n            return false;\n    }\n\n    return true;\n}\n\nbool isValidSessionName(const QString &sessionName)\n{\n    return !sessionName.isNull() &&\n           sessionName.length() <= 16 &&\n           containsOnlyValidCharacters(sessionName);\n}\n\nQString restoreSessionName(const QString &sessionId)\n{\n    const QSettings settings(\n        QSettings::IniFormat,\n        QSettings::UserScope,\n        QStringLiteral(\"copyq\"),\n        QStringLiteral(\"copyq_no_session\"));\n    const auto sessionNameKey = QLatin1String(\"session_\") + sessionId;\n    const auto sessionName = settings.value(sessionNameKey).toString();\n    return sessionName;\n}\n\nint startServer(int argc, char *argv[], QString sessionName)\n{\n    // By default, enable automatic screen scaling in Qt for high-DPI displays\n    // (this works better at least in Windows).\n    if ( qEnvironmentVariableIsEmpty(\"QT_AUTO_SCREEN_SCALE_FACTOR\") )\n        qputenv(\"QT_AUTO_SCREEN_SCALE_FACTOR\", QByteArrayLiteral(\"1\"));\n\n    auto qapp = platformNativeInterface()->createServerApplication(argc, argv);\n    if ( qapp->isSessionRestored() ) {\n        const auto sessionId = qapp->sessionId();\n        sessionName = restoreSessionName(sessionId);\n        COPYQ_LOG( QStringLiteral(\"Restoring session ID \\\"%1\\\", session name \\\"%2\\\"\")\n                   .arg(sessionId, sessionName) );\n        if ( !sessionName.isEmpty() && !isValidSessionName(sessionName) ) {\n            log(\"Failed to restore session name\", LogError);\n            return 2;\n        }\n    }\n\n    ClipboardServer app(qapp, sessionName);\n    return app.exec();\n}\n\nvoid startServerInBackground(const QString &applicationPath, QString sessionName)\n{\n    const QStringList arguments{QStringLiteral(\"-s\"), sessionName};\n    const bool started = QProcess::startDetached(applicationPath, arguments);\n\n    if (!started)\n        log(\"Failed to start the server\", LogError);\n}\n\nint startClient(int argc, char *argv[], const QStringList &arguments, const QString &sessionName)\n{\n    ClipboardClient app(argc, argv, arguments, sessionName);\n    return app.exec();\n}\n\nbool needsHelp(const QString &arg)\n{\n    return arg == QLatin1String(\"-h\") ||\n           arg == QLatin1String(\"--help\") ||\n           arg == QLatin1String(\"help\");\n}\n\nbool needsVersion(const QString &arg)\n{\n    return arg == QLatin1String(\"-v\") ||\n           arg == QLatin1String(\"--version\") ||\n           arg == QLatin1String(\"version\");\n}\n\nbool needsInfo(const QString &arg)\n{\n    return arg == QLatin1String(\"--info\") ||\n           arg == QLatin1String(\"info\");\n}\n\nbool needsLogs(const QString &arg)\n{\n    return arg == QLatin1String(\"--logs\") ||\n           arg == QLatin1String(\"logs\");\n}\n\nbool needsStartServer(const QString &arg)\n{\n    return arg == QLatin1String(\"--start-server\");\n}\n\nQString takeSessionName(QStringList &arguments)\n{\n    if (arguments.size() > 0) {\n        if ( arguments[0] == QLatin1String(\"-s\")\n          || arguments[0] == QLatin1String(\"--session\")\n          || arguments[0] == QLatin1String(\"session\") )\n        {\n            arguments.removeAt(0);\n            return arguments.takeAt(0);\n        }\n\n        if ( arguments[0].startsWith(QLatin1String(\"--session=\")) ) {\n            const QString sessionArg = arguments.takeAt(0);\n            return sessionArg.mid(std::char_traits<char>::length(\"--session=\"));\n        }\n\n        // Skip session arguments passed from session manager.\n        if (arguments.size() == 2 && arguments[0] == QLatin1String(\"-session\"))\n            arguments.clear();\n    }\n\n    return qEnvironmentVariable(\"COPYQ_SESSION_NAME\", QStringLiteral(\"\"));\n}\n\nAppArguments parseArguments(int argc, char **argv)\n{\n    QStringList arguments =\n        platformNativeInterface()->getCommandLineArguments(argc, argv);\n\n    const QString sessionName = takeSessionName(arguments);\n\n    if (arguments.isEmpty())\n        return {AppType::Server, sessionName, {}};\n\n    const QString &arg = arguments[0];\n\n    if ( needsStartServer(arg) )\n        return {AppType::StartServerInBackground, sessionName, arguments.mid(1)};\n\n    if ( needsVersion(arg) )\n        return {AppType::Version, sessionName, arguments.mid(1)};\n\n    if ( needsHelp(arg) )\n        return {AppType::Help, sessionName, arguments.mid(1)};\n\n    if ( needsInfo(arg) )\n        return {AppType::Info, sessionName, arguments.mid(1)};\n\n    if ( needsLogs(arg) )\n        return {AppType::Logs, sessionName, arguments.mid(1)};\n\n    // If argument was specified and server is running\n    // then run this process as client.\n    return {AppType::Client, sessionName, arguments};\n}\n\n/// Return log label for client based on the command called if available\n/// Examples:\n/// - cmd/monitorClipboard\n/// - cmd/synchronizeToSelection\n/// - cmd/copy\nQByteArray logLabelForClient(const QStringList &arguments)\n{\n    int i = 0;\n    for (; i < arguments.size(); ++i) {\n        const auto &arg = arguments[i];\n        if (arg == QLatin1String(\"tab\") || arg == QLatin1String(\"separator\")) {\n            ++i;\n            break;\n        }\n        if (!arg.startsWith('-') && arg != QLatin1String(\"eval\"))\n            break;\n    }\n    if (i < arguments.size()) {\n        const auto &command = arguments[i];\n        for (const auto &c : command) {\n            if ( !c.isLetterOrNumber() && c != '_' )\n                return \"Client\";\n        }\n        return \"cmd/\" + command.toUtf8();\n    }\n    return \"Client\";\n}\n\nQByteArray logLabelForType(AppType appType, const QStringList &arguments)\n{\n    switch (appType) {\n    case AppType::Server:\n        return \"Server\";\n    case AppType::Client:\n        return logLabelForClient(arguments);\n    case AppType::StartServerInBackground:\n        return logLabelForClient(arguments);\n    default:\n        return \"Prompt\";\n    }\n}\n\nint startApplication(int argc, char **argv)\n{\n    setSessionName(QString());\n\n    const AppArguments args = parseArguments(argc, argv);\n\n    setLogLabel( logLabelForType(args.appType, args.arguments) );\n    installMessageHandlerForQt();\n\n#ifdef Q_OS_UNIX\n    if ( !initUnixSignalHandler() )\n        log(\"Failed to create handler for Unix signals!\", LogError);\n#endif\n\n    if ( !isValidSessionName(args.sessionName) ) {\n        log( QObject::tr(\"Session name must contain at most 16 characters\\n\"\n                         \"which can be letters, digits, '-' or '_'!\"), LogError );\n        return 2;\n    }\n\n    if ( !args.sessionName.isEmpty() )\n        setSessionName(args.sessionName);\n\n    switch (args.appType) {\n    // If server hasn't been run yet and no argument were specified\n    // then run this process as server.\n    case AppType::Server:\n        return startServer(argc, argv, args.sessionName);\n\n    // If argument was specified and server is running\n    // then run this process as client.\n    case AppType::Client:\n        return startClient(argc, argv, args.arguments, args.sessionName);\n\n    case AppType::StartServerInBackground:\n        startServerInBackground( QString::fromUtf8(argv[0]), args.sessionName );\n        if (args.arguments.isEmpty())\n            return 0;\n        return startClient(argc, argv, args.arguments, args.sessionName);\n\n    case AppType::Version:\n        return evaluate( QStringLiteral(\"version\"), {}, argc, argv, args.sessionName );\n\n    case AppType::Help:\n        return evaluate( QStringLiteral(\"help\"), args.arguments, argc, argv, args.sessionName );\n\n    case AppType::Info:\n        return evaluate( QStringLiteral(\"info\"), args.arguments, argc, argv, args.sessionName );\n\n    case AppType::Logs:\n        return evaluate( QStringLiteral(\"logs\"), args.arguments, argc, argv, args.sessionName );\n    }\n    return -1;\n}\n\n} // namespace\n\nint main(int argc, char **argv)\n{\n    try {\n        return startApplication(argc, argv);\n    } catch (const std::exception &e) {\n        logException(e.what());\n        throw;\n    } catch (...) {\n        logException();\n        throw;\n    }\n}\n"
  },
  {
    "path": "src/miniaudio/CMakeLists.txt",
    "content": "# Build miniaudio implementation without coverage instrumentation.\n#\n# GCC's --coverage flag cannot be negated by -fno-profile-arcs or\n# -fno-test-coverage — it acts as an independent meta-flag.  The only way\n# to exclude a source file from coverage is to compile it in a separate\n# directory scope where CMAKE_CXX_FLAGS has been stripped of --coverage\n# (and the related -fprofile-* / -ftest-coverage flags).\n#\n# This matters because coverage instrumentation changes threading behaviour\n# inside miniaudio's PulseAudio backend enough to trigger a deadlock in\n# pa_mainloop_iterate during ma_engine_init.\n\n# Strip coverage-related flags from this scope's CMAKE_CXX_FLAGS.\nstring(REPLACE \"--coverage\"         \"\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\nstring(REPLACE \"-fprofile-arcs\"     \"\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\nstring(REPLACE \"-ftest-coverage\"    \"\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\nstring(REPLACE \"-fprofile-abs-path\" \"\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\nstring(REGEX REPLACE \"-fprofile-update=[^ ]*\" \"\" CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\")\n\nadd_library(miniaudio_impl OBJECT miniaudio_impl.cpp)\ntarget_include_directories(miniaudio_impl SYSTEM PRIVATE \"${MINIAUDIO_INCLUDE_DIR}\")\n\n# Suppress all warnings — this is third-party code.\nif (MSVC)\n    target_compile_options(miniaudio_impl PRIVATE /W0)\nelse()\n    target_compile_options(miniaudio_impl PRIVATE -w)\nendif()\n"
  },
  {
    "path": "src/miniaudio/miniaudio_impl.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n// Compile miniaudio implementation as part of CopyQ.\n// The miniaudio.h header is provided by the system (e.g. miniaudio-devel).\n#define MINIAUDIO_IMPLEMENTATION\n#include <miniaudio.h>\n"
  },
  {
    "path": "src/notifications.cmake",
    "content": "OPTION(WITH_NATIVE_NOTIFICATIONS \"Build with native notification support\" ON)\n\nif (WITH_NATIVE_NOTIFICATIONS)\n    set(KF5_MIN_VERSION \"5.18.0\")\n\n    find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE)\n    list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})\n\n    if (WITH_QT6)\n        set(KF6_MIN_VERSION \"5.248.0\")\n        find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS Notifications StatusNotifierItem)\n        list(APPEND copyq_LIBRARIES KF6::Notifications KF6::StatusNotifierItem)\n    else()\n        find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Notifications)\n        list(APPEND copyq_LIBRARIES KF5::Notifications)\n    endif()\n\n    list(APPEND copyq_SOURCES gui/notificationnative/notificationnative.cpp)\n\n    list(APPEND copyq_DEFINITIONS WITH_NATIVE_NOTIFICATIONS)\nendif()\n"
  },
  {
    "path": "src/platform/dummy/dummyclipboard.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"dummyclipboard.h\"\n\n#include \"common/common.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n\n#include <QGuiApplication>\n#include <QMimeData>\n#include <QStringList>\n\nQClipboard::Mode modeToQClipboardMode(ClipboardMode mode)\n{\n    switch (mode) {\n    case ClipboardMode::Selection:\n        return QClipboard::Selection;\n    case ClipboardMode::Clipboard:\n        return QClipboard::Clipboard;\n    }\n\n    Q_ASSERT(false);\n    return QClipboard::Clipboard;\n}\n\nvoid DummyClipboard::startMonitoringBackend(const QStringList &, ClipboardModeMask)\n{\n    connect(QGuiApplication::clipboard(), &QClipboard::changed,\n            this, &DummyClipboard::onClipboardChanged);\n}\n\nvoid DummyClipboard::stopMonitoringBackend()\n{\n    disconnect(QGuiApplication::clipboard(), &QClipboard::changed,\n               this, &DummyClipboard::onClipboardChanged);\n}\n\nQVariantMap DummyClipboard::data(ClipboardMode mode, const QStringList &formats) const\n{\n    const QMimeData *data = mimeData(mode);\n    if (data == nullptr)\n        return {};\n\n    const bool isDataSecret = isHidden(*data);\n    QVariantMap dataMap = cloneData(data, formats, clipboardSequenceNumber(mode));\n    if (isDataSecret)\n        dataMap[mimeSecret] = QByteArrayLiteral(\"1\");\n\n    return dataMap;\n}\n\nvoid DummyClipboard::setData(ClipboardMode mode, const QVariantMap &dataMap)\n{\n    QGuiApplication::clipboard()->setMimeData( createMimeData(dataMap), modeToQClipboardMode(mode) );\n}\n\nvoid DummyClipboard::setRawData(ClipboardMode mode, QMimeData *mimeData)\n{\n    QGuiApplication::clipboard()->setMimeData( mimeData, modeToQClipboardMode(mode) );\n}\n\nconst QMimeData *DummyClipboard::rawMimeData(ClipboardMode mode) const\n{\n    return QGuiApplication::clipboard()->mimeData( modeToQClipboardMode(mode) );\n}\n\nconst QMimeData *DummyClipboard::mimeData(ClipboardMode mode) const\n{\n    const auto modeText = mode == ClipboardMode::Clipboard ? \"clipboard\" : \"selection\";\n\n    COPYQ_LOG_VERBOSE( QStringLiteral(\"Getting %1 data\").arg(modeText) );\n    const QMimeData *data = rawMimeData(mode);\n\n    if (!data) {\n        log( QStringLiteral(\"Null data in %1\").arg(modeText), LogError );\n        return nullptr;\n    }\n\n    COPYQ_LOG_VERBOSE( QStringLiteral(\"Got %1 data\").arg(modeText) );\n    return data;\n}\n\nbool DummyClipboard::isHidden(const QMimeData &data) const\n{\n    const QByteArray passwordManagerHint = data.data(QStringLiteral(\"x-kde-passwordManagerHint\"));\n    return passwordManagerHint == QByteArrayLiteral(\"secret\");\n}\n\nvoid DummyClipboard::onChanged(int mode)\n{\n    if (mode == QClipboard::Clipboard)\n        emitConnectionChanged(ClipboardMode::Clipboard);\n    else if (mode == QClipboard::Selection)\n        emitConnectionChanged(ClipboardMode::Selection);\n}\n\nvoid DummyClipboard::onClipboardChanged(QClipboard::Mode mode)\n{\n    onChanged(static_cast<int>(mode));\n}\n"
  },
  {
    "path": "src/platform/dummy/dummyclipboard.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n#include \"platform/platformclipboard.h\"\n\n#include <QClipboard>\n\nQClipboard::Mode modeToQClipboardMode(ClipboardMode mode);\n\nclass DummyClipboard : public PlatformClipboard\n{\npublic:\n    QVariantMap data(ClipboardMode mode, const QStringList &formats) const override;\n\n    void setData(ClipboardMode mode, const QVariantMap &dataMap) override;\n    void setRawData(ClipboardMode mode, QMimeData *mimeData) override;\n\n    const QMimeData *mimeData(ClipboardMode mode) const override;\n\n    bool isSelectionSupported() const override { return false; }\n\n    bool isHidden(const QMimeData &data) const override;\n\n    void setClipboardOwner(const QString &) override {}\n\nprotected:\n    void startMonitoringBackend(const QStringList &, ClipboardModeMask) override;\n    void stopMonitoringBackend() override;\n    virtual const QMimeData *rawMimeData(ClipboardMode mode) const;\n    virtual void onChanged(int mode);\n    void onClipboardChanged(QClipboard::Mode mode);\n    virtual const long int *clipboardSequenceNumber(ClipboardMode) const { return nullptr; }\n};\n"
  },
  {
    "path": "src/platform/dummy/dummyplatform.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"dummyplatform.h\"\n\n#include \"dummyclipboard.h\"\n\n#include \"app/applicationexceptionhandler.h\"\n\n#include <QApplication>\n#include <QCoreApplication>\n#include <QDir>\n#include <QStringList>\n\nPlatformNativeInterface *platformNativeInterface()\n{\n    static DummyPlatform platform;\n    return &platform;\n}\n\nQCoreApplication *DummyPlatform::createConsoleApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QCoreApplication>(argc, argv);\n}\n\nQApplication *DummyPlatform::createServerApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QApplication>(argc, argv);\n}\n\nQGuiApplication *DummyPlatform::createClipboardProviderApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QGuiApplication>(argc, argv);\n}\n\nQCoreApplication *DummyPlatform::createClientApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QCoreApplication>(argc, argv);\n}\n\nQGuiApplication *DummyPlatform::createTestApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QGuiApplication>(argc, argv);\n}\n\nPlatformClipboardPtr DummyPlatform::clipboard()\n{\n    return PlatformClipboardPtr(new DummyClipboard());\n}\n\nbool DummyPlatform::findPluginDir(QDir *pluginsDir)\n{\n    pluginsDir->setPath( qApp->applicationDirPath() );\n    return pluginsDir->cd(\"plugins\");\n}\n\nQString DummyPlatform::defaultEditorCommand()\n{\n    return \"gedit %1\";\n}\n\nQString DummyPlatform::translationPrefix()\n{\n    return QString();\n}\n\nQStringList DummyPlatform::getCommandLineArguments(int argc, char **argv)\n{\n    QStringList arguments;\n\n    for (int i = 1; i < argc; ++i)\n        arguments.append( QString::fromUtf8(argv[i]) );\n\n    return arguments;\n}\n"
  },
  {
    "path": "src/platform/dummy/dummyplatform.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/platformnativeinterface.h\"\n\n#include <QKeyEvent>\n#include <QString>\n\nclass DummyPlatform : public PlatformNativeInterface\n{\npublic:\n    PlatformWindowPtr getWindow(WId) override { return PlatformWindowPtr(); }\n\n    PlatformWindowPtr getCurrentWindow() override { return PlatformWindowPtr(); }\n\n    bool canGetWindowTitle() override { return false; }\n\n    bool canAutostart() override { return false; }\n\n    bool isAutostartEnabled() override { return false; }\n\n    void setAutostartEnabled(bool) override {}\n\n    bool setPreventScreenCapture(WId, bool) override { return false; }\n    bool canPreventScreenCapture() override { return false; }\n\n    QCoreApplication *createConsoleApplication(int &argc, char **argv) override;\n\n    QApplication *createServerApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createClipboardProviderApplication(int &argc, char **argv) override;\n\n    QCoreApplication *createClientApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createTestApplication(int &argc, char **argv) override;\n\n    PlatformClipboardPtr clipboard() override;\n\n    QStringList getCommandLineArguments(int argc, char **argv) override;\n\n    bool findPluginDir(QDir *pluginsDir) override;\n\n    QString defaultEditorCommand() override;\n\n    QString translationPrefix() override;\n\n    QString themePrefix() override { return QString(); }\n\n    qint64 processResidentMemoryBytes() override { return -1; }\n};\n"
  },
  {
    "path": "src/platform/mac/cfref.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <CoreFoundation/CoreFoundation.h>\n\n/**\n * RAII wrapper for Core Foundation references (CFRetain/CFRelease).\n *\n * Automatically releases the held reference on destruction.  Eliminates\n * the class of bugs where an early return or exception skips a CFRelease.\n *\n * By default the constructor **adopts** (takes ownership of) a +1 reference\n * returned by CF *Create* / *Copy* functions — no extra retain.\n *\n * \\code\n *     // Adopt a +1 ref from a Create/Copy function (no extra retain):\n *     CFRef<CGEventRef> event = CGEventCreateKeyboardEvent(src, key, YES);\n *\n *     // Adopt a +1 ref from a Copy function:\n *     CFRef<CFArrayRef> items = LSSharedFileListCopySnapshot(list, &seed);\n *\n *     // Implicit conversion to the raw type for passing to CF APIs:\n *     CGEventPost(kCGHIDEventTap, event);\n *\n *     // Release is automatic; no manual CFRelease needed.\n * \\endcode\n */\ntemplate <typename T>\nclass CFRef {\npublic:\n    CFRef() : m_ref(nullptr) {}\n\n    // Adopts a +1 reference (from Create/Copy).  Intentionally implicit so\n    // `CFRef<X> x = SomeCreate(...)` works naturally.\n    // NOLINTNEXTLINE(google-explicit-constructor)\n    CFRef(T ref) : m_ref(ref) {}\n\n    ~CFRef()\n    {\n        if (m_ref)\n            CFRelease(m_ref);\n    }\n\n    CFRef(const CFRef &other) : m_ref(other.m_ref)\n    {\n        if (m_ref)\n            CFRetain(m_ref);\n    }\n\n    CFRef &operator=(const CFRef &other)\n    {\n        if (m_ref != other.m_ref) {\n            if (m_ref)\n                CFRelease(m_ref);\n            m_ref = other.m_ref;\n            if (m_ref)\n                CFRetain(m_ref);\n        }\n        return *this;\n    }\n\n    CFRef &operator=(T ref)\n    {\n        if (m_ref != ref) {\n            if (m_ref)\n                CFRelease(m_ref);\n            m_ref = ref;\n        }\n        return *this;\n    }\n\n    T get() const { return m_ref; }\n    operator T() const { return m_ref; }\n    explicit operator bool() const { return m_ref != nullptr; }\n\nprivate:\n    T m_ref;\n};\n"
  },
  {
    "path": "src/platform/mac/copyqpasteboardmime.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QtGlobal>\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n#   include <QUtiMimeConverter>\nusing CopyqPasteboardMimeBase = QUtiMimeConverter;\n#else\n#   include <QMacPasteboardMime>\nusing CopyqPasteboardMimeBase = QMacPasteboardMime;\n#endif\n\n/**\n * Class for doing lossless conversions between OS X UTIs and \"normal\" mimeTypes.\n *\n * Useful links about UTIs:\n * - https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html\n * - https://developer.apple.com/library/mac/documentation/MobileCoreServices/Reference/UTTypeRef/Reference/reference.html\n * - http://alastairs-place.net/blog/2012/06/06/utis-are-better-than-you-think-and-heres-why/\n *\n * Useful links about QMacPasteboardMime (and it's usage):\n * - http://doc-snapshot.qt-project.org/qdoc/qmacpasteboardmime.html\n * - https://www.qt.gitorious.org/qt/qt/source/src/gui/kernel/qmime_mac.cpp\n * - https://www.qt.gitorious.org/qt/qt/source/src/gui/kernel/qclipboard_mac.cpp\n */\n\nclass CopyQPasteboardMime final : public CopyqPasteboardMimeBase {\npublic:\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    QString mimeForUti(const QString &uti) const override;\n    QString utiForMime(const QString &mime) const override;\n    QVariant convertToMime(const QString &mime, const QList<QByteArray> &data, const QString &uti) const override;\n    QList<QByteArray> convertFromMime(const QString &mime, const QVariant &data, const QString &uti) const override;\n#else\n    CopyQPasteboardMime() : CopyqPasteboardMimeBase(MIME_ALL) {}\n    QString convertorName() override;\n    QString flavorFor(const QString &mime) override;\n    QString mimeFor(QString uti) override;\n    bool canConvert(const QString &mime, QString uti) override;\n    QVariant convertToMime(const QString &mime, QList<QByteArray> data, QString uti) override;\n    QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString uti) override;\n#endif\n};\n"
  },
  {
    "path": "src/platform/mac/copyqpasteboardmime.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"copyqpasteboardmime.h\"\n#include \"cfref.h\"\n\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n\n#include <QClipboard>\n#include <QEvent>\n#include <QVariant>\n\n#import <CoreServices/CoreServices.h>\n\nnamespace {\n    // MIME prefix used by other Qt apps to handle unknown mime types\n    const QString QT_UTI_PREFIX(\"com.trolltech.anymime.\");\n\n    // types handled by other (builtin) converters\n    bool shouldIgnoreUTI(const QString &uti) {\n        return uti == QLatin1String(\"public.html\")\n            || uti == QLatin1String(\"public.url\")\n            || uti == QLatin1String(\"public.file-url\")\n            || uti == QLatin1String(\"public.utf8-plain-text\")\n            || uti == QLatin1String(\"public.utf16-plain-text\")\n            || uti == QLatin1String(\"public.utf16-external-plain-text\")\n            || uti == QLatin1String(\"com.apple.traditional-mac-plain-text\");\n    }\n\n    // types handled by other (builtin) converters\n    bool shouldIgnoreMime(const QString &mime) {\n        return mime == QLatin1String(\"application/x-qt-image\")\n            || mime == QLatin1String(\"text/html\")\n            || mime == QLatin1String(\"text/plain\")\n            || mime == QLatin1String(\"text/uri-list\")\n            || mime == QLatin1String(\"application/x-copyq-owner-window-title\");\n    }\n\n    CFStringRef mimeToUTI(CFStringRef mime) {\n        return UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mime, NULL);\n    }\n\n    CFStringRef utiToMime(CFStringRef uti) {\n        return UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)uti, kUTTagClassMIMEType);\n    }\n\n    QString convertUtiOrMime(const QString &in, CFStringRef (*convert)(CFStringRef)) {\n        NSString *inString = in.toNSString();\n        CFRef<CFStringRef> outRef = convert((__bridge CFStringRef)inString);\n        QString out;\n        if (outRef)\n            out = QString::fromNSString((__bridge NSString *)outRef.get());\n        return out;\n    }\n\n}\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nQString CopyQPasteboardMime::convertorName()\n{\n    return QLatin1String(\"CopyQ\");\n}\n#endif\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQString CopyQPasteboardMime::utiForMime(const QString &mime) const\n#else\nQString CopyQPasteboardMime::flavorFor(const QString &mime)\n#endif\n{\n    if (shouldIgnoreMime(mime)) {\n        return QString();\n    }\n\n    QString uti = convertUtiOrMime(mime, mimeToUTI);\n    if (!uti.isEmpty()) {\n        return uti;\n    }\n\n    if (mime.startsWith(COPYQ_MIME_PREFIX)) {\n        return mime.mid(QLatin1String(COPYQ_MIME_PREFIX).size());\n    }\n\n    return QString();\n}\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQString CopyQPasteboardMime::mimeForUti(const QString &uti) const\n#else\nQString CopyQPasteboardMime::mimeFor(QString uti)\n#endif\n{\n    if (shouldIgnoreUTI(uti)) {\n        return QString();\n    }\n\n    // Handle mime data that Qt has converted by force to UTI\n    if (uti.startsWith(QT_UTI_PREFIX)) {\n        return uti.mid(QT_UTI_PREFIX.length()).replace(\"--\", \"/\");\n    }\n\n    QString mime = convertUtiOrMime(uti, utiToMime);\n    if (!mime.isEmpty()) {\n        return mime;\n    }\n\n    return COPYQ_MIME_PREFIX + uti;\n}\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nbool CopyQPasteboardMime::canConvert(const QString &mime, QString uti)\n{\n    if (uti.isEmpty() || mime.isEmpty())\n        return false;\n\n    // Allow to set UTI directly in QMimeData.\n    if (mime == uti)\n        return true;\n\n    if (shouldIgnoreMime(mime))\n        return false;\n\n    if (shouldIgnoreUTI(uti))\n        return false;\n\n    QString convMime = convertUtiOrMime(uti, utiToMime);\n\n    if (convMime != mime) {\n        COPYQ_LOG(QString(\"Can't convert between %1 and %2\").arg(uti).arg(mime));\n    }\n\n    return (convMime == mime);\n}\n#endif\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQVariant CopyQPasteboardMime::convertToMime(const QString &mime, const QList<QByteArray> &data, const QString &uti) const\n#else\nQVariant CopyQPasteboardMime::convertToMime(const QString &mime, QList<QByteArray> data, QString uti)\n#endif\n{\n    if (!canConvert(mime, uti)) {\n        return QVariant();\n    }\n\n    if (data.count() == 1) {\n        return QVariant::fromValue(data[0]);\n    } else {\n        QVariantList ret;\n        foreach(const QByteArray &item, data) {\n            ret << QVariant::fromValue(item);\n        }\n        return ret;\n    }\n}\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQList<QByteArray> CopyQPasteboardMime::convertFromMime(const QString &mime, const QVariant &data, const QString &uti) const\n#else\nQList<QByteArray> CopyQPasteboardMime::convertFromMime(const QString &mime, QVariant data, QString uti)\n#endif\n{\n    if (!canConvert(mime, uti)) {\n        return QList<QByteArray>();\n    }\n\n    QList<QByteArray> ret;\n    if (data.userType() == QMetaType::QByteArray) {\n        // Was a single item\n        ret << data.toByteArray();\n    } else {\n        // Was a list or null\n        QVariantList inp = data.toList();\n        foreach(const QVariant &item, inp) {\n            ret << item.toByteArray();\n        }\n    }\n    return ret;\n}\n"
  },
  {
    "path": "src/platform/mac/deploy.cmake.in",
    "content": "# Deploy script for CopyQ macOS bundle.\n# Generated from deploy.cmake.in by configure_file(@ONLY).\n\ninclude(\"@QT_DEPLOY_SUPPORT@\")\n\nset(_bundle \"@BUNDLE@\")\n\n# Run macdeployqt for Qt libraries and plugins.\nqt_deploy_runtime_dependencies(\n    EXECUTABLE \"${_bundle}\"\n    GENERATE_QT_CONF\n    VERBOSE\n    NO_APP_STORE_COMPLIANCE\n)\n"
  },
  {
    "path": "src/platform/mac/fixup_bundle.cmake.in",
    "content": "# Post-deploy fixup for CopyQ macOS bundle.\n# macdeployqt does not handle transitive dependencies of third-party libraries.\n# This script walks the bundle, finds unresolved @rpath deps, copies them from\n# known library directories, and rewrites install names.\n#\n# Generated from fixup_bundle.cmake.in by configure_file(@ONLY).\n\nset(_bundle \"@BUNDLE@\")\nset(_libpaths \"@COPYQ_DEPLOY_LIBPATHS@\")\nset(_fwk_dir \"${_bundle}/Contents/Frameworks\")\n\n# Collect all Mach-O binaries (dylibs + framework executables) under directories.\nfunction(collect_bundle_binaries out_var)\n    set(_result \"\")\n    foreach(_dir ${ARGN})\n        file(GLOB_RECURSE _dylibs \"${_dir}/*.dylib\")\n        list(APPEND _result ${_dylibs})\n        file(GLOB_RECURSE _fwk_files \"${_dir}/*.framework/Versions/*\")\n        foreach(_f ${_fwk_files})\n            get_filename_component(_name \"${_f}\" NAME)\n            if(NOT IS_DIRECTORY \"${_f}\" AND NOT IS_SYMLINK \"${_f}\" AND NOT _name MATCHES \"\\\\.\")\n                list(APPEND _result \"${_f}\")\n            endif()\n        endforeach()\n    endforeach()\n    set(${out_var} ${_result} PARENT_SCOPE)\nendfunction()\n\n# Return all @rpath-relative references from a binary via otool -L.\nfunction(get_rpath_deps bin out_var)\n    execute_process(\n        COMMAND otool -L \"${bin}\"\n        OUTPUT_VARIABLE _output\n        OUTPUT_STRIP_TRAILING_WHITESPACE\n        ERROR_QUIET\n    )\n    set(_refs \"\")\n    string(REPLACE \"\\n\" \";\" _lines \"${_output}\")\n    foreach(_line ${_lines})\n        if(_line MATCHES \"^[ \\t]+@rpath/([^ ]+)\")\n            list(APPEND _refs \"${CMAKE_MATCH_1}\")\n        endif()\n    endforeach()\n    set(${out_var} ${_refs} PARENT_SCOPE)\nendfunction()\n\n# --- Phase 1: Copy missing transitive dependencies into the bundle. ---\nmessage(STATUS \"Fixup bundle: searching for missing deps in: ${_libpaths}\")\nforeach(_iter RANGE 1 5)\n    collect_bundle_binaries(_bins \"${_bundle}/Contents/Frameworks\" \"${_bundle}/Contents/PlugIns\")\n\n    set(_found_new FALSE)\n    foreach(_bin ${_bins})\n        get_rpath_deps(\"${_bin}\" _refs)\n        foreach(_rel ${_refs})\n            if(EXISTS \"${_fwk_dir}/${_rel}\")\n                continue()\n            endif()\n            foreach(_sd ${_libpaths})\n                if(NOT EXISTS \"${_sd}/${_rel}\")\n                    continue()\n                endif()\n                if(_rel MATCHES \"^([^/]+\\\\.framework)/\")\n                    set(_fname \"${CMAKE_MATCH_1}\")\n                    if(NOT EXISTS \"${_fwk_dir}/${_fname}\")\n                        message(STATUS \"  Bundling framework: ${_fname}\")\n                        file(COPY \"${_sd}/${_fname}\" DESTINATION \"${_fwk_dir}\")\n                        set(_found_new TRUE)\n                    endif()\n                else()\n                    get_filename_component(_dest \"${_fwk_dir}/${_rel}\" DIRECTORY)\n                    file(MAKE_DIRECTORY \"${_dest}\")\n                    message(STATUS \"  Bundling library: ${_rel}\")\n                    file(COPY \"${_sd}/${_rel}\" DESTINATION \"${_dest}\")\n                    set(_found_new TRUE)\n                endif()\n                break()\n            endforeach()\n        endforeach()\n    endforeach()\n\n    if(NOT _found_new)\n        message(STATUS \"  No new deps found in iteration ${_iter}, done.\")\n        break()\n    endif()\nendforeach()\n\n# --- Phase 2: Rewrite @rpath references to @executable_path/../Frameworks/. ---\ncollect_bundle_binaries(_all_bins \"${_bundle}/Contents/Frameworks\" \"${_bundle}/Contents/PlugIns\")\nforeach(_bin ${_all_bins})\n    get_rpath_deps(\"${_bin}\" _refs)\n    foreach(_rel ${_refs})\n        if(EXISTS \"${_fwk_dir}/${_rel}\")\n            execute_process(\n                COMMAND install_name_tool -change\n                    \"@rpath/${_rel}\" \"@executable_path/../Frameworks/${_rel}\" \"${_bin}\"\n                ERROR_QUIET\n            )\n        endif()\n    endforeach()\nendforeach()\n\nmessage(STATUS \"Bundle fixup complete.\")\n"
  },
  {
    "path": "src/platform/mac/foregroundbackgroundfilter.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QObject>\n\n/**\n * This event filter manages the \"activationPolicy\" for an OS X app by\n * ensuring that it is a \"regular\" app when there are windows shown, but\n * an \"accessory\" or \"prohibited\"/\"background\" app when there are none.\n *\n * This allows the app to not have a dock icon unless there is an open window.\n *\n * If only menu or some notifications are visible dock icon is hidden.\n */\nclass ForegroundBackgroundFilter final : public QObject\n{\npublic:\n    /**\n     * Install the filter to parent.\n     */\n    static void installFilter(QObject *parent);\n\nprotected:\n    bool eventFilter(QObject *obj, QEvent *ev);\n    ForegroundBackgroundFilter(QObject *parent);\n};\n"
  },
  {
    "path": "src/platform/mac/foregroundbackgroundfilter.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"foregroundbackgroundfilter.h\"\n\n#include \"common/log.h\"\n\n#include <QEvent>\n#include <QGuiApplication>\n#include <QWindow>\n\n#include <Cocoa/Cocoa.h>\n#include <Carbon/Carbon.h>\n\nnamespace {\n\nbool isNormalApp()\n{\n    return [NSApp activationPolicy] == NSApplicationActivationPolicyRegular;\n}\n\nvoid becomeNormalApp()\n{\n    if (!isNormalApp()) {\n        COPYQ_LOG(\"Become normal app\");\n        if (![NSApp setActivationPolicy:NSApplicationActivationPolicyRegular])\n            COPYQ_LOG(\"Unable to become a normal app\");\n    }\n}\n\nvoid becomeAccessoryApp()\n{\n    if ([NSApp activationPolicy] != NSApplicationActivationPolicyAccessory) {\n        COPYQ_LOG(\"Become accessory app\");\n        if (![NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory])\n            COPYQ_LOG(\"Unable to become a accessory app\");\n    }\n}\n\nvoid becomeBackgroundApp()\n{\n    if ([NSApp activationPolicy] != NSApplicationActivationPolicyProhibited) {\n        COPYQ_LOG(\"Become background app\");\n        if (![NSApp setActivationPolicy:NSApplicationActivationPolicyProhibited])\n            COPYQ_LOG(\"Unable to become a background app\");\n    }\n}\n\nbool isNormalAppWindow(QWindow *window)\n{\n    const auto type = window->type();\n    return (type == Qt::Dialog || type == Qt::Window)\n            && !window->flags().testFlag(Qt::FramelessWindowHint);\n}\n\n} // namespace\n\nvoid ForegroundBackgroundFilter::installFilter(QObject *parent)\n{\n    auto filter = new ForegroundBackgroundFilter(parent);\n    parent->installEventFilter(filter);\n}\n\nForegroundBackgroundFilter::ForegroundBackgroundFilter(QObject *parent)\n    : QObject(parent)\n{\n}\n\nbool ForegroundBackgroundFilter::eventFilter(QObject *obj, QEvent *ev)\n{\n    auto window = qobject_cast<QWindow*>(obj);\n    if ( !window || !window->isTopLevel() )\n        return false;\n\n    const auto eventType = ev->type();\n    if (eventType == QEvent::Show) {\n        // WORKAROUND: Transform menu to frameless dialog to fix keyboard focus.\n        if (window->type() == Qt::Popup && QGuiApplication::focusWindow() == nullptr) {\n            COPYQ_LOG(\"Fixing focus for popup\");\n            window->setFlags(window->flags() | Qt::Dialog | Qt::FramelessWindowHint);\n        }\n\n        // Allow windows to pop up on current space.\n        const auto wid = window->winId();\n        auto nsView = reinterpret_cast<NSView*>(wid);\n        auto nsWindow = [nsView window];\n        if (nsWindow)\n            [nsWindow setCollectionBehavior: NSWindowCollectionBehaviorMoveToActiveSpace];\n\n        if ( isNormalAppWindow(window) )\n            becomeNormalApp();\n        else if (!isNormalApp())\n            becomeAccessoryApp();\n    } else if (eventType == QEvent::Hide) {\n        // Don't background if there are any other visible windows..\n        auto windows = QGuiApplication::topLevelWindows();\n        windows.removeOne(window);\n\n        const bool hasFocusableWindow = std::any_of(\n                    std::begin(windows), std::end(windows),\n                    [](QWindow *aWindow) {\n                        return aWindow->isVisible() && isNormalAppWindow(aWindow);\n                    });\n\n        if (hasFocusableWindow) {\n            becomeNormalApp();\n        } else {\n            const bool hasAccessoryWindow = std::any_of(\n                        std::begin(windows), std::end(windows),\n                        [](QWindow *aWindow) {\n                            return aWindow->isVisible();\n                        });\n\n            if (hasAccessoryWindow)\n                becomeAccessoryApp();\n            else\n                becomeBackgroundApp(); // This also focuses the previous app.\n        }\n    }\n\n    return false;\n}\n"
  },
  {
    "path": "src/platform/mac/macactivity.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\nclass QString;\n\n/**\n * RAII class for using activity blocks on OSX.\n */\nclass MacActivity\n{\npublic:\n    explicit MacActivity(const QString &reason);\n    ~MacActivity();\nprivate:\n    void *m_activity;\n};\n"
  },
  {
    "path": "src/platform/mac/macactivity.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"macactivity.h\"\n\n#include \"common/log.h\"\n\n#include <QString>\n\n#include <Cocoa/Cocoa.h>\n\nMacActivity::MacActivity(const QString &reason)\n    : m_activity(0)\n{\n    const NSActivityOptions options = NSActivityBackground;;\n    id act = [[NSProcessInfo processInfo]\n        beginActivityWithOptions:options\n        reason:reason.toNSString()];\n    if (act) {\n        m_activity = reinterpret_cast<void*>(act);\n        COPYQ_LOG_VERBOSE(QString(\"Started Background activity for: %1\").arg(reason));\n    } else {\n        ::log(\"Failed to create activity\", LogWarning);\n    }\n}\n\nMacActivity::~MacActivity() {\n    id act = reinterpret_cast<id>(m_activity);\n    if (act) {\n        [[NSProcessInfo processInfo] endActivity:act];\n        COPYQ_LOG_VERBOSE(\"Ended activity\");\n    } else {\n        ::log(\"Failed to stop activity\", LogWarning);\n    }\n}\n"
  },
  {
    "path": "src/platform/mac/macclipboard.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/dummy/dummyclipboard.h\"\n\nclass MacTimer;\n\nclass MacClipboard final : public DummyClipboard {\npublic:\n    void setData(ClipboardMode mode, const QVariantMap &dataMap) override;\n\n    bool isHidden(const QMimeData &data) const override;\n\nprotected:\n    void startMonitoringBackend(const QStringList &, ClipboardModeMask) override;\n    void stopMonitoringBackend() override;\n    void onChanged(int mode) override;\n    const long int *clipboardSequenceNumber(ClipboardMode) const override {\n        return &m_prevChangeCount;\n    }\n\nprivate:\n    void clipboardTimeout();\n\n    long int m_prevChangeCount = 0;\n    MacTimer *m_timer = nullptr;\n};\n"
  },
  {
    "path": "src/platform/mac/macclipboard.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"macclipboard.h\"\n\n#include \"common/common.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"platform/platformnativeinterface.h\"\n#include \"platform/platformwindow.h\"\n\n#include <QApplication>\n#include <QClipboard>\n#include <QMimeData>\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n#   include <QStringEncoder>\n#else\n#   include <QTextCodec>\n#endif\n\n#include \"mactimer.h\"\n\n#include <Cocoa/Cocoa.h>\n#include <Carbon/Carbon.h>\n\nvoid MacClipboard::startMonitoringBackend(const QStringList &formats, ClipboardModeMask modes)\n{\n    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];\n    m_prevChangeCount = [pasteboard changeCount];\n\n    m_timer = new MacTimer(this);\n    m_timer->setInterval(250);\n    m_timer->setTolerance(500);\n    connect(m_timer, &MacTimer::timeout, this, &MacClipboard::clipboardTimeout);\n    m_timer->start();\n\n    DummyClipboard::startMonitoringBackend(formats, modes);\n}\n\nvoid MacClipboard::stopMonitoringBackend()\n{\n    if (m_timer) {\n        m_timer->stop();\n        m_timer->deleteLater();\n        m_timer = nullptr;\n    }\n    DummyClipboard::stopMonitoringBackend();\n}\n\nvoid MacClipboard::setData(ClipboardMode mode, const QVariantMap &dataMap)\n{\n    auto dataMapForMac = dataMap;\n\n    // Qt adds BOM to UTF-16 text but some application on OS X\n    // doesn't expect BOM to be present.\n    // This converts text to UTF-16 without BOM.\n    const auto text = getTextData(dataMap);\n    if ( !text.isEmpty() ) {\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n        auto encoder = QStringEncoder(QStringConverter::Utf16);\n        const QByteArray data = encoder.encode(text);\n        dataMapForMac[QStringLiteral(\"public.utf16-plain-text\")] = data;\n#else\n        auto codec = QTextCodec::codecForName(QStringLiteral(\"UTF-16\"));\n        Q_ASSERT(codec != nullptr);\n        if (codec) {\n            auto encoder = codec->makeEncoder(QTextCodec::IgnoreHeader);\n            dataMapForMac[QStringLiteral(\"public.utf16-plain-text\")] = encoder->fromUnicode(text);\n        }\n#endif\n    }\n\n    DummyClipboard::setData(mode, dataMapForMac);\n}\n\nbool MacClipboard::isHidden(const QMimeData &data) const\n{\n    return data.hasFormat( QStringLiteral(\"application/x-nspasteboard-concealed-type\") );\n}\n\nvoid MacClipboard::onChanged(int mode)\n{\n    if (mode != QClipboard::Clipboard)\n        return;\n\n    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];\n    NSInteger newCount = [pasteboard changeCount];\n\n    if (newCount == m_prevChangeCount)\n        return;\n\n    m_prevChangeCount = newCount;\n\n    emitConnectionChanged(ClipboardMode::Clipboard);\n}\n\nvoid MacClipboard::clipboardTimeout() {\n    onChanged(QClipboard::Clipboard);\n}\n"
  },
  {
    "path": "src/platform/mac/macplatform.cmake",
    "content": "file(GLOB copyq_SOURCES ${copyq_SOURCES}\n    platform/mac/*.mm\n    platform/dummy/dummyclipboard.cpp\n    platform/platformcommon.cpp\n    ../qxt/qxtglobalshortcut_mac.cpp\n    )\n\nset(USE_QXT TRUE)\n\nif (NOT WITH_QT6)\n    list(APPEND copyq_qt_modules MacExtras)\nendif()\n\n# Install QCA ossl plugin into the bundle\nif (WITH_QCA_ENCRYPTION)\n    # Find QCA plugin directory\n    get_target_property(QCA_LOCATION qca-qt${QT_DEFAULT_MAJOR_VERSION} IMPORTED_LOCATION)\n    if(NOT QCA_LOCATION)\n        get_target_property(QCA_LOCATION qca-qt${QT_DEFAULT_MAJOR_VERSION} IMPORTED_LOCATION_RELEASE)\n    endif()\n    if(NOT QCA_LOCATION)\n        get_target_property(QCA_LOCATION qca-qt${QT_DEFAULT_MAJOR_VERSION} IMPORTED_LOCATION_NOCONFIG)\n    endif()\n    get_filename_component(QCA_LIB_DIR \"${QCA_LOCATION}\" DIRECTORY)\n\n    # Derive the install prefix from the QCA cmake config location.\n    # Qca-qt6_DIR is set by find_package and points to <prefix>/lib/cmake/Qca-qt6.\n    get_filename_component(QCA_INSTALL_PREFIX \"${Qca-qt6_DIR}/../../..\" ABSOLUTE)\n\n    # QCA plugins are in one of these locations:\n    # - <prefix>/lib/qca-qt6/crypto (source builds)\n    # - <lib_dir>/qt/plugins/crypto (Homebrew framework)\n    set(QCA_PLUGIN_SEARCH_PATHS\n        \"${QCA_INSTALL_PREFIX}/lib/qca-qt6/crypto\"\n        \"${QCA_LIB_DIR}/qt/plugins/crypto\"\n        \"${QCA_LIB_DIR}/../qt/plugins/crypto\"\n        \"/usr/local/lib/qt/plugins/crypto\"\n        \"/opt/homebrew/lib/qt/plugins/crypto\"\n    )\n\n    set(QCA_OSSL_PLUGIN_FOUND FALSE)\n    foreach(QCA_PLUGIN_PATH ${QCA_PLUGIN_SEARCH_PATHS})\n        if(EXISTS \"${QCA_PLUGIN_PATH}/libqca-ossl.dylib\")\n            install(FILES \"${QCA_PLUGIN_PATH}/libqca-ossl.dylib\"\n                DESTINATION \"${COPYQ_EXECUTABLE_NAME}.app/Contents/PlugIns/crypto\"\n                COMPONENT Runtime)\n            message(STATUS \"QCA ossl plugin found at: ${QCA_PLUGIN_PATH}/libqca-ossl.dylib\")\n            set(QCA_OSSL_PLUGIN_FOUND TRUE)\n            break()\n        endif()\n    endforeach()\n\n    if(NOT QCA_OSSL_PLUGIN_FOUND)\n        message(FATAL_ERROR \"QCA ossl plugin (libqca-ossl.dylib) not found. Searched paths: ${QCA_PLUGIN_SEARCH_PATHS}\")\n    endif()\nendif()\n\n# Bundle non-Qt third-party libraries into the app.\n# macdeployqt only handles Qt libraries; we must handle the rest.\nif (WITH_QT6)\n    set(_bundle_fwk_dir \"${COPYQ_EXECUTABLE_NAME}.app/Contents/Frameworks\")\n\n    # Helper: bundle a target's library into the Frameworks directory.\n    function(copyq_bundle_library target)\n        if(NOT TARGET ${target})\n            return()\n        endif()\n        get_target_property(_loc ${target} IMPORTED_LOCATION)\n        if(NOT _loc)\n            get_target_property(_loc ${target} IMPORTED_LOCATION_RELEASE)\n        endif()\n        if(NOT _loc)\n            get_target_property(_loc ${target} IMPORTED_LOCATION_NOCONFIG)\n        endif()\n        if(NOT _loc)\n            return()\n        endif()\n        if(_loc MATCHES \"\\\\.framework/\")\n            string(REGEX REPLACE \"(.*\\\\.framework)/.*\" \"\\\\1\" _fwk_dir \"${_loc}\")\n            install(DIRECTORY \"${_fwk_dir}\"\n                DESTINATION \"${_bundle_fwk_dir}\"\n                COMPONENT Runtime)\n        else()\n            # Install the actual library and all versioned symlinks.\n            get_filename_component(_dir \"${_loc}\" DIRECTORY)\n            get_filename_component(_name \"${_loc}\" NAME)\n            # Get the base name (e.g. libqt6keychain from libqt6keychain.1.0.0.dylib)\n            string(REGEX REPLACE \"\\\\.[0-9].*\" \"\" _base \"${_name}\")\n            file(GLOB _all_files \"${_dir}/${_base}*\")\n            install(FILES ${_all_files}\n                DESTINATION \"${_bundle_fwk_dir}\"\n                COMPONENT Runtime)\n        endif()\n    endfunction()\n\n    copyq_bundle_library(qca-qt6)\n    copyq_bundle_library(qt6keychain)\n    copyq_bundle_library(KF6::ConfigCore)\n    copyq_bundle_library(KF6::WindowSystem)\n    copyq_bundle_library(KF6::Notifications)\n    copyq_bundle_library(KF6::StatusNotifierItem)\nendif()\n"
  },
  {
    "path": "src/platform/mac/macplatform.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/platformnativeinterface.h\"\n\n#include <QKeyEvent>\n#include <QString>\n\nclass MacPlatform final : public PlatformNativeInterface\n{\npublic:\n    MacPlatform();\n\n    PlatformWindowPtr getWindow(WId winId) override;\n    PlatformWindowPtr getCurrentWindow() override;\n\n    bool canGetWindowTitle() override { return true; }\n    bool canAutostart() override { return true; }\n    bool isAutostartEnabled() override;\n    void setAutostartEnabled(bool) override;\n    bool setPreventScreenCapture(WId, bool) override { return false; }\n    bool canPreventScreenCapture() override { return false; }\n\n    QCoreApplication *createConsoleApplication(int &argc, char **argv) override;\n\n    QApplication *createServerApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createClipboardProviderApplication(int &argc, char **argv) override;\n\n    QCoreApplication *createClientApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createTestApplication(int &argc, char **argv) override;\n\n    PlatformClipboardPtr clipboard() override;\n\n    QStringList getCommandLineArguments(int argc, char **argv) override;\n\n    bool findPluginDir(QDir *pluginsDir) override;\n\n    QString defaultEditorCommand() override;\n\n    QString translationPrefix() override;\n\n    QString themePrefix() override;\n\n    qint64 processResidentMemoryBytes() override;\n};\n"
  },
  {
    "path": "src/platform/mac/macplatform.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"macplatform.h\"\n#include \"cfref.h\"\n\n#include \"app/applicationexceptionhandler.h\"\n#include \"common/log.h\"\n#include \"copyqpasteboardmime.h\"\n#include \"foregroundbackgroundfilter.h\"\n#include \"macplatformwindow.h\"\n#include \"platform/mac/macactivity.h\"\n#include \"urlpasteboardmime.h\"\n#include \"macclipboard.h\"\n\n#include <QApplication>\n#include <QCoreApplication>\n#include <QDir>\n#include <QGuiApplication>\n#include <QScopedPointer>\n#include <QStringList>\n\n#include <Cocoa/Cocoa.h>\n#include <Carbon/Carbon.h>\n#include <mach/mach.h>\n\nnamespace {\n    class ClipboardApplication : public QApplication\n    {\n    public:\n        ClipboardApplication(int &argc, char **argv)\n            : QApplication(argc, argv)\n            , m_pasteboardMime()\n            , m_pasteboardMimeUrl(QLatin1String(\"public.url\"))\n            , m_pasteboardMimeFileUrl(QLatin1String(\"public.file-url\"))\n        {\n        }\n\n    private:\n        CopyQPasteboardMime m_pasteboardMime;\n        UrlPasteboardMime m_pasteboardMimeUrl;\n        UrlPasteboardMime m_pasteboardMimeFileUrl;\n    };\n\n    template<typename T> inline T* objc_cast(id from)\n    {\n        if (from && [from isKindOfClass:[T class]]) {\n            return static_cast<T*>(from);\n        }\n        return nil;\n    }\n\n    bool isApplicationInItemList(LSSharedFileListRef list) {\n        bool flag = false;\n        UInt32 seed;\n        CFRef<CFArrayRef> items = LSSharedFileListCopySnapshot(list, &seed);\n        if (items) {\n            CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];\n            if (url) {\n                for (id item in(__bridge NSArray *) items.get()) {\n                    LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item;\n                    if (LSSharedFileListItemResolve(itemRef, 0, &url, NULL) == noErr) {\n                        if ([[(__bridge NSURL *) url path] hasPrefix:[[NSBundle mainBundle] bundlePath]]) {\n                            flag = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        return flag;\n    }\n\n    void addToLoginItems()\n    {\n        CFRef<LSSharedFileListRef> list = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, NULL);\n        if (list) {\n            if (!isApplicationInItemList(list)) {\n                CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];\n                if (url) {\n                    // Don't \"Hide on Launch\", as we don't have a window to show anyway\n                    NSDictionary *properties = [NSDictionary\n                        dictionaryWithObject: [NSNumber numberWithBool:NO]\n                        forKey: @\"com.apple.loginitem.HideOnLaunch\"];\n                    CFRef<LSSharedFileListItemRef> item = LSSharedFileListInsertItemURL(list, kLSSharedFileListItemLast, NULL, NULL, url, (__bridge CFDictionaryRef)properties, NULL);\n                    (void)item;  // released automatically\n                } else {\n                    ::log(\"Unable to find url for bundle, can't auto-load app\", LogWarning);\n                }\n            }\n        } else {\n            ::log(\"Unable to access shared file list, can't auto-load app\", LogWarning);\n        }\n    }\n\n    void removeFromLoginItems()\n    {\n        CFRef<LSSharedFileListRef> list = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, NULL);\n        if (list) {\n            if (isApplicationInItemList(list)) {\n                CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];\n                if (url) {\n                    UInt32 seed;\n                    CFRef<CFArrayRef> items = LSSharedFileListCopySnapshot(list, &seed);\n                    if (items) {\n                        for (id item in(__bridge NSArray *) items.get()) {\n                            LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item;\n                            if (LSSharedFileListItemResolve(itemRef, 0, &url, NULL) == noErr)\n                                if ([[(__bridge NSURL *) url path] hasPrefix:[[NSBundle mainBundle] bundlePath]])\n                                    LSSharedFileListItemRemove(list, itemRef);\n                        }\n                    } else {\n                        ::log(\"No items in list of auto-loaded apps, can't stop auto-load of app\", LogWarning);\n                    }\n                } else {\n                    ::log(\"Unable to find url for bundle, can't stop auto-load of app\", LogWarning);\n                }\n            }\n        } else {\n            ::log(\"Unable to access shared file list, can't stop auto-load of app\", LogWarning);\n        }\n    }\n\n    QString absoluteResourcesePath(const QString &path)\n    {\n        return QCoreApplication::applicationDirPath() + \"/../Resources/\" + path;\n    }\n\n    template <typename QtApplication>\n    class Activity\n        : public MacActivity\n        , public ApplicationExceptionHandler<QtApplication>\n    {\n    public:\n        Activity(int &argc, char **argv, const QString &reason)\n            : MacActivity(reason)\n            , ApplicationExceptionHandler<QtApplication>(argc, argv)\n        {\n            [NSApp setActivationPolicy:NSApplicationActivationPolicyProhibited];\n        }\n    };\n\n} // namespace\n\nPlatformNativeInterface *platformNativeInterface()\n{\n    static MacPlatform platform;\n    return &platform;\n}\n\nMacPlatform::MacPlatform()\n{\n}\n\nQCoreApplication *MacPlatform::createConsoleApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QCoreApplication>(argc, argv);\n}\n\nQApplication *MacPlatform::createServerApplication(int &argc, char **argv)\n{\n    QApplication *app = new Activity<ClipboardApplication>(argc, argv, \"CopyQ Server\");\n\n    // Switch the app to foreground when in foreground\n    ForegroundBackgroundFilter::installFilter(app);\n\n    return app;\n}\n\nQGuiApplication *MacPlatform::createClipboardProviderApplication(int &argc, char **argv)\n{\n    return new Activity<ClipboardApplication>(argc, argv, \"CopyQ clipboard provider\");\n}\n\nQCoreApplication *MacPlatform::createClientApplication(int &argc, char **argv)\n{\n    return new Activity<QCoreApplication>(argc, argv, \"CopyQ Client\");\n}\n\nQGuiApplication *MacPlatform::createTestApplication(int &argc, char **argv)\n{\n    return new Activity<QGuiApplication>(argc, argv, \"CopyQ Tests\");\n}\n\nPlatformClipboardPtr MacPlatform::clipboard()\n{\n    return PlatformClipboardPtr(new MacClipboard());\n}\n\nQStringList MacPlatform::getCommandLineArguments(int argc, char **argv)\n{\n    QStringList arguments;\n\n    for (int i = 1; i < argc; ++i)\n        arguments.append( QString::fromUtf8(argv[i]) );\n\n    return arguments;\n}\n\nbool MacPlatform::findPluginDir(QDir *pluginsDir)\n{\n    pluginsDir->setPath( qApp->applicationDirPath() );\n    if (pluginsDir->dirName() != \"MacOS\") {\n        return pluginsDir->cd(\"plugins\");\n    }\n\n    if ( pluginsDir->cdUp() // Contents\n            && pluginsDir->cd(\"PlugIns\")\n            && pluginsDir->cd(\"copyq\"))\n    {\n        return true;\n    }\n\n    pluginsDir->setPath( qApp->applicationDirPath() );\n\n    if ( pluginsDir->cdUp() // Contents\n            && pluginsDir->cdUp() // copyq.app\n            && pluginsDir->cdUp() // repo root\n            && pluginsDir->cd(\"plugins\"))\n    {\n        return true;\n    }\n\n    return false;\n}\n\nQString MacPlatform::defaultEditorCommand()\n{\n    return \"open -t -W -n %1\";\n}\n\nQString MacPlatform::translationPrefix()\n{\n    return absoluteResourcesePath(\"translations\");\n}\n\nQString MacPlatform::themePrefix()\n{\n    return absoluteResourcesePath(\"themes\");\n}\n\nPlatformWindowPtr MacPlatform::getCurrentWindow()\n{\n    // FIXME: frontmostApplication doesn't seem to work well for own windows (at least in tests).\n    auto window = QApplication::activeWindow();\n    if (window == nullptr)\n        window = QApplication::activeModalWidget();\n    if (window != nullptr)\n        return PlatformWindowPtr(new MacPlatformWindow(window->winId()));\n\n    NSRunningApplication *runningApp = [[NSWorkspace sharedWorkspace] frontmostApplication];\n    return PlatformWindowPtr(new MacPlatformWindow(runningApp));\n}\n\nPlatformWindowPtr MacPlatform::getWindow(WId winId) {\n    return PlatformWindowPtr(new MacPlatformWindow(winId));\n}\n\nbool MacPlatform::isAutostartEnabled()\n{\n    // Note that this will need to be done differently if CopyQ goes into\n    // the App Store.\n    // http://rhult.github.io/articles/sandboxed-launch-on-login/\n    bool isInList = false;\n    CFRef<LSSharedFileListRef> list = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, NULL);\n    if (list) {\n        isInList = isApplicationInItemList(list);\n    }\n    return isInList;\n}\n\nvoid MacPlatform::setAutostartEnabled(bool shouldEnable)\n{\n    if (shouldEnable != isAutostartEnabled()) {\n        if (shouldEnable) {\n            addToLoginItems();\n        } else {\n            removeFromLoginItems();\n        }\n    }\n}\n\nqint64 MacPlatform::processResidentMemoryBytes()\n{\n    struct mach_task_basic_info info;\n    mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;\n    if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO,\n                  (task_info_t)&info, &count) != KERN_SUCCESS)\n        return -1;\n    return static_cast<qint64>(info.resident_size);\n}\n"
  },
  {
    "path": "src/platform/mac/macplatformwindow.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include \"objcstrong.h\"\n\n#include \"platform/platformwindow.h\"\n\n// For WId\n#include <QWidget>\n\n@class NSWindow;\n@class NSRunningApplication;\n\nclass MacPlatformWindow final : public PlatformWindow\n{\npublic:\n    MacPlatformWindow();\n    explicit MacPlatformWindow(WId wid);\n    explicit MacPlatformWindow(NSRunningApplication *runningApplication);\n\n    virtual ~MacPlatformWindow();\n\n    /**\n     * Return window title text of current window.\n     *\n     * On OS X, this gets the title of the application instead of the window.\n     */\n    QString getTitle() override;\n\n    void raise() override;\n    bool pasteFromClipboard() override;\n    bool copyToClipboard() override;\n\nprivate:\n    // Don't allow copies\n    Q_DISABLE_COPY(MacPlatformWindow)\n\n    long int m_windowNumber = -1;\n    ObjCStrong<NSWindow> m_window;\n    ObjCStrong<NSRunningApplication> m_runningApplication;\n};\n"
  },
  {
    "path": "src/platform/mac/macplatformwindow.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"macplatformwindow.h\"\n#include \"cfref.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/log.h\"\n#include \"platform/platformcommon.h\"\n\n#include <AppKit/NSGraphics.h>\n#include <Cocoa/Cocoa.h>\n#include <Carbon/Carbon.h>\n#include <CoreFoundation/CoreFoundation.h>\n#include <dispatch/dispatch.h>\n\n#include <QApplication>\n#include <QSet>\n\nnamespace {\n    // Original from: https://stackoverflow.com/a/33584460/454171\n    NSString* keyCodeToString(CGKeyCode keyCode, const UCKeyboardLayout *keyboardLayout)\n    {\n        UInt32 deadKeyState = 0;\n        UniCharCount maxStringLength = 255;\n        UniCharCount actualStringLength = 0;\n        UniChar unicodeString[maxStringLength];\n\n        OSStatus status = UCKeyTranslate(\n            keyboardLayout,\n            keyCode, kUCKeyActionDown, 0,\n            LMGetKbdType(), 0,\n            &deadKeyState,\n            maxStringLength,\n            &actualStringLength, unicodeString);\n\n        if (actualStringLength == 0 && deadKeyState) {\n            status = UCKeyTranslate(\n                keyboardLayout,\n                kVK_Space, kUCKeyActionDown, 0,\n                LMGetKbdType(), 0,\n                &deadKeyState,\n                maxStringLength,\n                &actualStringLength, unicodeString);\n        }\n\n        if (actualStringLength > 0 && status == noErr) {\n            return [[NSString stringWithCharacters:unicodeString\n                    length:(NSUInteger)actualStringLength] lowercaseString];\n        }\n\n        return nil;\n    }\n\n    NSNumber* charToKeyCode(const char c)\n    {\n        CFRef<TISInputSourceRef> currentKeyboard = TISCopyCurrentKeyboardLayoutInputSource();\n        CFDataRef layoutData = (CFDataRef)TISGetInputSourceProperty(\n            currentKeyboard, kTISPropertyUnicodeKeyLayoutData);\n\n        if (layoutData != nil) {\n            const UCKeyboardLayout *keyboardLayout =\n                (const UCKeyboardLayout*)CFDataGetBytePtr(layoutData);\n\n            COPYQ_LOG( QStringLiteral(\"Searching key code for '%1'\").arg(c) );\n            NSString *keyChar = [NSString stringWithFormat:@\"%c\" , c];\n            for (size_t i = 0; i < 128; ++i) {\n                NSString* str = keyCodeToString((CGKeyCode)i, keyboardLayout);\n                if (str != nil && [str isEqualToString:keyChar]) {\n                    COPYQ_LOG( QStringLiteral(\"KeyCode for '%1' is %2\").arg(c).arg(i) );\n                    return [NSNumber numberWithInt:i];\n                }\n            }\n        }\n\n        return nil;\n    }\n\n    CGKeyCode keyCodeFromChar(const char c, CGKeyCode fallback)\n    {\n        const auto keyCode = charToKeyCode(c);\n        return keyCode == nil\n            ? fallback\n            : (CGKeyCode)[keyCode intValue];\n    }\n\n    template<typename T> inline T* objc_cast(id from)\n    {\n        if (from && [from isKindOfClass:[T class]]) {\n            return static_cast<T*>(from);\n        }\n        return nil;\n    }\n\n    void sendShortcut(int modifier, int key) {\n        COPYQ_LOG( QStringLiteral(\"Sending key codes %1 and %2\")\n                   .arg(modifier)\n                   .arg(key) );\n\n        CFRef<CGEventSourceRef> sourceRef = CGEventSourceCreate(\n            kCGEventSourceStateCombinedSessionState);\n\n        CFRef<CGEventRef> commandDown = CGEventCreateKeyboardEvent(sourceRef, modifier, YES);\n        CFRef<CGEventRef> VDown = CGEventCreateKeyboardEvent(sourceRef, key, YES);\n\n        CFRef<CGEventRef> VUp = CGEventCreateKeyboardEvent(sourceRef, key, NO);\n        CFRef<CGEventRef> commandUp = CGEventCreateKeyboardEvent(sourceRef, modifier, NO);\n\n        // 0x000008 is a hack to fix pasting in Emacs?\n        // https://github.com/TermiT/Flycut/pull/18\n        CGEventSetFlags(VDown,CGEventFlags(kCGEventFlagMaskCommand|0x000008));\n        CGEventSetFlags(VUp,CGEventFlags(kCGEventFlagMaskCommand|0x000008));\n\n        CGEventPost(kCGHIDEventTap, commandDown);\n        CGEventPost(kCGHIDEventTap, VDown);\n        CGEventPost(kCGHIDEventTap, VUp);\n        CGEventPost(kCGHIDEventTap, commandUp);\n    }\n\n    /**\n     * Delays a sending Command+key operation for delayInMS, and retries up to 'tries' times.\n     *\n     * This function is necessary in order to check that the intended window has come\n     * to the foreground. The \"isActive\" property only changes when the app gets back\n     * to the \"run loop\", so we can't block and check it.\n     */\n    void delayedSendShortcut(int modifier, int key, int64_t delayInMS, uint tries, NSWindow *window) {\n        COPYQ_LOG( QStringLiteral(\"Sending key codes %1 and %2 with delay %3ms (%4 retries to go)\")\n                   .arg(modifier)\n                   .arg(key)\n                   .arg(delayInMS)\n                   .arg(tries) );\n\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayInMS * NSEC_PER_MSEC), dispatch_get_main_queue(), ^(void){\n            if (window && ![window isKeyWindow]) {\n                if (tries > 0) {\n                    delayedSendShortcut(modifier, key, delayInMS, tries - 1, window);\n                } else {\n                    log(\"Failed to raise application, will not paste.\", LogWarning);\n                }\n            } else {\n                sendShortcut(modifier, key);\n            }\n        });\n    }\n\n    pid_t getPidForWid(WId find_wid) {\n        // Build a set of \"normal\" windows. This is necessary as \"NSWindowList\" gets things like the\n        // menubar (which can be \"owned\" by various apps).\n        CFRef<CFArrayRef> windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListExcludeDesktopElements, kCGNullWindowID);\n        for (NSDictionary* dict in (__bridge NSArray*)windowList.get()) {\n            long int pid = [(NSNumber*)[dict objectForKey:@\"kCGWindowOwnerPID\"] longValue];\n            unsigned long int wid = (unsigned long) [(NSNumber*)[dict objectForKey:@\"kCGWindowNumber\"] longValue];\n\n            if (wid == find_wid) {\n                return pid;\n            }\n        }\n\n        return 0;\n    }\n\n\n    long int getTopWindow(pid_t process_pid) {\n        // Build a set of \"normal\" windows. This is necessary as \"NSWindowList\" gets things like the\n        // menubar (which can be \"owned\" by various apps).\n        QSet<long int> widsForProcess;\n        CFRef<CFArrayRef> windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListExcludeDesktopElements, kCGNullWindowID);\n        for (NSDictionary* dict in (__bridge NSArray*)windowList.get()) {\n            long int pid = [(NSNumber*)[dict objectForKey:@\"kCGWindowOwnerPID\"] longValue];\n            long int wid = [(NSNumber*)[dict objectForKey:@\"kCGWindowNumber\"] longValue];\n            long int layer = [(NSNumber*)[dict objectForKey:@\"kCGWindowLayer\"] longValue];\n\n            if (pid == process_pid && layer == 0) {\n                widsForProcess.insert(wid);\n            }\n        }\n\n        // Now look through the windows in NSWindowList (which are ordered from front to back)\n        // the first window in this list which is also in widsForProcess is our frontmost \"normal\" window\n        long int wid = -1;\n        for (NSNumber *window : [NSWindow windowNumbersWithOptions:0]) {\n            const long int wid2 = [window longValue];\n            if (widsForProcess.contains(wid2)) {\n                wid = wid2;\n                break;\n            }\n        }\n        return wid;\n    }\n\n    QString getTitleFromWid(long int wid) {\n        QString title;\n\n        if (wid < 0) {\n            return title;\n        }\n\n        const void *windowid = reinterpret_cast<const void *>(static_cast<uintptr_t>(wid));\n        CFRef<CFArrayRef> windowArray = CFArrayCreate( NULL, &windowid, 1, NULL );\n        CFRef<CFArrayRef> descArray = CGWindowListCreateDescriptionFromArray(windowArray);\n\n        // Should only be one\n        for (NSDictionary* dict in (__bridge NSArray*)descArray.get()) {\n            title = QString::fromNSString([dict objectForKey:@\"kCGWindowName\"]);\n        }\n\n        return title;\n    }\n} // namespace\n\nMacPlatformWindow::MacPlatformWindow(NSRunningApplication *runningApp)\n{\n    if (runningApp) {\n        m_runningApplication = runningApp;\n        m_windowNumber = getTopWindow(runningApp.processIdentifier);\n        COPYQ_LOG_VERBOSE(\"Created platform window for non-copyq\");\n    } else {\n        log(\"Failed to convert runningApplication to application\", LogWarning);\n    }\n}\n\nMacPlatformWindow::MacPlatformWindow(WId wid)\n{\n    // Try using wid as an actual window ID\n    pid_t pid = getPidForWid(wid);\n    if (pid != 0) {\n        m_runningApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];\n        m_windowNumber = wid;\n        // This will return 'nil' unless this process owns the window\n        m_window = [NSApp windowWithWindowNumber: wid];\n    } else if (NSView *view = objc_cast<NSView>((id)wid)) {\n        // If given a view, its ours\n        m_runningApplication = [NSRunningApplication currentApplication];\n        m_window = [view window];\n        m_windowNumber = [m_window windowNumber];\n        COPYQ_LOG_VERBOSE(\"Created platform window for copyq\");\n    } else {\n        log(\"Failed to convert WId to window\", LogWarning);\n    }\n}\n\nMacPlatformWindow::MacPlatformWindow() = default;\n\nMacPlatformWindow::~MacPlatformWindow() = default;\n\nQString MacPlatformWindow::getTitle()\n{\n    QString appTitle;\n    if (m_runningApplication)\n        appTitle = QString::fromNSString([m_runningApplication localizedName]);\n\n    QString windowTitle;\n    if (m_window)\n        windowTitle = QString::fromNSString([m_window title]);\n    if (windowTitle.isEmpty() && m_windowNumber >= 0)\n        windowTitle = getTitleFromWid(m_windowNumber);\n\n    // We have two separate titles, the application title (shown at the top\n    // left in the menu bar and the window title (shown in the window bar).\n    // Some apps put the app name into the window title as well, some don't. We\n    // want to be able to match on the app name (e.g. Firefox, Safari, or\n    // Terminal) when writing commands, so we'll ensure that the app name is at\n    // the beginning of the returned window title.\n    QString result;\n    if (windowTitle.isEmpty()) {\n        result = appTitle;\n    } else if (appTitle.isEmpty() || windowTitle.startsWith(appTitle)) {\n        result = windowTitle;\n    } else {\n        result = QString(\"%1 - %2\").arg(appTitle, windowTitle);\n    }\n    return result;\n}\n\nvoid MacPlatformWindow::raise()\n{\n    if (m_window && m_runningApplication &&\n            [m_runningApplication isEqual:[NSRunningApplication currentApplication]]) {\n        COPYQ_LOG( QString(\"Raise own window \\\"%1\\\"\").arg(getTitle()) );\n        [NSApp activateIgnoringOtherApps:YES];\n        [m_window makeKeyAndOrderFront:nil];\n    } else if (m_runningApplication) {\n        // Shouldn't need to unhide since we should have just been in this\n        // application..\n        //[m_runningApplication unhide];\n\n        COPYQ_LOG( QString(\"Raise a window \\\"%1\\\"\").arg(getTitle()) );\n        [m_runningApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];\n        if (m_windowNumber != -1) {\n            auto window = [NSApp windowWithWindowNumber: m_windowNumber];\n            [window makeKeyAndOrderFront:nil];\n        }\n    } else {\n        ::log(QString(\"Tried to raise unknown window\"), LogWarning);\n    }\n}\n\nbool MacPlatformWindow::pasteFromClipboard()\n{\n    if (!m_runningApplication) {\n        log(\"Failed to paste to unknown window\", LogWarning);\n        return false;\n    }\n\n    const AppConfig config;\n\n    const auto keyCodeV = keyCodeFromChar('v', kVK_ANSI_V);\n    if (m_window != nullptr) {\n        // Window MUST be raised, otherwise we can't send events to it\n        waitMs(config.option<Config::window_wait_before_raise_ms>());\n        raise();\n        waitMs(config.option<Config::window_wait_after_raised_ms>());\n\n        // Paste after after a delay, try 5 times\n        const int keyPressTimeMs = config.option<Config::window_key_press_time_ms>();\n        delayedSendShortcut(kVK_Command, keyCodeV, keyPressTimeMs, 5, m_window);\n    } else {\n        sendShortcut(kVK_Command, keyCodeV);\n    }\n\n    return true;\n}\n\nbool MacPlatformWindow::copyToClipboard()\n{\n    if (!m_runningApplication) {\n        log(\"Failed to copy from unknown window\", LogWarning);\n        return false;\n    }\n\n    const AppConfig config;\n\n    // Window MUST be raised, otherwise we can't send events to it\n    waitMs(config.option<Config::window_wait_before_raise_ms>());\n    raise();\n    waitMs(config.option<Config::window_wait_after_raised_ms>());\n\n    // Copy after after a delay, try 5 times\n    const int keyPressTimeMs = config.option<Config::window_key_press_time_ms>();\n    const auto keyCodeC = keyCodeFromChar('c', kVK_ANSI_C);\n    delayedSendShortcut(kVK_Command, keyCodeC, keyPressTimeMs, 5, m_window);\n    return true;\n}\n"
  },
  {
    "path": "src/platform/mac/mactimer.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QObject>\n\n#ifdef __OBJC__\n@class NSTimer;\n#else\nusing NSTimer = void;\n#endif\n\n/**\n * Class similar to a QTimer but allows setting a tolerance, which\n * makes timers more battery-friendly on OSX.\n */\nclass MacTimer final : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit MacTimer(QObject *parent = 0);\n    virtual ~MacTimer();\n\n    void setInterval(int msec);\n    int interval() const { return m_interval; }\n    inline void setSingleShot(bool singleShot);\n\n    /**\n     * Set the tolerance for the timer. See NSTimer::setTolerance.\n     *\n     * Tolerance is ignored on OS X < 10.9.\n     */\n    void setTolerance(int msec);\n    int tolerance() const { return m_tolerance; }\n\npublic Q_SLOTS:\n    void start();\n    void stop();\n    inline bool isSingleShot() const { return m_singleShot; }\n\nQ_SIGNALS:\n    void timeout();\n\nprivate:\n    Q_DISABLE_COPY(MacTimer)\n\n    void restart();\n\n    int m_interval;\n    int m_tolerance;\n    bool m_singleShot;\n\n    NSTimer *m_nsTimer;\n};\n"
  },
  {
    "path": "src/platform/mac/mactimer.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"mactimer.h\"\n\n#include <Cocoa/Cocoa.h>\n#include <QPointer>\n\nMacTimer::MacTimer(QObject *parent) :\n    QObject(parent),\n    m_interval(0),\n    m_tolerance(0),\n    m_singleShot(false),\n    m_nsTimer(0)\n{\n}\n\nMacTimer::~MacTimer()\n{\n    stop();\n}\n\nvoid MacTimer::stop()\n{\n    if (m_nsTimer) {\n        CFRunLoopTimerInvalidate((CFRunLoopTimerRef) m_nsTimer);\n    }\n    m_nsTimer = 0;\n}\n\nvoid MacTimer::restart()\n{\n    if (m_nsTimer) {\n        stop();\n        start();\n    }\n}\n\nvoid MacTimer::setInterval(int msec)\n{\n    if (msec != m_interval) {\n        m_interval = msec;\n        restart();\n    }\n}\n\nvoid MacTimer::setTolerance(int msec)\n{\n    if (msec != m_tolerance) {\n        m_tolerance = msec;\n        restart();\n    }\n}\n\nvoid MacTimer::setSingleShot(bool singleShot)\n{\n    if (singleShot != m_singleShot) {\n        m_singleShot = singleShot;\n        restart();\n    }\n}\n\nvoid MacTimer::start() {\n    stop();\n\n    // Use QPointer to make it auto-null, and use a 'weak reference' in the\n    // block\n    QPointer<MacTimer> weakThis(this);\n    double intervalSeconds = (float)m_interval / 1000.0;\n\n    // Create a timer which kicks into a block\n    CFRunLoopTimerRef timer = CFRunLoopTimerCreateWithHandler(NULL,\n        CFAbsoluteTimeGetCurrent() + intervalSeconds,\n        m_singleShot ? 0 : intervalSeconds,\n        0, 0, // These are both ignored\n        ^(CFRunLoopTimerRef) {\n            if (weakThis) {\n                emit weakThis->timeout();\n            }\n        }\n    );\n\n    // Set the tolerance using an NSTimer as there is no CF way of doing so\n    if ([m_nsTimer respondsToSelector:@selector(setTolerance:)]) {\n        double toleranceSeconds = (double)m_tolerance / 1000.0;\n        [m_nsTimer setTolerance:toleranceSeconds];\n    }\n\n    // add timer to the hidden run loop\n    CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);\n}\n"
  },
  {
    "path": "src/platform/mac/objcstrong.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#ifdef __OBJC__\n#   import <Foundation/NSObject.h>\n#endif\n\n/**\n * RAII strong-reference holder for Objective-C objects (manual retain/release).\n *\n * Retains the object on construction/assignment and releases it on\n * destruction, exactly like a \\c __strong property under ARC.  Using this\n * wrapper instead of raw pointers eliminates the class of bugs where a\n * constructor forgets to retain an autoreleased object while the destructor\n * unconditionally releases it.\n *\n * Safe to use with \\c nil: retaining and releasing \\c nil are no-ops.\n *\n * \\code\n *     ObjCStrong<NSWindow> m_window;       // starts nil\n *     m_window = [NSApp windowWithWindowNumber: wid];  // retains\n *     m_window = nil;                      // releases old, holds nil\n *     // destructor releases automatically\n * \\endcode\n */\ntemplate <typename T>\nclass ObjCStrong {\npublic:\n    ObjCStrong() : m_ptr(nil) {}\n\n    // Intentionally implicit: allows `m_member = [SomeClass ...]` naturally.\n    // NOLINTNEXTLINE(google-explicit-constructor)\n    ObjCStrong(T *ptr) : m_ptr([ptr retain]) {}\n\n    ~ObjCStrong() { [m_ptr release]; }\n\n    ObjCStrong(const ObjCStrong &other) : m_ptr([other.m_ptr retain]) {}\n\n    ObjCStrong &operator=(const ObjCStrong &other)\n    {\n        if (m_ptr != other.m_ptr) {\n            [m_ptr release];\n            m_ptr = [other.m_ptr retain];\n        }\n        return *this;\n    }\n\n    ObjCStrong &operator=(T *ptr)\n    {\n        if (m_ptr != ptr) {\n            [m_ptr release];\n            m_ptr = [ptr retain];\n        }\n        return *this;\n    }\n\n    T *get() const { return m_ptr; }\n    operator T *() const { return m_ptr; }\n    T *operator->() const { return m_ptr; }\n    explicit operator bool() const { return m_ptr != nil; }\n\nprivate:\n    T *m_ptr;\n};\n"
  },
  {
    "path": "src/platform/mac/urlpasteboardmime.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QtGlobal>\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n#   include <QUtiMimeConverter>\nusing UrlPasteboardMimeBase = QUtiMimeConverter;\n#else\n#   include <QMacPasteboardMime>\nusing UrlPasteboardMimeBase = QMacPasteboardMime;\n#endif\n\n/**\n * Class for doing conversions of URLs between OS X UTIs and \"normal\" mimeTypes.\n */\nclass UrlPasteboardMime final : public UrlPasteboardMimeBase {\npublic:\n    //! Create an instance of UrlPasteboardMime which will try to convert to/from the given UTI.\n    explicit UrlPasteboardMime(const QString &urlUti);\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    QString mimeForUti(const QString &uti) const override;\n    QString utiForMime(const QString &mime) const override;\n    QVariant convertToMime(const QString &mime, const QList<QByteArray> &data, const QString &uti) const override;\n    QList<QByteArray> convertFromMime(const QString &mime, const QVariant &data, const QString &uti) const override;\n#else\n    QString convertorName() override;\n    QString flavorFor(const QString &mime) override;\n    QString mimeFor(QString uti) override;\n    bool canConvert(const QString &mime, QString uti) override;\n    QVariant convertToMime(const QString &mime, QList<QByteArray> data, QString uti) override;\n    QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString uti) override;\n#endif\nprivate:\n    QString m_urlUti;\n};\n"
  },
  {
    "path": "src/platform/mac/urlpasteboardmime.mm",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"urlpasteboardmime.h\"\n\n#include \"common/mimetypes.h\"\n\n#import <CoreServices/CoreServices.h>\n#import <Cocoa/Cocoa.h>\n\n#import <QUrl>\n#import <QVariant>\n\n/*\n * Much of this code is based on the Qt code here:\n *  https://www.qt.gitorious.org/qt/qt/source/src/gui/kernel/qmime_mac.cpp#L765\n */\n\nUrlPasteboardMime::UrlPasteboardMime(const QString &urlUti)\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    : UrlPasteboardMimeBase()\n#else\n    : UrlPasteboardMimeBase(MIME_ALL)\n#endif\n    , m_urlUti(urlUti)\n{\n}\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nQString UrlPasteboardMime::convertorName()\n{\n    return QLatin1String(\"CopyQ-URL-\") + m_urlUti;\n}\n#endif\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQString UrlPasteboardMime::utiForMime(const QString &mime) const\n#else\nQString UrlPasteboardMime::flavorFor(const QString &mime)\n#endif\n{\n    if (mime.startsWith(QLatin1String(mimeUriList))) {\n        return m_urlUti;\n    }\n    return QString();\n}\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQString UrlPasteboardMime::mimeForUti(const QString &uti) const\n#else\nQString UrlPasteboardMime::mimeFor(QString uti)\n#endif\n{\n    return (uti == m_urlUti) ? mimeUriList : QString();\n}\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nbool UrlPasteboardMime::canConvert(const QString &mime, QString uti)\n{\n    return mime == QLatin1String(mimeUriList) && uti == m_urlUti;\n}\n#endif\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQVariant UrlPasteboardMime::convertToMime(const QString &mime, const QList<QByteArray> &data, const QString &uti) const\n#else\nQVariant UrlPasteboardMime::convertToMime(const QString &mime, QList<QByteArray> data, QString uti)\n#endif\n{\n    if (!canConvert(mime, uti))\n        return QVariant();\n\n    QList<QVariant> ret;\n    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n    foreach (const QByteArray &urlBytes, data) {\n        QUrl url = QUrl::fromEncoded(urlBytes);\n        if (url.scheme().toLower() == QLatin1String(\"file\")) {\n            // If this is a \"file://\" URL, we probably got a fileReference URL, which is less\n            // understandable by the user, so we'll change it to a filePath URL instead.\n            NSURL *nsUrl = [NSURL URLWithString: url.toString(QUrl::FullyEncoded).toNSString()];\n            url = QUrl::fromNSURL([nsUrl filePathURL]);\n        }\n        if (url.host().toLower() == QLatin1String(\"localhost\"))\n            url.setHost(QString());\n        url.setPath(url.path().normalized(QString::NormalizationForm_C));\n        ret.append(url);\n    }\n    [pool release];\n\n    return QVariant(ret);\n}\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\nQList<QByteArray> UrlPasteboardMime::convertFromMime(const QString &mime, const QVariant &data, const QString &uti) const\n#else\nQList<QByteArray> UrlPasteboardMime::convertFromMime(const QString &mime, QVariant data, QString uti)\n#endif\n{\n    QList<QByteArray> ret;\n    if (!canConvert(mime, uti))\n        return ret;\n\n    QVariantList dataList = data.toList();\n    if (dataList.isEmpty()) {\n        // Data has been converted to a newline separated byte array (??)\n        QStringList urls = data.toString().split('\\n');\n        foreach (const QUrl &url, QUrl::fromStringList(urls)) {\n            dataList << url;\n        }\n    }\n\n    foreach (const QVariant &urlVariant, dataList) {\n        QUrl url = urlVariant.toUrl();\n        if (url.scheme().isEmpty())\n            url.setScheme(QLatin1String(\"file\"));\n        if (url.scheme().toLower() == QLatin1String(\"file\")) {\n            // If this is a \"file://\" URL, OS X probably wants a fileReference URL\n            NSURL *nsUrl = [NSURL URLWithString: url.toString(QUrl::FullyEncoded).toNSString()];\n            url = QUrl::fromNSURL([nsUrl fileReferenceURL]);\n            url.setPath(url.path().normalized(QString::NormalizationForm_D));\n        }\n        ret.append(url.toEncoded());\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "src/platform/platform.cmake",
    "content": "# If window system is X11 then set X11_FOUND to TRUE.\nfind_package(X11)\n\nfile(GLOB copyq_SOURCES ${copyq_SOURCES}\n    platform/platformclipboard.cpp\n    platform/platformclipboard.h\n    )\n\nif (UNIX)\n    file(GLOB copyq_SOURCES ${copyq_SOURCES} platform/unix/*.cpp)\nendif()\n\nif (X11_FOUND AND NOT APPLE)\n    include(platform/x11/x11platform.cmake)\nelseif (Q_WS_WIN OR WIN32)\n    include(platform/win/winplatform.cmake)\nelseif (Q_OS_MAC OR APPLE)\n    include(platform/mac/macplatform.cmake)\nelse()\n    message(WARNING \"Building on unsupported platform!\")\n    file(GLOB copyq_SOURCES ${copyq_SOURCES}\n        platform/dummy/*.cpp\n        )\n    set(USE_QXT FALSE)\nendif()\n"
  },
  {
    "path": "src/platform/platformclipboard.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"platformclipboard.h\"\n\n#include <algorithm>\n\nClipboardModeFlag clipboardModeFlag(ClipboardMode mode)\n{\n    return mode == ClipboardMode::Clipboard\n        ? ClipboardModeFlag::Clipboard\n        : ClipboardModeFlag::Selection;\n}\n\nClipboardConnection::ClipboardConnection(\n        const QStringList &formats, ClipboardModeMask modes, PlatformClipboard *clipboard)\n    : m_formats(formats)\n    , m_modes(modes)\n    , m_clipboard(clipboard)\n{}\n\nClipboardConnection::~ClipboardConnection()\n{\n    if (m_clipboard)\n        m_clipboard->unregisterConnection(this);\n}\n\nPlatformClipboard::~PlatformClipboard()\n{\n    for (auto *connection : std::as_const(m_connections))\n        connection->m_clipboard = nullptr;\n    m_connections.clear();\n}\n\nClipboardConnectionPtr PlatformClipboard::createConnection(\n        const QStringList &formats, ClipboardModeMask modes)\n{\n    auto connection = ClipboardConnectionPtr(new ClipboardConnection(formats, modes, this));\n    registerConnection(connection.get());\n    return connection;\n}\n\nvoid PlatformClipboard::registerConnection(ClipboardConnection *connection)\n{\n    m_connections.append(connection);\n    setMonitoringState();\n}\n\nvoid PlatformClipboard::unregisterConnection(ClipboardConnection *connection)\n{\n    const auto it = std::remove(m_connections.begin(), m_connections.end(), connection);\n    if (it == m_connections.end())\n        return;\n\n    m_connections.erase(it, m_connections.end());\n    connection->m_clipboard = nullptr;\n    setMonitoringState();\n}\n\nvoid PlatformClipboard::setMonitoringState()\n{\n    m_monitoredFormats.clear();\n    m_monitoredModes = {};\n\n    for (const auto *connection : std::as_const(m_connections)) {\n        m_monitoredFormats.append(connection->formats());\n        m_monitoredModes |= connection->modes();\n    }\n    m_monitoredFormats.removeDuplicates();\n\n    if (m_connections.isEmpty()) {\n        if (m_isMonitoringActive) {\n            stopMonitoringBackend();\n            m_isMonitoringActive = false;\n        }\n        return;\n    }\n\n    if (!m_isMonitoringActive) {\n        startMonitoringBackend(m_monitoredFormats, m_monitoredModes);\n        m_isMonitoringActive = true;\n    } else {\n        updateMonitoringSubscription(m_monitoredFormats, m_monitoredModes);\n    }\n}\n\nvoid PlatformClipboard::updateMonitoringSubscription(const QStringList &, ClipboardModeMask)\n{\n}\n\nvoid PlatformClipboard::emitConnectionChanged(ClipboardMode mode)\n{\n    const auto flag = clipboardModeFlag(mode);\n    const auto connections = m_connections;\n    for (auto *connection : connections) {\n        if (connection->modes().testFlag(flag))\n            emit connection->changed(mode);\n    }\n}\n"
  },
  {
    "path": "src/platform/platformclipboard.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n\n#include <QList>\n#include <QObject>\n#include <QVariantMap>\n#include <memory>\n\nclass QMimeData;\nclass PlatformClipboard;\n\nenum class ClipboardModeFlag {\n    Clipboard = 0x1,\n    Selection = 0x2,\n};\nQ_DECLARE_FLAGS(ClipboardModeMask, ClipboardModeFlag)\nQ_DECLARE_OPERATORS_FOR_FLAGS(ClipboardModeMask)\n\nClipboardModeFlag clipboardModeFlag(ClipboardMode mode);\n\nclass ClipboardConnection final : public QObject\n{\n    Q_OBJECT\npublic:\n    ~ClipboardConnection() override;\n\n    const QStringList &formats() const { return m_formats; }\n    ClipboardModeMask modes() const { return m_modes; }\n\nsignals:\n    void changed(ClipboardMode mode);\n\nprivate:\n    friend class PlatformClipboard;\n    ClipboardConnection(const QStringList &formats, ClipboardModeMask modes, PlatformClipboard *clipboard);\n\n    QStringList m_formats;\n    ClipboardModeMask m_modes;\n    PlatformClipboard *m_clipboard = nullptr;\n};\n\nusing ClipboardConnectionPtr = std::unique_ptr<ClipboardConnection>;\n\n/**\n * Interface for clipboard.\n */\nclass PlatformClipboard : public QObject\n{\n    Q_OBJECT\npublic:\n    ~PlatformClipboard() override;\n\n    ClipboardConnectionPtr createConnection(const QStringList &formats, ClipboardModeMask modes);\n\n    /**\n     * Return clipboard data containing specified @a formats if available.\n     */\n    virtual QVariantMap data(ClipboardMode mode, const QStringList &formats) const = 0;\n\n    /**\n     * Set data to clipboard.\n     */\n    virtual void setData(ClipboardMode mode, const QVariantMap &dataMap) = 0;\n    virtual void setRawData(ClipboardMode mode, QMimeData *mimeData) = 0;\n\n    virtual const QMimeData *mimeData(ClipboardMode mode) const = 0;\n\n    virtual bool isSelectionSupported() const = 0;\n\n    virtual bool isHidden(const QMimeData &data) const = 0;\n\n    virtual void setClipboardOwner(const QString &owner) = 0;\n\nprotected:\n    virtual void startMonitoringBackend(const QStringList &formats, ClipboardModeMask modes) = 0;\n    virtual void stopMonitoringBackend() = 0;\n    virtual void updateMonitoringSubscription(const QStringList &formats, ClipboardModeMask modes);\n    void emitConnectionChanged(ClipboardMode mode);\n\nprivate:\n    friend class ClipboardConnection;\n    void registerConnection(ClipboardConnection *connection);\n    void unregisterConnection(ClipboardConnection *connection);\n    void setMonitoringState();\n\n    QList<ClipboardConnection*> m_connections;\n    QStringList m_monitoredFormats;\n    ClipboardModeMask m_monitoredModes;\n    bool m_isMonitoringActive = false;\n};\n"
  },
  {
    "path": "src/platform/platformcommon.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"platformcommon.h\"\n#include \"platformwindow.h\"\n\n#include \"common/log.h\"\n#include \"common/appconfig.h\"\n\n#include <QEventLoop>\n#include <QRegularExpression>\n#include <QSettings>\n#include <QTimer>\n\nnamespace {\n\nconst QLatin1String optionName(\"paste_with_ctrl_v_windows\");\n\n} // namespace\n\nbool pasteWithCtrlV(PlatformWindow &window, const AppConfig &config)\n{\n    const auto value = config.option<Config::window_paste_with_ctrl_v_regex>();\n    const auto pattern = value.isEmpty() ? QSettings().value(optionName).toString() : value;\n    if (pattern.isEmpty())\n        return false;\n\n    const QRegularExpression re(pattern);\n    if (!re.isValid()) {\n        log(QString(\"Invalid regular expression in option \\\"%1\\\": %2\")\n            .arg(optionName, re.errorString()), LogWarning);\n        return false;\n    }\n\n    const QString windowTitle = window.getTitle();\n\n    if ( !windowTitle.contains(re) ) {\n        COPYQ_LOG(QString(\"Paste with standard shortcut to window \\\"%1\\\".\")\n                  .arg(windowTitle));\n        return false;\n    }\n\n    COPYQ_LOG(QString(\"Paste with Ctrl+V requested with option \\\"%1\\\" for window \\\"%2\\\".\")\n              .arg(optionName, windowTitle));\n    return true;\n}\n\nvoid waitMs(int msec)\n{\n    if (msec <= 0)\n        return;\n\n    QEventLoop loop;\n    QTimer t;\n    QObject::connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);\n    t.start(msec);\n    loop.exec();\n}\n"
  },
  {
    "path": "src/platform/platformcommon.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\nclass AppConfig;\nclass PlatformWindow;\n\nbool pasteWithCtrlV(PlatformWindow &window, const AppConfig &config);\n\nvoid waitMs(int msec);\n"
  },
  {
    "path": "src/platform/platformnativeinterface.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QWidget> // WId\n\n#include <memory>\n\nclass QApplication;\nclass QCoreApplication;\nclass QDir;\nclass QGuiApplication;\nclass QKeyEvent;\n\nclass PlatformWindow;\nclass PlatformClipboard;\nclass ClipboardConnection;\n\nusing PlatformWindowPtr = std::shared_ptr<PlatformWindow>;\nusing PlatformClipboardPtr = std::shared_ptr<PlatformClipboard>;\nusing ClipboardConnectionPtr = std::unique_ptr<ClipboardConnection>;\n\n/**\n * Interface for platform dependent code.\n */\nclass PlatformNativeInterface\n{\npublic:\n    PlatformNativeInterface() = default;\n\n    virtual ~PlatformNativeInterface() = default;\n\n    /**\n     * Get window from widget (nullptr if failed or not implemented).\n     */\n    virtual PlatformWindowPtr getWindow(WId winId) = 0;\n\n    /**\n     * Get currently focused window (nullptr if failed or not implemented).\n     */\n    virtual PlatformWindowPtr getCurrentWindow() = 0;\n\n    /**\n     * Return true only if window titles can be retrieved using PlatformWindow::getTitle().\n     */\n    virtual bool canGetWindowTitle() = 0;\n\n    /**\n     * Return true automatic the application start at system startup is supported.\n     */\n    virtual bool canAutostart() = 0;\n\n    /**\n     * Return true if the application is automatically started at system startup.\n     */\n    virtual bool isAutostartEnabled() = 0;\n\n    /**\n     * Enable automatic application start at system startup.\n     */\n    virtual void setAutostartEnabled(bool enable) = 0;\n\n    /**\n     * Prevent screen capture for the window and return true if successfully set.\n     */\n    virtual bool setPreventScreenCapture(WId winId, bool prevent) = 0;\n    virtual bool canPreventScreenCapture() = 0;\n\n    /**\n     * Create QCoreApplication object for console output (to show help or version and quit).\n     */\n    virtual QCoreApplication *createConsoleApplication(int &argc, char **argv) = 0;\n\n    /**\n     * Create QApplication object for server.\n     */\n    virtual QApplication *createServerApplication(int &argc, char **argv) = 0;\n\n    /**\n     * Create QGuiApplication object that monitors or provides clipboard.\n     */\n    virtual QGuiApplication *createClipboardProviderApplication(int &argc, char **argv) = 0;\n\n    /**\n     * Create QCoreApplication object for client.\n     */\n    virtual QCoreApplication *createClientApplication(int &argc, char **argv) = 0;\n    /**\n     * Create QGuiApplication object for tests.\n     */\n    virtual QGuiApplication *createTestApplication(int &argc, char **argv) = 0;\n\n    /**\n     * Return object for managing clipboard.\n     */\n    virtual PlatformClipboardPtr clipboard() = 0;\n\n    /**\n     * Returns list of command line arguments without executable name (argv[0]).\n     */\n    virtual QStringList getCommandLineArguments(int argc, char **argv) = 0;\n\n    /**\n     * Find directory with plugins and return true on success.\n     */\n    virtual bool findPluginDir(QDir *pluginsDir) = 0;\n\n    /**\n     * Default editor command (e.g. \"notepad %1\"; \"%1\" will be replaced with file name to edit).\n     */\n    virtual QString defaultEditorCommand() = 0;\n\n    /**\n     * Path to translations.\n     *\n     * Can be overridden by preprocessor flag COPYQ_TRANSLATION_PREFIX.\n     *\n     * Custom translation prefix can be added by setting COPYQ_TRANSLATION_PREFIX\n     * environment variable.\n     */\n    virtual QString translationPrefix() = 0;\n\n    /**\n     * Path to installed themes.\n     *\n     * Can be overridden by preprocessor flag COPYQ_THEME_PREFIX.\n     *\n     * Custom theme prefix can be added by setting COPYQ_THEME_PREFIX\n     * environment variable.\n     *\n     * Note: Customized themes are saved to settings path.\n     */\n    virtual QString themePrefix() = 0;\n\n    /**\n     * Return the resident set size (RSS) of the current process in bytes.\n     * Returns -1 if not supported on this platform.\n     */\n    virtual qint64 processResidentMemoryBytes() = 0;\n\n    PlatformNativeInterface(const PlatformNativeInterface &) = delete;\n    PlatformNativeInterface &operator=(const PlatformNativeInterface &) = delete;\n};\n\nPlatformNativeInterface *platformNativeInterface();\n"
  },
  {
    "path": "src/platform/platformwindow.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QByteArray>\n\nclass QString;\n\n/**\n * Window storage class for platform. Used to raise/focus window and paste to window.\n */\nclass PlatformWindow\n{\npublic:\n    PlatformWindow() = default;\n\n    virtual ~PlatformWindow() = default;\n\n    /**\n     * Return window title text.\n     */\n    virtual QString getTitle() = 0;\n\n    /**\n     * Raise/focus window.\n     */\n    virtual void raise() = 0;\n\n    /**\n     * Paste clipboard content to window.\n     */\n    virtual bool pasteFromClipboard() = 0;\n\n    /**\n     * Copy to clipboard from window.\n     */\n    virtual bool copyToClipboard() = 0;\n\n    PlatformWindow(const PlatformWindow &) = delete;\n    PlatformWindow &operator=(const PlatformWindow &) = delete;\n};\n"
  },
  {
    "path": "src/platform/unix/unixsignalhandler.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"unixsignalhandler.h\"\n\n#include \"common/log.h\"\n\n#include <QCoreApplication>\n#include <QSocketNotifier>\n\n#include <csignal>\n#include <sys/socket.h>\n#include <unistd.h>\n\nnamespace {\n\nnamespace SignalAction {\nenum SignalAction { Write, Read, Count };\n}\n\nint signalFd[SignalAction::Count];\nQSocketNotifier *signalFdNotifier = nullptr;\n\nstruct SignalData {\n    qint64 pid;\n    int code;\n};\n\n/**\n * Catch Unix signal.\n *\n * Since this can be called at any time, Qt code cannot be handled here. For example,\n * this can be called from QString constructor which can easily deadlock the application on\n * a mutex when trying to create new QString from this handler. Also note that creating\n * QSettings recursively can result in resetting application settings.\n */\nvoid exitSignalHandler(int code)\n{\n    const SignalData data{QCoreApplication::applicationPid(), code};\n    const auto written = ::write(signalFd[SignalAction::Write], &data, sizeof(data));\n    if (written == -1)\n        log(\"Failed to write a Unix signal data\", LogError);\n}\n\nvoid handleSignal()\n{\n    signalFdNotifier->setEnabled(false);\n\n    SignalData data;\n\n    if ( ::read(signalFd[SignalAction::Read], &data, sizeof(data)) != sizeof(data) ) {\n        log(\"Failed to read a Unix signal data\", LogError);\n    } else if (data.pid != QCoreApplication::applicationPid()) {\n        log(\"PID not matching on a Unix signal\", LogError);\n    } else {\n        log( QStringLiteral(\"Terminating application on signal %1\").arg(data.code) );\n        QCoreApplication::exit(128 + data.code);\n    }\n\n    signalFdNotifier->setEnabled(true);\n}\n\n} // namespace\n\nbool initUnixSignalHandler()\n{\n    // Safely quit application on TERM and HUP signals.\n    struct sigaction sigact{};\n\n    sigact.sa_handler = exitSignalHandler;\n    sigemptyset(&sigact.sa_mask);\n    sigact.sa_flags = 0;\n    sigact.sa_flags |= SA_RESTART;\n\n    if ( sigaction(SIGINT, &sigact, nullptr) > 0\n         || sigaction(SIGTERM, &sigact, nullptr) > 0 )\n    {\n        log(\"sigaction() failed!\", LogError);\n        return false;\n    }\n\n    if (::socketpair(AF_UNIX, SOCK_STREAM, 0, signalFd)) {\n        log(\"socketpair() failed!\", LogError);\n        return false;\n    }\n\n    return true;\n}\n\nvoid startUnixSignalHandler()\n{\n    signalFdNotifier = new QSocketNotifier(signalFd[SignalAction::Read], QSocketNotifier::Read);\n    QObject::connect(signalFdNotifier, &QSocketNotifier::activated, handleSignal);\n}\n"
  },
  {
    "path": "src/platform/unix/unixsignalhandler.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n/**\n * Gracefully exit application on Unix signals SIGHUP, SIGINT and SIGTERM.\n *\n * More info at http://qt-project.org/doc/qt-4.8/unix-signals.html\n */\n\nbool initUnixSignalHandler();\nvoid startUnixSignalHandler();\n"
  },
  {
    "path": "src/platform/win/winplatform.cmake",
    "content": "# File icon on Windows\nset(copyq_RC copyq.rc)\n\nfile(GLOB copyq_SOURCES ${copyq_SOURCES}\n    platform/win/winplatform.cpp\n    platform/win/winplatformclipboard.cpp\n    platform/win/winplatformwindow.cpp\n    platform/dummy/dummyclipboard.cpp\n    platform/platformcommon.cpp\n    ../qxt/qxtglobalshortcut_win.cpp\n    )\n\nset(USE_QXT TRUE)\n\n# Omit opening extra console window on Windows.\nset(copyq_windows_no_console WIN32)\nlist(APPEND copyq_COMPILE\n    ${copyq_COMPILE}\n    ${copyq_RC}\n    )\n\nif (MSVC)\n    set(copyq_LINK_FLAGS ${copyq_LINK_FLAGS} \"/ENTRY:mainCRTStartup\")\nendif()\n"
  },
  {
    "path": "src/platform/win/winplatform.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"app/applicationexceptionhandler.h\"\n#include \"common/log.h\"\n#include \"common/settings.h\"\n\n#include \"platform/dummy/dummyclipboard.h\"\n#include \"winplatform.h\"\n#include \"winplatformclipboard.h\"\n#include \"winplatformwindow.h\"\n\n#include <QApplication>\n#include <QCoreApplication>\n#include <QDir>\n#include <QFileInfo>\n#include <QKeyEvent>\n#include <QMetaObject>\n#include <QSettings>\n#include <QStringList>\n#include <QWidget>\n\n#include <qt_windows.h>\n#include <shlobj.h>\n#include <objbase.h>\n#include <objidl.h>\n#include <shlguid.h>\n\n#include <psapi.h>\n#include <stdio.h>\n#include <fcntl.h>\n#include <io.h>\n\nnamespace {\n\nvoid setBinaryFor(int fd)\n{\n    _setmode(fd, _O_BINARY);\n}\n\nQString portableFolder()\n{\n    const QString appDir = QCoreApplication::applicationDirPath();\n    if ( !QFileInfo(appDir).isWritable() )\n        return {};\n\n    const QString uninstPath = appDir + QLatin1String(\"/unins000.exe\");\n    if ( QFile::exists(uninstPath) )\n        return {};\n\n    QDir dir(appDir);\n    if ( !dir.mkpath(QStringLiteral(\"config\"))\n      || !dir.mkpath(QStringLiteral(\"logs\"))\n      || !dir.isReadable() )\n    {\n        return {};\n    }\n\n    const QString fullPath = dir.absolutePath();\n    if ( !QFileInfo(fullPath).isWritable() )\n        return {};\n\n    return fullPath;\n}\n\nQString getStartupFolderPath()\n{\n    wchar_t path[MAX_PATH];\n    if (SUCCEEDED(SHGetFolderPathW(nullptr, CSIDL_STARTUP, nullptr, 0, path))) {\n        return QString::fromWCharArray(path);\n    }\n    return {};\n}\n\nQString getAutostartShortcutPath()\n{\n    const QString startupFolder = getStartupFolderPath();\n    if (startupFolder.isEmpty())\n        return {};\n\n    return QStringLiteral(\"%1\\\\%2.lnk\")\n           .arg(startupFolder, QCoreApplication::applicationName());\n}\n\nbool createShortcut(const QString &shortcutPath, const QString &targetPath, const QString &workingDir)\n{\n    HRESULT hres = CoInitialize(nullptr);\n    if (FAILED(hres) && hres != RPC_E_CHANGED_MODE)\n        return false;\n\n    IShellLinkW *pShellLink = nullptr;\n    hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER,\n                            IID_IShellLinkW, reinterpret_cast<void**>(&pShellLink));\n\n    bool success = false;\n    if (SUCCEEDED(hres)) {\n        pShellLink->SetPath(reinterpret_cast<const wchar_t*>(targetPath.utf16()));\n\n        // Set working directory to the application directory\n        pShellLink->SetWorkingDirectory(reinterpret_cast<const wchar_t*>(workingDir.utf16()));\n\n        IPersistFile *pPersistFile = nullptr;\n        hres = pShellLink->QueryInterface(IID_IPersistFile, reinterpret_cast<void**>(&pPersistFile));\n        if (SUCCEEDED(hres)) {\n            hres = pPersistFile->Save(reinterpret_cast<const wchar_t*>(shortcutPath.utf16()), TRUE);\n            success = SUCCEEDED(hres);\n            pPersistFile->Release();\n        }\n        pShellLink->Release();\n    }\n\n    CoUninitialize();\n    return success;\n}\n\nvoid uninstallControlHandler();\n\nBOOL appQuit()\n{\n    uninstallControlHandler();\n    const bool invoked = QMetaObject::invokeMethod(\n        QCoreApplication::instance(), \"quit\", Qt::BlockingQueuedConnection);\n    if (!invoked) {\n        log(\"Failed to request application exit\", LogError);\n        return FALSE;\n    }\n    ExitProcess(EXIT_SUCCESS);\n    return TRUE;\n}\n\nBOOL ctrlHandler(DWORD fdwCtrlType)\n{\n    switch (fdwCtrlType) {\n    case CTRL_C_EVENT:\n        log(\"Terminating application on signal.\");\n        return appQuit();\n\n    case CTRL_CLOSE_EVENT:\n        log(\"Terminating application on close event.\");\n        return appQuit();\n\n    case CTRL_BREAK_EVENT:\n        log(\"Terminating application on break event.\");\n        return appQuit();\n\n    case CTRL_LOGOFF_EVENT:\n        log(\"Terminating application on log off.\");\n        return appQuit();\n\n    case CTRL_SHUTDOWN_EVENT:\n        log(\"Terminating application on shut down.\");\n        return appQuit();\n\n    default:\n        return FALSE;\n    }\n}\n\nvoid installControlHandler()\n{\n    if ( !SetConsoleCtrlHandler(reinterpret_cast<PHANDLER_ROUTINE>(ctrlHandler), TRUE) )\n        log(\"Failed to set Windows control handler.\", LogError);\n}\n\nvoid uninstallControlHandler()\n{\n    SetConsoleCtrlHandler(reinterpret_cast<PHANDLER_ROUTINE>(ctrlHandler), FALSE);\n}\n\nvoid initApplication(QCoreApplication *app)\n{\n    installControlHandler();\n    setBinaryFor(0);\n    setBinaryFor(1);\n\n    // Don't use Windows registry.\n    QSettings::setDefaultFormat(QSettings::IniFormat);\n\n    // Use config and log file in portable app folder.\n    const QString folder = portableFolder();\n    if ( !folder.isEmpty() ) {\n        const QString configFolder = folder + QLatin1String(\"/config\");\n        QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, configFolder);\n        if ( qEnvironmentVariableIsEmpty(\"COPYQ_LOG_DIR\") )\n            qputenv(\"COPYQ_LOG_DIR\", folder.toLocal8Bit() + \"/logs\");\n        app->setProperty(\"CopyQ_item_data_path\", configFolder + QLatin1String(\"/items\"));\n    }\n}\n\ntemplate <typename Application>\nApplication *createApplication(int &argc, char **argv)\n{\n    Application *app = new ApplicationExceptionHandler<Application>(argc, argv);\n    initApplication(app);\n    return app;\n}\n\nQApplication *createGuiApplication(int &argc, char **argv)\n{\n    auto app = createApplication<QApplication>(argc, argv);\n\n    // WORKAROUND: Create a window so that application can receive\n    //             WM_QUERYENDSESSION (from installer) and similar events.\n    auto w = new QWidget();\n    auto winId = w->winId();\n    Q_UNUSED(winId)\n\n    return app;\n}\n\nQString windowClass(HWND window)\n{\n    WCHAR buf[32];\n    GetClassNameW(window, buf, 32);\n    return QString::fromUtf16(reinterpret_cast<ushort *>(buf));\n}\n\nHWND getLastVisibleActivePopUpOfWindow(HWND window)\n{\n    HWND currentWindow = window;\n\n    for (int i = 0; i < 50; ++i) {\n        HWND lastPopUp = GetLastActivePopup(currentWindow);\n\n        if (IsWindowVisible(lastPopUp))\n            return lastPopUp;\n\n        if (lastPopUp == currentWindow)\n            return nullptr;\n\n        currentWindow = lastPopUp;\n    }\n\n    return nullptr;\n}\n\nbool isAltTabWindow(HWND window)\n{\n    if (!window || window == GetShellWindow())\n        return false;\n\n    HWND root = GetAncestor(window, GA_ROOTOWNER);\n\n    if (getLastVisibleActivePopUpOfWindow(root) != window)\n        return false;\n\n    const QString cls = windowClass(window);\n    COPYQ_LOG_VERBOSE( QString(\"cls: \\\"%1\\\"\").arg(cls) );\n    return !cls.isEmpty()\n            && cls != \"Shell_TrayWnd\"\n            && cls != \"Shell_SecondaryTrayWnd\"\n            && cls != \"Shell_CharmWindow\"\n            && cls != \"DV2ControlHost\"\n            && cls != \"MsgrIMEWindowClass\"\n            && cls != \"SysShadow\"\n            && cls != \"Button\"\n            && !cls.startsWith(\"WMP9MediaBarFlyout\");\n}\n\nHWND currentWindow;\nBOOL CALLBACK getCurrentWindowProc(HWND window, LPARAM)\n{\n    if (!isAltTabWindow(window))\n        return TRUE;\n\n    currentWindow = window;\n    return FALSE;\n}\n\n} // namespace\n\nPlatformNativeInterface *platformNativeInterface()\n{\n    static WinPlatform platform;\n    return &platform;\n}\n\nPlatformWindowPtr WinPlatform::getWindow(WId winId)\n{\n    HWND window = reinterpret_cast<HWND>(winId);\n    return PlatformWindowPtr( window ? new WinPlatformWindow(window) : nullptr );\n}\n\nPlatformWindowPtr WinPlatform::getCurrentWindow()\n{\n    currentWindow = GetForegroundWindow();\n    if (!isAltTabWindow(currentWindow))\n        EnumWindows(getCurrentWindowProc, 0);\n    return PlatformWindowPtr( currentWindow ? new WinPlatformWindow(currentWindow) : nullptr );\n}\n\nbool WinPlatform::setPreventScreenCapture(WId winId, bool prevent)\n{\n    HWND window = reinterpret_cast<HWND>(winId);\n    return window && SetWindowDisplayAffinity(\n        window, prevent ? WDA_EXCLUDEFROMCAPTURE : WDA_NONE);\n}\n\nQCoreApplication *WinPlatform::createConsoleApplication(int &argc, char **argv)\n{\n    return createApplication<QCoreApplication>(argc, argv);\n}\n\nQApplication *WinPlatform::createServerApplication(int &argc, char **argv)\n{\n    return createGuiApplication(argc, argv);\n}\n\nQGuiApplication *WinPlatform::createClipboardProviderApplication(int &argc, char **argv)\n{\n    return createApplication<QGuiApplication>(argc, argv);\n}\n\nQCoreApplication *WinPlatform::createClientApplication(int &argc, char **argv)\n{\n    return createApplication<QCoreApplication>(argc, argv);\n}\n\nQGuiApplication *WinPlatform::createTestApplication(int &argc, char **argv)\n{\n    return createApplication<QGuiApplication>(argc, argv);\n}\n\nPlatformClipboardPtr WinPlatform::clipboard()\n{\n    return PlatformClipboardPtr(new WinPlatformClipboard());\n}\n\nQStringList WinPlatform::getCommandLineArguments(int, char**)\n{\n    int argumentCount;\n    LPWSTR *arguments = CommandLineToArgvW(GetCommandLineW(), &argumentCount);\n\n    QStringList result;\n\n    for (int i = 1; i < argumentCount; ++i)\n        result.append( QString::fromUtf16(reinterpret_cast<ushort*>(arguments[i])) );\n\n    return result;\n}\n\nbool WinPlatform::findPluginDir(QDir *pluginsDir)\n{\n    pluginsDir->setPath( qApp->applicationDirPath() );\n    return pluginsDir->cd(\"plugins\");\n}\n\nQString WinPlatform::defaultEditorCommand()\n{\n    return \"notepad %1\";\n}\n\nQString WinPlatform::translationPrefix()\n{\n    return QCoreApplication::applicationDirPath() + \"/translations\";\n}\n\nQString WinPlatform::themePrefix()\n{\n    return QApplication::applicationDirPath() + \"/themes\";\n}\n\nbool WinPlatform::isAutostartEnabled()\n{\n    const QString shortcutPath = getAutostartShortcutPath();\n    return !shortcutPath.isEmpty() && QFile::exists(shortcutPath);\n}\n\nvoid WinPlatform::setAutostartEnabled(bool enable)\n{\n    const QString shortcutPath = getAutostartShortcutPath();\n    if (shortcutPath.isEmpty()) {\n        log(\"Failed to get autostart shortcut path\", LogError);\n        return;\n    }\n\n    if (enable) {\n        const QString exePath = QDir::toNativeSeparators(QCoreApplication::applicationFilePath());\n        const QString dirPath = QDir::toNativeSeparators(QCoreApplication::applicationDirPath());\n        if (!createShortcut(shortcutPath, exePath, dirPath)) {\n            log(QStringLiteral(\"Failed to create autostart shortcut at \\\"%1\\\"\").arg(shortcutPath), LogError);\n        }\n    } else if (QFile::exists(shortcutPath) && !QFile::remove(shortcutPath)) {\n        log(QStringLiteral(\"Failed to remove autostart shortcut at \\\"%1\\\"\").arg(shortcutPath), LogError);\n    }\n}\n\nqint64 WinPlatform::processResidentMemoryBytes()\n{\n    PROCESS_MEMORY_COUNTERS pmc;\n    if (!GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))\n        return -1;\n    return static_cast<qint64>(pmc.WorkingSetSize);\n}\n"
  },
  {
    "path": "src/platform/win/winplatform.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/platformnativeinterface.h\"\n\nclass WinPlatform final : public PlatformNativeInterface\n{\npublic:\n    WinPlatform() {}\n\n    PlatformWindowPtr getWindow(WId winId) override;\n\n    PlatformWindowPtr getCurrentWindow() override;\n\n    bool canGetWindowTitle() override { return true; }\n\n    bool canAutostart() override { return true; }\n\n    bool isAutostartEnabled() override;\n\n    void setAutostartEnabled(bool enable) override;\n\n    bool setPreventScreenCapture(WId winId, bool prevent) override;\n    bool canPreventScreenCapture() override { return true; }\n\n    QCoreApplication *createConsoleApplication(int &argc, char **argv) override;\n\n    QApplication *createServerApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createClipboardProviderApplication(int &argc, char **argv) override;\n\n    QCoreApplication *createClientApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createTestApplication(int &argc, char **argv) override;\n\n    PlatformClipboardPtr clipboard() override;\n\n    QStringList getCommandLineArguments(int, char**) override;\n\n    bool findPluginDir(QDir *pluginsDir) override;\n\n    QString defaultEditorCommand() override;\n\n    QString translationPrefix() override;\n\n    QString themePrefix() override;\n\n    qint64 processResidentMemoryBytes() override;\n};\n"
  },
  {
    "path": "src/platform/win/winplatformclipboard.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"winplatformclipboard.h\"\n\n#include <QClipboard>\n#include <QMimeData>\n#include <QTimer>\n\nnamespace {\n\nbool contains(const QStringList &formats, const QMimeData &data, const QString &format, const QByteArray &value)\n{\n    return formats.contains(format) && data.data(format) == value;\n}\n\n} // namespace\n\nvoid WinPlatformClipboard::startMonitoringBackend(const QStringList &formats, ClipboardModeMask modes)\n{\n    Q_UNUSED(modes)\n    m_lastClipboardSequenceNumber = GetClipboardSequenceNumber();\n\n    /* Clipboard needs to be checked in intervals since\n     * the QClipboard::changed() signal is not emitted in some cases on Windows.\n     */\n    m_timer = new QTimer(this);\n    m_timer->setInterval(500);\n    connect( m_timer, &QTimer::timeout, this, [this](){\n        onClipboardChanged(QClipboard::Clipboard);\n    });\n    m_timer->start();\n\n    DummyClipboard::startMonitoringBackend(formats, modes);\n}\n\nvoid WinPlatformClipboard::stopMonitoringBackend()\n{\n    if (m_timer) {\n        m_timer->stop();\n        m_timer->deleteLater();\n        m_timer = nullptr;\n    }\n    DummyClipboard::stopMonitoringBackend();\n}\n\nbool WinPlatformClipboard::isHidden(const QMimeData &data) const\n{\n    static const QByteArray zeroDWord(4, '\\0');\n\n    // QMimeData::hasFormat does not seem to work in this case (in Qt 5.15.2).\n    const QStringList formats = data.formats();\n\n    return formats.contains(\n            QLatin1String(\"application/x-qt-windows-mime;value=\\\"Clipboard Viewer Ignore\\\"\"))\n\n        // https://learn.microsoft.com/en-us/windows/win32/dataxchg/clipboard-formats#cloud-clipboard-and-clipboard-history-formats\n        || formats.contains(\n            QLatin1String(\"application/x-qt-windows-mime;value=\\\"ExcludeClipboardContentFromMonitorProcessing\\\"\"))\n        || contains(formats, data,\n            QStringLiteral(\"application/x-qt-windows-mime;value=\\\"CanIncludeInClipboardHistory\\\"\"), zeroDWord)\n        || contains(formats, data,\n            QStringLiteral(\"application/x-qt-windows-mime;value=\\\"CanUploadToCloudClipboard\\\"\"), zeroDWord)\n\n        // This is set by some Qt apps\n        || contains(formats, data,\n            QStringLiteral(\"ExcludeClipboardContentFromMonitorProcessing\"), QByteArrayLiteral(\"1\"));\n}\n\nvoid WinPlatformClipboard::onChanged(int)\n{\n    const DWORD newClipboardSequenceNumber = GetClipboardSequenceNumber();\n    if (newClipboardSequenceNumber == m_lastClipboardSequenceNumber)\n        return;\n\n    m_lastClipboardSequenceNumber = newClipboardSequenceNumber;\n\n    emitConnectionChanged(ClipboardMode::Clipboard);\n}\n"
  },
  {
    "path": "src/platform/win/winplatformclipboard.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/dummy/dummyclipboard.h\"\n\n#include <qt_windows.h>\n\nclass QTimer;\n\nclass WinPlatformClipboard final : public DummyClipboard\n{\npublic:\n    bool isHidden(const QMimeData &data) const override;\n\nprotected:\n    void startMonitoringBackend(const QStringList &, ClipboardModeMask) override;\n    void stopMonitoringBackend() override;\n    void onChanged(int) override;\n    const long int *clipboardSequenceNumber(ClipboardMode) const override {\n        return &m_lastClipboardSequenceNumber;\n    }\n\nprivate:\n    long int m_lastClipboardSequenceNumber = 0;\n    QTimer *m_timer = nullptr;\n};\n"
  },
  {
    "path": "src/platform/win/winplatformwindow.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"platform/platformcommon.h\"\n#include \"winplatformwindow.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/log.h\"\n#include \"common/sleeptimer.h\"\n\n#include <QApplication>\n#include <QElapsedTimer>\n#include <QString>\n#include <QVector>\n\nnamespace {\n\nQString windowTitle(HWND window)\n{\n    WCHAR buf[1024];\n    GetWindowTextW(window, buf, 1024);\n    return QString::fromUtf16(reinterpret_cast<ushort *>(buf));\n}\n\nINPUT createInput(WORD key, DWORD flags = 0)\n{\n    INPUT input;\n\n    input.type = INPUT_KEYBOARD;\n    input.ki.wVk = key;\n    input.ki.wScan = 0;\n    input.ki.dwFlags = KEYEVENTF_UNICODE | flags;\n    input.ki.time = 0;\n    input.ki.dwExtraInfo = GetMessageExtraInfo();\n\n    return input;\n}\n\nQString windowLogText(QString text, HWND window)\n{\n    const QString windowInfo =\n            QString(\"%1\").arg(reinterpret_cast<quintptr>(window))\n            + \" \\\"\" + windowTitle(window) + \"\\\"\";\n\n    text.prepend(\"Window \" + windowInfo + \": \");\n\n    const DWORD lastError = GetLastError();\n    if (lastError != 0)\n        text.append( QString(\" (last error is %1)\").arg(GetLastError()) );\n\n    return text;\n}\n\nvoid logWindowWarning(const char *text, HWND window)\n{\n    log( windowLogText(text, window), LogWarning );\n}\n\nvoid logWindowDebug(const char *text, HWND window)\n{\n    COPYQ_LOG( windowLogText(text, window) );\n}\n\nbool raiseWindowHelper(HWND window)\n{\n    if (!SetForegroundWindow(window)) {\n        logWindowWarning(\"Failed to raise: SetForegroundWindow() == false\", window);\n        return false;\n    }\n\n    SetWindowPos(window, HWND_TOP, 0, 0, 0, 0,\n                 SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);\n\n    logWindowDebug(\"Raised\", window);\n\n    return true;\n}\n\nbool raiseWindow(HWND window)\n{\n    if (!IsWindowVisible(window)) {\n        logWindowWarning(\"Failed to raise: IsWindowVisible() == false\", window);\n        return false;\n    }\n\n    // WORKAROUND: Set foreground window if even this process is not in foreground.\n    const auto thisThreadId = GetCurrentThreadId();\n    const auto foregroundThreadId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);\n    if (thisThreadId != foregroundThreadId) {\n        if ( AttachThreadInput(thisThreadId, foregroundThreadId, true) ) {\n            logWindowDebug(\"Attached foreground thread\", window);\n            const bool result = raiseWindowHelper(window);\n            AttachThreadInput(thisThreadId, foregroundThreadId, false);\n            return result;\n        }\n\n        logWindowDebug(\"Failed to attach foreground thread\", window);\n    }\n\n    return raiseWindowHelper(window);\n}\n\nbool isKeyPressed(int key)\n{\n    return GetKeyState(key) & 0x8000;\n}\n\nbool isModifierPressed()\n{\n    return isKeyPressed(VK_LWIN)\n        || isKeyPressed(VK_RWIN)\n        || isKeyPressed(VK_LCONTROL)\n        || isKeyPressed(VK_RCONTROL)\n        || isKeyPressed(VK_LSHIFT)\n        || isKeyPressed(VK_RSHIFT)\n        || isKeyPressed(VK_LMENU)\n        || isKeyPressed(VK_RMENU)\n        || isKeyPressed(VK_MENU);\n}\n\nbool waitForModifiersReleased(const AppConfig &config)\n{\n    const int maxWaitForModsReleaseMs = config.option<Config::window_wait_for_modifier_released_ms>();\n    if (maxWaitForModsReleaseMs >= 0) {\n        SleepTimer t(maxWaitForModsReleaseMs);\n        while (t.sleep()) {\n            if (!isModifierPressed())\n                return true;\n        }\n    }\n\n    return !isModifierPressed();\n}\n\nbool sendInputs(QVector<INPUT> input, HWND wnd)\n{\n    const UINT numberOfAddedEvents = SendInput( input.size(), input.data(), sizeof(INPUT) );\n    if (numberOfAddedEvents == 0u) {\n        logWindowWarning(\"Failed to simulate key events\", wnd);\n        return false;\n    }\n    return true;\n}\n\n} // namespace\n\nWinPlatformWindow::WinPlatformWindow(HWND window)\n    : m_window(window)\n{\n}\n\nQString WinPlatformWindow::getTitle()\n{\n    return windowTitle(m_window);\n}\n\nvoid WinPlatformWindow::raise()\n{\n    raiseWindow(m_window);\n}\n\nbool WinPlatformWindow::pasteFromClipboard()\n{\n    const AppConfig config;\n\n    if ( pasteWithCtrlV(*this, config) )\n        return sendKeyPress(VK_LCONTROL, 'V', config);\n\n    return sendKeyPress(VK_LSHIFT, VK_INSERT, config);\n}\n\nbool WinPlatformWindow::copyToClipboard()\n{\n    const AppConfig config;\n\n    const DWORD clipboardSequenceNumber = GetClipboardSequenceNumber();\n    if ( !sendKeyPress(VK_LCONTROL, 'C', config) )\n        return false;\n\n    // Wait for clipboard to change.\n    QElapsedTimer t;\n    t.start();\n    while ( clipboardSequenceNumber == GetClipboardSequenceNumber() && t.elapsed() < 2000 )\n        QApplication::processEvents(QEventLoop::AllEvents, 100);\n\n    return clipboardSequenceNumber != GetClipboardSequenceNumber();\n}\n\nbool WinPlatformWindow::sendKeyPress(WORD modifier, WORD key, const AppConfig &config)\n{\n    waitMs(config.option<Config::window_wait_before_raise_ms>());\n\n    if (!raiseWindow(m_window))\n        return false;\n\n    waitMs(config.option<Config::window_wait_after_raised_ms>());\n\n    // Wait for user to release modifiers.\n    if (!waitForModifiersReleased(config)) {\n        logWindowWarning(\"Failed to simulate key presses while modifiers are pressed\", m_window);\n        return false;\n    }\n\n    const int keyPressTimeMs = config.option<Config::window_key_press_time_ms>();\n    if (keyPressTimeMs <= 0) {\n        return sendInputs({\n           createInput(modifier),\n           createInput(key),\n           createInput(key, KEYEVENTF_KEYUP),\n           createInput(modifier, KEYEVENTF_KEYUP)\n        }, m_window);\n    }\n\n    const bool sent = sendInputs({\n        createInput(modifier),\n        createInput(key)\n    }, m_window);\n    if (!sent)\n        return false;\n\n    waitMs(keyPressTimeMs);\n\n    return sendInputs({\n       createInput(key, KEYEVENTF_KEYUP),\n       createInput(modifier, KEYEVENTF_KEYUP)\n    }, m_window);\n}\n"
  },
  {
    "path": "src/platform/win/winplatformwindow.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/platformwindow.h\"\n\n#ifndef WINVER\n#define WINVER 0x0500\n#endif\n#include <qt_windows.h>\n\nclass AppConfig;\n\nclass WinPlatformWindow final : public PlatformWindow\n{\npublic:\n    explicit WinPlatformWindow(HWND window);\n\n    QString getTitle() override;\n\n    void raise() override;\n\n    bool pasteFromClipboard() override;\n    bool copyToClipboard() override;\n\nprivate:\n    bool sendKeyPress(WORD modifier, WORD key, const AppConfig &config);\n\n    HWND m_window;\n};\n"
  },
  {
    "path": "src/platform/x11/systemclipboard/CMakeLists.txt",
    "content": "include_directories(SYSTEM ${${copyq_qt}Gui_PRIVATE_INCLUDE_DIRS}) # for native interface to get wl_seat\nfind_package(Wayland 1.15 COMPONENTS Client)\nfind_package(${copyq_qt} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS WaylandClient)\n\nset(systemclipboard_SRCS\n    waylandclipboard.cpp\n)\n\nif(WITH_QT6)\n    add_library(systemclipboard STATIC ${systemclipboard_SRCS})\n    qt_generate_wayland_protocol_client_sources(systemclipboard\n        FILES\n            \"${CMAKE_CURRENT_SOURCE_DIR}/wlr-data-control-unstable-v1.xml\"\n            \"${CMAKE_CURRENT_SOURCE_DIR}/keyboard-shortcuts-inhibit-unstable-v1.xml\"\n            \"${Wayland_DATADIR}/wayland.xml\"\n    )\nelse()\n    find_package(QtWaylandScanner REQUIRED)\n    ecm_add_qtwayland_client_protocol(systemclipboard_SRCS\n        PROTOCOL wlr-data-control-unstable-v1.xml\n        BASENAME wlr-data-control-unstable-v1\n    )\n    ecm_add_qtwayland_client_protocol(systemclipboard_SRCS\n        PROTOCOL keyboard-shortcuts-inhibit-unstable-v1.xml\n        BASENAME keyboard-shortcuts-inhibit-unstable-v1\n    )\n    ecm_add_qtwayland_client_protocol(systemclipboard_SRCS\n        PROTOCOL \"${Wayland_DATADIR}/wayland.xml\"\n        BASENAME wayland\n    )\n    add_library(systemclipboard STATIC ${systemclipboard_SRCS})\nendif()\n\ntarget_link_libraries(systemclipboard\n                      ${copyq_qt}::Gui\n                      ${copyq_qt}::WaylandClient\n                      Wayland::Client\n)\nif (TARGET ${copyq_qt}::GuiPrivate)\n    # for native interface to get wl_seat\n    target_link_libraries(systemclipboard ${copyq_qt}::GuiPrivate)\nendif()\n"
  },
  {
    "path": "src/platform/x11/systemclipboard/keyboard-shortcuts-inhibit-unstable-v1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<protocol name=\"keyboard_shortcuts_inhibit_unstable_v1\">\n\n  <copyright>\n    Copyright © 2017 Red Hat Inc.\n\n    Permission is hereby granted, free of charge, to any person obtaining a\n    copy of this software and associated documentation files (the \"Software\"),\n    to deal in the Software without restriction, including without limitation\n    the rights to use, copy, modify, merge, publish, distribute, sublicense,\n    and/or sell copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice (including the next\n    paragraph) shall be included in all copies or substantial portions of the\n    Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n    DEALINGS IN THE SOFTWARE.\n  </copyright>\n\n  <description summary=\"Protocol for inhibiting the compositor keyboard shortcuts\">\n    This protocol specifies a way for a client to request the compositor\n    to ignore its own keyboard shortcuts for a given seat, so that all\n    key events from that seat get forwarded to a surface.\n\n    Warning! The protocol described in this file is experimental and\n    backward incompatible changes may be made. Backward compatible\n    changes may be added together with the corresponding interface\n    version bump.\n    Backward incompatible changes are done by bumping the version\n    number in the protocol and interface names and resetting the\n    interface version. Once the protocol is to be declared stable,\n    the 'z' prefix and the version number in the protocol and\n    interface names are removed and the interface version number is\n    reset.\n  </description>\n\n  <interface name=\"zwp_keyboard_shortcuts_inhibit_manager_v1\" version=\"1\">\n    <description summary=\"context object for keyboard grab_manager\">\n      A global interface used for inhibiting the compositor keyboard shortcuts.\n    </description>\n\n    <request name=\"destroy\" type=\"destructor\">\n      <description summary=\"destroy the keyboard shortcuts inhibitor object\">\n\tDestroy the keyboard shortcuts inhibitor manager.\n      </description>\n    </request>\n\n    <request name=\"inhibit_shortcuts\">\n      <description summary=\"create a new keyboard shortcuts inhibitor object\">\n\tCreate a new keyboard shortcuts inhibitor object associated with\n\tthe given surface for the given seat.\n\n\tIf shortcuts are already inhibited for the specified seat and surface,\n\ta protocol error \"already_inhibited\" is raised by the compositor.\n      </description>\n      <arg name=\"id\" type=\"new_id\" interface=\"zwp_keyboard_shortcuts_inhibitor_v1\"/>\n      <arg name=\"surface\" type=\"object\" interface=\"wl_surface\"\n\t   summary=\"the surface that inhibits the keyboard shortcuts behavior\"/>\n      <arg name=\"seat\" type=\"object\" interface=\"wl_seat\"\n\t   summary=\"the wl_seat for which keyboard shortcuts should be disabled\"/>\n    </request>\n\n    <enum name=\"error\">\n      <entry name=\"already_inhibited\"\n\t     value=\"0\"\n\t     summary=\"the shortcuts are already inhibited for this surface\"/>\n    </enum>\n  </interface>\n\n  <interface name=\"zwp_keyboard_shortcuts_inhibitor_v1\" version=\"1\">\n    <description summary=\"context object for keyboard shortcuts inhibitor\">\n      A keyboard shortcuts inhibitor instructs the compositor to ignore\n      its own keyboard shortcuts when the associated surface has keyboard\n      focus. As a result, when the surface has keyboard focus on the given\n      seat, it will receive all key events originating from the specified\n      seat, even those which would normally be caught by the compositor for\n      its own shortcuts.\n\n      The Wayland compositor is however under no obligation to disable\n      all of its shortcuts, and may keep some special key combo for its own\n      use, including but not limited to one allowing the user to forcibly\n      restore normal keyboard events routing in the case of an unwilling\n      client. The compositor may also use the same key combo to reactivate\n      an existing shortcut inhibitor that was previously deactivated on\n      user request.\n\n      When the compositor restores its own keyboard shortcuts, an\n      \"inactive\" event is emitted to notify the client that the keyboard\n      shortcuts inhibitor is not effectively active for the surface and\n      seat any more, and the client should not expect to receive all\n      keyboard events.\n\n      When the keyboard shortcuts inhibitor is inactive, the client has\n      no way to forcibly reactivate the keyboard shortcuts inhibitor.\n\n      The user can chose to re-enable a previously deactivated keyboard\n      shortcuts inhibitor using any mechanism the compositor may offer,\n      in which case the compositor will send an \"active\" event to notify\n      the client.\n\n      If the surface is destroyed, unmapped, or loses the seat's keyboard\n      focus, the keyboard shortcuts inhibitor becomes irrelevant and the\n      compositor will restore its own keyboard shortcuts but no \"inactive\"\n      event is emitted in this case.\n    </description>\n\n    <request name=\"destroy\" type=\"destructor\">\n      <description summary=\"destroy the keyboard shortcuts inhibitor object\">\n\tRemove the keyboard shortcuts inhibitor from the associated wl_surface.\n      </description>\n    </request>\n\n    <event name=\"active\">\n      <description summary=\"shortcuts are inhibited\">\n\tThis event indicates that the shortcut inhibitor is active.\n\n\tThe compositor sends this event every time compositor shortcuts\n\tare inhibited on behalf of the surface. When active, the client\n\tmay receive input events normally reserved by the compositor\n\t(see zwp_keyboard_shortcuts_inhibitor_v1).\n\n\tThis occurs typically when the initial request \"inhibit_shortcuts\"\n\tfirst becomes active or when the user instructs the compositor to\n\tre-enable and existing shortcuts inhibitor using any mechanism\n\toffered by the compositor.\n      </description>\n    </event>\n\n    <event name=\"inactive\">\n      <description summary=\"shortcuts are restored\">\n\tThis event indicates that the shortcuts inhibitor is inactive,\n\tnormal shortcuts processing is restored by the compositor.\n       </description>\n    </event>\n  </interface>\n</protocol>\n"
  },
  {
    "path": "src/platform/x11/systemclipboard/waylandclipboard.cpp",
    "content": "/*\n    SPDX-FileCopyrightText: 2020 David Edmundson <davidedmundson@kde.org>\n    SPDX-FileCopyrightText: 2021 Méven Car <meven.car@enioka.com>\n\n    SPDX-License-Identifier: LGPL-2.0-or-later\n*/\n\n#include \"waylandclipboard.h\"\n\n#include <QBuffer>\n#include <QDebug>\n#include <QElapsedTimer>\n#include <QFile>\n#include <QGuiApplication>\n#include <QImageReader>\n#include <QImageWriter>\n#include <QMimeData>\n#include <QThread>\n#include <QtWaylandClient/QWaylandClientExtension>\n#include <qpa/qplatformnativeinterface.h>\n#include <qtwaylandclientversion.h>\n\n#include <errno.h>\n#include <fcntl.h>\n#include <poll.h>\n#include <signal.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"qwayland-wayland.h\"\n#include \"qwayland-wlr-data-control-unstable-v1.h\"\n\nstatic inline QString applicationQtXImageLiteral()\n{\n    return QStringLiteral(\"application/x-qt-image\");\n}\n\n// copied from https://code.woboq.org/qt5/qtbase/src/gui/kernel/qinternalmimedata.cpp.html\nstatic QString utf8Text()\n{\n    return QStringLiteral(\"text/plain;charset=utf-8\");\n}\n\nstatic QStringList imageMimeFormats(const QList<QByteArray> &imageFormats)\n{\n    QStringList formats;\n    formats.reserve(imageFormats.size());\n    for (const auto &format : imageFormats)\n        formats.append(QLatin1String(\"image/\") + QLatin1String(format.toLower()));\n    // put png at the front because it is best\n    int pngIndex = formats.indexOf(QLatin1String(\"image/png\"));\n    if (pngIndex != -1 && pngIndex != 0)\n        formats.move(pngIndex, 0);\n    return formats;\n}\n\nstatic inline QStringList imageReadMimeFormats()\n{\n    return imageMimeFormats(QImageReader::supportedImageFormats());\n}\n\nstatic inline QStringList imageWriteMimeFormats()\n{\n    return imageMimeFormats(QImageWriter::supportedImageFormats());\n}\n// end copied\n\nnamespace {\n\nclass SendThread : public QThread {\npublic:\n    SendThread(int fd, const QByteArray &data)\n        : m_data(data)\n        , m_fd(fd)\n    {}\n\nprotected:\n    void run() override {\n        QFile c;\n        if (c.open(m_fd, QFile::WriteOnly, QFile::AutoCloseHandle)) {\n            // Create a sigpipe handler that does nothing, or clients may be forced to terminate\n            // if the pipe is closed in the other end.\n            struct sigaction action, oldAction;\n            action.sa_handler = SIG_IGN;\n            sigemptyset(&action.sa_mask);\n            action.sa_flags = 0;\n            sigaction(SIGPIPE, &action, &oldAction);\n            // Unset O_NONBLOCK\n            fcntl(m_fd, F_SETFL, 0);\n            const qint64 written = c.write(m_data);\n            sigaction(SIGPIPE, &oldAction, nullptr);\n            c.close();\n\n            if (written != m_data.size()) {\n                qWarning() << \"Failed to send all clipobard data; sent\"\n                           << written << \"bytes out of\" << m_data.size();\n            }\n        }\n    }\n\nprivate:\n    QByteArray m_data;\n    int m_fd;\n};\n\n} // namespace\n\nclass Keyboard;\n// We are binding to Seat/Keyboard manually because we want to react to gaining focus but inside Qt the events are Qt and arrive to late\nclass KeyboardFocusWatcher : public QWaylandClientExtensionTemplate<KeyboardFocusWatcher>, public QtWayland::wl_seat\n{\n    Q_OBJECT\npublic:\n    KeyboardFocusWatcher()\n        : QWaylandClientExtensionTemplate(5)\n    {\n#if QTWAYLANDCLIENT_VERSION >= QT_VERSION_CHECK(6, 2, 0)\n        initialize();\n#else\n        // QWaylandClientExtensionTemplate invokes this with a QueuedConnection but we want shortcuts\n        // to be have access to data_control immediately.\n        QMetaObject::invokeMethod(this, \"addRegistryListener\");\n#endif\n        QPlatformNativeInterface *native = qGuiApp->platformNativeInterface();\n        auto display = static_cast<struct ::wl_display *>(native->nativeResourceForIntegration(\"wl_display\"));\n        // so we get capabilities\n        wl_display_roundtrip(display);\n    }\n    ~KeyboardFocusWatcher() override\n    {\n        if (isActive()) {\n            release();\n        }\n    }\n    void seat_capabilities(uint32_t capabilities) override\n    {\n        const bool hasKeyboard = capabilities & capability_keyboard;\n        if (hasKeyboard && !m_keyboard) {\n            m_keyboard = std::make_unique<Keyboard>(get_keyboard(), *this);\n        } else if (!hasKeyboard && m_keyboard) {\n            m_keyboard.reset();\n        }\n    }\n    bool hasFocus() const\n    {\n        return m_focus;\n    }\nQ_SIGNALS:\n    void keyboardEntered();\n\nprivate:\n    friend Keyboard;\n    bool m_focus = false;\n    std::unique_ptr<Keyboard> m_keyboard;\n};\n\nclass Keyboard : public QtWayland::wl_keyboard\n{\npublic:\n    Keyboard(::wl_keyboard *keyboard, KeyboardFocusWatcher &seat)\n        : wl_keyboard(keyboard)\n        , m_seat(seat)\n    {\n    }\n    ~Keyboard()\n    {\n        release();\n    }\n\nprivate:\n    void keyboard_enter([[maybe_unused]] uint32_t serial, [[maybe_unused]] wl_surface *surface, [[maybe_unused]] wl_array *keys) override\n    {\n        m_seat.m_focus = true;\n        Q_EMIT m_seat.keyboardEntered();\n    }\n    void keyboard_leave([[maybe_unused]] uint32_t serial, [[maybe_unused]] wl_surface *surface) override\n    {\n        m_seat.m_focus = false;\n    }\n    KeyboardFocusWatcher &m_seat;\n};\n\nclass DataControlDeviceManager : public QWaylandClientExtensionTemplate<DataControlDeviceManager>\n        , public QtWayland::zwlr_data_control_manager_v1\n{\n    Q_OBJECT\npublic:\n    DataControlDeviceManager()\n        : QWaylandClientExtensionTemplate<DataControlDeviceManager>(2)\n    {\n    }\n\n    void instantiate()\n    {\n#if QTWAYLANDCLIENT_VERSION >= QT_VERSION_CHECK(6, 2, 0)\n        initialize();\n#else\n        // QWaylandClientExtensionTemplate invokes this with a QueuedConnection but we want shortcuts\n        // to be have access to data_control immediately.\n        QMetaObject::invokeMethod(this, \"addRegistryListener\");\n#endif\n    }\n\n    ~DataControlDeviceManager()\n    {\n        if (isInitialized()) {\n            destroy();\n        }\n    }\n};\n\nclass DataControlOffer : public QMimeData, public QtWayland::zwlr_data_control_offer_v1\n{\n    Q_OBJECT\npublic:\n    QClipboard::Mode clipboardMode = QClipboard::Clipboard;\n\n    DataControlOffer(struct ::zwlr_data_control_offer_v1 *id, const std::shared_ptr<KeyboardFocusWatcher> &keyboardFocusWatcher)\n        : QtWayland::zwlr_data_control_offer_v1(id)\n        , m_keyboardFocusWatcher(keyboardFocusWatcher)\n    {\n    }\n\n    ~DataControlOffer()\n    {\n        if ( isInitialized() )\n            destroy();\n    }\n\n    QStringList formats() const override\n    {\n        return m_receivedFormats;\n    }\n\n    bool containsImageData() const\n    {\n        if (m_receivedFormats.contains(applicationQtXImageLiteral())) {\n            return true;\n        }\n        const auto formats = imageReadMimeFormats();\n        for (const auto &receivedFormat : m_receivedFormats) {\n            if (formats.contains(receivedFormat)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    bool hasFormat(const QString &mimeType) const override\n    {\n        if (mimeType == QStringLiteral(\"text/plain\") && m_receivedFormats.contains(utf8Text())) {\n            return true;\n        }\n        if (m_receivedFormats.contains(mimeType)) {\n            return true;\n        }\n\n        // If we have image data\n        if (containsImageData()) {\n            // is the requested output mimeType supported ?\n            const QStringList imageFormats = imageWriteMimeFormats();\n            for (const QString &imageFormat : imageFormats) {\n                if (imageFormat == mimeType) {\n                    return true;\n                }\n            }\n            if (mimeType == applicationQtXImageLiteral()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\nprotected:\n    void zwlr_data_control_offer_v1_offer(const QString &mime_type) override\n    {\n        if (!m_receivedFormats.contains(mime_type)) {\n            m_receivedFormats << mime_type;\n        }\n    }\n\n#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)\n    QVariant retrieveData(const QString &mimeType, QMetaType type) const override;\n#else\n    QVariant retrieveData(const QString &mimeType, QVariant::Type type) const override;\n#endif\n\nprivate:\n    /** reads data from a file descriptor with a timeout of 1 second\n     *  true if data is read successfully\n     */\n    static bool readData(int fd, QByteArray &data);\n    QStringList m_receivedFormats;\n    mutable QHash<QString, QVariant> m_data;\n    std::shared_ptr<KeyboardFocusWatcher> m_keyboardFocusWatcher;\n};\n\n#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)\nQVariant DataControlOffer::retrieveData(const QString &mimeType, QMetaType type) const\n#else\nQVariant DataControlOffer::retrieveData(const QString &mimeType, QVariant::Type type) const\n#endif\n{\n    Q_UNUSED(type);\n\n    if (m_keyboardFocusWatcher->hasFocus()) {\n        const auto mimeData = QGuiApplication::clipboard()->mimeData(clipboardMode);\n        if (mimeData)\n            return mimeData->data(mimeType);\n        return {};\n    }\n\n    auto it = m_data.constFind(mimeType);\n    if (it != m_data.constEnd())\n        return *it;\n\n    QString mime;\n    if (!m_receivedFormats.contains(mimeType)) {\n        if (mimeType == QStringLiteral(\"text/plain\") && m_receivedFormats.contains(utf8Text())) {\n            mime = utf8Text();\n        } else if (mimeType == applicationQtXImageLiteral()) {\n            const auto writeFormats = imageWriteMimeFormats();\n            for (const auto &receivedFormat : m_receivedFormats) {\n                if (writeFormats.contains(receivedFormat)) {\n                    mime = receivedFormat;\n                    break;\n                }\n            }\n            if (mime.isEmpty()) {\n                // default exchange format\n                mime = QStringLiteral(\"image/png\");\n            }\n        }\n\n        if (mime.isEmpty()) {\n            return QVariant();\n        }\n    } else {\n        mime = mimeType;\n    }\n\n    int pipeFds[2];\n    if (pipe(pipeFds) != 0) {\n        return QVariant();\n    }\n\n    auto t = const_cast<DataControlOffer *>(this);\n    t->receive(mime, pipeFds[1]);\n\n    close(pipeFds[1]);\n\n    /*\n     * Ideally we need to introduce a non-blocking QMimeData object\n     * Or a non-blocking constructor to QMimeData with the mimetypes that are relevant\n     *\n     * However this isn't actually any worse than X.\n     */\n\n    QPlatformNativeInterface *native = qGuiApp->platformNativeInterface();\n    auto display = static_cast<struct ::wl_display *>(native->nativeResourceForIntegration(\"wl_display\"));\n    wl_display_flush(display);\n\n    QFile readPipe;\n    if (readPipe.open(pipeFds[0], QIODevice::ReadOnly)) {\n        QByteArray data;\n        if (readData(pipeFds[0], data)) {\n            close(pipeFds[0]);\n\n            if (mimeType == applicationQtXImageLiteral()) {\n                QImage img = QImage::fromData(data, mime.mid(mime.indexOf(QLatin1Char('/')) + 1).toLatin1().toUpper().data());\n                if (!img.isNull()) {\n                    m_data.insert(mimeType, img);\n                    return img;\n                }\n            } else if (data.size() > 1 && mimeType == u\"text/uri-list\") {\n                const auto urls = data.split('\\n');\n                QVariantList list;\n                list.reserve(urls.size());\n                for (const QByteArray &s : urls) {\n#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)\n                    if (QUrl url(QUrl::fromEncoded(QByteArrayView(s).trimmed())); url.isValid()) {\n                        list.emplace_back(std::move(url));\n                    }\n#else\n                    if (QUrl url(QUrl::fromEncoded(s.trimmed())); url.isValid()) {\n                        list.push_back(std::move(url));\n                    }\n#endif\n                }\n                m_data.insert(mimeType, list);\n                return list;\n            }\n            m_data.insert(mimeType, data);\n            return data;\n        }\n        close(pipeFds[0]);\n    }\n\n    return QVariant();\n}\n\nbool DataControlOffer::readData(int fd, QByteArray &data)\n{\n    pollfd pfds[1];\n    pfds[0].fd = fd;\n    pfds[0].events = POLLIN;\n\n    while (true) {\n        const int ready = poll(pfds, 1, 1000);\n        if (ready < 0) {\n            if (errno != EINTR) {\n                qWarning(\"DataControlOffer: poll() failed: %s\", strerror(errno));\n                return false;\n            }\n        } else if (ready == 0) {\n            qWarning(\"DataControlOffer: timeout reading from pipe\");\n            return false;\n        } else {\n            char buf[4096];\n            int n = read(fd, buf, sizeof buf);\n\n            if (n < 0) {\n                qWarning(\"DataControlOffer: read() failed: %s\", strerror(errno));\n                return false;\n            } else if (n == 0) {\n                return true;\n            } else if (n > 0) {\n                data.append(buf, n);\n            }\n        }\n    }\n}\n\nclass DataControlSource : public QObject, public QtWayland::zwlr_data_control_source_v1\n{\n    Q_OBJECT\npublic:\n    DataControlSource(struct ::zwlr_data_control_source_v1 *id, QMimeData *mimeData);\n\n    ~DataControlSource()\n    {\n        if ( isInitialized() )\n            destroy();\n    }\n\n    QMimeData *mimeData()\n    {\n        return m_mimeData.get();\n    }\n    std::unique_ptr<QMimeData> releaseMimeData()\n    {\n        return std::move(m_mimeData);\n    }\n\n    bool isCancelled() const { return m_cancelled; }\n\nQ_SIGNALS:\n    void cancelled();\n\nprotected:\n    void zwlr_data_control_source_v1_send(const QString &mime_type, int32_t fd) override;\n    void zwlr_data_control_source_v1_cancelled() override;\n\nprivate:\n    std::unique_ptr<QMimeData> m_mimeData;\n    bool m_cancelled = false;\n};\n\nDataControlSource::DataControlSource(struct ::zwlr_data_control_source_v1 *id, QMimeData *mimeData)\n    : QtWayland::zwlr_data_control_source_v1(id)\n    , m_mimeData(mimeData)\n{\n    const auto formats = mimeData->formats();\n    for (const QString &format : formats) {\n        offer(format);\n    }\n    if (mimeData->hasText()) {\n        // ensure GTK applications get this mimetype to avoid them discarding the offer\n        offer(QStringLiteral(\"text/plain;charset=utf-8\"));\n    }\n\n    if (mimeData->hasImage()) {\n        const QStringList imageFormats = imageWriteMimeFormats();\n        for (const QString &imageFormat : imageFormats) {\n            if (!formats.contains(imageFormat)) {\n                offer(imageFormat);\n            }\n        }\n    }\n}\n\nvoid DataControlSource::zwlr_data_control_source_v1_send(const QString &mime_type, int32_t fd)\n{\n    QString send_mime_type = mime_type;\n    if( send_mime_type == QStringLiteral(\"text/plain;charset=utf-8\")\n        && !m_mimeData->hasFormat(QStringLiteral(\"text/plain;charset=utf-8\")) )\n    {\n        // if we get a request on the fallback mime, send the data from the original mime type\n        send_mime_type = QStringLiteral(\"text/plain\");\n    }\n\n    QByteArray ba;\n    if (m_mimeData->hasImage()) {\n        // adapted from QInternalMimeData::renderDataHelper\n        if (mime_type == applicationQtXImageLiteral()) {\n            QImage image = qvariant_cast<QImage>(m_mimeData->imageData());\n            QBuffer buf(&ba);\n            buf.open(QBuffer::WriteOnly);\n            // would there not be PNG ??\n            image.save(&buf, \"PNG\");\n\n        } else if (mime_type.startsWith(QLatin1String(\"image/\"))) {\n            QImage image = qvariant_cast<QImage>(m_mimeData->imageData());\n            QBuffer buf(&ba);\n            buf.open(QBuffer::WriteOnly);\n            image.save(&buf, mime_type.mid(mime_type.indexOf(QLatin1Char('/')) + 1).toLatin1().toUpper().data());\n        }\n        // end adapted\n    } else {\n        ba = m_mimeData->data(send_mime_type);\n    }\n\n    auto thread = new SendThread(fd, m_mimeData->data(send_mime_type));\n    connect(thread, &QThread::finished, thread, &QObject::deleteLater);\n    thread->start();\n}\n\nvoid DataControlSource::zwlr_data_control_source_v1_cancelled()\n{\n    m_cancelled = true;\n    Q_EMIT cancelled();\n}\n\nclass DataControlDevice : public QObject, public QtWayland::zwlr_data_control_device_v1\n{\n    Q_OBJECT\npublic:\n    DataControlDevice(struct ::zwlr_data_control_device_v1 *id, const std::shared_ptr<KeyboardFocusWatcher> &keyboardFocusWatcher)\n        : QtWayland::zwlr_data_control_device_v1(id)\n        , m_keyboardFocusWatcher(keyboardFocusWatcher)\n    {\n    }\n\n    ~DataControlDevice()\n    {\n        if ( isInitialized() )\n            destroy();\n    }\n\n    void setSelection(std::unique_ptr<DataControlSource> selection);\n    QMimeData *receivedSelection()\n    {\n        return m_receivedSelection.get();\n    }\n    QMimeData *selection()\n    {\n        return m_selection ? m_selection->mimeData() : nullptr;\n    }\n\n    void setPrimarySelection(std::unique_ptr<DataControlSource> selection);\n    QMimeData *receivedPrimarySelection()\n    {\n        return m_receivedPrimarySelection.get();\n    }\n    QMimeData *primarySelection()\n    {\n        return m_primarySelection ? m_primarySelection->mimeData() : nullptr;\n    }\n\nQ_SIGNALS:\n    void receivedSelectionChanged();\n    void selectionChanged();\n\n    void receivedPrimarySelectionChanged();\n    void primarySelectionChanged();\n\nprotected:\n    void zwlr_data_control_device_v1_data_offer(struct ::zwlr_data_control_offer_v1 *id) override\n    {\n        // this will become memory managed when we retrieve the selection event\n        // a compositor calling data_offer without doing that would be a bug\n        new DataControlOffer(id, m_keyboardFocusWatcher);\n    }\n\n    void zwlr_data_control_device_v1_selection(struct ::zwlr_data_control_offer_v1 *id) override\n    {\n        if (!id) {\n            m_receivedSelection.reset();\n        } else {\n            auto derivated = QtWayland::zwlr_data_control_offer_v1::fromObject(id);\n            auto offer = dynamic_cast<DataControlOffer *>(derivated); // dynamic because of the dual inheritance\n            if (offer)\n                offer->clipboardMode = QClipboard::Clipboard;\n            m_receivedSelection.reset(offer);\n        }\n        Q_EMIT receivedSelectionChanged();\n    }\n\n    void zwlr_data_control_device_v1_primary_selection(struct ::zwlr_data_control_offer_v1 *id) override\n    {\n        if (!id) {\n            m_receivedPrimarySelection.reset();\n        } else {\n            auto derivated = QtWayland::zwlr_data_control_offer_v1::fromObject(id);\n            auto offer = dynamic_cast<DataControlOffer *>(derivated); // dynamic because of the dual inheritance\n            if (offer)\n                offer->clipboardMode = QClipboard::Selection;\n            m_receivedPrimarySelection.reset(offer);\n        }\n        Q_EMIT receivedPrimarySelectionChanged();\n    }\n\nprivate:\n    std::shared_ptr<KeyboardFocusWatcher> m_keyboardFocusWatcher;\n\n    std::unique_ptr<DataControlSource> m_selection; // selection set locally\n    std::unique_ptr<DataControlOffer> m_receivedSelection; // latest selection set from externally to here\n\n    std::unique_ptr<DataControlSource> m_primarySelection; // selection set locally\n    std::unique_ptr<DataControlOffer> m_receivedPrimarySelection; // latest selection set from externally to here\n    friend WaylandClipboard;\n};\n\nvoid DataControlDevice::setSelection(std::unique_ptr<DataControlSource> selection)\n{\n    m_selection = std::move(selection);\n    connect(m_selection.get(), &DataControlSource::cancelled, this, [this]() {\n        m_selection.reset();\n        Q_EMIT selectionChanged();\n    });\n    set_selection(m_selection->object());\n    Q_EMIT selectionChanged();\n}\n\nvoid DataControlDevice::setPrimarySelection(std::unique_ptr<DataControlSource> selection)\n{\n    m_primarySelection = std::move(selection);\n    connect(m_primarySelection.get(), &DataControlSource::cancelled, this, [this]() {\n        m_primarySelection.reset();\n        Q_EMIT primarySelectionChanged();\n    });\n\n    if (zwlr_data_control_device_v1_get_version(object()) >= ZWLR_DATA_CONTROL_DEVICE_V1_SET_PRIMARY_SELECTION_SINCE_VERSION) {\n        set_primary_selection(m_primarySelection->object());\n        Q_EMIT primarySelectionChanged();\n    }\n}\n\nWaylandClipboard::WaylandClipboard(QObject *parent)\n    : QObject(parent)\n    , m_keyboardFocusWatcher(new KeyboardFocusWatcher)\n    , m_manager(new DataControlDeviceManager)\n{\n    connect(m_manager.get(), &DataControlDeviceManager::activeChanged, this, [this]() {\n        if (m_manager->isActive()) {\n            QPlatformNativeInterface *native = qApp->platformNativeInterface();\n            if (!native) {\n                return;\n            }\n            auto seat = static_cast<struct ::wl_seat *>(native->nativeResourceForIntegration(\"wl_seat\"));\n            if (!seat) {\n                return;\n            }\n\n            m_device.reset(new DataControlDevice(m_manager->get_data_device(seat), m_keyboardFocusWatcher));\n\n            connect(m_device.get(), &DataControlDevice::receivedSelectionChanged, this, [this]() {\n                // When our source is still valid, so the offer is for setting it or we emit changed when it is cancelled\n                if (!m_device->selection()) {\n                    Q_EMIT changed(QClipboard::Clipboard);\n                }\n            });\n            connect(m_device.get(), &DataControlDevice::selectionChanged, this, [this]() {\n                Q_EMIT changed(QClipboard::Clipboard);\n            });\n\n            connect(m_device.get(), &DataControlDevice::receivedPrimarySelectionChanged, this, [this]() {\n                // When our source is still valid, so the offer is for setting it or we emit changed when it is cancelled\n                if (!m_device->primarySelection()) {\n                    Q_EMIT changed(QClipboard::Selection);\n                }\n            });\n            connect(m_device.get(), &DataControlDevice::primarySelectionChanged, this, [this]() {\n                Q_EMIT changed(QClipboard::Selection);\n            });\n\n        } else {\n            m_device.reset();\n        }\n    });\n\n    m_manager->instantiate();\n    m_deviceRequestedTimer.start();\n}\n\nWaylandClipboard *WaylandClipboard::createInstance()\n{\n    return new WaylandClipboard(qApp);\n}\n\nvoid WaylandClipboard::setMimeData(QMimeData *mime, QClipboard::Mode mode)\n{\n    if (!waitForDevice(1000)) {\n        return;\n    }\n\n    // roundtrip to have accurate focus state when losing focus but setting mime data before processing wayland events.\n    QPlatformNativeInterface *native = qGuiApp->platformNativeInterface();\n    auto display = static_cast<struct ::wl_display *>(native->nativeResourceForIntegration(\"wl_display\"));\n    wl_display_roundtrip(display);\n\n    // If the application is focused, use the normal mechanism so a future paste will not deadlock itself\n    if (m_keyboardFocusWatcher->hasFocus()) {\n        QGuiApplication::clipboard()->setMimeData(mime, mode);\n        // if we short-circuit the wlr_data_device, when we receive the data\n        // we cannot identify ourselves as the owner\n        // because of that we act like it's a synchronous action to not confuse klipper.\n        wl_display_roundtrip(display);\n        return;\n    }\n    // If not, set the clipboard once the app receives focus to avoid the deadlock\n    connect(m_keyboardFocusWatcher.get(), &KeyboardFocusWatcher::keyboardEntered, this, &WaylandClipboard::gainedFocus, Qt::UniqueConnection);\n    std::unique_ptr<DataControlSource> source(new DataControlSource(m_manager->create_data_source(), mime));\n    if (mode == QClipboard::Clipboard) {\n        m_device->setSelection(std::move(source));\n    } else if (mode == QClipboard::Selection) {\n        m_device->setPrimarySelection(std::move(source));\n    }\n}\n\nvoid WaylandClipboard::gainedFocus()\n{\n    disconnect(m_keyboardFocusWatcher.get(), &KeyboardFocusWatcher::keyboardEntered, this, nullptr);\n    // QClipboard takes ownership of the QMimeData so we need to transfer and unset our selections\n    if (auto &selection = m_device->m_selection) {\n        std::unique_ptr<QMimeData> data = selection->releaseMimeData();\n        selection.reset();\n        QGuiApplication::clipboard()->setMimeData(data.release(), QClipboard::Clipboard);\n    }\n    if (auto &primarySelection = m_device->m_primarySelection) {\n        std::unique_ptr<QMimeData> data = primarySelection->releaseMimeData();\n        primarySelection.reset();\n        QGuiApplication::clipboard()->setMimeData(data.release(), QClipboard::Selection);\n    }\n}\n\nconst QMimeData *WaylandClipboard::mimeData(QClipboard::Mode mode) const\n{\n    if (!waitForDevice(1000)) {\n        return nullptr;\n    }\n\n    // return our locally set selection if it's not cancelled to avoid copying data to ourselves\n    if (mode == QClipboard::Clipboard) {\n        if (m_device->selection()) {\n            return m_device->selection();\n        }\n        return m_device->receivedSelection();\n    } else if (mode == QClipboard::Selection) {\n        if (m_device->primarySelection()) {\n            return m_device->primarySelection();\n        }\n        return m_device->receivedPrimarySelection();\n    }\n    return nullptr;\n}\n\nbool WaylandClipboard::waitForDevice(int timeoutMs) const\n{\n    if (m_device)\n        return true;\n\n    if (m_deviceRequestedTimer.elapsed() > timeoutMs)\n        return false;\n\n    qWarning() << \"Waiting for Wayland clipboard for\"\n        << timeoutMs - m_deviceRequestedTimer.elapsed() << \"ms\";\n\n    while (!m_device && m_deviceRequestedTimer.elapsed() < timeoutMs) {\n        QCoreApplication::processEvents();\n    }\n\n    if (m_device) {\n        if (m_deviceRequestedTimer.elapsed() > 200) {\n            qWarning() << \"Activating Wayland clipboard took\"\n                << m_deviceRequestedTimer.elapsed() << \"ms\";\n        }\n        return true;\n    }\n\n    qCritical() << \"Failed to activate Wayland clipboard\";\n    return false;\n}\n\nWaylandClipboard *WaylandClipboard::instance()\n{\n    static WaylandClipboard *clipboard = createInstance();\n    return clipboard;\n}\n\nWaylandClipboard::~WaylandClipboard() = default;\n\n#include \"waylandclipboard.moc\"\n"
  },
  {
    "path": "src/platform/x11/systemclipboard/waylandclipboard.h",
    "content": "/*\n    SPDX-FileCopyrightText: 2020 David Edmundson <davidedmundson@kde.org>\n\n    SPDX-License-Identifier: LGPL-2.0-or-later\n*/\n\n#pragma once\n#include <QClipboard>\n#include <QElapsedTimer>\n#include <QObject>\n#include <memory>\n\nclass DataControlDevice;\nclass DataControlDeviceManager;\nclass KeyboardFocusWatcher;\nclass QMimeData;\n\nclass WaylandClipboard final : public QObject\n{\n    Q_OBJECT\n\npublic:\n    static WaylandClipboard *instance();\n\n    ~WaylandClipboard();\n\n    void setMimeData(QMimeData *mime, QClipboard::Mode mode);\n    const QMimeData *mimeData(QClipboard::Mode mode) const;\n    bool waitForDevice(int timeoutMs = 5000) const;\n\nsignals:\n    void changed(QClipboard::Mode mode);\n\nprivate:\n    explicit WaylandClipboard(QObject *parent);\n    static WaylandClipboard *createInstance();\n    void gainedFocus();\n    std::shared_ptr<KeyboardFocusWatcher> m_keyboardFocusWatcher;\n\n    std::unique_ptr<DataControlDeviceManager> m_manager;\n    std::unique_ptr<DataControlDevice> m_device;\n    QElapsedTimer m_deviceRequestedTimer;\n};\n"
  },
  {
    "path": "src/platform/x11/systemclipboard/wlr-data-control-unstable-v1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<protocol name=\"wlr_data_control_unstable_v1\">\n  <copyright>\n    Copyright © 2018 Simon Ser\n    Copyright © 2019 Ivan Molodetskikh\n\n    Permission to use, copy, modify, distribute, and sell this\n    software and its documentation for any purpose is hereby granted\n    without fee, provided that the above copyright notice appear in\n    all copies and that both that copyright notice and this permission\n    notice appear in supporting documentation, and that the name of\n    the copyright holders not be used in advertising or publicity\n    pertaining to distribution of the software without specific,\n    written prior permission.  The copyright holders make no\n    representations about the suitability of this software for any\n    purpose.  It is provided \"as is\" without express or implied\n    warranty.\n\n    THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS\n    SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n    FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY\n    SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n    AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\n    ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n    THIS SOFTWARE.\n  </copyright>\n\n  <description summary=\"control data devices\">\n    This protocol allows a privileged client to control data devices. In\n    particular, the client will be able to manage the current selection and take\n    the role of a clipboard manager.\n\n    Warning! The protocol described in this file is experimental and\n    backward incompatible changes may be made. Backward compatible changes\n    may be added together with the corresponding interface version bump.\n    Backward incompatible changes are done by bumping the version number in\n    the protocol and interface names and resetting the interface version.\n    Once the protocol is to be declared stable, the 'z' prefix and the\n    version number in the protocol and interface names are removed and the\n    interface version number is reset.\n  </description>\n\n  <interface name=\"zwlr_data_control_manager_v1\" version=\"2\">\n    <description summary=\"manager to control data devices\">\n      This interface is a manager that allows creating per-seat data device\n      controls.\n    </description>\n\n    <request name=\"create_data_source\">\n      <description summary=\"create a new data source\">\n        Create a new data source.\n      </description>\n      <arg name=\"id\" type=\"new_id\" interface=\"zwlr_data_control_source_v1\"\n        summary=\"data source to create\"/>\n    </request>\n\n    <request name=\"get_data_device\">\n      <description summary=\"get a data device for a seat\">\n        Create a data device that can be used to manage a seat's selection.\n      </description>\n      <arg name=\"id\" type=\"new_id\" interface=\"zwlr_data_control_device_v1\"/>\n      <arg name=\"seat\" type=\"object\" interface=\"wl_seat\"/>\n    </request>\n\n    <request name=\"destroy\" type=\"destructor\">\n      <description summary=\"destroy the manager\">\n        All objects created by the manager will still remain valid, until their\n        appropriate destroy request has been called.\n      </description>\n    </request>\n  </interface>\n\n  <interface name=\"zwlr_data_control_device_v1\" version=\"2\">\n    <description summary=\"manage a data device for a seat\">\n      This interface allows a client to manage a seat's selection.\n\n      When the seat is destroyed, this object becomes inert.\n    </description>\n\n    <request name=\"set_selection\">\n      <description summary=\"copy data to the selection\">\n        This request asks the compositor to set the selection to the data from\n        the source on behalf of the client.\n\n        The given source may not be used in any further set_selection or\n        set_primary_selection requests. Attempting to use a previously used\n        source is a protocol error.\n\n        To unset the selection, set the source to NULL.\n      </description>\n      <arg name=\"source\" type=\"object\" interface=\"zwlr_data_control_source_v1\"\n        allow-null=\"true\"/>\n    </request>\n\n    <request name=\"destroy\" type=\"destructor\">\n      <description summary=\"destroy this data device\">\n        Destroys the data device object.\n      </description>\n    </request>\n\n    <event name=\"data_offer\">\n      <description summary=\"introduce a new wlr_data_control_offer\">\n        The data_offer event introduces a new wlr_data_control_offer object,\n        which will subsequently be used in either the\n        wlr_data_control_device.selection event (for the regular clipboard\n        selections) or the wlr_data_control_device.primary_selection event (for\n        the primary clipboard selections). Immediately following the\n        wlr_data_control_device.data_offer event, the new data_offer object\n        will send out wlr_data_control_offer.offer events to describe the MIME\n        types it offers.\n      </description>\n      <arg name=\"id\" type=\"new_id\" interface=\"zwlr_data_control_offer_v1\"/>\n    </event>\n\n    <event name=\"selection\">\n      <description summary=\"advertise new selection\">\n        The selection event is sent out to notify the client of a new\n        wlr_data_control_offer for the selection for this device. The\n        wlr_data_control_device.data_offer and the wlr_data_control_offer.offer\n        events are sent out immediately before this event to introduce the data\n        offer object. The selection event is sent to a client when a new\n        selection is set. The wlr_data_control_offer is valid until a new\n        wlr_data_control_offer or NULL is received. The client must destroy the\n        previous selection wlr_data_control_offer, if any, upon receiving this\n        event.\n\n        The first selection event is sent upon binding the\n        wlr_data_control_device object.\n      </description>\n      <arg name=\"id\" type=\"object\" interface=\"zwlr_data_control_offer_v1\"\n        allow-null=\"true\"/>\n    </event>\n\n    <event name=\"finished\">\n      <description summary=\"this data control is no longer valid\">\n        This data control object is no longer valid and should be destroyed by\n        the client.\n      </description>\n    </event>\n\n    <!-- Version 2 additions -->\n\n    <event name=\"primary_selection\" since=\"2\">\n      <description summary=\"advertise new primary selection\">\n        The primary_selection event is sent out to notify the client of a new\n        wlr_data_control_offer for the primary selection for this device. The\n        wlr_data_control_device.data_offer and the wlr_data_control_offer.offer\n        events are sent out immediately before this event to introduce the data\n        offer object. The primary_selection event is sent to a client when a\n        new primary selection is set. The wlr_data_control_offer is valid until\n        a new wlr_data_control_offer or NULL is received. The client must\n        destroy the previous primary selection wlr_data_control_offer, if any,\n        upon receiving this event.\n\n        If the compositor supports primary selection, the first\n        primary_selection event is sent upon binding the\n        wlr_data_control_device object.\n      </description>\n      <arg name=\"id\" type=\"object\" interface=\"zwlr_data_control_offer_v1\"\n        allow-null=\"true\"/>\n    </event>\n\n    <request name=\"set_primary_selection\" since=\"2\">\n      <description summary=\"copy data to the primary selection\">\n        This request asks the compositor to set the primary selection to the\n        data from the source on behalf of the client.\n\n        The given source may not be used in any further set_selection or\n        set_primary_selection requests. Attempting to use a previously used\n        source is a protocol error.\n\n        To unset the primary selection, set the source to NULL.\n\n        The compositor will ignore this request if it does not support primary\n        selection.\n      </description>\n      <arg name=\"source\" type=\"object\" interface=\"zwlr_data_control_source_v1\"\n        allow-null=\"true\"/>\n    </request>\n\n    <enum name=\"error\" since=\"2\">\n      <entry name=\"used_source\" value=\"1\"\n        summary=\"source given to set_selection or set_primary_selection was already used before\"/>\n    </enum>\n  </interface>\n\n  <interface name=\"zwlr_data_control_source_v1\" version=\"1\">\n    <description summary=\"offer to transfer data\">\n      The wlr_data_control_source object is the source side of a\n      wlr_data_control_offer. It is created by the source client in a data\n      transfer and provides a way to describe the offered data and a way to\n      respond to requests to transfer the data.\n    </description>\n\n    <enum name=\"error\">\n      <entry name=\"invalid_offer\" value=\"1\"\n        summary=\"offer sent after wlr_data_control_device.set_selection\"/>\n    </enum>\n\n    <request name=\"offer\">\n      <description summary=\"add an offered MIME type\">\n        This request adds a MIME type to the set of MIME types advertised to\n        targets. Can be called several times to offer multiple types.\n\n        Calling this after wlr_data_control_device.set_selection is a protocol\n        error.\n      </description>\n      <arg name=\"mime_type\" type=\"string\"\n        summary=\"MIME type offered by the data source\"/>\n    </request>\n\n    <request name=\"destroy\" type=\"destructor\">\n      <description summary=\"destroy this source\">\n        Destroys the data source object.\n      </description>\n    </request>\n\n    <event name=\"send\">\n      <description summary=\"send the data\">\n        Request for data from the client. Send the data as the specified MIME\n        type over the passed file descriptor, then close it.\n      </description>\n      <arg name=\"mime_type\" type=\"string\" summary=\"MIME type for the data\"/>\n      <arg name=\"fd\" type=\"fd\" summary=\"file descriptor for the data\"/>\n    </event>\n\n    <event name=\"cancelled\">\n      <description summary=\"selection was cancelled\">\n        This data source is no longer valid. The data source has been replaced\n        by another data source.\n\n        The client should clean up and destroy this data source.\n      </description>\n    </event>\n  </interface>\n\n  <interface name=\"zwlr_data_control_offer_v1\" version=\"1\">\n    <description summary=\"offer to transfer data\">\n      A wlr_data_control_offer represents a piece of data offered for transfer\n      by another client (the source client). The offer describes the different\n      MIME types that the data can be converted to and provides the mechanism\n      for transferring the data directly from the source client.\n    </description>\n\n    <request name=\"receive\">\n      <description summary=\"request that the data is transferred\">\n        To transfer the offered data, the client issues this request and\n        indicates the MIME type it wants to receive. The transfer happens\n        through the passed file descriptor (typically created with the pipe\n        system call). The source client writes the data in the MIME type\n        representation requested and then closes the file descriptor.\n\n        The receiving client reads from the read end of the pipe until EOF and\n        then closes its end, at which point the transfer is complete.\n\n        This request may happen multiple times for different MIME types.\n      </description>\n      <arg name=\"mime_type\" type=\"string\"\n        summary=\"MIME type desired by receiver\"/>\n      <arg name=\"fd\" type=\"fd\" summary=\"file descriptor for data transfer\"/>\n    </request>\n\n    <request name=\"destroy\" type=\"destructor\">\n      <description summary=\"destroy this offer\">\n        Destroys the data offer object.\n      </description>\n    </request>\n\n    <event name=\"offer\">\n      <description summary=\"advertise offered MIME type\">\n        Sent immediately after creating the wlr_data_control_offer object.\n        One event per offered MIME type.\n      </description>\n      <arg name=\"mime_type\" type=\"string\" summary=\"offered MIME type\"/>\n    </event>\n  </interface>\n</protocol>\n"
  },
  {
    "path": "src/platform/x11/x11info.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"x11info.h\"\n\n#include <QGuiApplication>\n\n#ifdef COPYQ_WITH_X11\n#   if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n#       include <QX11Info>\n#   else\n#       include <QtGui/private/qtx11extras_p.h>\n#   endif\n#   include <X11/Xlib.h>\n#else\nstruct _XDisplay {};\n#endif\n\nbool X11Info::isPlatformX11()\n{\n    return QGuiApplication::platformName() == QStringLiteral(\"xcb\");\n}\n\nDisplay *X11Info::display()\n{\n#ifdef COPYQ_WITH_X11\n    return QX11Info::display();\n#else\n    return nullptr;\n#endif\n}\n"
  },
  {
    "path": "src/platform/x11/x11info.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wreserved-identifier\"\n#endif\n\ntypedef struct _XDisplay Display;\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\nclass X11Info {\npublic:\n    static bool isPlatformX11();\n    static Display *display();\n};\n"
  },
  {
    "path": "src/platform/x11/x11platform.cmake",
    "content": "file(GLOB copyq_SOURCES ${copyq_SOURCES}\n    platform/x11/x11info.cpp\n    platform/x11/x11platform.cpp\n    platform/x11/x11platformclipboard.cpp\n    platform/dummy/dummyclipboard.cpp\n    platform/platformcommon.cpp\n    )\n\nadd_definitions( -DHAS_MOUSE_SELECTIONS )\nadd_definitions( -DCOPYQ_MOVE_TO_WORKSPACE )\nlist(APPEND copyq_qt_modules DBus)\n\nOPTION(WITH_X11 \"Enable X11 support (global shortcuts, getting window titles)\" ON)\nif (WITH_X11)\n    add_definitions( -DCOPYQ_WITH_X11 )\n\n    # X11 requires 'fixes' extension for clipboard to work correctly.\n    message(STATUS \"Building for X11 window system.\")\n    if(NOT X11_Xfixes_FOUND)\n        message(FATAL_ERROR \"X11 'fixes' extension library is required\")\n    endif(NOT X11_Xfixes_FOUND)\n\n    if(X11_XTest_FOUND)\n        add_definitions( -DHAS_X11TEST )\n        list(APPEND copyq_DEFINITIONS HAS_X11TEST)\n        list(APPEND copyq_LIBRARIES ${X11_XTest_LIB})\n    else(X11_XTest_FOUND)\n        message(WARNING \"X11 'TEST' extension library is needed to be able to\"\n                        \" automatically paste to some windows!\")\n    endif(X11_XTest_FOUND)\n\n    file(GLOB copyq_SOURCES ${copyq_SOURCES}\n        platform/x11/x11platformwindow.cpp\n        ../qxt/qxtglobalshortcut_x11.cpp\n        )\n    set(USE_QXT TRUE)\n\n    set(copyq_LIBRARIES ${copyq_LIBRARIES} ${X11_LIBRARIES} ${X11_Xfixes_LIB})\n\n    if(WITH_QT6)\n        if (Qt6_VERSION VERSION_GREATER_EQUAL \"6.10.0\")\n            find_package(${copyq_qt} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS GuiPrivate)\n        endif()\n        list(APPEND copyq_LIBRARIES Qt::GuiPrivate)\n    else()\n        list(APPEND copyq_qt_modules X11Extras)\n    endif()\nendif()\n\n# Wayland clipboard\nfind_package(ECM REQUIRED NO_MODULE)\nlist(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH})\nif (WITH_QT6 AND ECM_VERSION VERSION_GREATER \"6.2.0\")\n    message(STATUS \"Using clipboard support from KGuiAddons.\")\n    find_package(KF6GuiAddons REQUIRED)\n    list(APPEND copyq_DEFINITIONS HAS_KGUIADDONS)\n    list(APPEND copyq_LIBRARIES KF6::GuiAddons)\nelse()\n    message(WARNING\n        \"Using built-in clipboard support.\"\n        \" Requires Qt 6 and 'kf6-kguiaddons', 'libkf6guiaddons' or similar\"\n        \" for better Wayland clipboard integration.\")\n    set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})\n    include_directories(${CMAKE_CURRENT_BINARY_DIR}/platform/x11/systemclipboard)\n    add_subdirectory(platform/x11/systemclipboard)\n    set_target_properties(systemclipboard PROPERTIES COMPILE_FLAGS \"-Wno-old-style-cast\")\n    list(APPEND copyq_LIBRARIES systemclipboard)\nendif()\n"
  },
  {
    "path": "src/platform/x11/x11platform.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"x11platform.h\"\n\n#include \"x11info.h\"\n\n#include \"app/applicationexceptionhandler.h\"\n#include \"common/log.h\"\n#include \"common/textdata.h\"\n\n#include <QApplication>\n#include <QCoreApplication>\n#include <QDir>\n#include <QRegularExpression>\n#include <QStandardPaths>\n#include <QStringList>\n#include <QVariant>\n#include <QWidget>\n#include <QFile>\n\n#include \"x11platformclipboard.h\"\n\n#ifdef COPYQ_WITH_X11\n#   include \"x11platformwindow.h\"\n#   include <X11/Xatom.h>\n#   include <X11/Xlib.h>\n#endif\n\n#include <memory>\n#include <unistd.h>\n\nnamespace {\n\nconst char *defaultDesktopFileContent =\nR\"([Desktop Entry]\nName=CopyQ\nIcon=copyq\nGenericName=Clipboard Manager\nType=Application\nTerminal=false\nX-KDE-autostart-after=panel\nX-KDE-StartupNotify=false\nX-KDE-UniqueApplet=true\n)\";\n\n#ifdef COPYQ_WITH_X11\nint (*old_xio_errhandler)(Display *) = nullptr;\n\n// Try to handle X11 fatal error gracefully.\nint copyq_xio_errhandler(Display *display)\n{\n    // Try to call MainWindow::saveTabs().\n    if ( QCoreApplication::instance() ) {\n        for ( auto obj : qApp->topLevelWidgets() ) {\n            if (obj->objectName() == \"MainWindow\") {\n                QMetaObject::invokeMethod(obj, \"saveTabs\");\n                break;\n            }\n        }\n    }\n\n    // Call the old handler (possibly for Qt).\n    if (old_xio_errhandler)\n        old_xio_errhandler(display);\n\n    // As documentation for XSetIOErrorHandler states, this function should not return.\n    exit(1);\n}\n#endif\n\n#ifdef COPYQ_DESKTOP_FILE\nQString getDesktopFilename()\n{\n    const QString configDir = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);\n    const QString path = QStringLiteral(\"%1/autostart/%2.desktop\")\n        .arg( configDir, QCoreApplication::applicationName() );\n    if ( QFile::exists(path) )\n        return path;\n\n    return QStringLiteral(\"%1/autostart/%2.desktop\")\n        .arg( configDir, QGuiApplication::desktopFileName() );\n}\n#endif\n\nvoid printFileError(const QFile &file, const char *message, LogLevel logLevel = LogError)\n{\n    log( QString(\"%1 \\\"%2\\\": %3\")\n         .arg( QString::fromLatin1(message), file.fileName(), file.errorString()),\n         logLevel );\n}\n\nvoid maybePrintFileError(const QFile &file, const char *message)\n{\n    if (file.error() != QFile::NoError)\n        printFileError(file, message);\n}\n\n} // namespace\n\nPlatformNativeInterface *platformNativeInterface()\n{\n    static X11Platform platform;\n    return &platform;\n}\n\nX11Platform::~X11Platform() = default;\n\nPlatformWindowPtr X11Platform::getWindow(WId winId)\n{\n#ifdef COPYQ_WITH_X11\n    if (!X11Info::isPlatformX11())\n        return PlatformWindowPtr();\n\n    std::unique_ptr<X11PlatformWindow> window(new X11PlatformWindow(winId));\n    return PlatformWindowPtr(window->isValid() ? window.release() : nullptr);\n#else\n    Q_UNUSED(winId)\n    return PlatformWindowPtr();\n#endif\n}\n\nPlatformWindowPtr X11Platform::getCurrentWindow()\n{\n#ifdef COPYQ_WITH_X11\n    if (!X11Info::isPlatformX11())\n        return PlatformWindowPtr();\n\n    std::unique_ptr<X11PlatformWindow> window(new X11PlatformWindow());\n    return PlatformWindowPtr(window->isValid() ? window.release() : nullptr);\n#else\n    return PlatformWindowPtr();\n#endif\n}\n\nbool X11Platform::canAutostart()\n{\n#if defined(COPYQ_AUTOSTART) && defined(COPYQ_DESKTOP_FILE)\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool X11Platform::isAutostartEnabled()\n{\n#if defined(COPYQ_AUTOSTART) && defined(COPYQ_DESKTOP_FILE)\n    const QString filename = getDesktopFilename();\n\n    QFile desktopFile(filename);\n\n    if ( !desktopFile.exists() )\n        return false;\n\n    if ( !desktopFile.open(QIODevice::ReadOnly | QIODevice::Text) )\n        return false;\n\n    const QRegularExpression re(\"^Hidden\\\\s*=\\\\s*([a-zA-Z01]+)\");\n\n    while ( !desktopFile.atEnd() ) {\n        const QString line = getTextData(desktopFile.readLine());\n        const auto m = re.match(line);\n        if (m.hasMatch()) {\n            const QString value = m.captured(1);\n            return !(value.startsWith(\"True\") || value.startsWith(\"true\") || value.startsWith(\"0\"));\n        }\n    }\n\n    return true;\n#else\n    return false;\n#endif\n}\n\nvoid X11Platform::setAutostartEnabled(bool enable)\n{\n#if defined(COPYQ_AUTOSTART) && defined(COPYQ_DESKTOP_FILE)\n    if ( isAutostartEnabled() == enable )\n        return;\n\n    const QString filename = getDesktopFilename();\n\n    const auto autostartPath = QDir::cleanPath(filename + \"/..\");\n    QDir autostartDir(autostartPath);\n    if ( !autostartDir.mkpath(\".\") ) {\n        log( QString(\"Failed to create autostart path \\\"%1\\\"\").arg(autostartPath) );\n        return;\n    }\n\n    QFile desktopFile2(filename + \".new\");\n    if ( !desktopFile2.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) ) {\n        printFileError(desktopFile2, \"Failed to create new desktop file\");\n        return;\n    }\n\n    const QRegularExpression re(\"^(Hidden|X-GNOME-Autostart-enabled|Exec)\\\\s*=\\\\s*\");\n\n    QFile desktopFile(filename);\n    bool createUserDesktopFile = !desktopFile.exists();\n    if (createUserDesktopFile)\n        desktopFile.setFileName(COPYQ_DESKTOP_FILE);\n\n    if ( desktopFile.open(QIODevice::ReadOnly | QIODevice::Text) ) {\n        while ( !desktopFile.atEnd() ) {\n            const QString line = getTextData(desktopFile.readLine());\n            if ( !line.contains(re) )\n                desktopFile2.write(line.toUtf8());\n        }\n        desktopFile.close();\n        maybePrintFileError(desktopFile, \"Failed to read desktop file\");\n    } else {\n        // Installed desktop file not found (can happen when running tests).\n        printFileError(desktopFile, \"Failed to open desktop file\", LogNote);\n        desktopFile2.write(defaultDesktopFileContent);\n    }\n\n#ifdef COPYQ_AUTOSTART_COMMAND\n    QString cmd = COPYQ_AUTOSTART_COMMAND;\n#else\n    QString cmd = \"\\\"\" + QApplication::applicationFilePath() + \"\\\"\";\n#endif\n    const QString sessionName = qApp->property(\"CopyQ_session_name\").toString();\n    if ( !sessionName.isEmpty() )\n        cmd.append(\" -s \" + sessionName);\n    desktopFile2.write(\"Exec=\" + cmd.toUtf8() + \"\\n\");\n\n    desktopFile2.write(\"Hidden=\");\n    desktopFile2.write(enable ? \"false\" : \"true\");\n    desktopFile2.write(\"\\n\");\n\n    desktopFile2.write(\"X-GNOME-Autostart-enabled=\");\n    desktopFile2.write(enable ? \"true\" : \"false\");\n    desktopFile2.write(\"\\n\");\n\n    QFile::remove(filename);\n    desktopFile2.rename(filename);\n\n    maybePrintFileError(desktopFile2, \"Failed to write desktop file\");\n#else\n    Q_UNUSED(enable)\n#endif\n}\n\nQCoreApplication *X11Platform::createConsoleApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QCoreApplication>(argc, argv);\n}\n\nQApplication *X11Platform::createServerApplication(int &argc, char **argv)\n{\n#ifdef COPYQ_WITH_X11\n    if (X11Info::isPlatformX11())\n        old_xio_errhandler = XSetIOErrorHandler(copyq_xio_errhandler);\n#endif\n    return new ApplicationExceptionHandler<QApplication>(argc, argv);\n}\n\nQGuiApplication *X11Platform::createClipboardProviderApplication(int &argc, char **argv)\n{\n    // WORKAROUND: On GNOME Wayland session, run clipboard monitor/provider\n    // processes in XWayland mode, because GNOME does not support the\n    // wlr-data-control protocol required for clipboard access.\n    if ( qEnvironmentVariableIsEmpty(\"QT_QPA_PLATFORM\")\n         && qgetenv(\"XAUTHORITY\").contains(\"mutter-Xwayland\") )\n    {\n        qputenv(\"QT_QPA_PLATFORM\", \"xcb\");\n    }\n\n    return new ApplicationExceptionHandler<QGuiApplication>(argc, argv);\n}\n\nQCoreApplication *X11Platform::createClientApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QCoreApplication>(argc, argv);\n}\n\nQGuiApplication *X11Platform::createTestApplication(int &argc, char **argv)\n{\n    return new ApplicationExceptionHandler<QGuiApplication>(argc, argv);\n}\n\nPlatformClipboardPtr X11Platform::clipboard()\n{\n    return PlatformClipboardPtr(new X11PlatformClipboard());\n}\n\nQStringList X11Platform::getCommandLineArguments(int argc, char **argv)\n{\n    if (argc == 0)\n        return QStringList();\n\n    QStringList arguments;\n    arguments.reserve(argc - 1);\n\n    for (int i = 1; i < argc; ++i)\n        arguments.append( QString::fromUtf8(argv[i]) );\n\n    return arguments;\n}\n\nbool X11Platform::findPluginDir(QDir *pluginsDir)\n{\n    pluginsDir->setPath( qApp->applicationDirPath() );\n\n    if ( pluginsDir->dirName() == QLatin1String(\"bin\")\n         && pluginsDir->cdUp()\n         && (pluginsDir->cd(QLatin1String(\"lib64\")) || pluginsDir->cd(QLatin1String(\"lib\")))\n         && pluginsDir->cd(QLatin1String(\"copyq\")) )\n    {\n        // OK, installed in /usr/local/bin or /usr/bin.\n        return true;\n    }\n\n    pluginsDir->setPath( qApp->applicationDirPath() );\n\n    if ( pluginsDir->cd(QLatin1String(\"plugins\")) ) {\n        // OK, plugins in same directory as executable.\n        pluginsDir->cd(QLatin1String(\"copyq\"));\n        return true;\n    }\n\n    return false;\n}\n\nQString X11Platform::defaultEditorCommand()\n{\n    return QLatin1String(\"gedit --standalone -- %1\");\n}\n\nQString X11Platform::translationPrefix()\n{\n    return QString();\n}\n\nqint64 X11Platform::processResidentMemoryBytes()\n{\n    QFile statm(QStringLiteral(\"/proc/self/statm\"));\n    if (!statm.open(QIODevice::ReadOnly))\n        return -1;\n    const QList<QByteArray> fields = statm.readAll().split(' ');\n    if (fields.size() < 2)\n        return -1;\n    return fields.at(1).toLongLong() * sysconf(_SC_PAGESIZE);\n}\n"
  },
  {
    "path": "src/platform/x11/x11platform.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/platformnativeinterface.h\"\n\n#include <QKeyEvent>\n#include <QString>\n\nclass X11Platform final : public PlatformNativeInterface\n{\npublic:\n    X11Platform() = default;\n\n    ~X11Platform();\n\n    PlatformWindowPtr getWindow(WId winId) override;\n\n    PlatformWindowPtr getCurrentWindow() override;\n\n    bool canGetWindowTitle() override { return true; }\n\n    bool canAutostart() override;\n\n    /**\n     * Return true only if \"copyq.desktop\" file exists in \"autostart\" directory of current user and\n     * it doesn't contain \"Hidden\" property or its value is false.\n     */\n    bool isAutostartEnabled() override;\n\n    /**\n     * Replace \"Hidden\" property in current user's autostart \"copyq.desktop\" file\n     * (create the file if it doesn't exist).\n     *\n     * Additionally, replace \"Exec\" property with current application path.\n     */\n    void setAutostartEnabled(bool) override;\n\n    bool setPreventScreenCapture(WId, bool) override { return false; }\n    bool canPreventScreenCapture() override { return false; }\n\n    QCoreApplication *createConsoleApplication(int &argc, char **argv) override;\n\n    QApplication *createServerApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createClipboardProviderApplication(int &argc, char **argv) override;\n\n    QCoreApplication *createClientApplication(int &argc, char **argv) override;\n\n    QGuiApplication *createTestApplication(int &argc, char **argv) override;\n\n    PlatformClipboardPtr clipboard() override;\n\n    QStringList getCommandLineArguments(int argc, char **argv) override;\n\n    bool findPluginDir(QDir *pluginsDir) override;\n\n    QString defaultEditorCommand() override;\n\n    QString translationPrefix() override;\n\n    QString themePrefix() override { return QString(); }\n\n    qint64 processResidentMemoryBytes() override;\n};\n"
  },
  {
    "path": "src/platform/x11/x11platformclipboard.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include <QApplication>\n#include <QDBusConnection>\n#include <QDBusConnectionInterface>\n#include <QDBusArgument>\n#include <QDBusMessage>\n#include <QDBusReply>\n#include <QDBusServiceWatcher>\n#include <QDBusVariant>\n#include <QLoggingCategory>\n#include <memory>\n\n#include \"x11platformclipboard.h\"\n\n#include \"x11info.h\"\n\n#include \"common/clipboarddataguard.h\"\n#include \"common/common.h\"\n#include \"common/mimetypes.h\"\n#include \"common/timer.h\"\n\n#ifdef HAS_KGUIADDONS\n#   include <KSystemClipboard>\n#else\n#   include \"systemclipboard/waylandclipboard.h\"\nusing KSystemClipboard = WaylandClipboard;\n#endif\n\n#include <QDataStream>\n\n#ifdef COPYQ_WITH_X11\n#   include <X11/Xlib.h>\n#   include <X11/Xatom.h>\n#endif\n\n#include <QClipboard>\n#include <QMetaType>\n#include <QMimeData>\n#include <QPointer>\n#include <optional>\n\nnamespace {\n\nQ_LOGGING_CATEGORY(logClipboard, \"copyq.clipboard\")\nQ_LOGGING_CATEGORY(logClipboardGnome, \"copyq.clipboard.gnome\")\n\nconstexpr auto minCheckAgainIntervalMs = 50;\nconstexpr auto maxCheckAgainIntervalMs = 500;\nconstexpr auto maxRetryCount = 3;\nconst auto gnomeClipboardService = QStringLiteral(\"com.github.hluk.copyq.GnomeClipboard\");\nconst auto gnomeClipboardPath = QStringLiteral(\"/com/github/hluk/copyq/GnomeClipboard\");\nconst auto gnomeClipboardInterface = QStringLiteral(\"com.github.hluk.CopyQ.GnomeClipboard1\");\nconst auto gnomeClipboardClientPath = QStringLiteral(\"/com/github/hluk/copyq/GnomeClipboardClient\");\nconst auto gnomeClipboardClientInterface = QStringLiteral(\"com.github.hluk.CopyQ.GnomeClipboardClient1\");\nconstexpr int gnomeClipboardTypeClipboard = 0;\nconstexpr int gnomeClipboardTypePrimary = 1;\nconstexpr int gnomeClipboardTypeBoth = 2;\n\nint gnomeClipboardType(ClipboardMode mode)\n{\n    return mode == ClipboardMode::Selection ? gnomeClipboardTypePrimary : gnomeClipboardTypeClipboard;\n}\n\n/// Return true only if selection is incomplete, i.e. mouse button or shift key is pressed.\nbool isSelectionIncomplete()\n{\n#ifdef COPYQ_WITH_X11\n    if (!X11Info::isPlatformX11())\n        return false;\n\n    auto display = X11Info::display();\n    if (!display)\n        return false;\n\n    // If mouse button or shift is pressed then assume that user is selecting text.\n    XButtonEvent event{};\n    XQueryPointer(display, DefaultRootWindow(display),\n                  &event.root, &event.window,\n                  &event.x_root, &event.y_root,\n                  &event.x, &event.y,\n                  &event.state);\n\n    return event.state & (Button1Mask | ShiftMask);\n#else\n    return false;\n#endif\n}\n\nQVariant unwrapDbusValue(QVariant value)\n{\n    if (value.canConvert<QDBusVariant>())\n        value = value.value<QDBusVariant>().variant();\n\n    if (value.userType() == QMetaType::QByteArray)\n        return value;\n\n    if (value.canConvert<QByteArray>()) {\n        const auto bytes = value.toByteArray();\n        if (!bytes.isNull())\n            return bytes;\n    }\n\n    if (value.userType() == qMetaTypeId<QDBusArgument>()) {\n        const auto argument = value.value<QDBusArgument>();\n        if (argument.currentType() == QDBusArgument::VariantType) {\n            QVariant nested;\n            argument >> nested;\n            return unwrapDbusValue(nested);\n        }\n        if (argument.currentType() == QDBusArgument::ArrayType) {\n            QByteArray bytes;\n            argument.beginArray();\n            while (!argument.atEnd()) {\n                QVariant element;\n                argument >> element;\n                bytes.append(static_cast<char>(element.toUInt()));\n            }\n            argument.endArray();\n            return bytes;\n        }\n    }\n\n    return value;\n}\n\nQVariantMap variantToMap(const QVariant &value)\n{\n    if (value.canConvert<QVariantMap>())\n        return value.toMap();\n\n    if (value.userType() == qMetaTypeId<QDBusArgument>()) {\n        const auto argument = value.value<QDBusArgument>();\n        if (argument.currentType() == QDBusArgument::MapType) {\n            QVariantMap map;\n            argument.beginMap();\n            while (!argument.atEnd()) {\n                QString key;\n                QVariant entryValue;\n                argument.beginMapEntry();\n                argument >> key >> entryValue;\n                argument.endMapEntry();\n                map.insert(key, unwrapDbusValue(entryValue));\n            }\n            argument.endMap();\n            return map;\n        }\n    }\n\n    return {};\n}\n\nQVariantMap normalizeClipboardDataMap(const QVariantMap &dataMap)\n{\n    QVariantMap data;\n    for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it) {\n        QVariant value = unwrapDbusValue(it.value());\n        if (value.userType() == QMetaType::QByteArray) {\n            data.insert(it.key(), value);\n        } else if (value.userType() == QMetaType::QString) {\n            data.insert(it.key(), value.toString().toUtf8());\n        }\n    }\n    return data;\n}\n\nstd::optional<QPair<QString, QVariant>> preferredClipboardFormatValue(const QVariantMap &dataMap)\n{\n    static const QStringList preferredFormats = {\n        QStringLiteral(\"text/plain;charset=utf-8\"),\n        QStringLiteral(\"text/plain\"),\n        QStringLiteral(\"text/uri-list\"),\n        QStringLiteral(\"image/png\"),\n        QStringLiteral(\"image/bmp\"),\n        QStringLiteral(\"image/jpeg\"),\n        QStringLiteral(\"image/gif\"),\n        QStringLiteral(\"image/svg+xml\"),\n        QStringLiteral(\"text/html\"),\n    };\n\n    if (dataMap.isEmpty())\n        return std::nullopt;\n\n    for (const auto &format : preferredFormats) {\n        const auto it = dataMap.constFind(format);\n        if (it != dataMap.constEnd())\n            return QPair<QString, QVariant>(format, it.value());\n    }\n\n    for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it) {\n        if (!it.key().startsWith(QLatin1String(COPYQ_MIME_PREFIX)))\n            return QPair<QString, QVariant>(it.key(), it.value());\n    }\n\n    const auto it = dataMap.constBegin();\n    return QPair<QString, QVariant>(it.key(), it.value());\n}\n\nQVariantMap dataMapFromMimeData(const QMimeData *mimeData)\n{\n    if (mimeData == nullptr)\n        return {};\n\n    QVariantMap data;\n    for (const auto &format : mimeData->formats())\n        data.insert(format, mimeData->data(format));\n\n    if (mimeData->hasText()) {\n        const QByteArray bytes = mimeData->text().toUtf8();\n        data.insert(mimeText, bytes);\n        data.insert(mimeTextUtf8, bytes);\n    }\n    return data;\n}\n\n} // namespace\n\nclass GnomeClipboardExtensionClient final : public QObject\n{\n    Q_OBJECT\n    Q_CLASSINFO(\"D-Bus Interface\", \"com.github.hluk.CopyQ.GnomeClipboardClient1\")\npublic:\n    explicit GnomeClipboardExtensionClient(QObject *parent)\n        : QObject(parent)\n        , m_connection(QDBusConnection::sessionBus())\n        , m_serviceWatcher(\n                gnomeClipboardService, m_connection,\n                QDBusServiceWatcher::WatchForRegistration\n                | QDBusServiceWatcher::WatchForUnregistration,\n                this)\n    {\n        if (!m_connection.isConnected()) {\n            qCWarning(logClipboardGnome)\n                << \"Failed to register GNOME clipboard client: DBus is not available\";\n            return;\n        }\n\n        m_registeredObject = m_connection.registerObject(\n            gnomeClipboardClientPath, this, QDBusConnection::ExportScriptableSlots);\n        if (!m_registeredObject) {\n            const auto error = m_connection.lastError();\n            qCInfo(logClipboardGnome)\n                << \"Failed to register GNOME clipboard client:\"\n                << error.name() << \"-\" << error.message();\n        }\n\n        connect(&m_serviceWatcher, &QDBusServiceWatcher::serviceRegistered,\n                this, &GnomeClipboardExtensionClient::onServiceRegistered);\n        connect(&m_serviceWatcher, &QDBusServiceWatcher::serviceUnregistered,\n                this, &GnomeClipboardExtensionClient::onServiceUnregistered);\n        m_serviceWatcherReady = m_connection.interface()\n            && m_connection.interface()->isServiceRegistered(gnomeClipboardService);\n    }\n\n    bool isConnected() const\n    {\n        return m_registeredObject && m_connection.isConnected() && m_serviceWatcherReady;\n    }\n\n    bool isRegisteredWithExtension() const { return m_registeredWithExtension; }\n\n    ~GnomeClipboardExtensionClient() override\n    {\n        unregisterClient();\n        if (m_registeredObject)\n            m_connection.unregisterObject(gnomeClipboardClientPath);\n    }\n\n    void registerClipboardTypes(int clipboardTypes)\n    {\n        m_clipboardTypes = clipboardTypes;\n        if (m_serviceWatcherReady)\n            registerClient();\n    }\n\n    void unregisterClipboardTypes()\n    {\n        unregisterClient();\n    }\n\n    QStringList fetchClipboardFormats(ClipboardMode mode) const\n    {\n        if (!m_serviceWatcherReady)\n            return {};\n\n        auto message = QDBusMessage::createMethodCall(\n            gnomeClipboardService, gnomeClipboardPath, gnomeClipboardInterface,\n            QStringLiteral(\"GetClipboardFormats\"));\n        message << gnomeClipboardType(mode);\n        const QDBusMessage reply = m_connection.call(message);\n        if (reply.type() == QDBusMessage::ErrorMessage) {\n            qCWarning(logClipboardGnome)\n                << \"Failed to fetch clipboard formats from GNOME extension:\"\n                << reply.errorName() << \"-\" << reply.errorMessage();\n            return {};\n        }\n\n        const auto arguments = reply.arguments();\n        if (arguments.isEmpty() || !arguments.first().canConvert<QStringList>()) {\n            qCWarning(logClipboardGnome)\n                << \"Failed to fetch clipboard formats from GNOME extension: invalid reply\";\n            return {};\n        }\n        return arguments.first().toStringList();\n    }\n\n    QVariantMap fetchClipboardData(ClipboardMode mode, const QStringList &formats) const\n    {\n        if (!m_serviceWatcherReady)\n            return {};\n\n        auto message = QDBusMessage::createMethodCall(\n            gnomeClipboardService, gnomeClipboardPath, gnomeClipboardInterface,\n            QStringLiteral(\"GetClipboardData\"));\n        message << gnomeClipboardType(mode) << formats;\n        const QDBusMessage reply = m_connection.call(message);\n        if (reply.type() == QDBusMessage::ErrorMessage) {\n            qCWarning(logClipboardGnome)\n                << \"Failed to fetch clipboard data from GNOME extension:\"\n                << reply.errorName() << \"-\" << reply.errorMessage();\n            return {};\n        }\n\n        const auto arguments = reply.arguments();\n        if (arguments.isEmpty()) {\n            qCWarning(logClipboardGnome)\n                << \"Failed to fetch clipboard data from GNOME extension: empty reply\";\n            return {};\n        }\n\n        auto data = variantToMap(arguments.first());\n        for (auto it = data.begin(); it != data.end(); ++it) {\n            it.value() = unwrapDbusValue(it.value());\n        }\n        return data;\n    }\n\n    void setClipboardData(ClipboardMode mode, const QString &format, const QVariant &value)\n    {\n        if (!m_serviceWatcherReady)\n            return;\n\n        auto message = QDBusMessage::createMethodCall(\n            gnomeClipboardService, gnomeClipboardPath, gnomeClipboardInterface,\n            QStringLiteral(\"SetClipboardData\"));\n        message << gnomeClipboardType(mode) << format << QVariant::fromValue(QDBusVariant(value));\n        QDBusReply<void> reply = m_connection.call(message);\n        if (!reply.isValid()) {\n            qCWarning(logClipboardGnome)\n                << \"Failed to set clipboard data through GNOME extension:\"\n                << format << reply.error().name() << \"-\" << reply.error().message();\n        }\n    }\n\nsignals:\n    void clipboardChanged(int clipboardType);\n\npublic slots:\n    Q_SCRIPTABLE void ClipboardChanged(int clipboardType)\n    {\n        emit clipboardChanged(clipboardType);\n    }\n\nprivate:\n    void registerClient()\n    {\n        auto message = QDBusMessage::createMethodCall(\n            gnomeClipboardService, gnomeClipboardPath, gnomeClipboardInterface,\n            QStringLiteral(\"RegisterClipboardClient\"));\n        message << m_clipboardTypes;\n        QDBusReply<void> reply = m_connection.call(message);\n        if (!reply.isValid()) {\n            m_registeredWithExtension = false;\n            qCWarning(logClipboardGnome)\n                << \"Failed to register with GNOME extension service:\"\n                << reply.error().name() << \"-\" << reply.error().message();\n        } else {\n            m_registeredWithExtension = true;\n            qCDebug(logClipboardGnome)\n                << \"Registered with GNOME extension service, clipboardTypes:\"\n                << m_clipboardTypes;\n        }\n    }\n\n    void unregisterClient()\n    {\n        if (!m_registeredWithExtension)\n            return;\n\n        auto message = QDBusMessage::createMethodCall(\n            gnomeClipboardService, gnomeClipboardPath, gnomeClipboardInterface,\n            QStringLiteral(\"UnregisterClipboardClient\"));\n        QDBusReply<void> reply = m_connection.call(message);\n        if (!reply.isValid()) {\n            qCWarning(logClipboardGnome)\n                << \"Failed to unregister from GNOME extension service:\"\n                << reply.error().message();\n        } else {\n            m_registeredWithExtension = false;\n        }\n    }\n\n    void onServiceRegistered(const QString &name)\n    {\n        if (name == gnomeClipboardService) {\n            m_serviceWatcherReady = true;\n            registerClient();\n        }\n    }\n\n    void onServiceUnregistered(const QString &name)\n    {\n        if (name == gnomeClipboardService) {\n            m_serviceWatcherReady = false;\n            m_registeredWithExtension = false;\n        }\n    }\n\n    QDBusConnection m_connection;\n    QDBusServiceWatcher m_serviceWatcher;\n    int m_clipboardTypes = gnomeClipboardTypeClipboard;\n    bool m_registeredObject = false;\n    bool m_registeredWithExtension = false;\n    bool m_serviceWatcherReady = false;\n};\n\nclass GnomeExtensionMimeData final : public QMimeData\n{\npublic:\n    explicit GnomeExtensionMimeData(const GnomeClipboardExtensionClient *client, ClipboardMode mode)\n        : m_client(client)\n        , m_mode(mode)\n    {}\n\n    QStringList formats() const override\n    {\n        return m_client ? m_client->fetchClipboardFormats(m_mode) : QStringList{};\n    }\n\n    bool hasFormat(const QString &mimeType) const override\n    {\n        if (!m_client)\n            return false;\n        const auto formats = m_client->fetchClipboardFormats(m_mode);\n        if (formats.contains(mimeType))\n            return true;\n        const auto data = m_client->fetchClipboardData(m_mode, {mimeType});\n        return data.contains(mimeType);\n    }\n\nprotected:\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    QVariant retrieveData(const QString &mimeType, QMetaType preferredType) const override\n#else\n    QVariant retrieveData(const QString &mimeType, QVariant::Type preferredType) const override\n#endif\n    {\n        Q_UNUSED(preferredType)\n        if (!m_client)\n            return {};\n\n        auto data = m_client->fetchClipboardData(m_mode, {mimeType});\n        const auto value = data.value(mimeType);\n        if (value.userType() == QMetaType::QByteArray)\n            return value;\n        if (value.userType() == QMetaType::QString)\n            return value.toString().toUtf8();\n        if (value.canConvert<QByteArray>())\n            return value.toByteArray();\n        return {};\n    }\n\nprivate:\n    const GnomeClipboardExtensionClient *m_client = nullptr;\n    ClipboardMode m_mode = ClipboardMode::Clipboard;\n};\n\nX11PlatformClipboard::X11PlatformClipboard()\n{\n    m_clipboardData.mode = ClipboardMode::Clipboard;\n    m_selectionData.mode = ClipboardMode::Selection;\n\n    if ( !X11Info::isPlatformX11() ) {\n        // Create Wayland clipboard instance so it can start receiving new data.\n        KSystemClipboard::instance();\n\n        // Try to register with CopyQ GNOME extension.\n        m_gnomeClipboardExtensionClient = std::make_unique<GnomeClipboardExtensionClient>(this);\n        connect(\n            m_gnomeClipboardExtensionClient.get(), &GnomeClipboardExtensionClient::clipboardChanged,\n            this, &X11PlatformClipboard::onGnomeClipboardChanged );\n        if (!m_gnomeClipboardExtensionClient->isConnected())\n            m_gnomeClipboardExtensionClient.reset();\n    }\n}\n\nX11PlatformClipboard::~X11PlatformClipboard() = default;\n\nvoid X11PlatformClipboard::updateMonitoringSubscription(\n        const QStringList &formats, ClipboardModeMask modes)\n{\n    m_clipboardData.formats = formats;\n\n    // Avoid asking apps for bigger data when mouse selection changes.\n    // This could make the app hang for a moment.\n    m_selectionData.formats = QStringList{mimeText, mimeTextUtf8};\n    for (auto &format : formats) {\n        if (!format.startsWith(QLatin1String(\"image/\")) && !format.startsWith(QLatin1String(\"text/\")))\n            m_selectionData.formats.append(format);\n    }\n\n    m_clipboardData.enabled = modes.testFlag(ClipboardModeFlag::Clipboard);\n    m_selectionData.enabled = modes.testFlag(ClipboardModeFlag::Selection);\n\n    if ( m_selectionData.enabled && !QGuiApplication::clipboard()->supportsSelection() ) {\n        qCWarning(logClipboard) << \"X11 selection is not supported, disabling.\";\n        m_selectionData.enabled = false;\n    }\n\n    if (!X11Info::isPlatformX11() && m_monitoring && isGnomeExtensionAvailable()) {\n        m_gnomeClipboardExtensionClient->registerClipboardTypes(toGnomeClipboardTypes(modes));\n    }\n}\n\nvoid X11PlatformClipboard::startMonitoringBackend(\n        const QStringList &formats, ClipboardModeMask modes)\n{\n    updateMonitoringSubscription(formats, modes);\n\n    if ( !X11Info::isPlatformX11() ) {\n        connect(KSystemClipboard::instance(), &KSystemClipboard::changed,\n                this, [this](QClipboard::Mode mode){ onClipboardChanged(mode); });\n        if (isGnomeExtensionAvailable())\n            m_gnomeClipboardExtensionClient->registerClipboardTypes(toGnomeClipboardTypes(modes));\n    }\n\n    // Ignore the initial clipboard content since\n    // it won't have the correct owner's window title.\n    m_clipboardData.ignoreNext = true;\n    m_selectionData.ignoreNext = true;\n    QTimer::singleShot(5000, this, [this](){\n        m_clipboardData.ignoreNext = false;\n        m_selectionData.ignoreNext = false;\n    });\n\n    for (auto clipboardData : {&m_clipboardData, &m_selectionData}) {\n        clipboardData->owner.clear();\n        clipboardData->newOwner.clear();\n        if ( X11Info::isPlatformX11() ) {\n            updateClipboardData(clipboardData);\n            useNewClipboardData(clipboardData);\n        }\n    }\n\n    initSingleShotTimer( &m_timerCheckAgain, 0, this, &X11PlatformClipboard::check );\n\n    initSingleShotTimer( &m_clipboardData.timerEmitChange, 0, this, [this](){\n        useNewClipboardData(&m_clipboardData);\n    } );\n\n    initSingleShotTimer( &m_selectionData.timerEmitChange, 0, this, [this](){\n        useNewClipboardData(&m_selectionData);\n    } );\n\n    m_monitoring = true;\n\n    DummyClipboard::startMonitoringBackend(formats, modes);\n}\n\nvoid X11PlatformClipboard::stopMonitoringBackend()\n{\n    if (!m_monitoring)\n        return;\n\n    m_timerCheckAgain.stop();\n    m_clipboardData.timerEmitChange.stop();\n    m_selectionData.timerEmitChange.stop();\n    m_monitoring = false;\n\n    if ( !X11Info::isPlatformX11() ) {\n        disconnect(KSystemClipboard::instance(), nullptr, this, nullptr);\n        if (isGnomeExtensionAvailable())\n            m_gnomeClipboardExtensionClient->unregisterClipboardTypes();\n    }\n\n    DummyClipboard::stopMonitoringBackend();\n}\n\nQVariantMap X11PlatformClipboard::data(ClipboardMode mode, const QStringList &formats) const\n{\n    if (!m_monitoring) {\n        if (isGnomeExtensionAvailable()) {\n            return m_gnomeClipboardExtensionClient->fetchClipboardData(mode, formats);\n        }\n        return DummyClipboard::data(mode, formats);\n    }\n\n    const auto &clipboardData = mode == ClipboardMode::Clipboard ? m_clipboardData : m_selectionData;\n\n    auto data = clipboardData.data;\n    if ( !data.contains(mimeOwner) )\n        data[mimeWindowTitle] = clipboardData.owner.toUtf8();\n    return data;\n}\n\nconst QMimeData *X11PlatformClipboard::mimeData(ClipboardMode mode) const\n{\n    if (isGnomeExtensionAvailable()) {\n        std::unique_ptr<QMimeData> &ptr = (mode == ClipboardMode::Clipboard)\n            ? m_gnomeClipboardMimeData : m_gnomeSelectionMimeData;\n        if (!ptr) {\n            ptr = std::make_unique<GnomeExtensionMimeData>(\n                    m_gnomeClipboardExtensionClient.get(), mode);\n        }\n        return ptr.get();\n    }\n\n    return DummyClipboard::mimeData(mode);\n}\n\nvoid X11PlatformClipboard::setData(ClipboardMode mode, const QVariantMap &dataMap)\n{\n    if ( X11Info::isPlatformX11() ) {\n        // WORKAROUND: Avoid getting X11 warning \"QXcbClipboard: SelectionRequest too old\".\n        QCoreApplication::processEvents();\n\n        // WORKAROUND: XWayland on GNOME does not handle UTF-8 text properly.\n        if ( dataMap.contains(mimeTextUtf8) && qgetenv(\"XAUTHORITY\").contains(\"mutter-Xwayland\") ) {\n            auto dataMap2 = dataMap;\n            dataMap2[mimeText] = dataMap[mimeTextUtf8];\n            DummyClipboard::setData(mode, dataMap2);\n        } else {\n            DummyClipboard::setData(mode, dataMap);\n        }\n    } else {\n        auto data = createMimeData(dataMap);\n        const auto qmode = modeToQClipboardMode(mode);\n        if (isGnomeExtensionAvailable()) {\n            setGnomeExtensionClipboardData(mode, dataMap);\n            DummyClipboard::setData(mode, dataMap);\n        } else {\n            DummyClipboard::setData(mode, dataMap);\n            // WORKAROUND: KGuiAddons does not handle UTF-8 text properly.\n            // This unfortunately overrides \"text/plain\" with\n            // \"text/plain;charset=utf-8\" (these can differ).\n            // See: https://invent.kde.org/frameworks/kguiaddons/-/merge_requests/184\n            if (dataMap.contains(mimeTextUtf8))\n                data->setText(dataMap.value(mimeTextUtf8).toString());\n            else\n                KSystemClipboard::instance()->setMimeData(data, qmode);\n        }\n    }\n}\n\nvoid X11PlatformClipboard::setRawData(ClipboardMode mode, QMimeData *mimeData)\n{\n    if (isGnomeExtensionAvailable())\n        setGnomeExtensionClipboardData(mode, dataMapFromMimeData(mimeData));\n    DummyClipboard::setRawData(mode, mimeData);\n}\n\nconst QMimeData *X11PlatformClipboard::rawMimeData(ClipboardMode mode) const\n{\n    if ( !X11Info::isPlatformX11() ) {\n        const auto data = KSystemClipboard::instance()->mimeData( modeToQClipboardMode(mode) );\n        if (data != nullptr)\n            return data;\n    }\n    return DummyClipboard::rawMimeData(mode);\n}\n\nvoid X11PlatformClipboard::onChanged(int mode)\n{\n    auto &clipboardData = mode == QClipboard::Clipboard ? m_clipboardData : m_selectionData;\n    if (!clipboardData.enabled)\n        return;\n\n    ++clipboardData.sequenceNumber;\n    clipboardData.ignoreNext = false;\n\n    // Store the current window title right after the clipboard/selection changes.\n    // This makes sure that the title points to the correct clipboard/selection\n    // owner most of the times.\n    clipboardData.newOwner = m_clipboardOwner;\n\n    if (mode == QClipboard::Selection) {\n        // Omit checking selection too fast.\n        if ( m_timerCheckAgain.isActive() ) {\n            qCDebug(logClipboard) << \"Postponing fast selection change\";\n            return;\n        }\n\n        if ( isSelectionIncomplete() ) {\n            qCDebug(logClipboard) << \"Selection is incomplete\";\n            if ( !m_timerCheckAgain.isActive()\n                 || minCheckAgainIntervalMs < m_timerCheckAgain.remainingTime() )\n            {\n                m_timerCheckAgain.start(minCheckAgainIntervalMs);\n            }\n            return;\n        }\n    }\n\n    if (m_clipboardData.cloningData || m_selectionData.cloningData)\n        return;\n\n    updateClipboardData(&clipboardData);\n\n    checkAgainLater(true, 0);\n}\n\nvoid X11PlatformClipboard::check()\n{\n    if (m_clipboardData.cloningData || m_selectionData.cloningData) {\n        m_timerCheckAgain.start(minCheckAgainIntervalMs);\n        return;\n    }\n\n    m_timerCheckAgain.stop();\n\n    updateClipboardData(&m_clipboardData);\n    updateClipboardData(&m_selectionData);\n\n    if ( m_timerCheckAgain.isActive() )\n        return;\n\n    const bool changed = m_clipboardData.timerEmitChange.isActive()\n        || m_selectionData.timerEmitChange.isActive();\n\n    // Check clipboard and selection again if some signals where\n    // not delivered or older data was received after new one.\n    const int interval = m_timerCheckAgain.interval() * 2 + minCheckAgainIntervalMs;\n    checkAgainLater(changed, interval);\n}\n\nvoid X11PlatformClipboard::updateClipboardData(X11PlatformClipboard::ClipboardData *clipboardData)\n{\n    if (!clipboardData->enabled)\n        return;\n\n    if ( isSelectionIncomplete() ) {\n        m_timerCheckAgain.start(minCheckAgainIntervalMs);\n        return;\n    }\n\n    ClipboardDataGuard data( mimeData(clipboardData->mode), &clipboardData->sequenceNumber );\n\n    // Retry to retrieve clipboard data few times.\n    if (data.isExpired()) {\n        if ( !X11Info::isPlatformX11() )\n            return;\n\n        if ( rawMimeData(clipboardData->mode) )\n            return;\n\n        if (clipboardData->retry < maxRetryCount) {\n            ++clipboardData->retry;\n            m_timerCheckAgain.start(clipboardData->retry * maxCheckAgainIntervalMs);\n        }\n\n        qCWarning(logClipboard)\n            << \"Failed to retrieve\"\n            << (clipboardData->mode == ClipboardMode::Clipboard ? \"clipboard\" : \"selection\")\n            << \"data, try\" << clipboardData->retry << \"of\" << maxRetryCount;\n\n        return;\n    }\n    clipboardData->retry = 0;\n\n    const QByteArray newDataTimestampData = data.data(QStringLiteral(\"TIMESTAMP\"));\n    quint32 newDataTimestamp = 0;\n    if ( !newDataTimestampData.isEmpty() ) {\n        QDataStream stream(newDataTimestampData);\n        stream.setByteOrder(QDataStream::LittleEndian);\n        stream >> newDataTimestamp;\n        if (stream.status() != QDataStream::Ok)\n            newDataTimestamp = 0;\n    }\n\n    // In case there is a valid timestamp, omit update if the timestamp and\n    // text did not change.\n    if ( newDataTimestamp != 0 && clipboardData->newDataTimestamp == newDataTimestamp ) {\n        const QVariantMap newData = cloneData(data, {mimeText});\n        if (data.isExpired() || newData.value(mimeText) == clipboardData->newData.value(mimeText))\n            return;\n    }\n\n    clipboardData->timerEmitChange.stop();\n    clipboardData->cloningData = true;\n    const bool isDataSecret = isHidden(*data.mimeData());\n    clipboardData->newData = cloneData(data, clipboardData->formats);\n    if (isDataSecret)\n        clipboardData->newData[mimeSecret] = QByteArrayLiteral(\"1\");\n    clipboardData->cloningData = false;\n\n    if (data.isExpired()) {\n        m_timerCheckAgain.start(0);\n        return;\n    }\n\n    // Update only if the data changed.\n    if ( clipboardData->data == clipboardData->newData )\n        return;\n\n    clipboardData->newDataTimestamp = newDataTimestamp;\n    clipboardData->timerEmitChange.start();\n}\n\nvoid X11PlatformClipboard::useNewClipboardData(X11PlatformClipboard::ClipboardData *clipboardData)\n{\n    qCDebug(logClipboard)\n        << (clipboardData->mode == ClipboardMode::Clipboard ? \"Clipboard\" : \"Selection\")\n        << \"CHANGED, owner:\" << clipboardData->newOwner;\n\n    clipboardData->data = clipboardData->newData;\n    clipboardData->owner = clipboardData->newOwner;\n    clipboardData->timerEmitChange.stop();\n    if (clipboardData->ignoreNext)\n        clipboardData->ignoreNext = false;\n    else\n        emitConnectionChanged(clipboardData->mode);\n}\n\nvoid X11PlatformClipboard::checkAgainLater(bool clipboardChanged, int interval)\n{\n    if (interval < maxCheckAgainIntervalMs)\n        m_timerCheckAgain.start(interval);\n    else if (clipboardChanged)\n        m_timerCheckAgain.start(maxCheckAgainIntervalMs);\n}\n\nvoid X11PlatformClipboard::onGnomeClipboardChanged(int clipboardType)\n{\n    if (clipboardType == gnomeClipboardTypeClipboard) {\n        qCDebug(logClipboardGnome) << \"GNOME Clipboard change\";\n        onChanged(QClipboard::Clipboard);\n    } else {\n        qCDebug(logClipboardGnome) << \"GNOME Selection change\";\n        onChanged(QClipboard::Selection);\n    }\n}\n\nbool X11PlatformClipboard::isGnomeExtensionAvailable() const\n{\n    return m_gnomeClipboardExtensionClient\n        && m_gnomeClipboardExtensionClient->isConnected();\n}\n\nvoid X11PlatformClipboard::setGnomeExtensionClipboardData(ClipboardMode mode, const QVariantMap &dataMap) const\n{\n    const QVariantMap normalizedDataMap = normalizeClipboardDataMap(dataMap);\n    if (const auto preferred = preferredClipboardFormatValue(normalizedDataMap))\n        m_gnomeClipboardExtensionClient->setClipboardData(mode, preferred->first, preferred->second);\n}\n\nint X11PlatformClipboard::toGnomeClipboardTypes(ClipboardModeMask modes) const\n{\n    const bool clipboard = modes.testFlag(ClipboardModeFlag::Clipboard);\n    const bool selection = modes.testFlag(ClipboardModeFlag::Selection);\n    if (clipboard && selection)\n        return gnomeClipboardTypeBoth;\n    if (selection)\n        return gnomeClipboardTypePrimary;\n    return gnomeClipboardTypeClipboard;\n}\n\n#include \"x11platformclipboard.moc\"\n"
  },
  {
    "path": "src/platform/x11/x11platformclipboard.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/dummy/dummyclipboard.h\"\n\n#include <QByteArray>\n#include <QMimeData>\n#include <QStringList>\n#include <QTimer>\n#include <memory>\n\nclass GnomeClipboardExtensionClient;\n\nclass X11PlatformClipboard final : public DummyClipboard\n{\npublic:\n    X11PlatformClipboard();\n    ~X11PlatformClipboard() override;\n\n    QVariantMap data(ClipboardMode mode, const QStringList &formats) const override;\n\n    void setData(ClipboardMode mode, const QVariantMap &dataMap) override;\n    void setRawData(ClipboardMode mode, QMimeData *mimeData) override;\n\n    bool isSelectionSupported() const override { return true; }\n\n    void setClipboardOwner(const QString &owner) override { m_clipboardOwner = owner; }\n\nprotected:\n    void startMonitoringBackend(const QStringList &formats, ClipboardModeMask modes) override;\n    void stopMonitoringBackend() override;\n    void updateMonitoringSubscription(const QStringList &formats, ClipboardModeMask modes) override;\n    const QMimeData *mimeData(ClipboardMode mode) const override;\n    const QMimeData *rawMimeData(ClipboardMode mode) const override;\n    void onChanged(int mode) override;\n    const long int *clipboardSequenceNumber(ClipboardMode mode) const override {\n        return mode == ClipboardMode::Clipboard\n            ? &m_clipboardData.sequenceNumber\n            : &m_selectionData.sequenceNumber;\n    }\n\nprivate:\n    struct ClipboardData {\n        QVariantMap newData;\n        QVariantMap data;\n        QString owner;\n        QString newOwner;\n        QTimer timerEmitChange;\n        QStringList formats;\n        quint32 newDataTimestamp;\n        ClipboardMode mode;\n        bool enabled = true;\n        bool cloningData = false;\n        long int sequenceNumber = 0;\n        bool ignoreNext = false;\n        int retry = 0;\n    };\n\n    bool isGnomeExtensionAvailable() const;\n    void setGnomeExtensionClipboardData(ClipboardMode mode, const QVariantMap &dataMap) const;\n    void check();\n    void updateClipboardData(ClipboardData *clipboardData);\n    void useNewClipboardData(ClipboardData *clipboardData);\n    void checkAgainLater(bool clipboardChanged, int interval);\n    void onGnomeClipboardChanged(int clipboardType);\n    int toGnomeClipboardTypes(ClipboardModeMask modes) const;\n\n    QTimer m_timerCheckAgain;\n\n    ClipboardData m_clipboardData;\n    ClipboardData m_selectionData;\n\n    bool m_monitoring = false;\n\n    QString m_clipboardOwner;\n    std::unique_ptr<GnomeClipboardExtensionClient> m_gnomeClipboardExtensionClient;\n    mutable std::unique_ptr<QMimeData> m_gnomeClipboardMimeData;\n    mutable std::unique_ptr<QMimeData> m_gnomeSelectionMimeData;\n};\n"
  },
  {
    "path": "src/platform/x11/x11platformwindow.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#include \"x11platformwindow.h\"\n\n#include \"x11info.h\"\n\n#include \"common/appconfig.h\"\n#include \"common/log.h\"\n#include \"common/sleeptimer.h\"\n#include \"gui/clipboardspy.h\"\n#include \"platform/platformcommon.h\"\n\n#include <X11/Xlib.h>\n#include <X11/Xatom.h>\n#include <X11/keysym.h>\n\n#ifdef HAS_X11TEST\n#   include <X11/extensions/XTest.h>\n#endif\n\n#include <unistd.h> // usleep()\n\nnamespace {\n\nclass KeyPressTester final {\npublic:\n    explicit KeyPressTester(Display *display)\n        : m_display(display)\n    {\n        XQueryKeymap(m_display, m_keyMap);\n    }\n\n    bool isPressed(KeySym key) const\n    {\n        const KeyCode keyCode = XKeysymToKeycode(m_display, key);\n        return (m_keyMap[keyCode >> 3] >> (keyCode & 7)) & 1;\n    }\n\nprivate:\n    Display *m_display;\n    char m_keyMap[32]{};\n};\n\n#ifdef HAS_X11TEST\nbool fakeKeyEvent(Display* display, unsigned int keyCode, Bool isPress, unsigned long delayMs = CurrentTime)\n{\n    if (!XTestFakeKeyEvent(display, keyCode, isPress, delayMs)) {\n        log( QStringLiteral(\"Failed to send key event (key code: %1, isPress: %2)\")\n               .arg(keyCode)\n               .arg(isPress), LogWarning );\n        return false;\n    }\n\n    XSync(display, False);\n    return true;\n}\n\nbool simulateModifierKeyPress(Display *display, const QList<int> &modCodes, Bool keyDown)\n{\n    for (int modCode : modCodes) {\n        const auto keySym = static_cast<KeySym>(modCode);\n        const KeyCode keyCode = XKeysymToKeycode(display, keySym);\n        if (keyCode == 0) {\n            log( QStringLiteral(\"Failed to get X11 modifier key code for key symbol: %1\")\n                   .arg(modCode), LogWarning );\n            return false;\n        }\n\n        if ( !fakeKeyEvent(display, keyCode, keyDown) )\n            return false;\n    }\n\n    return true;\n}\n\nbool isModifierPressed(Display *display)\n{\n    KeyPressTester tester(display);\n    return tester.isPressed(XK_Shift_L)\n        || tester.isPressed(XK_Shift_R)\n        || tester.isPressed(XK_Control_L)\n        || tester.isPressed(XK_Control_R)\n        || tester.isPressed(XK_Meta_L)\n        || tester.isPressed(XK_Meta_R)\n        || tester.isPressed(XK_Alt_L)\n        || tester.isPressed(XK_Alt_R)\n        || tester.isPressed(XK_Super_L)\n        || tester.isPressed(XK_Super_R)\n        || tester.isPressed(XK_Hyper_L)\n        || tester.isPressed(XK_Hyper_R);\n}\n\nbool waitForModifiersReleased(Display *display, const AppConfig &config)\n{\n    const int maxWaitForModsReleaseMs = config.option<Config::window_wait_for_modifier_released_ms>();\n    if (maxWaitForModsReleaseMs >= 0) {\n        SleepTimer t(maxWaitForModsReleaseMs);\n        while (t.sleep()) {\n            if (!isModifierPressed(display))\n                return true;\n        }\n    }\n\n    return !isModifierPressed(display);\n}\n\nbool simulateKeyPress(Display *display, const QList<int> &modCodes, unsigned int key, const AppConfig &config)\n{\n    // Wait for user to release modifiers.\n    if (!waitForModifiersReleased(display, config)) {\n        log(\"Failed to simulate key presses while modifiers are pressed\", LogWarning);\n        return false;\n    }\n\n    if ( !simulateModifierKeyPress(display, modCodes, True) )\n        return false;\n\n    const KeyCode keyCode = XKeysymToKeycode(display, key);\n    if (keyCode == 0) {\n        log( QStringLiteral(\"Failed to get X11 key code for key symbol: %1\")\n                   .arg(key), LogWarning );\n        simulateModifierKeyPress(display, modCodes, False);\n        return false;\n    }\n\n    if ( !fakeKeyEvent(display, keyCode, True) ) {\n        simulateModifierKeyPress(display, modCodes, False);\n        return false;\n    }\n\n    // This is needed to paste into URL bar in Chrome.\n    const unsigned long delayMs = config.option<Config::window_key_press_time_ms>();\n    if ( !fakeKeyEvent(display, keyCode, False, delayMs) ) {\n        simulateModifierKeyPress(display, modCodes, False);\n        return false;\n    }\n\n    if ( !simulateModifierKeyPress(display, modCodes, False) )\n        return false;\n\n    XSync(display, False);\n    return true;\n}\n#else\n\nbool simulateKeyPress(Display *display, Window window, unsigned int modifiers, unsigned int key)\n{\n    XKeyEvent event;\n    XEvent *xev = reinterpret_cast<XEvent *>(&event);\n    event.display     = display;\n    event.window      = window;\n    event.root        = DefaultRootWindow(display);\n    event.subwindow   = None;\n    event.time        = CurrentTime;\n    event.x           = 1;\n    event.y           = 1;\n    event.x_root      = 1;\n    event.y_root      = 1;\n    event.same_screen = True;\n    event.keycode     = XKeysymToKeycode(display, key);\n    if (event.keycode == 0) {\n        log( QStringLiteral(\"Failed to get X11 key code for key symbol: %1\")\n               .arg(key), LogWarning );\n        return false;\n    }\n    event.state       = modifiers;\n\n    event.type = KeyPress;\n    if (!XSendEvent(display, window, True, KeyPressMask, xev)) {\n        log( QStringLiteral(\"Failed to send X11 key press event (key code: %1)\")\n               .arg(event.keycode), LogWarning );\n        return false;\n    }\n    XSync(display, False);\n\n    event.type = KeyRelease;\n    if (!XSendEvent(display, window, True, KeyPressMask, xev)) {\n        log( QStringLiteral(\"Failed to send X11 key release event (key code: %1)\")\n               .arg(event.keycode), LogWarning );\n        return false;\n    }\n    XSync(display, False);\n    return true;\n}\n#endif\n\nclass X11WindowProperty final {\npublic:\n    X11WindowProperty(Display *display, Window w, Atom property, long longOffset,\n                      long longLength, Atom reqType)\n    {\n        if ( XGetWindowProperty(display, w, property, longOffset, longLength, false,\n                                reqType, &type, &format, &len, &remain, &data) != Success )\n        {\n            data = nullptr;\n        }\n    }\n\n    ~X11WindowProperty()\n    {\n        if (data != nullptr)\n            XFree(data);\n    }\n\n    bool isValid() const { return data != nullptr; }\n\n    X11WindowProperty(const X11WindowProperty &) = delete;\n    X11WindowProperty &operator=(const X11WindowProperty &) = delete;\n\n    Atom type{};\n    int format{};\n    unsigned long len{};\n    unsigned long remain{};\n    unsigned char *data;\n};\n\nWindow getCurrentWindow()\n{\n    if (!X11Info::isPlatformX11())\n        return 0L;\n\n    auto display = X11Info::display();\n    if (!display)\n        return 0L;\n\n    static Atom atomWindow = XInternAtom(display, \"_NET_ACTIVE_WINDOW\", true);\n\n    X11WindowProperty property(display, DefaultRootWindow(display), atomWindow, 0l, 1l, XA_WINDOW);\n\n    if ( property.isValid() && property.type == XA_WINDOW && property.format == 32 && property.len == 1)\n        return *reinterpret_cast<Window *>(property.data);\n\n    return 0L;\n}\n\n} // namespace\n\n\nX11PlatformWindow::X11PlatformWindow()\n    : m_window(getCurrentWindow())\n{\n}\n\nX11PlatformWindow::X11PlatformWindow(quintptr winId)\n    : m_window(winId)\n{\n}\n\nQString X11PlatformWindow::getTitle()\n{\n    Q_ASSERT( isValid() );\n\n    if (!X11Info::isPlatformX11())\n        return QString();\n\n    auto display = X11Info::display();\n    if (!display)\n        return QString();\n\n    static Atom atomName = XInternAtom(display, \"_NET_WM_NAME\", false);\n    static Atom atomUTF8 = XInternAtom(display, \"UTF8_STRING\", false);\n\n    X11WindowProperty property(display, m_window, atomName, 0, (~0L), atomUTF8);\n    if ( property.isValid() ) {\n        const auto len = static_cast<int>(property.len);\n        QByteArray result(reinterpret_cast<const char *>(property.data), len);\n        return QString::fromUtf8(result);\n    }\n\n    return QString();\n}\n\nvoid X11PlatformWindow::raise()\n{\n    Q_ASSERT( isValid() );\n\n    if (!X11Info::isPlatformX11())\n        return;\n\n    auto display = X11Info::display();\n    if (!display)\n        return;\n\n    COPYQ_LOG( QString(\"Raising window \\\"%1\\\"\").arg(getTitle()) );\n\n    XClientMessageEvent e{};\n    memset(&e, 0, sizeof(e));\n    e.type = ClientMessage;\n    e.display = display;\n    e.window = m_window;\n    e.message_type = XInternAtom(display, \"_NET_ACTIVE_WINDOW\", False);\n    e.format = 32;\n    e.data.l[0] = 2;\n    e.data.l[1] = CurrentTime;\n    e.data.l[2] = 0;\n    e.data.l[3] = 0;\n    e.data.l[4] = 0;\n\n    XWindowAttributes wattr{};\n    XGetWindowAttributes(display, m_window, &wattr);\n\n    if (wattr.map_state == IsViewable) {\n        XSendEvent(display, wattr.screen->root, False,\n                   SubstructureNotifyMask | SubstructureRedirectMask,\n                   reinterpret_cast<XEvent*>(&e));\n        XRaiseWindow(display, m_window);\n        XSetInputFocus(display, m_window, RevertToPointerRoot, CurrentTime);\n        // XFlush (not XSync): push all requests to the X server without\n        // blocking for a round-trip.  The WM processes the raise\n        // asynchronously regardless — XSync only waits for the server to\n        // acknowledge receipt, not for the WM to act.  Avoiding the\n        // round-trip eliminates the multi-second stall when the\n        // server/compositor is slow to respond after idle (#2877).\n        XFlush(display);\n    }\n}\n\nbool X11PlatformWindow::pasteFromClipboard()\n{\n    const AppConfig config;\n    if ( pasteWithCtrlV(*this, config) )\n        return sendKeyPress(XK_Control_L, XK_V, config);\n\n    return sendKeyPress(XK_Shift_L, XK_Insert, config);\n}\n\nbool X11PlatformWindow::copyToClipboard()\n{\n    const AppConfig config;\n    ClipboardSpy spy(ClipboardMode::Clipboard, QByteArray());\n    if ( !sendKeyPress(XK_Control_L, XK_C, config) )\n        return false;\n    spy.wait();\n    return true;\n}\n\nbool X11PlatformWindow::isValid() const\n{\n    return m_window != 0L;\n}\n\nbool X11PlatformWindow::waitForFocus(int ms)\n{\n    Q_ASSERT( isValid() );\n\n    if (ms >= 0) {\n        SleepTimer t(ms);\n        while (t.sleep()) {\n            const auto currentWindow = getCurrentWindow();\n            if (currentWindow == m_window)\n                return true;\n        }\n    }\n\n    const auto currentWindow = getCurrentWindow();\n    if (m_window != currentWindow) {\n        log( QStringLiteral(\"Unexpected window focus:\\n  expected-title: [%1]\\n  current-title: [%2]\")\n                .arg(getTitle())\n                .arg(X11PlatformWindow(currentWindow).getTitle()), LogWarning );\n        return false;\n    }\n\n    return true;\n}\n\nbool X11PlatformWindow::sendKeyPress(int modifier, int key, const AppConfig &config)\n{\n    Q_ASSERT( isValid() );\n\n    if ( !waitForFocus(config.option<Config::window_wait_before_raise_ms>()) ) {\n        raise();\n        if ( !waitForFocus(config.option<Config::window_wait_raised_ms>()) ) {\n            log( QString(\"Failed to focus window \\\"%1\\\"\").arg(getTitle()), LogWarning );\n            return false;\n        }\n    }\n\n    waitMs(config.option<Config::window_wait_after_raised_ms>());\n\n    if (!X11Info::isPlatformX11())\n        return false;\n\n    auto display = X11Info::display();\n    if (!display)\n        return false;\n\n#ifdef HAS_X11TEST\n    if ( !simulateKeyPress(display, QList<int>() << modifier, static_cast<uint>(key), config) )\n        return false;\n#else\n    const int modifierMask = (modifier == XK_Control_L) ? ControlMask : ShiftMask;\n    if ( !simulateKeyPress(display, m_window, modifierMask, key) )\n        return false;\n#endif\n    return true;\n}\n"
  },
  {
    "path": "src/platform/x11/x11platformwindow.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"platform/platformwindow.h\"\n\nclass AppConfig;\nclass QWidget;\n\nclass X11PlatformWindow final : public PlatformWindow\n{\npublic:\n    explicit X11PlatformWindow();\n\n    explicit X11PlatformWindow(quintptr winId);\n\n    QString getTitle() override;\n\n    void raise() override;\n\n    bool pasteFromClipboard() override;\n\n    bool copyToClipboard() override;\n\n    bool isValid() const;\n\nprivate:\n    bool waitForFocus(int ms);\n\n    bool sendKeyPress(int modifier, int key, const AppConfig &config);\n\n    quintptr m_window;\n};\n"
  },
  {
    "path": "src/scriptable/commandhelp.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"commandhelp.h\"\n\n#include \"common/common.h\"\n#include \"scriptable/scriptable.h\"\n\nconstexpr int helpTextColumn = 23;\n\nCommandHelp::CommandHelp()\n    : cmd()\n    , desc()\n    , args()\n{\n}\n\nCommandHelp::CommandHelp(const char *command, const QString &description)\n    : cmd(command)\n    , desc(description)\n    , args()\n{\n}\n\nCommandHelp &CommandHelp::addArg(const QString &arg)\n{\n    args.append(' ');\n    args.append(arg);\n    return *this;\n}\n\nQString CommandHelp::toString() const\n{\n    if (cmd.isNull())\n        return \"\\n\";\n\n    const auto cmdArgs = cmd + args;\n    if ( cmdArgs.size() > helpTextColumn - 2 || desc.contains('\\n') ) {\n        const auto indent = QString(' ').repeated(6);\n        return QString::fromLatin1(\"    %1\\n%2\").arg(cmdArgs, indent)\n                + QString(desc)\n                    .replace('\\n', \"\\n\" + indent) + \"\\n\";\n    }\n\n    return QString::fromLatin1(\"    %1 \").arg(cmdArgs, -helpTextColumn)\n            + QString(desc)\n                .replace('\\n', \"\\n\" + QString(' ')\n                .repeated(6 + helpTextColumn)) + \"\\n\";\n}\n\nQList<CommandHelp> commandHelp()\n{\n    return QList<CommandHelp>()\n            << CommandHelp(\"show\",\n                           Scriptable::tr(\"Show main window and optionally open tab with given name.\"))\n               .addArg(\"[\" + Scriptable::tr(\"NAME\") + \"]\")\n            << CommandHelp(\"hide\",\n                           Scriptable::tr(\"Hide main window.\"))\n            << CommandHelp(\"toggle\",\n                           Scriptable::tr(\"Show or hide main window.\"))\n            << CommandHelp(\"menu\",\n                           Scriptable::tr(\"Open context menu.\"))\n            << CommandHelp(\"exit\",\n                           Scriptable::tr(\"Exit server.\"))\n            << CommandHelp(\"disable, enable\",\n                           Scriptable::tr(\"Disable or enable clipboard content storing.\"))\n            << CommandHelp()\n            << CommandHelp(\"clipboard\",\n                           Scriptable::tr(\"Print clipboard content.\"))\n               .addArg(\"[\" + Scriptable::tr(\"MIME\") + \"]\")\n           #ifdef HAS_MOUSE_SELECTIONS\n            << CommandHelp(\"selection\",\n                           Scriptable::tr(\"Print X11 selection content.\"))\n               .addArg(\"[\" + Scriptable::tr(\"MIME\") + \"]\")\n           #endif\n            << CommandHelp(\"paste\",\n                           Scriptable::tr(\"Paste clipboard to current window\\n\"\n                                          \"(may not work with some applications).\"))\n            << CommandHelp(\"copy\",\n                           Scriptable::tr(\"Copy clipboard from current window\\n\"\n                                          \"(may not work with some applications).\"))\n            << CommandHelp(\"copy\", Scriptable::tr(\"Set clipboard text.\"))\n               .addArg(Scriptable::tr(\"TEXT\"))\n            << CommandHelp(\"copy\", Scriptable::tr(\"Set clipboard content.\"))\n               .addArg(Scriptable::tr(\"MIME\"))\n               .addArg(Scriptable::tr(\"DATA\"))\n               .addArg(\"[\" + Scriptable::tr(\"MIME\") + \" \" + Scriptable::tr(\"DATA\") + \"]...\")\n            << CommandHelp()\n            << CommandHelp(\"count\",\n                           Scriptable::tr(\"Print amount of items in current tab.\"))\n            << CommandHelp(\"select\",\n                           Scriptable::tr(\"Copy item in the row to clipboard.\"))\n               .addArg(\"[\" + Scriptable::tr(\"ROW\") + \"=0]\")\n            << CommandHelp(\"next\",\n                           Scriptable::tr(\"Copy next item from current tab to clipboard.\"))\n            << CommandHelp(\"previous\",\n                           Scriptable::tr(\"Copy previous item from current tab to clipboard.\"))\n            << CommandHelp(\"add\",\n                           Scriptable::tr(\"Add text into clipboard.\"))\n               .addArg(Scriptable::tr(\"TEXT\") + \"...\")\n            << CommandHelp(\"insert\",\n                           Scriptable::tr(\"Insert text into given row.\"))\n               .addArg(Scriptable::tr(\"ROW\"))\n               .addArg(Scriptable::tr(\"TEXT\"))\n            << CommandHelp(\"remove\",\n                           Scriptable::tr(\"Remove items in given rows.\"))\n               .addArg(\"[\" + Scriptable::tr(\"ROWS\") + \"=0...]\")\n            << CommandHelp(\"edit\",\n                           Scriptable::tr(\"Edit items or edit new one.\\n\"\n                                          \"Value -1 is for current text in clipboard.\"))\n               .addArg(\"[\" + Scriptable::tr(\"ROW\") + \"=-1...]\")\n            << CommandHelp()\n            << CommandHelp(\"separator\",\n                           Scriptable::tr(\"Set separator for items on output.\"))\n               .addArg(Scriptable::tr(\"SEPARATOR\"))\n            << CommandHelp(\"read\",\n                           Scriptable::tr(\"Print raw data of clipboard or item in row.\"))\n               .addArg(\"[\" + Scriptable::tr(\"MIME\") + \"|\" + Scriptable::tr(\"ROW\") + \"]...\")\n            << CommandHelp(\"write\", Scriptable::tr(\"Write raw data to given row.\"))\n               .addArg(\"[\" + Scriptable::tr(\"ROW\") + \"=0]\")\n               .addArg(Scriptable::tr(\"MIME\"))\n               .addArg(Scriptable::tr(\"DATA\"))\n               .addArg(\"[\" + Scriptable::tr(\"MIME\") + \" \" + Scriptable::tr(\"DATA\") + \"]...\")\n            << CommandHelp()\n            << CommandHelp(\"action\",\n                           Scriptable::tr(\"Show action dialog.\"))\n               .addArg(\"[\" + Scriptable::tr(\"ROWS\") + \"=0...]\")\n            << CommandHelp(\"action\",\n                           Scriptable::tr(\"Run PROGRAM on item text in the rows.\\n\"\n                                          \"Use %1 in PROGRAM to pass text as argument.\"))\n               .addArg(\"[\" + Scriptable::tr(\"ROWS\") + \"=0...]\")\n               .addArg(\"[\" + Scriptable::tr(\"PROGRAM\") + \" [\" + Scriptable::tr(\"SEPARATOR\") + \"=\\\\n]]\")\n            << CommandHelp(\"popup\",\n                           Scriptable::tr(\"Show tray popup message for TIME milliseconds.\"))\n               .addArg(Scriptable::tr(\"TITLE\"))\n               .addArg(Scriptable::tr(\"MESSAGE\"))\n               .addArg(\"[\" + Scriptable::tr(\"TIME\") + \"=8000]\")\n            << CommandHelp()\n            << CommandHelp(\"tab\",\n                           Scriptable::tr(\"List available tab names.\"))\n            << CommandHelp(\"tab\",\n                           Scriptable::tr(\"Run command on tab with given name.\\n\"\n                                          \"Tab is created if it doesn't exist.\\n\"\n                                          \"Default is the first tab.\"))\n               .addArg(Scriptable::tr(\"NAME\"))\n               .addArg(\"[\" + Scriptable::tr(\"COMMAND\") + \"]\")\n            << CommandHelp(\"removetab\",\n                           Scriptable::tr(\"Remove tab.\"))\n               .addArg(Scriptable::tr(\"NAME\"))\n            << CommandHelp(\"renametab\",\n                           Scriptable::tr(\"Rename tab.\"))\n               .addArg(Scriptable::tr(\"NAME\"))\n               .addArg(Scriptable::tr(\"NEW_NAME\"))\n            << CommandHelp()\n            << CommandHelp(\"exporttab\",\n                           Scriptable::tr(\"Export items to file.\"))\n               .addArg(Scriptable::tr(\"FILE_NAME\"))\n            << CommandHelp(\"importtab\",\n                           Scriptable::tr(\"Import items from file.\"))\n               .addArg(Scriptable::tr(\"FILE_NAME\"))\n            << CommandHelp()\n            << CommandHelp(\"config\",\n                           Scriptable::tr(\"List all options.\"))\n            << CommandHelp(\"config\",\n                           Scriptable::tr(\"Get option value.\"))\n               .addArg(Scriptable::tr(\"OPTION\"))\n            << CommandHelp(\"config\",\n                           Scriptable::tr(\"Set option value.\"))\n               .addArg(Scriptable::tr(\"OPTION\"))\n               .addArg(Scriptable::tr(\"VALUE\"))\n            << CommandHelp()\n            << CommandHelp(\"eval, -e\", Scriptable::tr(\"Evaluate script.\"))\n               .addArg(\"[\" + Scriptable::tr(\"SCRIPT\") + \"]\")\n               .addArg(\"[\" + Scriptable::tr(\"ARGUMENTS\") + \"]...\")\n            << CommandHelp(\"session, -s, --session\",\n                           Scriptable::tr(\"Starts or connects to application instance with given session name.\"))\n               .addArg(Scriptable::tr(\"SESSION\"))\n            << CommandHelp(\"help, -h, --help\",\n                           Scriptable::tr(\"Print help for COMMAND or all commands.\"))\n               .addArg(\"[\" + Scriptable::tr(\"COMMAND\") + \"]...\")\n            << CommandHelp(\"version, -v, --version\",\n                           Scriptable::tr(\"Print version of program and libraries.\"))\n            << CommandHelp(\"--start-server\",\n                           Scriptable::tr(\"Start server in background before running a command.\"))\n               .addArg(\"[\" + Scriptable::tr(\"COMMAND\") + \"]\")\n               ;\n}\n"
  },
  {
    "path": "src/scriptable/commandhelp.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QList>\n#include <QString>\n\nstruct CommandHelp {\n    CommandHelp();\n\n    CommandHelp(const char *command, const QString &description);\n\n    CommandHelp &addArg(const QString &arg);\n\n    QString toString() const;\n\n    QString cmd;\n    QString desc;\n    QString args;\n};\n\nQList<CommandHelp> commandHelp();\n"
  },
  {
    "path": "src/scriptable/scriptable.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptable.h\"\n\n#include \"app/clipboardmonitor.h\"\n#include \"common/action.h\"\n#include \"common/appconfig.h\"\n#include \"common/audioplayer.h\"\n#include \"common/command.h\"\n#include \"common/commandstatus.h\"\n#include \"common/commandstore.h\"\n#include \"common/common.h\"\n#include \"common/log.h\"\n#include \"common/sleeptimer.h\"\n#include \"common/version.h\"\n#include \"common/textdata.h\"\n#include \"gui/clipboardspy.h\"\n#include \"gui/icons.h\"\n#include \"gui/fromiconid.h\"\n#include \"item/itemfactory.h\"\n#include \"item/serialize.h\"\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformwindow.h\"\n#include \"scriptable/commandhelp.h\"\n#include \"scriptable/scriptablebytearray.h\"\n#include \"scriptable/scriptabledir.h\"\n#include \"scriptable/scriptablefile.h\"\n#include \"scriptable/scriptableitemselection.h\"\n#include \"scriptable/scriptableproxy.h\"\n#include \"scriptable/scriptablesettings.h\"\n#include \"scriptable/scriptabletemporaryfile.h\"\n#include \"scriptable/scriptoverrides.h\"\n#include \"scriptable/scriptvaluefactory.h\"\n#include \"scriptable/scriptablenetworkrequest.h\"\n#include \"scriptable/scriptablenetworkreply.h\"\n\n#include <QApplication>\n#include <QCryptographicHash>\n#include <QDateTime>\n#include <QDir>\n#include <QFile>\n#include <QMap>\n#include <QMimeData>\n#include <QMetaProperty>\n#include <QNetworkAccessManager>\n#include <QNetworkReply>\n#include <QNetworkRequest>\n#include <QPoint>\n#include <QRegularExpression>\n#include <QJSEngine>\n#include <QJSValueIterator>\n#include <QSettings>\n#include <QSysInfo>\n#include <QUrl>\n#include <QVector>\n#include <QThread>\n#include <QTimer>\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n#   include <QTextCodec>\n#else\n#   include <QStringDecoder>\n#   include <QStringEncoder>\n#endif\n\n#ifdef WITH_NATIVE_NOTIFICATIONS\n#   include <knotifications_version.h>\n#endif\n\nQ_DECLARE_METATYPE(QByteArray*)\nQ_DECLARE_METATYPE(QFile*)\n\nnamespace {\n\nconst QLatin1String mimeIgnore(COPYQ_MIME_PREFIX \"ignore\");\n\nclass PerformanceLogger {\npublic:\n    explicit PerformanceLogger(const QString &label)\n        : m_label(label)\n    {\n        m_timer.start();\n    }\n\n    ~PerformanceLogger()\n    {\n        const qint64 ms = m_timer.elapsed();\n        if (ms >= 5000)\n            log(ms, LogWarning);\n        else if (ms >= 500)\n            log(ms, LogNote);\n        else if (ms >= 150)\n            log(ms, LogDebug);\n        else\n            log(ms, LogTrace);\n    }\n\nprivate:\n    void log(qint64 ms, LogLevel level) const\n    {\n        if ( !hasLogLevel(level) )\n            return;\n\n        ::log( QStringLiteral(\"%1: %2\")\n               .arg(m_label, \"Finished in %1 ms\")\n               .arg(ms), level );\n    }\n\n    QString m_label;\n    QElapsedTimer m_timer;\n};\n\nQString helpHead()\n{\n    return Scriptable::tr(\"Usage: copyq [%1]\").arg(Scriptable::tr(\"COMMAND\")) + \"\\n\\n\"\n        + Scriptable::tr(\"Starts server if no command is specified.\") + \"\\n\"\n        + Scriptable::tr(\"  COMMANDs:\");\n}\n\nQString helpTail()\n{\n    return Scriptable::tr(\"NOTES:\") + \"\\n\"\n        + Scriptable::tr(\"  - Use dash argument (-) to read data from standard input.\") + \"\\n\"\n        + Scriptable::tr(\"  - Use double-dash argument (--) to read all following arguments without\\n\"\n                      \"    expanding escape sequences (i.e. \\\\n, \\\\t and others).\") + \"\\n\"\n        + Scriptable::tr(\"  - Use ? for MIME to print available MIME types (default is \\\"text/plain\\\").\");\n}\n\nQString argumentError()\n{\n    return Scriptable::tr(\"Invalid number of arguments!\");\n}\n\nQString exceptionBacktrace(const QJSValue &exception, const QStringList &stack = {})\n{\n    const auto backtraceValue = exception.property(\"stack\");\n    auto backtrace = backtraceValue.isUndefined() ? QStringList() : backtraceValue.toString().split(\"\\n\");\n    for (int i = backtrace.size() - 1; i >= 0; --i) {\n        if ( backtrace[i] == QLatin1String(\"@:1\") )\n            backtrace.removeAt(i);\n    }\n    for (const auto &frame : stack)\n        backtrace.append(frame);\n\n    if ( backtrace.isEmpty() )\n        return {};\n\n    return QStringLiteral(\"\\n\\n--- backtrace ---\\n%1\\n--- end backtrace ---\")\n        .arg(backtrace.join(QLatin1String(\"\\n\")));\n\n}\n\nQJSValue evaluateStrict(QJSEngine *engine, const QString &script)\n{\n    const auto v = engine->evaluate(script);\n    if ( v.isError() ) {\n        const auto scriptText = QStringLiteral(\"--- SCRIPT BEGIN ---\\n%1\\n--- SCRIPT END ---\").arg(script);\n        log( QStringLiteral(\"Exception during evaluate: %1%2\\n\\n%3\")\n            .arg(v.toString(), exceptionBacktrace(v), scriptText), LogError );\n    }\n    return v;\n}\n\nQJSValue addScriptableClass(const QMetaObject *metaObject, const QString &name, QJSEngine *engine)\n{\n    auto cls = engine->newQMetaObject(metaObject);\n    auto fn = engine->globalObject().property(name);\n    Q_ASSERT(fn.isCallable());\n    fn.setProperty(QStringLiteral(\"prototype\"), cls);\n    return cls;\n}\n\nQByteArray serializeScriptValue(const QJSValue &value, Scriptable *scriptable)\n{\n    QByteArray data;\n\n    const QByteArray *bytes = getByteArray(value);\n\n    if (bytes != nullptr) {\n        data = *bytes;\n    } else if ( value.isArray() || value.toVariant().type() == QVariant::StringList ) {\n        const quint32 len = value.property(\"length\").toUInt();\n        for (quint32 i = 0; i < len; ++i)\n            data += serializeScriptValue(value.property(i), scriptable);\n    } else if ( !value.isUndefined() ) {\n        data = value.toString().toUtf8() + '\\n';\n    }\n\n    return data;\n}\n\nQString parseCommandLineArgument(const QString &arg)\n{\n    QString result;\n    bool escape = false;\n\n    for (const auto &c : arg) {\n        if (escape) {\n            escape = false;\n\n            if (c == 'n')\n                result.append('\\n');\n            else if (c == 't')\n                result.append('\\t');\n            else if (c == '\\\\')\n                result.append('\\\\');\n            else\n                result.append(c);\n        } else if (c == '\\\\') {\n            escape = true;\n        } else {\n            result.append(c);\n        }\n    }\n\n    return result;\n}\n\nbool isInternalDataFormat(const QString &format)\n{\n    return format == mimeWindowTitle\n        || format == mimeItems\n        || format == mimeOwner\n        || format == mimeClipboardMode\n        || format == mimeCurrentTab\n        || format == mimeSelectedItems\n        || format == mimeCurrentItem\n        || format == mimeShortcut\n        || format == mimeOutputTab\n        || format == mimeSecret;\n}\n\nQVariantMap copyWithoutInternalData(const QVariantMap &data) {\n    QVariantMap newData;\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n        const auto &format = it.key();\n        if ( !isInternalDataFormat(format) )\n            newData.insert(format, it.value());\n    }\n\n    return newData;\n}\n\nQJSValue checksumForArgument(Scriptable *scriptable, QCryptographicHash::Algorithm method)\n{\n    const auto data = scriptable->makeByteArray(scriptable->argument(0));\n    const QByteArray hash = QCryptographicHash::hash(data, method).toHex();\n    return QLatin1String(hash);\n}\n\nQString scriptToLabel(const QString &script)\n{\n    constexpr auto maxScriptSize = 30;\n    if (maxScriptSize < script.size())\n        return script.left(maxScriptSize).simplified() + QLatin1String(\"...\");\n    return script;\n}\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nQTextCodec *codecFromNameOrThrow(const QJSValue &codecName, Scriptable *scriptable)\n{\n    const auto codec = QTextCodec::codecForName( scriptable->makeByteArray(codecName) );\n    if (!codec) {\n        QString codecs;\n        for (const auto &availableCodecName : QTextCodec::availableCodecs())\n            codecs.append( \"\\n\" + QLatin1String(availableCodecName) );\n        scriptable->throwError(\"Available codecs are:\" + codecs);\n    }\n    return codec;\n}\n\nQJSValue toUnicode(const QByteArray &bytes, const QJSValue &codecName, Scriptable *scriptable)\n{\n    const auto codec = codecFromNameOrThrow(codecName, scriptable);\n    if (!codec)\n        return QJSValue();\n\n    return codec->toUnicode(bytes);\n}\n\nQJSValue toUnicode(const QByteArray &bytes, Scriptable *scriptable)\n{\n    const auto codec = QTextCodec::codecForUtfText(bytes, nullptr);\n    if (!codec)\n        return scriptable->throwError(\"Failed to detect encoding\");\n    return codec->toUnicode(bytes);\n}\n\nQJSValue fromUnicode(const QString &text, const QJSValue &codecName, Scriptable *scriptable)\n{\n    const auto codec = codecFromNameOrThrow(codecName, scriptable);\n    if (!codec)\n        return QJSValue();\n\n    return scriptable->newByteArray( codec->fromUnicode(text) );\n}\n#else\nstd::optional<QStringConverter::Encoding> encodingFromNameOrThrow(const QJSValue &codecName, Scriptable *scriptable)\n{\n    const auto encoding = QStringConverter::encodingForName( scriptable->makeByteArray(codecName) );\n    if (!encoding)\n        scriptable->throwError(\"Unknown encoding name\");\n    return encoding;\n}\n\nQJSValue toUnicode(const QByteArray &bytes, const QJSValue &codecName, Scriptable *scriptable)\n{\n    const auto encoding = encodingFromNameOrThrow(codecName, scriptable);\n    if (!encoding)\n        return QJSValue();\n    const QString text = QStringDecoder(*encoding).decode(bytes);\n    return text;\n}\n\nQJSValue toUnicode(const QByteArray &bytes, Scriptable *scriptable)\n{\n    const auto encoding = QStringConverter::encodingForData(bytes);\n    if (!encoding)\n        return scriptable->throwError(\"Failed to detect encoding\");\n    const QString text = QStringDecoder(*encoding).decode(bytes);\n    return text;\n}\n\nQJSValue fromUnicode(const QString &text, const QJSValue &codecName, Scriptable *scriptable)\n{\n    const auto encoding = encodingFromNameOrThrow(codecName, scriptable);\n    if (!encoding)\n        return QJSValue();\n    const QStringConverter::Flags flags = *encoding == QStringConverter::Utf8\n        ? QStringConverter::Flag::Default\n        : (QStringConverter::Flag::Default | QStringConverter::Flag::WriteBom);\n    return scriptable->newByteArray(\n        QStringEncoder(*encoding, flags).encode(text) );\n}\n#endif\n\nbool isGuiApplication()\n{\n    return qobject_cast<QGuiApplication*>(qApp);\n}\n\nbool isOverridden(const QJSValue &globalObject, const QString &property)\n{\n    return globalObject.property(property).property(QStringLiteral(\"_copyq\")).toString() != property;\n}\n\n} // namespace\n\nScriptable::Scriptable(\n        QJSEngine *engine,\n        ScriptableProxy *proxy,\n        ItemFactory *factory,\n        QObject *parent)\n    : QObject(parent)\n    , m_proxy(proxy)\n    , m_engine(engine)\n    , m_factory(factory)\n    , m_inputSeparator(\"\\n\")\n    , m_input()\n{\n    m_engine->installExtensions(QJSEngine::ConsoleExtension);\n\n    QJSValue globalObject = m_engine->globalObject();\n    globalObject.setProperty(QStringLiteral(\"global\"), globalObject);\n\n    m_safeCall = evaluateStrict(m_engine, QStringLiteral(\n        \"(function() {\"\n            \"try {return this.apply(global, arguments);}\"\n            \"catch(e) {_copyqUncaughtException = e; throw e;}\"\n        \"})\"\n    ));\n\n    m_safeEval = evaluateStrict(m_engine, QStringLiteral(\n        \"(function(){\"\n            \"var _eval = eval;\"\n            \"return function(script) {\"\n                \"try {return _eval(script);}\"\n                \"catch(e) {_copyqUncaughtException = e; throw e;}\"\n            \"}\"\n        \"})()\"\n    ));\n\n    m_createFn = evaluateStrict(m_engine, QStringLiteral(\n        \"(function(from, name) {\"\n            \"var f = function() {\"\n                \"_copyqArguments = arguments;\"\n                \"var v = from[name]();\"\n                \"_copyqArguments = null;\"\n                \"if (_copyqHasUncaughtException) throw _copyqUncaughtException;\"\n                \"return v;\"\n            \"};\"\n            \"f._copyq = name;\"\n            \"return f;\"\n        \"})\"\n    ));\n    m_createFnB = evaluateStrict(m_engine, QStringLiteral(\n        \"(function(from, name) {\"\n            \"var f = function() {\"\n                \"_copyqArguments = arguments;\"\n                \"var v = from[name]();\"\n                \"_copyqArguments = null;\"\n                \"if (_copyqHasUncaughtException) throw _copyqUncaughtException;\"\n                \"return ByteArray(v);\"\n            \"};\"\n            \"f._copyq = 1;\"\n            \"return f;\"\n        \"})\"\n    ));\n\n    m_createProperty = evaluateStrict(m_engine, QStringLiteral(\n        \"(function(obj, name, from) {\"\n            \"Object.defineProperty(obj, name, {\"\n            \"get: function(){return from[name];},\"\n            \"set: function(arg){from[name] = arg},\"\n            \"});\"\n        \"})\"\n    ));\n\n    installObject(this, &Scriptable::staticMetaObject, globalObject);\n\n    m_byteArrayPrototype = addScriptableClass(\n        &ScriptableByteArray::staticMetaObject, QStringLiteral(\"ByteArray\"), m_engine);\n    m_filePrototype = addScriptableClass(\n        &ScriptableFile::staticMetaObject, QStringLiteral(\"File\"), m_engine);\n    m_temporaryFilePrototype = addScriptableClass(\n        &ScriptableTemporaryFile::staticMetaObject, QStringLiteral(\"TemporaryFile\"), m_engine);\n    m_dirPrototype = addScriptableClass(\n        &ScriptableDir::staticMetaObject, QStringLiteral(\"Dir\"), m_engine);\n    m_itemSelectionPrototype = addScriptableClass(\n        &ScriptableItemSelection::staticMetaObject, QStringLiteral(\"ItemSelection\"), m_engine);\n    m_settingsPrototype = addScriptableClass(\n        &ScriptableSettings::staticMetaObject, QStringLiteral(\"Settings\"), m_engine);\n    m_networkRequestPrototype = addScriptableClass(\n        &ScriptableNetworkRequest::staticMetaObject, QStringLiteral(\"NetworkRequest\"), m_engine);\n    m_networkReplyPrototype = addScriptableClass(\n        &ScriptableNetworkReply::staticMetaObject, QStringLiteral(\"NetworkReply\"), m_engine);\n}\n\nQJSValue Scriptable::argumentsArray() const\n{\n    return m_engine->globalObject().property(\"_copyqArguments\");\n}\n\nint Scriptable::argumentCount() const\n{\n    return argumentsArray().property(\"length\").toInt();\n}\n\nQJSValue Scriptable::argument(int index) const\n{\n    return argumentsArray().property(static_cast<quint32>(index) );\n}\n\nQJSValue Scriptable::newByteArray(const QByteArray &bytes) const\n{\n    return newQObject(new ScriptableByteArray(bytes), m_byteArrayPrototype);\n}\n\nQJSValue Scriptable::newByteArray(ScriptableByteArray *ba) const\n{\n    return newQObject(ba, m_byteArrayPrototype);\n}\n\nQByteArray Scriptable::fromString(const QString &value) const\n{\n  QByteArray bytes = value.toUtf8();\n#ifdef COPYQ_OS_WIN\n  bytes.replace('\\n', \"\\r\\n\");\n#endif\n  return bytes;\n}\n\nQVariant Scriptable::toVariant(const QJSValue &value)\n{\n    return fromScriptValue<QVariant>(value, m_engine);\n}\n\nbool Scriptable::toInt(const QJSValue &value, int *number) const\n{\n    bool ok;\n    *number = toString(value).toInt(&ok);\n    return ok;\n}\n\nQVariantMap Scriptable::toDataMap(const QJSValue &value) const\n{\n    if ( value.isVariant() )\n        return value.toVariant().toMap();\n\n    QVariantMap dataMap;\n\n    QJSValueIterator it(value);\n    while (it.hasNext()) {\n        it.next();\n        dataMap.insert( it.name(), makeByteArray(it.value()) );\n    }\n\n    return dataMap;\n}\n\nQJSValue Scriptable::fromDataMap(const QVariantMap &dataMap) const\n{\n    return toScriptValue(dataMap, m_engine);\n}\n\nQByteArray Scriptable::makeByteArray(const QJSValue &value) const\n{\n    const QByteArray *data = getByteArray(value);\n    if (data)\n        return *data;\n\n    const QVariant variant = value.toVariant();\n    if (variant.type() == QVariant::ByteArray)\n        return variant.toByteArray();\n\n    return fromString(value.toString());\n}\n\nbool Scriptable::toItemData(const QJSValue &value, const QString &mime, QVariantMap *data) const\n{\n    if (value.isUndefined()) {\n        data->insert( mime, QVariant() );\n        return true;\n    }\n\n    const QByteArray *itemData = getByteArray(value);\n    if (mime == mimeItems)\n        return itemData && deserializeData(data, *itemData);\n\n    data->insert( mime, itemData ? *itemData : toString(value).toUtf8() );\n    return true;\n}\n\nQJSValue Scriptable::getInputSeparator() const\n{\n    return m_inputSeparator;\n}\n\nvoid Scriptable::setInputSeparator(const QJSValue &separator)\n{\n    m_inputSeparator = toString(separator);\n}\n\nQString Scriptable::getCurrentPath() const\n{\n    return QDir::currentPath();\n}\n\nvoid Scriptable::setCurrentPath(const QString &path)\n{\n    QDir::setCurrent(path);\n}\n\nQString Scriptable::getAbsoluteFilePath(const QString &fileName) const\n{\n    return QDir::isRelativePath(fileName) ? getCurrentPath() + '/' + fileName\n                                          : fileName;\n}\n\nQString Scriptable::arg(int i, const QString &defaultValue)\n{\n    return i < argumentCount() ? toString(argument(i)) : defaultValue;\n}\n\nQJSValue Scriptable::throwError(const QString &errorMessage)\n{\n    // QJSEngine::throwError() is available in Qt 5.12.\n    QJSValue throwFn = evaluateStrict(m_engine,  QStringLiteral(\n        \"(function(text) {throw new Error(text);})\"\n    ));\n    const auto exc = throwFn.call({errorMessage});\n    m_engine->throwError(QJSValue::GenericError, errorMessage);\n    return exc;\n}\n\nQJSValue Scriptable::throwExportError(const QString &filePath)\n{\n    return throwError( tr(\"Failed to export file \\\"%1\\\"\").arg(filePath) );\n}\n\nQJSValue Scriptable::throwImportError(const QString &filePath)\n{\n    return throwError( tr(\"Failed to import file \\\"%1\\\"\").arg(filePath) );\n}\n\nbool Scriptable::hasUncaughtException() const\n{\n    return m_hasUncaughtException;\n}\n\nvoid Scriptable::clearExceptions()\n{\n    m_hasUncaughtException = false;\n    m_uncaughtException = QJSValue();\n    m_uncaughtExceptionStack.clear();\n\n    if (m_abort == Abort::CurrentEvaluation) {\n        m_engine->setInterrupted(false);\n        m_abort = Abort::None;\n        m_abortWithSuccess = false;\n    }\n}\n\nvoid Scriptable::setUncaughtException(const QJSValue &exc)\n{\n    if (m_abort != Abort::None || m_hasUncaughtException)\n        return;\n\n    m_uncaughtException = exc;\n    m_hasUncaughtException = true;\n    m_uncaughtExceptionStack = m_stack;\n}\n\nQJSValue Scriptable::getPlugins()\n{\n    // Load plugins on demand.\n    if ( m_plugins.isUndefined() && m_factory ) {\n        m_plugins = m_engine->newQObject(new ScriptablePlugins(this, m_factory));\n        m_engine->globalObject().setProperty(QStringLiteral(\"_copyqPlugins\"), m_plugins);\n        m_plugins = evaluateStrict(m_engine, QStringLiteral(\n            \"new Proxy({}, { get: function(_, name, _) { return _copyqPlugins.load(name); } });\"\n        ));\n    }\n\n    return m_plugins;\n}\n\nQJSValue Scriptable::call(const QString &label, QJSValue *fn, const QVariantList &arguments)\n{\n    QJSValueList fnArgs;\n    fnArgs.reserve( arguments.size() );\n    for (const auto &argument : arguments)\n        fnArgs.append( toScriptValue(argument, m_engine) );\n\n    return call(label, fn, fnArgs);\n}\n\nQJSValue Scriptable::call(const QString &label, QJSValue *fn, const QJSValueList &arguments)\n{\n    m_stack.prepend(label);\n    COPYQ_LOG_VERBOSE( QStringLiteral(\"Stack push: %1\").arg(m_stack.join('|')) );\n    const auto v = m_safeCall.callWithInstance(*fn, arguments);\n    m_stack.pop_front();\n    COPYQ_LOG_VERBOSE( QStringLiteral(\"Stack pop: %1\").arg(m_stack.join('|')) );\n    return v;\n}\n\nQJSValue Scriptable::ByteArray() const\n{\n    const auto arg = argument(0);\n    if (arg.isUndefined())\n        return newByteArray(new ScriptableByteArray());\n\n    if (arg.isNumber())\n        return newByteArray(new ScriptableByteArray(arg.toInt()));\n\n    const auto obj = arg.toQObject();\n    if (obj) {\n        const auto ba = qobject_cast<ScriptableByteArray*>(obj);\n        if (ba)\n            return newByteArray(new ScriptableByteArray(*ba));\n    }\n\n    return newByteArray(new ScriptableByteArray(makeByteArray(arg)));\n}\n\nQJSValue Scriptable::File() const\n{\n    const auto arg = argument(0);\n    const auto path = arg.isUndefined() ? QString() : toString(arg);\n    return newQObject(new ScriptableFile(path), m_filePrototype);\n}\n\nQJSValue Scriptable::TemporaryFile() const\n{\n    const auto arg = argument(0);\n    const auto path = arg.isUndefined() ? QString() : toString(arg);\n    return newQObject(new ScriptableTemporaryFile(path), m_temporaryFilePrototype);\n}\n\nQJSValue Scriptable::Dir() const\n{\n    const auto arg = argument(0);\n    const auto path = arg.isUndefined() ? QString() : toString(arg);\n    return newQObject(new ScriptableDir(path), m_dirPrototype);\n}\n\nQJSValue Scriptable::ItemSelection() const\n{\n    const auto arg = argument(0);\n    const auto tabName = arg.isUndefined() ? QString() : toString(arg);\n    auto sel = new ScriptableItemSelection(tabName);\n    auto obj = newQObject(sel, m_itemSelectionPrototype);\n    sel->init(obj, m_proxy, m_tabName);\n    return obj;\n}\n\nQJSValue Scriptable::Settings() const\n{\n    const auto arg = argument(0);\n    if (arg.isUndefined())\n        return newQObject(new ScriptableSettings(), m_settingsPrototype);\n\n    return newQObject(new ScriptableSettings(toString(arg)), m_settingsPrototype);\n}\n\nQJSValue Scriptable::NetworkReply() const\n{\n    return newQObject(new ScriptableNetworkReply(), m_networkReplyPrototype);\n}\n\nQJSValue Scriptable::NetworkRequest() const\n{\n    return newQObject(new ScriptableNetworkRequest(), m_networkRequestPrototype);\n}\n\nQJSValue Scriptable::version()\n{\n    m_skipArguments = 0;\n    return tr(\"CopyQ Clipboard Manager\") + \" \" + versionString + \"\\n\"\n            + \"Qt: \" QT_VERSION_STR \"\\n\"\n#ifdef WITH_NATIVE_NOTIFICATIONS\n            + \"KNotifications: \" KNOTIFICATIONS_VERSION_STRING \"\\n\"\n#endif\n            + \"Compiler: \"\n#if defined(Q_CC_GNU)\n            \"GCC\"\n#elif defined(Q_CC_CLANG)\n            \"Clang\"\n#elif defined(Q_CC_MINGW)\n            \"MinGW\"\n#elif defined(Q_CC_MSVC)\n            \"MSVC\"\n#else\n            \"???\"\n#endif\n            + \"\\n\"\n            + \"Arch: \" + QSysInfo::buildAbi() + \"\\n\"\n            + \"OS: \" + QSysInfo::prettyProductName() + \"\\n\"\n            + \"Audio: \" + audioBackendVersion() + \"\\n\"\n            ;\n}\n\nQJSValue Scriptable::help()\n{\n    m_skipArguments = -1;\n\n    QString helpString;\n\n    if ( argumentCount() == 0 ) {\n        helpString.append(helpHead() + \"\\n\");\n\n        for (const auto &hlp : commandHelp())\n            helpString.append(hlp.toString());\n\n        helpString.append(\"\\n\" + helpTail() + \"\\n\\n\" + tr(\"CopyQ Clipboard Manager\")\n            + \" \" + versionString + \"\\n\");\n    } else {\n        for (int i = 0; i < argumentCount(); ++i) {\n            const QString &cmd = toString(argument(i));\n            for (const auto &helpItem : commandHelp()) {\n                if ( helpItem.cmd.contains(cmd) )\n                    helpString.append(helpItem.toString());\n            }\n        }\n\n        if ( helpString.isEmpty() ) {\n            return throwError( tr(\"Command not found!\") );\n        }\n    }\n\n    return helpString;\n}\n\nvoid Scriptable::show()\n{\n    m_skipArguments = 1;\n\n    if ( argumentCount() == 0 )\n        m_proxy->showWindow();\n    else\n        m_proxy->showBrowser( toString(argument(0)) );\n}\n\nvoid Scriptable::showAt()\n{\n    QRect rect(-1, -1, 0, 0);\n    int n;\n    int i = 0;\n    if ( toInt(argument(i), &n) ) {\n        rect.setX(n);\n        ++i;\n\n        if ( toInt(argument(i), &n) ) {\n            rect.setY(n);\n            ++i;\n\n            if ( toInt(argument(i), &n) ) {\n                rect.setWidth(n);\n                ++i;\n\n                if ( toInt(argument(i), &n) ) {\n                    rect.setHeight(n);\n                    ++i;\n                }\n            }\n        }\n    }\n\n    m_skipArguments = i;\n\n    const auto tabName = arg(i++);\n    if ( tabName.isEmpty() )\n        m_proxy->showWindowAt(rect);\n    else\n        m_proxy->showBrowserAt(tabName, rect);\n}\n\nvoid Scriptable::hide()\n{\n    m_skipArguments = 0;\n    m_proxy->close();\n}\n\nQJSValue Scriptable::toggle()\n{\n    m_skipArguments = 0;\n    return m_proxy->toggleVisible();\n}\n\nQJSValue Scriptable::menu()\n{\n    m_skipArguments = 4;\n\n    if (argumentCount() == 0) {\n        m_proxy->toggleCurrentMenu();\n    } else {\n        const auto tabName = toString(argument(0));\n\n        int maxItemCount = -1;\n        if (argumentCount() >= 2) {\n            const auto value = argument(1);\n            if ( !toInt(value, &maxItemCount) || maxItemCount <= 0 ) {\n                return throwError(\"Argument maxItemCount must be positive number\");\n            }\n        }\n\n        int x = -1;\n        int y = -1;\n        if (argumentCount() >= 3) {\n            const auto xValue = argument(2);\n            const auto yValue = argument(3);\n            if ( !toInt(xValue, &x) || !toInt(yValue, &y) ) {\n                return throwError(\"Coordinates must be numbers\");\n            }\n        }\n\n        m_proxy->toggleMenu( tabName, maxItemCount, QPoint(x, y) );\n    }\n\n    return QJSValue();\n}\n\nvoid Scriptable::exit()\n{\n    m_skipArguments = 0;\n    QByteArray message = fromString( tr(\"Terminating server.\\n\") );\n    printError(message);\n    m_abortWithSuccess = true;\n    m_proxy->exit();\n}\n\nvoid Scriptable::disable()\n{\n    m_skipArguments = 0;\n    m_proxy->disableMonitoring(true);\n}\n\nvoid Scriptable::enable()\n{\n    m_skipArguments = 0;\n    m_proxy->disableMonitoring(false);\n}\n\nQJSValue Scriptable::monitoring()\n{\n    m_skipArguments = 0;\n    return m_proxy->isMonitoringEnabled();\n}\n\nQJSValue Scriptable::visible()\n{\n    m_skipArguments = 0;\n    return m_proxy->isMainWindowVisible();\n}\n\nQJSValue Scriptable::focused()\n{\n    m_skipArguments = 0;\n    return m_proxy->isMainWindowFocused();\n}\n\nQJSValue Scriptable::focusPrevious()\n{\n    m_skipArguments = 0;\n\n    if ( !m_proxy->focusPrevious() )\n        return throwError(\"Failed to focus previous window\");\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::preview()\n{\n    m_skipArguments = 1;\n    return m_proxy->preview( toVariant(argument(0)) );\n}\n\nQJSValue Scriptable::filter()\n{\n    m_skipArguments = 1;\n    if (argumentCount() == 0)\n        return m_proxy->filter();\n\n    m_proxy->filter(arg(0));\n    return QJSValue();\n}\n\nvoid Scriptable::ignore()\n{\n    m_skipArguments = 0;\n    m_data[mimeIgnore] = QByteArray();\n}\n\nQJSValue Scriptable::clipboard()\n{\n    m_skipArguments = 1;\n    const QString &mime = arg(0);\n    return newByteArray( getClipboardData(mime) );\n}\n\nQJSValue Scriptable::selection()\n{\n    m_skipArguments = 1;\n#ifdef HAS_MOUSE_SELECTIONS\n    const QString &mime = arg(0);\n    return newByteArray( getClipboardData(mime, ClipboardMode::Selection) );\n#else\n    return QJSValue();\n#endif\n}\n\nQJSValue Scriptable::hasClipboardFormat()\n{\n    m_skipArguments = 1;\n    const QString &mime = arg(0);\n    return hasClipboardFormat(mime, ClipboardMode::Clipboard);\n}\n\nQJSValue Scriptable::hasSelectionFormat()\n{\n    m_skipArguments = 1;\n#ifdef HAS_MOUSE_SELECTIONS\n    const QString &mime = arg(0);\n    return hasClipboardFormat(mime, ClipboardMode::Selection);\n#else\n    return false;\n#endif\n}\n\nQJSValue Scriptable::isClipboard()\n{\n    return isClipboardData(m_data);\n}\n\nQJSValue Scriptable::copy()\n{\n    m_skipArguments = -1;\n    return copy(ClipboardMode::Clipboard);\n}\n\nQJSValue Scriptable::copySelection()\n{\n    m_skipArguments = -1;\n#ifdef HAS_MOUSE_SELECTIONS\n    return copy(ClipboardMode::Selection);\n#else\n    return QJSValue();\n#endif\n}\n\nQJSValue Scriptable::paste()\n{\n    m_skipArguments = 0;\n    if ( !m_proxy->pasteToCurrentWindow() )\n        return throwError( QStringLiteral(\"Failed to paste clipboard\") );\n\n    const QString option = QStringLiteral(\"script_paste_delay_ms\");\n    const auto values = m_proxy->config({option}).toMap();\n    const int msec = values.value(option).toInt();\n    COPYQ_LOG( QStringLiteral(\"Delay after paste: %1ms\").arg(msec) );\n    if (msec > 0)\n        interruptibleSleep(msec);\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::tab()\n{\n    m_skipArguments = 1;\n\n    const QString &name = arg(0);\n    if ( name.isNull() )\n        return toScriptValue( m_proxy->tabs(), m_engine );\n\n    m_tabName = name;\n    return QJSValue();\n}\n\nQJSValue Scriptable::removeTab()\n{\n    m_skipArguments = 1;\n\n    const QString &name = arg(0);\n    if ( const QString error = m_proxy->removeTab(name); !error.isEmpty() )\n        return throwError(error);\n    return QJSValue();\n}\n\nQJSValue Scriptable::renameTab()\n{\n    m_skipArguments = 2;\n    const QString &name = arg(0);\n    const QString &newName = arg(1);\n    if ( const QString error = m_proxy->renameTab(newName, name); !error.isEmpty() )\n        return throwError(error);\n    return QJSValue();\n}\n\nQJSValue Scriptable::tabIcon()\n{\n    m_skipArguments = 2;\n\n    if (argumentCount() == 1)\n        return m_proxy->tabIcon(arg(0));\n\n    if (argumentCount() < 2)\n        return throwError(argumentError());\n\n    m_proxy->setTabIcon(arg(0), arg(1));\n    return QJSValue();\n}\n\nQJSValue Scriptable::unload()\n{\n    const auto tabs = arguments();\n    const QStringList unloaded = m_proxy->unloadTabs(tabs.isEmpty() ? m_proxy->tabs() : tabs);\n    return toScriptValue(unloaded, m_engine);\n}\n\nvoid Scriptable::forceUnload()\n{\n    const auto tabs = arguments();\n    m_proxy->forceUnloadTabs(tabs.isEmpty() ? m_proxy->tabs() : tabs);\n}\n\nQJSValue Scriptable::length()\n{\n    m_skipArguments = 0;\n    return m_proxy->browserLength(m_tabName);\n}\n\nQJSValue Scriptable::select()\n{\n    m_skipArguments = 1;\n    QJSValue value = argument(0);\n    int row;\n    if ( !toInt(value, &row) )\n        return throwError(argumentError());\n\n    m_proxy->browserMoveToClipboard(m_tabName, row);\n    return QJSValue();\n}\n\nvoid Scriptable::next()\n{\n    m_skipArguments = 0;\n    nextToClipboard(1);\n}\n\nvoid Scriptable::previous()\n{\n    m_skipArguments = 0;\n    nextToClipboard(-1);\n}\n\nvoid Scriptable::add()\n{\n    insert(0, 0, argumentCount());\n}\n\nvoid Scriptable::insert()\n{\n    insert(argumentCount());\n}\n\nQJSValue Scriptable::remove()\n{\n    auto rows = getRows();\n    m_skipArguments = rows.size();\n\n    if ( rows.empty() )\n        rows.append(0);\n\n    if ( const auto error = m_proxy->browserRemoveRows(m_tabName, rows); !error.isEmpty() )\n        return throwError(error);\n    return QJSValue();\n}\n\nQJSValue Scriptable::move()\n{\n    m_skipArguments = 1;\n\n    int row;\n    if ( !toInt(argument(0), &row) ) {\n        return throwError(argumentError());\n    }\n\n    m_proxy->browserMoveSelected(row, m_tabName);\n    return QJSValue();\n}\n\nvoid Scriptable::edit()\n{\n    m_skipArguments = -1;\n\n    QByteArray content;\n    int row = -1;\n    int editRow = -1;\n    bool changeClipboard = true;\n\n    const int len = argumentCount();\n    for ( int i = 0; i < len; ++i ) {\n        const QJSValue value = argument(i);\n        if (i > 0)\n            content.append(m_inputSeparator.toUtf8());\n        if ( toInt(value, &row) ) {\n            editRow = (i == 0) ? row : -1;\n            changeClipboard = i == 0 && row < 0;\n\n            const QByteArray bytes = row >= 0\n                ? m_proxy->browserItemData(m_tabName, row, QString())\n                : getClipboardData();\n            if ( !bytes.isEmpty() ) {\n                content.append(bytes);\n                break;\n            }\n        } else {\n            content.append( toByteArray(value) );\n        }\n    }\n\n    editContent(editRow, mimeText, content, changeClipboard);\n}\n\nQJSValue Scriptable::editItem()\n{\n    m_skipArguments = 3;\n\n    int editRow;\n    if ( !toInt(argument(0), &editRow) )\n        return throwError(argumentError());\n\n    const auto format = arg(1);\n    const bool changeClipboard = editRow < 0;\n\n    QByteArray content;\n    if ( argumentCount() > 2 )\n        content = makeByteArray(argument(2));\n    else if (editRow >= 0)\n        content = m_proxy->browserItemData(m_tabName, editRow, format);\n    else\n        content = getClipboardData(format);\n\n    editContent(editRow, format, content, changeClipboard);\n    return {};\n}\n\nQJSValue Scriptable::read()\n{\n    m_skipArguments = -1;\n\n    QByteArray result;\n    QString mime;\n    QJSValue value;\n\n    bool used = false;\n    for ( int i = 0; i < argumentCount(); ++i ) {\n        value = argument(i);\n        int row;\n        if ( toInt(value, &row) ) {\n            if (used)\n                result.append( m_inputSeparator.toUtf8() );\n            used = true;\n            result.append( row >= 0 ? m_proxy->browserItemData(m_tabName, row, mime)\n                                    : getClipboardData(mime) );\n        } else {\n            mime = toString(value);\n        }\n    }\n\n    if (!used)\n        result.append( getClipboardData(mime) );\n\n    return newByteArray(result);\n}\n\nQJSValue Scriptable::write()\n{\n    m_skipArguments = -1;\n    return changeItem(true);\n}\n\nQJSValue Scriptable::change()\n{\n    m_skipArguments = -1;\n    return changeItem(false);\n}\n\nvoid Scriptable::separator()\n{\n    setInputSeparator( toString(argument(0)) );\n    m_skipArguments = 1;\n}\n\nvoid Scriptable::action()\n{\n    QString text;\n    bool anyRows = false;\n    int i;\n    QJSValue value;\n\n    for ( i = 0; i < argumentCount(); ++i ) {\n        value = argument(i);\n        int row;\n        if (!toInt(value, &row))\n            break;\n        if (anyRows)\n            text.append(m_inputSeparator);\n        else\n            anyRows = true;\n        if (row < 0)\n            text.append( getClipboardData() );\n        text.append( getTextData(m_proxy->browserItemData(m_tabName, row, QString())) );\n    }\n\n    QString cmd = toString(value);\n\n    m_skipArguments = i + 2;\n\n    if (!anyRows && cmd.contains(QLatin1String(\"%1\"))) {\n        text = getTextData( getClipboardData() );\n    }\n\n    const QVariantMap data = createDataMap(mimeText, text);\n\n    if (i < argumentCount()) {\n        Command command;\n        command.cmd = cmd;\n        command.output = mimeText;\n        command.input = mimeText;\n        command.wait = false;\n        command.outputTab = m_proxy->tab(m_tabName);\n        command.sep = ((i + 1) < argumentCount()) ? toString( argument(i + 1) )\n                                                  : QString('\\n');\n        m_proxy->action(data, command);\n    } else {\n        m_proxy->openActionDialog(data);\n    }\n}\n\nvoid Scriptable::popup()\n{\n    m_skipArguments = 3;\n\n    MessageData messageData;\n    messageData.urgency = Notification::Urgency::Normal;\n    messageData.title = arg(0);\n    messageData.message = arg(1);\n    if ( !toInt(argument(2), &messageData.timeoutMs) )\n        messageData.timeoutMs = 8000;\n    m_proxy->showMessage(messageData);\n}\n\nQJSValue Scriptable::playSound()\n{\n    m_skipArguments = 1;\n    const QJSValue value = argument(0);\n\n    QString filePath;\n    float volume = 1.0f;\n    // CLI string arguments arrive as ByteArray objects; treat those as file paths.\n    // A plain JS object (not ByteArray) is parsed as an options object.\n    if (value.isObject() && !getByteArray(value)) {\n        const QJSValue fileProp = value.property(QStringLiteral(\"file\"));\n        if (!fileProp.isString() || fileProp.toString().isEmpty())\n            return throwError(\"playSound: object argument requires a 'file' string property\");\n\n        filePath = fileProp.toString();\n\n        const QJSValue volProp = value.property(QStringLiteral(\"volume\"));\n        if (!volProp.isUndefined()) {\n            if (!volProp.isNumber())\n                return throwError(\"playSound: 'volume' must be a number\");\n            volume = static_cast<float>(volProp.toNumber()) / 100.0f;\n        }\n    } else {\n        filePath = arg(0);\n    }\n\n    if (const auto error = m_proxy->playSound(filePath, volume); !error.isEmpty())\n        return throwError(error);\n\n    return {};\n}\n\nQJSValue Scriptable::notification()\n{\n    m_skipArguments = -1;\n\n    MessageData messageData;\n    messageData.urgency = Notification::Urgency::Normal;\n\n    for ( int i = 0; i < argumentCount(); ++i ) {\n        const auto name = arg(i++);\n        if ( name == QLatin1String(\".title\") ) {\n            messageData.title = arg(i);\n        } else if ( name == QLatin1String(\".message\") ) {\n            messageData.message = arg(i);\n        } else if ( name == QLatin1String(\".time\") ) {\n            if ( !toInt(argument(i), &messageData.timeoutMs) ) {\n                return throwError(\"Expected number after .time argument\");\n            }\n        } else if ( name == QLatin1String(\".id\") ) {\n            messageData.notificationId = arg(i);\n        } else if ( name == QLatin1String(\".icon\") ) {\n            messageData.icon = arg(i);\n        } else if ( name == QLatin1String(\".button\") ) {\n            NotificationButton button;\n            button.name = arg(i);\n            button.script = arg(++i);\n            button.data = makeByteArray( argument(++i) );\n            messageData.buttons.items.append(button);\n        } else if ( name == QLatin1String(\".urgency\") ) {\n            const QString urgencyName = arg(i).toLower();\n            if (urgencyName == QLatin1String(\"low\")) {\n                messageData.urgency = Notification::Urgency::Low;\n            } else if (urgencyName == QLatin1String(\"normal\")) {\n                messageData.urgency = Notification::Urgency::Normal;\n            } else if (urgencyName == QLatin1String(\"high\")) {\n                messageData.urgency = Notification::Urgency::High;\n            } else if (urgencyName == QLatin1String(\"critical\")) {\n                messageData.urgency = Notification::Urgency::Critical;\n            } else {\n                return throwError(\n                    QStringLiteral(\"Unknown value for '.urgency' notification field: %1\")\n                    .arg(urgencyName)\n                );\n            }\n        } else if ( name == QLatin1String(\".persistent\") ) {\n            const QJSValue persistent = argument(i);\n            if (persistent.isBool()) {\n                messageData.persistency = persistent.toBool()\n                    ? Notification::Persistency::Persistent\n                    : Notification::Persistency::NonPersistent;\n            } else {\n                const QString name = toString(persistent);\n                if (name == QLatin1String(\"true\") || name == QLatin1String(\"1\"))\n                    messageData.persistency = Notification::Persistency::Persistent;\n                else if (name == QLatin1String(\"false\") || name == QLatin1String(\"0\"))\n                    messageData.persistency = Notification::Persistency::NonPersistent;\n                else\n                    return throwError(\n                        QStringLiteral(\"Unknown value for '.persistent' notification field: %1\")\n                        .arg(name)\n                    );\n            }\n        } else {\n            return throwError(\"Unknown argument: \" + name);\n        }\n    }\n\n    m_proxy->showMessage(messageData);\n    return QJSValue();\n}\n\nQJSValue Scriptable::exportTab()\n{\n    m_skipArguments = 1;\n\n    const auto filePath = arg(0);\n    if ( filePath.isNull() )\n        return throwError(argumentError());\n\n    if ( !m_proxy->saveTab(m_tabName, getAbsoluteFilePath(filePath)) )\n        return throwExportError(filePath);\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::importTab()\n{\n    m_skipArguments = 1;\n\n    const auto filePath = arg(0);\n    if ( filePath.isNull() )\n        return throwError(argumentError());\n\n    if ( !m_proxy->loadTab(getAbsoluteFilePath(filePath)) )\n        return throwImportError(filePath);\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::importData()\n{\n    m_skipArguments = 1;\n\n    const auto filePath = arg(0);\n    if ( filePath.isNull() )\n        return throwError(argumentError());\n\n    if ( !m_proxy->importData(getAbsoluteFilePath(filePath)) )\n        return throwImportError(filePath);\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::exportData()\n{\n    m_skipArguments = 1;\n\n    const auto filePath = arg(0);\n    if ( filePath.isNull() )\n        return throwError(argumentError());\n\n    if ( !m_proxy->exportData(getAbsoluteFilePath(filePath)) )\n        return throwExportError(filePath);\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::config()\n{\n    m_skipArguments = -1;\n\n    const QVariantList nameValueInput = argumentsAsVariants();\n    if (nameValueInput.isEmpty())\n        return m_proxy->configDescription();\n\n    const auto result = m_proxy->config(nameValueInput);\n    if ( result.type() == QVariant::String )\n        return result.toString();\n\n    if ( result.type() == QVariant::StringList ) {\n        QString errors;\n        const auto unknownOptions = result.toStringList();\n        for (const auto &name : unknownOptions) {\n            if ( !errors.isEmpty() )\n                errors.append('\\n');\n            errors.append( tr(\"Invalid option \\\"%1\\\"!\").arg(name) );\n        }\n\n        return throwError(errors);\n    }\n\n    const auto nameValue = result.toMap();\n    if ( nameValue.size() == 1 ) {\n        const auto value = nameValue.constBegin().value();\n        return value.type() == QVariant::StringList || value.type() == QVariant::List\n            ? toScriptValue(value, m_engine)\n            : toScriptValue(value.toString(), m_engine);\n    }\n\n    QStringList output;\n    for (auto it = nameValue.constBegin(); it != nameValue.constEnd(); ++it) {\n        const auto name = it.key();\n        const auto value = it.value();\n        const auto textValue =\n            value.type() == QVariant::StringList || value.type() == QVariant::List\n            ? value.toStringList().join(',')\n            : value.toString();\n        output.append( name + \"=\" + textValue );\n    }\n\n    return toScriptValue(output, m_engine);\n}\n\nQJSValue Scriptable::toggleConfig()\n{\n    m_skipArguments = 1;\n    const auto optionName = arg(0);\n    if ( optionName.isEmpty() )\n        return throwError(argumentError());\n\n    const auto result = m_proxy->toggleConfig(optionName);\n    if ( result.type() != QVariant::Bool ) {\n        return throwError( QStringLiteral(\"Invalid boolean option \\\"%1\\\"!\").arg(optionName) );\n    }\n\n    return result.toBool();\n}\n\nQJSValue Scriptable::info()\n{\n    m_skipArguments = 1;\n\n    const QString logFile = logFileName();\n    using InfoMap = QMap<QString, QString>;\n    InfoMap info;\n    info.insert(\"config\", QSettings().fileName());\n    info.insert(\"exe\", QCoreApplication::applicationFilePath());\n    info.insert(\"log\", logFile);\n    info.insert(\"data\", itemDataPath());\n\n    info.insert(\"plugins\",\n#ifdef COPYQ_PLUGIN_PREFIX\n                COPYQ_PLUGIN_PREFIX\n#else\n                m_proxy ? m_proxy->pluginsPath() : pluginsPath()\n#endif\n                );\n\n    info.insert(\"themes\",\n#ifdef COPYQ_THEME_PREFIX\n                COPYQ_THEME_PREFIX\n#else\n                m_proxy ? m_proxy->themesPath() : themesPath()\n#endif\n                );\n\n    info.insert(\"translations\",\n#ifdef COPYQ_TRANSLATION_PREFIX\n                COPYQ_TRANSLATION_PREFIX\n#else\n                m_proxy ? m_proxy->translationsPath() : translationsPath()\n#endif\n                );\n\n    info.insert(\"themes(custom)\", qgetenv(\"COPYQ_THEME_PREFIX\"));\n    info.insert(\"translations(custom)\", qgetenv(\"COPYQ_TRANSLATION_PREFIX\"));\n\n    info.insert(\"icons\",\n#ifdef COPYQ_ICON_PREFIX\n                COPYQ_ICON_PREFIX\n#else\n                QString()\n#endif\n                );\n\n    info.insert(\"desktop\",\n#ifdef COPYQ_DESKTOP_FILE\n                COPYQ_DESKTOP_FILE\n#else\n                QString()\n#endif\n                );\n\n    info.insert(\"has-mouse-selection\",\n#ifdef HAS_MOUSE_SELECTIONS\n                \"1\"\n#else\n                \"0\"\n#endif\n                );\n\n    info.insert(\"has-global-shortcuts\",\n#ifdef COPYQ_GLOBAL_SHORTCUTS\n                \"1\"\n#else\n                \"0\"\n#endif\n                );\n\n    info.insert(\"has-encryption\",\n#ifdef WITH_QCA_ENCRYPTION\n                \"1\"\n#else\n                \"0\"\n#endif\n                );\n\n    info.insert(\"has-keychain\",\n#ifdef WITH_KEYCHAIN\n                \"1\"\n#else\n                \"0\"\n#endif\n                );\n\n    info.insert(\"has-audio\",\n#ifdef WITH_AUDIO\n                \"1\"\n#else\n                \"0\"\n#endif\n                );\n\n    info.insert(\"platform\",\n#if defined(Q_OS_WIN)\n                \"Windows\"\n#elif defined(Q_OS_MAC)\n                \"OS X\"\n#elif defined(Q_OS_LINUX)\n                \"Linux\"\n#elif defined(Q_OS_UNIX)\n                \"Unix\"\n#else\n                \"?\"\n#endif\n\n#ifdef COPYQ_WITH_X11\n                \"/X11\"\n#endif\n                );\n\n    const QString name = arg(0);\n    if (!name.isEmpty())\n        return info.value(name);\n\n    QString result;\n    for (auto it = info.constBegin(); it != info.constEnd(); ++it)\n        result.append( QStringLiteral(\"%1: %2\\n\").arg(it.key(), it.value()) );\n    result.chop(1);\n\n    return result;\n}\n\nQJSValue Scriptable::eval()\n{\n    const auto script = arg(0);\n    const auto result = eval(script);\n    if ( result.isError() )\n        setUncaughtException(result);\n    m_skipArguments = -1;\n    return result;\n}\n\nQJSValue Scriptable::source()\n{\n    const auto scriptFilePath = arg(0);\n\n    QByteArray script;\n    {\n        QFile scriptFile( getAbsoluteFilePath(scriptFilePath) );\n        if ( !scriptFile.open(QIODevice::ReadOnly) ) {\n            return throwError(\n                    QStringLiteral(\"Failed to open \\\"%1\\\": %2\")\n                        .arg(scriptFilePath,\n                             scriptFile.errorString()) );\n        }\n\n        script = scriptFile.readAll();\n    }\n\n    const auto result = eval(script, scriptFilePath);\n    m_skipArguments = 1;\n    return result;\n}\n\nQJSValue Scriptable::currentPath()\n{\n    m_skipArguments = 1;\n\n    if (argumentCount() > 0)\n        setCurrentPath(arg(0));\n\n    return getCurrentPath();\n}\n\nQJSValue Scriptable::str()\n{\n    m_skipArguments = 1;\n    return arg(0);\n}\n\nQJSValue Scriptable::input()\n{\n    m_skipArguments = 0;\n\n    if ( !getByteArray(m_input) )\n        m_input = readInput();\n\n    return m_input;\n}\n\nQJSValue Scriptable::toUnicode()\n{\n    m_skipArguments = 2;\n\n    const auto bytes = makeByteArray(argument(0));\n\n    if (argumentCount() >= 2)\n        return ::toUnicode(bytes, argument(1), this);\n\n    if (argumentCount() >= 1)\n        return ::toUnicode(bytes, this);\n\n    return throwError(argumentError());\n}\n\nQJSValue Scriptable::fromUnicode()\n{\n    m_skipArguments = 2;\n\n    if (argumentCount() < 2)\n        return throwError(argumentError());\n\n    const QJSValue codecName = argument(1);\n    const QString text = arg(0);\n    return ::fromUnicode(text, codecName, this);\n}\n\nQJSValue Scriptable::dataFormats()\n{\n    m_skipArguments = 0;\n    return toScriptValue( m_data.keys(), m_engine );\n}\n\nQJSValue Scriptable::data()\n{\n    m_skipArguments = 1;\n    return newByteArray( m_data.value(arg(0)).toByteArray() );\n}\n\nQJSValue Scriptable::setData()\n{\n    m_skipArguments = 2;\n\n    const QString mime = arg(0);\n    if ( !toItemData(argument(1), mime, &m_data) )\n        return false;\n\n    if (m_modifySelectionData)\n        m_proxy->setSelectedItemsData(mime, m_data.value(mime), m_tabName);\n\n    return true;\n}\n\nQJSValue Scriptable::removeData()\n{\n    m_skipArguments = 1;\n\n    const QString mime = arg(0);\n    m_data.remove(mime);\n\n    if (m_modifySelectionData)\n        m_proxy->setSelectedItemsData(mime, QVariant(), m_tabName);\n\n    return true;\n}\n\nvoid Scriptable::print()\n{\n    m_skipArguments = 1;\n    print(makeByteArray(argument(0)));\n}\n\nvoid Scriptable::abort()\n{\n    m_skipArguments = 0;\n    m_abortWithSuccess = true;\n    abortEvaluation(Abort::CurrentEvaluation);\n}\n\nvoid Scriptable::fail()\n{\n    m_skipArguments = 0;\n    abortEvaluation(Abort::CurrentEvaluation);\n}\n\nQJSValue Scriptable::testSelected()\n{\n    m_skipArguments = 0;\n    return m_proxy->testSelected();\n}\n\nvoid Scriptable::serverLog()\n{\n    m_skipArguments = 1;\n    m_proxy->serverLog(arg(0));\n}\n\nQJSValue Scriptable::logs()\n{\n    m_skipArguments = 0;\n    return newByteArray(readLogFile(50 * 1024 * 1024));\n}\n\nvoid Scriptable::setCurrentTab()\n{\n    m_skipArguments = 1;\n    const QString tabName = arg(0);\n    m_proxy->setCurrentTab(tabName);\n}\n\nQJSValue Scriptable::selectItems()\n{\n    const auto rows = getRows();\n    m_skipArguments = rows.size();\n    return m_proxy->selectItems(m_tabName, rows);\n}\n\nQJSValue Scriptable::selectedTab()\n{\n    m_skipArguments = 0;\n    return m_proxy->selectedTab();\n}\n\nQJSValue Scriptable::selectedItems()\n{\n    m_skipArguments = 0;\n    return toScriptValue( m_proxy->selectedItems(m_tabName), m_engine );\n}\n\nQJSValue Scriptable::currentItem()\n{\n    m_skipArguments = 0;\n    return m_proxy->currentItem(m_tabName);\n}\n\nQJSValue Scriptable::selectedItemData()\n{\n    int selectedIndex;\n    if ( !toInt(argument(0), &selectedIndex) )\n        return throwError(argumentError());\n\n    return toScriptValue( m_proxy->selectedItemData(selectedIndex, m_tabName), m_engine );\n}\n\nQJSValue Scriptable::setSelectedItemData()\n{\n    int selectedIndex;\n    if ( !toInt(argument(0), &selectedIndex) )\n        return throwError(argumentError());\n\n    const auto data = toDataMap( argument(1) );\n    return toScriptValue( m_proxy->setSelectedItemData(selectedIndex, data, m_tabName), m_engine );\n}\n\nQJSValue Scriptable::selectedItemsData()\n{\n    return toScriptValue( m_proxy->selectedItemsData(m_tabName).items, m_engine );\n}\n\nvoid Scriptable::setSelectedItemsData()\n{\n    m_skipArguments = 1;\n    const VariantMapList dataList{fromScriptValue<QVector<QVariantMap>>( argument(0), m_engine )};\n    m_proxy->setSelectedItemsData(dataList, m_tabName);\n}\n\nQJSValue Scriptable::escapeHtml()\n{\n    m_skipArguments = 1;\n    return ::escapeHtml( toString(argument(0)) );\n}\n\nQJSValue Scriptable::unpack()\n{\n    m_skipArguments = 1;\n\n    QVariantMap data;\n\n    if ( !toItemData(argument(0), mimeItems, &data) )\n        return throwError(argumentError());\n\n    return toScriptValue(data, m_engine);\n}\n\nQJSValue Scriptable::pack()\n{\n    m_skipArguments = 1;\n    QVariantMap data = toDataMap( argument(0) );\n    return newByteArray(serializeData(data));\n}\n\nQJSValue Scriptable::getItem()\n{\n    m_skipArguments = 1;\n\n    int row;\n    if ( !toInt(argument(0), &row) )\n        return throwError(argumentError());\n\n    return toScriptValue( m_proxy->browserItemData(m_tabName, row), m_engine );\n}\n\nvoid Scriptable::setItem()\n{\n    insert(2);\n}\n\nQJSValue Scriptable::toBase64()\n{\n    m_skipArguments = 1;\n    return QString::fromLatin1(makeByteArray(argument(0)).toBase64());\n}\n\nQJSValue Scriptable::fromBase64()\n{\n    m_skipArguments = 1;\n    return newByteArray(QByteArray::fromBase64(makeByteArray(argument(0))));\n}\n\nQJSValue Scriptable::md5sum()\n{\n    m_skipArguments = 1;\n    return checksumForArgument(this, QCryptographicHash::Md5);\n}\n\nQJSValue Scriptable::sha1sum()\n{\n    m_skipArguments = 1;\n    return checksumForArgument(this, QCryptographicHash::Sha1);\n}\n\nQJSValue Scriptable::sha256sum()\n{\n    m_skipArguments = 1;\n    return checksumForArgument(this, QCryptographicHash::Sha256);\n}\n\nQJSValue Scriptable::sha512sum()\n{\n    m_skipArguments = 1;\n    return checksumForArgument(this, QCryptographicHash::Sha512);\n}\n\nQJSValue Scriptable::open()\n{\n    m_skipArguments = -1;\n    return m_proxy->openUrls( arguments() );\n}\n\nQJSValue Scriptable::execute()\n{\n    m_skipArguments = -1;\n\n    QByteArray executeStdoutData;\n    QString executeStdoutLastLine;\n    QJSValue executeStdoutCallback;\n\n    // Pass all arguments until null to command. The rest will be sent to stdin.\n    QStringList args;\n    int i = 0;\n    for ( ; i < argumentCount(); ++i ) {\n        const auto arg = argument(i);\n        if (arg.isNull())\n            break;\n\n        if ( arg.isCallable() )\n            executeStdoutCallback = arg;\n        else\n            args.append( toString(arg) );\n    }\n\n    Action action;\n    for ( ++i ; i < argumentCount(); ++i ) {\n        const auto arg = argument(i);\n        if ( arg.isCallable() )\n            executeStdoutCallback = arg;\n        else\n            action.setInput( action.input() + makeByteArray(arg) );\n    }\n\n    action.setCommand(args);\n    action.setReadOutput(true);\n\n    connect( &action, &Action::actionOutput,\n             this, [&](const QByteArray &output) {\n                 executeStdoutData.append(output);\n             });\n    if ( executeStdoutCallback.isCallable() ) {\n        connect( &action, &Action::actionOutput,\n                 this, [&](const QByteArray &output) {\n                     executeStdoutLastLine.append( getTextData(output) );\n                     auto lines = executeStdoutLastLine.split('\\n');\n                     executeStdoutLastLine = lines.takeLast();\n                     if ( !lines.isEmpty() ) {\n                         const auto arg = toScriptValue(lines, m_engine);\n                         call( \"executeStdoutCallback\", &executeStdoutCallback, {arg} );\n                     }\n                 });\n    }\n\n    if ( !runAction(&action) || action.actionFailed() ) {\n        return throwError( QStringLiteral(\"Failed to run command\") );\n    }\n\n    if ( executeStdoutCallback.isCallable() ) {\n        const auto arg = toScriptValue(executeStdoutLastLine, m_engine);\n        call( \"executeStdoutCallback\", &executeStdoutCallback, {arg} );\n    }\n\n    QJSValue actionResult = m_engine->newObject();\n    actionResult.setProperty( QStringLiteral(\"stdout\"), newByteArray(executeStdoutData) );\n    actionResult.setProperty( QStringLiteral(\"stderr\"), getTextData(action.errorOutput()) );\n    actionResult.setProperty( QStringLiteral(\"exit_code\"), action.exitCode() );\n\n    return actionResult;\n}\n\nQJSValue Scriptable::currentWindowTitle()\n{\n    m_skipArguments = 0;\n    if ( isGuiApplication() ) {\n        PlatformWindowPtr window = platformNativeInterface()->getCurrentWindow();\n        return window ? window->getTitle() : QString();\n    }\n    return m_proxy->currentWindowTitle();\n}\n\nQJSValue Scriptable::currentClipboardOwner()\n{\n    return eval(\"currentWindowTitle()\");\n}\n\nQJSValue Scriptable::dialog()\n{\n    m_skipArguments = -1;\n\n    NamedValueList values;\n    values.items.reserve(argumentCount() / 2);\n\n    for ( int i = 0; i < argumentCount(); i += 2 ) {\n        const QString key = arg(i);\n        const QJSValue value = argument(i + 1);\n        values.items.append( NamedValue(key, toVariant(value)) );\n    }\n\n    const auto dialogId = m_proxy->inputDialog(values);\n    if ( !canContinue() )\n        return QJSValue();\n\n    QEventLoop loop;\n    connect(this, &Scriptable::finished, &loop, &QEventLoop::quit);\n    connect( m_proxy, &ScriptableProxy::inputDialogFinished,\n             &loop, [&](int finishedDialogId, const NamedValueList &result) {\n                 if (finishedDialogId != dialogId)\n                     return;\n                 values = result;\n                 loop.quit();\n             });\n    loop.exec();\n\n    if (values.items.isEmpty())\n        return QJSValue();\n\n    if (values.items.size() == 1)\n        return toScriptValue( values.items.first().value, m_engine );\n\n    QJSValue result = m_engine->newObject();\n\n    for (const auto &value : values.items)\n        result.setProperty( value.name, toScriptValue(value.value, m_engine) );\n\n    return result;\n}\n\nQJSValue Scriptable::menuItems()\n{\n    const auto text = argument(0);\n    if ( text.isString() ) {\n        m_skipArguments = -1;\n        VariantMapList items;\n        for (const auto &arg : arguments())\n            items.items.append(createDataMap(mimeText, arg));\n        const int i = m_proxy->menuItems(items);\n        if (i == -1 || i >= items.items.size())\n            return QString();\n        return getTextData(items.items[i]);\n    }\n\n    m_skipArguments = 1;\n    const VariantMapList items{fromScriptValue<QVector<QVariantMap>>(text, m_engine)};\n    if ( items.items.isEmpty() )\n        return -1;\n    return m_proxy->menuItems(items);\n}\n\nQJSValue Scriptable::settings()\n{\n    m_skipArguments = 2;\n\n    QSettings settings(\n          QSettings::IniFormat,\n          QSettings::UserScope,\n          QCoreApplication::organizationName(),\n          QCoreApplication::applicationName() + \"-scripts\");\n\n    if (argumentCount() == 2) {\n        const QString key = arg(0);\n        const QJSValue value = argument(1);\n        const QVariant saveValue = toVariant(value);\n        settings.setValue(key, saveValue);\n        return QJSValue();\n    }\n\n    if (argumentCount() == 1) {\n        const auto value = settings.value(arg(0));\n        return toScriptValue(value, m_engine);\n    }\n\n    return toScriptValue(settings.allKeys(), m_engine);\n}\n\nQJSValue Scriptable::dateString()\n{\n    m_skipArguments = 1;\n    const QDateTime dateTime = QDateTime::currentDateTime();\n    return dateTime.toString(arg(0));\n}\n\nQJSValue Scriptable::commands()\n{\n    return toScriptValue( m_proxy->commands(), m_engine );\n}\n\nvoid Scriptable::setCommands()\n{\n    const auto commands = fromScriptValue<QVector<Command>>(argument(0), m_engine);\n    m_proxy->setCommands(commands);\n}\n\nvoid Scriptable::addCommands()\n{\n    const auto commands = fromScriptValue<QVector<Command>>(argument(0), m_engine);\n    m_proxy->addCommands(commands);\n}\n\nQJSValue Scriptable::importCommands()\n{\n    m_skipArguments = 1;\n    const auto commands = importCommandsFromText(arg(0));\n    return toScriptValue(commands, m_engine);\n}\n\nQJSValue Scriptable::exportCommands()\n{\n    m_skipArguments = 1;\n    const auto commands = fromScriptValue<QVector<Command>>(argument(0), m_engine);\n\n    const auto exportedCommands = ::exportCommands(commands);\n    if ( exportedCommands.isEmpty() )\n        return throwError(\"Failed to export commands\");\n\n    return exportedCommands;\n}\n\nQJSValue Scriptable::networkGet()\n{\n    QJSValue reply = networkGetAsync();\n    reply.property(\"data\");\n    return reply;\n}\n\nQJSValue Scriptable::networkPost()\n{\n    QJSValue reply = networkPostAsync();\n    reply.property(\"data\");\n    return reply;\n}\n\nQJSValue Scriptable::networkGetAsync()\n{\n    m_skipArguments = 1;\n    auto requestJs = this->NetworkRequest();\n    auto request = qobject_cast<ScriptableNetworkRequest *>(requestJs.toQObject());\n    return request->request(newByteArray(\"GET\"), argument(0), {});\n}\n\nQJSValue Scriptable::networkPostAsync()\n{\n    m_skipArguments = 2;\n    auto requestJs = this->NetworkRequest();\n    auto request = qobject_cast<ScriptableNetworkRequest *>(requestJs.toQObject());\n    return request->request(newByteArray(\"POST\"), argument(0), argument(1));\n}\n\nQJSValue Scriptable::env()\n{\n    m_skipArguments = 1;\n    const QString name = arg(0);\n    const QByteArray value = qgetenv(name.toUtf8().constData());\n    return newByteArray(value);\n}\n\nQJSValue Scriptable::setEnv()\n{\n    m_skipArguments = 2;\n    const QString name = arg(0);\n    const QByteArray value = makeByteArray(argument(1));\n    return qputenv(name.toLocal8Bit().constData(), value);\n}\n\nQJSValue Scriptable::sleep()\n{\n    m_skipArguments = 1;\n\n    int msec;\n    if ( !toInt(argument(0), &msec) )\n        return throwError(argumentError());\n\n    interruptibleSleep(msec);\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::afterMilliseconds()\n{\n    m_skipArguments = 2;\n\n    if (argumentCount() < 2)\n        return throwError(argumentError());\n\n    int msec;\n    if ( !toInt(argument(0), &msec) )\n        return throwError(argumentError());\n\n    const auto fn = argument(1);\n    if ( !fn.isCallable() )\n        return throwError(argumentError());\n\n    class TimedFunctionCall final : public QObject {\n    public:\n        TimedFunctionCall(int msec, const QJSValue &fn, Scriptable *scriptable)\n            : QObject(scriptable)\n            , m_timerId( startTimer(msec, Qt::PreciseTimer) )\n            , m_fn(fn)\n            , m_scriptable(scriptable)\n        {\n        }\n\n    protected:\n        void timerEvent(QTimerEvent *event) override\n        {\n            QObject::timerEvent(event);\n            if ( m_timerId == event->timerId() ) {\n                killTimer(m_timerId);\n                m_scriptable->call(\"afterMillisecondsCallback\", &m_fn);\n            }\n        }\n\n    private:\n        int m_timerId;\n        QJSValue m_fn;\n        Scriptable *m_scriptable;\n    };\n\n    new TimedFunctionCall(msec, fn, this);\n    return QJSValue();\n}\n\nQVariant Scriptable::call(const QString &method, const QVariantList &arguments)\n{\n    if ( hasUncaughtException() )\n        return QVariant();\n\n    auto fn = m_engine->globalObject().property(method);\n    const auto result = call(method, &fn, arguments);\n    m_skipArguments = -1;\n    if ( result.isUndefined() || result.isNull() )\n        return QVariant();\n\n    return toVariant(result);\n}\n\nQVariantList Scriptable::currentArguments()\n{\n    m_skipArguments = -1;\n    QVariantList arguments;\n    arguments.reserve( argumentCount() );\n    for ( int i = 0; i < argumentCount(); ++i )\n        arguments.append( toVariant(argument(i)) );\n    return arguments;\n}\n\nvoid Scriptable::throwException(const QString &errorMessage)\n{\n    throwError(errorMessage);\n}\n\nQJSValue Scriptable::screenshot()\n{\n    return screenshot(false);\n}\n\nQJSValue Scriptable::screenshotSelect()\n{\n    return screenshot(true);\n}\n\nQJSValue Scriptable::screenNames()\n{\n    return toScriptValue( m_proxy->screenNames(), m_engine );\n}\n\nQJSValue Scriptable::queryKeyboardModifiers()\n{\n    const auto modifiers = m_proxy->queryKeyboardModifiers().items;\n    QStringList modifierList;\n    if (modifiers.testFlag(Qt::ControlModifier))\n        modifierList.append(\"Ctrl\");\n    if (modifiers.testFlag(Qt::ShiftModifier))\n        modifierList.append(\"Shift\");\n    if (modifiers.testFlag(Qt::AltModifier))\n        modifierList.append(\"Alt\");\n    if (modifiers.testFlag(Qt::MetaModifier))\n        modifierList.append(\"Meta\");\n    return toScriptValue(modifierList, m_engine);\n}\n\nQJSValue Scriptable::pointerPosition()\n{\n    const QPoint pos = m_proxy->pointerPosition();\n    return toScriptValue(QVector<int>{pos.x(), pos.y()}, m_engine);\n}\n\nQJSValue Scriptable::setPointerPosition()\n{\n    m_skipArguments = 2;\n    int x = 0;\n    int y = 0;\n    if ( !toInt(argument(0), &x) || !toInt(argument(1), &y) )\n        return throwError(argumentError());\n\n    m_proxy->setPointerPosition(x, y);\n\n    // Apparently, on macOS the pointer position is set only after some time.\n    SleepTimer t(5000);\n    while ( m_proxy->pointerPosition() != QPoint(x, y) ) {\n        if ( !t.sleep() )\n            return throwError(\"Failed to set pointer position\");\n    }\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::iconColor()\n{\n    m_skipArguments = 1;\n\n    if (argumentCount() == 0)\n        return m_proxy->iconColor();\n\n    const auto color = arg(0);\n    if ( !m_proxy->setIconColor(color) )\n        return throwError(\"Invalid color name\");\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::iconTag()\n{\n    m_skipArguments = 1;\n\n    if (argumentCount() == 0)\n        return m_proxy->iconTag();\n\n    const auto tag = arg(0);\n    m_proxy->setIconTag(tag);\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::iconTagColor()\n{\n    m_skipArguments = 1;\n\n    if (argumentCount() == 0)\n        return m_proxy->iconTagColor();\n\n    const auto color = arg(0);\n    if ( !m_proxy->setIconTagColor(color) )\n        return throwError(\"Invalid color name\");\n\n    return QJSValue();\n}\n\nQJSValue Scriptable::loadTheme()\n{\n    m_skipArguments = 1;\n\n    const QString path = getAbsoluteFilePath(arg(0));\n    if ( const QString error = m_proxy->loadTheme(path); !error.isEmpty() )\n        return throwError(error);\n\n    return QJSValue();\n}\n\nvoid Scriptable::onClipboardChanged()\n{\n    eval(R\"(\n    if (!hasData()) {\n        updateClipboardData();\n    } else if (runAutomaticCommands()) {\n        saveData();\n        updateClipboardData();\n    } else {\n        clearClipboardData();\n    }\n    )\", \"onClipboardChanged()\");\n}\n\nvoid Scriptable::onOwnClipboardChanged()\n{\n    eval(\"updateClipboardData()\");\n}\n\nvoid Scriptable::onHiddenClipboardChanged()\n{\n    eval(\"updateClipboardData()\");\n}\n\nvoid Scriptable::onClipboardUnchanged()\n{\n}\n\nvoid Scriptable::onSecretClipboardChanged()\n{\n    // Drop secret data by default\n    m_data = {{mimeSecret, m_data.value(mimeSecret)}};\n    eval(\"updateClipboardData()\");\n}\n\nvoid Scriptable::synchronizeToSelection()\n{\n    if ( canSynchronizeSelection(ClipboardMode::Selection) ) {\n        COPYQ_LOG( QStringLiteral(\"Synchronizing to selection: Calling provideSelection()\") );\n        provideSelection();\n    }\n}\n\nvoid Scriptable::synchronizeFromSelection()\n{\n    if( canSynchronizeSelection(ClipboardMode::Clipboard) ) {\n        COPYQ_LOG( QStringLiteral(\"Synchronizing to clipboard: Calling provideClipboard()\") );\n        provideClipboard();\n    }\n}\n\nvoid Scriptable::setClipboardData()\n{\n    auto data = copyWithoutInternalData(m_data);\n    m_proxy->setClipboardData(data);\n}\n\nvoid Scriptable::updateTitle()\n{\n    m_proxy->setTitleForData(m_data);\n}\n\nvoid Scriptable::setTitle()\n{\n    m_skipArguments = 1;\n    const auto title = arg(0);\n    m_proxy->setTitle(title);\n}\n\nvoid Scriptable::saveData()\n{\n    const QString outputTab = getTextData(m_data, mimeOutputTab);\n\n    if ( !outputTab.isEmpty() )\n        saveData(outputTab);\n}\n\nQJSValue Scriptable::hasData()\n{\n    for (auto it = m_data.constBegin(); it != m_data.constEnd(); ++it) {\n        const auto &format = it.key();\n        if ( isInternalDataFormat(format) )\n            continue;\n\n        auto bytes = it.value().toByteArray();\n        for (const auto &byte : bytes) {\n            const QChar c(byte);\n            if ( !c.isSpace() && !c.isNull() )\n                return true;\n        }\n    }\n\n    return false;\n}\n\nvoid Scriptable::showDataNotification()\n{\n    m_proxy->showDataNotification(m_data);\n}\n\nvoid Scriptable::hideDataNotification()\n{\n    m_proxy->showDataNotification(QVariantMap());\n}\n\nvoid Scriptable::updateClipboardData()\n{\n    eval(R\"(\n    if (isClipboard()) {\n        updateTitle();\n        showDataNotification();\n        setClipboardData();\n    }\n    )\", \"updateClipboardData()\");\n}\n\nvoid Scriptable::clearClipboardData()\n{\n    eval(R\"(\n    if (isClipboard()) {\n        setTitle();\n        hideDataNotification();\n    }\n    )\", \"clearClipboardData()\");\n}\n\nQJSValue Scriptable::runAutomaticCommands()\n{\n    m_modifySelectionData = false;\n    const auto result = runCommands(CommandType::Automatic);\n    m_modifySelectionData = true;\n    return result;\n}\n\nvoid Scriptable::runDisplayCommands()\n{\n    m_modifySelectionData = false;\n\n    QEventLoop loop;\n    connect(this, &Scriptable::finished, &loop, [&]() {\n        if (m_abort == Abort::AllEvaluations)\n            loop.exit();\n    });\n\n    QTimer timer;\n    timer.setSingleShot(true);\n    timer.setInterval(0);\n    connect(this, &Scriptable::dataReceived, &loop, [&]() {\n        timer.start();\n    });\n\n    bool running = false;\n    connect(&timer, &QTimer::timeout, &loop, [&]() {\n        if (running)\n            return;\n        running = true;\n\n        if ( m_data.isEmpty() )\n            m_data = m_proxy->setDisplayData(m_actionId, m_data);\n\n        while ( !m_data.isEmpty() && runCommands(CommandType::Display) ) {\n            m_data = m_proxy->setDisplayData(m_actionId, m_data);\n        }\n\n        m_data.clear();\n        running = false;\n    });\n\n    emit receiveData();\n\n    if (m_abort == Abort::None)\n        loop.exec();\n\n    m_modifySelectionData = true;\n}\n\nvoid Scriptable::runMenuCommandFilters()\n{\n    QEventLoop loop;\n    connect(this, &Scriptable::finished, &loop, [&]() {\n        if (m_abort == Abort::AllEvaluations)\n            loop.exit();\n    });\n\n    QByteArray bytes;\n    QTimer timer;\n    timer.setSingleShot(true);\n    timer.setInterval(0);\n\n    connect(this, &Scriptable::dataReceived, &loop, [&](const QByteArray &receivedBytes) {\n        bytes = receivedBytes;\n        if ( !bytes.isEmpty() )\n            timer.start();\n    });\n\n    // Avoid modifying menu filter data.\n    const int actionId = m_actionId;\n    m_actionId = -1;\n\n    const QString menuItemProperty = QStringLiteral(\"menuItem\");\n    const QString enabledProperty = QStringLiteral(\"enabled\");\n    bool running = false;\n    bool restart = false;\n    connect(&timer, &QTimer::timeout, &loop, [&]() {\n        if ( bytes.isEmpty() )\n            return;\n\n        if (running) {\n            restart = true;\n            return;\n        }\n        running = true;\n\n        do {\n            restart = false;\n            const int currentRun = bytes.toInt();\n\n            getActionData(actionId);\n            const QStringList matchCommands =\n                m_data.value(COPYQ_MIME_PREFIX \"match-commands\").toStringList();\n\n            PerformanceLogger logger( QStringLiteral(\"Menu item filters\") );\n\n            for (int i = 0; i < matchCommands.length(); ++i) {\n                const auto obj = m_engine->newObject();\n                m_engine->globalObject().setProperty(menuItemProperty, obj);\n                const bool enabled = canExecuteCommandFilter(matchCommands[i]);\n                QVariantMap menuItem = toDataMap(obj);\n                menuItem[enabledProperty] = enabled && menuItem.value(enabledProperty, true).toBool();\n                if ( restart || !m_proxy->enableMenuItem(actionId, currentRun, i, menuItem) )\n                    break;\n            }\n        } while (restart);\n\n        running = false;\n    });\n\n    emit receiveData();\n\n    if (m_abort == Abort::None)\n        loop.exec();\n}\n\nvoid Scriptable::monitorClipboard()\n{\n    if (!verifyClipboardAccess())\n        return;\n\n    ClipboardMonitor monitor(\n        fromScriptValue<QStringList>(eval(\"clipboardFormatsToSave()\"), m_engine) );\n\n    QEventLoop loop;\n    connect(this, &Scriptable::finished, &loop, &QEventLoop::quit);\n    connect( &monitor, &ClipboardMonitor::clipboardChanged,\n             this, &Scriptable::onMonitorClipboardChanged );\n    connect( &monitor, &ClipboardMonitor::hiddenClipboardChanged,\n             this, &Scriptable::onMonitorHiddenClipboardChanged );\n    connect( &monitor, &ClipboardMonitor::ownClipboardChanged,\n             this, &Scriptable::onMonitorOwnClipboardChanged );\n    connect( &monitor, &ClipboardMonitor::secretClipboardChanged,\n             this, &Scriptable::onMonitorSecretClipboardChanged );\n    connect( &monitor, &ClipboardMonitor::clipboardUnchanged,\n             this, &Scriptable::onMonitorClipboardUnchanged );\n    connect( &monitor, &ClipboardMonitor::synchronizeSelection,\n             this, &Scriptable::onSynchronizeSelection );\n    connect( &monitor, &ClipboardMonitor::fetchCurrentClipboardOwner,\n             this, &Scriptable::onFetchCurrentClipboardOwner );\n    connect( &monitor, &ClipboardMonitor::saveData,\n             m_proxy, [this](const QVariantMap &data) {\n                 m_data = data;\n                 eval(\"if (hasData()) { saveData(); }\");\n             } );\n\n    monitor.startMonitoring();\n    setClipboardMonitorRunning(true);\n    loop.exec();\n    setClipboardMonitorRunning(false);\n}\n\nvoid Scriptable::provideClipboard()\n{\n    provideClipboard(ClipboardMode::Clipboard);\n}\n\nvoid Scriptable::provideSelection()\n{\n    provideClipboard(ClipboardMode::Selection);\n}\n\nQJSValue Scriptable::isClipboardMonitorRunning()\n{\n    return ::isClipboardMonitorRunning();\n}\n\nQJSValue Scriptable::clipboardFormatsToSave()\n{\n    if (!m_factory)\n        return toScriptValue(QStringList(), m_engine);\n\n    QStringList formats = m_factory->formatsToSave();\n    COPYQ_LOG( \"Clipboard formats to save: \" + formats.join(\", \") );\n\n    for (const auto &command : m_proxy->automaticCommands()) {\n        if ( !command.input.isEmpty() && !formats.contains(command.input) ) {\n            COPYQ_LOG( QStringLiteral(\"Clipboard format to save for command \\\"%1\\\": %2\")\n                       .arg(command.name, command.input) );\n            formats.append(command.input);\n        }\n    }\n\n    return toScriptValue(formats, m_engine);\n}\n\nQJSValue Scriptable::styles()\n{\n    return toScriptValue( m_proxy->styles(), m_engine );\n}\n\nQJSValue Scriptable::stats()\n{\n    m_skipArguments = 0;\n    return m_proxy->stats();\n}\n\nvoid Scriptable::collectScriptOverrides()\n{\n    m_skipArguments = 1;\n    auto globalObject = engine()->globalObject();\n\n    QVector<int> overrides;\n    if (isOverridden(globalObject, QStringLiteral(\"paste\")))\n        overrides.append(ScriptOverrides::Paste);\n    if (isOverridden(globalObject, QStringLiteral(\"onItemsAdded\")))\n        overrides.append(ScriptOverrides::OnItemsAdded);\n    if (isOverridden(globalObject, QStringLiteral(\"onItemsRemoved\")))\n        overrides.append(ScriptOverrides::OnItemsRemoved);\n    if (isOverridden(globalObject, QStringLiteral(\"onItemsChanged\")))\n        overrides.append(ScriptOverrides::OnItemsChanged);\n    if (isOverridden(globalObject, QStringLiteral(\"onTabSelected\")))\n        overrides.append(ScriptOverrides::OnTabSelected);\n    if (isOverridden(globalObject, QStringLiteral(\"onItemsLoaded\")))\n        overrides.append(ScriptOverrides::OnItemsLoaded);\n    if (isOverridden(globalObject, QStringLiteral(\"onExit\")))\n        overrides.append(ScriptOverrides::OnExit);\n\n    m_proxy->setScriptOverrides(overrides);\n}\n\nQByteArray Scriptable::serializeScriptValue(const QJSValue &value)\n{\n    return ::serializeScriptValue(value, this);\n}\n\nQJSValue Scriptable::callPlugin()\n{\n    return toScriptValue( m_proxy->callPlugin(argumentsAsVariants()), m_engine );\n}\n\nvoid Scriptable::onMonitorClipboardChanged(const QVariantMap &data)\n{\n    COPYQ_LOG(\"onClipboardChanged\");\n    m_proxy->runInternalAction(data, QStringLiteral(\"copyq onClipboardChanged\"));\n}\n\nvoid Scriptable::onMonitorSecretClipboardChanged(const QVariantMap &data)\n{\n    COPYQ_LOG(\"onSecretClipboardChanged\");\n    m_proxy->runInternalAction(data, QStringLiteral(\"copyq onSecretClipboardChanged\"));\n}\n\nvoid Scriptable::onMonitorHiddenClipboardChanged(const QVariantMap &data)\n{\n    COPYQ_LOG(\"onHiddenClipboardChanged\");\n    m_proxy->runInternalAction(data, QStringLiteral(\"copyq onHiddenClipboardChanged\"));\n}\n\nvoid Scriptable::onMonitorOwnClipboardChanged(const QVariantMap &data)\n{\n    COPYQ_LOG(\"onOwnClipboardChanged\");\n    m_proxy->runInternalAction(data, QStringLiteral(\"copyq onOwnClipboardChanged\"));\n}\n\nvoid Scriptable::onMonitorClipboardUnchanged(const QVariantMap &data)\n{\n    COPYQ_LOG(\"onOwnClipboardUnchanged\");\n    m_proxy->runInternalAction(data, \"copyq onClipboardUnchanged\");\n}\n\nvoid Scriptable::onSynchronizeSelection(ClipboardMode sourceMode, uint sourceTextHash, uint targetTextHash)\n{\n#ifdef HAS_MOUSE_SELECTIONS\n    QVariantMap data;\n    data[COPYQ_MIME_PREFIX \"source-text-hash\"] = QByteArray::number(sourceTextHash);\n    data[COPYQ_MIME_PREFIX \"target-text-hash\"] = QByteArray::number(targetTextHash);\n    const auto command = sourceMode == ClipboardMode::Clipboard\n        ? \"copyq --clipboard-access synchronizeToSelection\"\n        : \"copyq --clipboard-access synchronizeFromSelection\";\n    m_proxy->runInternalAction(data, command);\n#else\n    Q_UNUSED(sourceMode)\n    Q_UNUSED(sourceTextHash)\n    Q_UNUSED(targetTextHash)\n#endif\n}\n\nvoid Scriptable::onFetchCurrentClipboardOwner(QString *owner)\n{\n    const QJSValue result = eval(\"currentClipboardOwner()\");\n    if ( !result.isError() )\n        *owner = toString(result);\n}\n\nbool Scriptable::sourceScriptCommands()\n{\n    const auto commands = m_proxy->scriptCommands();\n    for (const auto &command : commands) {\n        const auto script = QStringLiteral(\"(function(){%1\\n;})()\").arg(command.cmd);\n        const auto label = QStringLiteral(\"source@<%1>\").arg(command.name);\n        eval(script, label);\n        if ( hasUncaughtException() ) {\n            processUncaughtException(label);\n            return false;\n        }\n    }\n\n    return true;\n}\n\nint Scriptable::executeArguments(const QStringList &args)\n{\n    if ( !sourceScriptCommands() )\n        return CommandError;\n\n    const int exitCode = executeArgumentsSimple(args);\n\n    if (exitCode == CommandFinished)\n        setActionData();\n\n    // Destroy objects so destructors are run before script finishes\n    // (e.g. file writes are flushed or temporary files are automatically removed).\n    m_engine->collectGarbage();\n\n    return exitCode;\n}\n\nint Scriptable::executeArgumentsSimple(const QStringList &args)\n{\n    /* Special arguments:\n     * \"-\"  read this argument from stdin\n     * \"--\" read all following arguments without control sequences\n     */\n    QJSValueList fnArgs;\n    bool readRaw = false;\n    for (const auto &arg : args) {\n        if (readRaw) {\n            fnArgs.append( newByteArray(arg.toUtf8()) );\n        } else if (arg == \"--\") {\n            readRaw = true;\n        } else if (arg == \"-\") {\n            fnArgs.append( input() );\n        } else if (arg == \"-e\") {\n            fnArgs.append(\"eval\");\n        } else {\n            const auto unescapedArg = parseCommandLineArgument(arg);\n            const auto value = newByteArray( unescapedArg.toUtf8() );\n            fnArgs.append(value);\n        }\n    }\n\n    QString cmd;\n    QJSValue result;\n\n    int skipArguments = 0;\n    if (!fnArgs.isEmpty() && toString(fnArgs[0]) == \"--clipboard-access\")\n        ++skipArguments;\n\n    auto globalObject = engine()->globalObject();\n    const auto evalFn = globalObject.property(\"eval\");\n\n    QString label;\n    while ( skipArguments < fnArgs.size() && canContinue() && !hasUncaughtException() ) {\n        if ( result.isCallable() ) {\n            const auto arguments = fnArgs.mid(skipArguments);\n            if ( result.strictlyEquals(evalFn) )\n                globalObject.setProperty( QStringLiteral(\"arguments\"), toScriptValue(arguments, m_engine) );\n            m_skipArguments = -1;\n            result = call( label, &result, arguments );\n            if (m_skipArguments == -1)\n                break;\n            skipArguments += m_skipArguments;\n        } else {\n            cmd = toString(fnArgs[skipArguments]);\n            label = scriptToLabel(cmd);\n            result = eval(cmd, label);\n            ++skipArguments;\n        }\n    }\n\n    if ( result.isCallable() && canContinue() && !hasUncaughtException() ) {\n        const QString label2 = QStringLiteral(\"eval(arguments[%1])()\").arg(skipArguments - 1);\n        result = call( label2, &result, fnArgs.mid(skipArguments) );\n    }\n\n    if (m_abort != Abort::None)\n        return m_abortWithSuccess ? CommandFinished : CommandStop;\n\n    if ( hasUncaughtException() ) {\n        processUncaughtException(QString());\n        return CommandException;\n    }\n\n    const auto message = serializeScriptValue(result);\n    print(message);\n    return CommandFinished;\n}\n\nvoid Scriptable::processUncaughtException(const QString &cmd)\n{\n    const auto exceptionName = m_uncaughtException.toString()\n            .remove(QRegularExpression(\"^Error: \"))\n            .trimmed();\n\n    const QString backtraceText = exceptionBacktrace(m_uncaughtException, m_uncaughtExceptionStack);\n    const auto exceptionText = QStringLiteral(\"ScriptError: %3%4\").arg(exceptionName, backtraceText);\n\n    // Show exception popups only if the script was launched from application.\n    // (avoid it if launched from command line).\n    if (m_actionId != -1) {\n        showExceptionMessage(exceptionName);\n\n        auto label = m_actionName;\n        if ( !cmd.isEmpty() )\n            label.append(\"::\" + cmd);\n\n        if (label.isEmpty())\n            label = QStringLiteral(\"Exception in command: \");\n        else\n            label = QStringLiteral(\"Exception in command \\\"%1\\\": \").arg(label);\n        m_proxy->serverLog(label + exceptionText);\n    }\n\n    printError(exceptionText.toUtf8());\n}\n\nvoid Scriptable::showExceptionMessage(const QString &message)\n{\n    if (!m_proxy)\n        return;\n\n    const auto title = m_actionName.isEmpty()\n        ? tr(\"Exception\")\n        : tr(\"Exception in %1\").arg( quoteString(m_actionName) );\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,10,0)\n    QtPrivate::QHashCombine hash(0);\n#else\n    QtPrivate::QHashCombine hash;\n#endif\n    MessageData messageData;\n    const auto id = hash(hash(0, title), message);\n    messageData.notificationId = QString::number(id);\n    messageData.message = message;\n    messageData.title = title;\n    messageData.icon = fromIconId(IconCircleExclamation);\n    messageData.timeoutMs = 8000;\n    messageData.urgency = Notification::Urgency::High;\n    m_proxy->showMessage(messageData);\n}\n\nQVector<int> Scriptable::getRows() const\n{\n    QVector<int> rows;\n\n    for ( int i = 0; i < argumentCount(); ++i ) {\n        int row;\n        if ( !toInt(argument(i), &row) )\n            break;\n        rows.append(row);\n    }\n\n    return rows;\n}\n\nQVector<QVariantMap> Scriptable::getItemArguments(int begin, int end, QString *error)\n{\n    if (begin == end) {\n        *error = QStringLiteral(\"Expected item arguments\");\n        return {};\n    }\n\n    const auto firstArg = argument(begin);\n    if (firstArg.isArray()) {\n        if (end - begin != 1) {\n            *error = QStringLiteral(\"Unexpected multiple item list arguments\");\n            return {};\n        }\n        return getItemList(0, firstArg.property(\"length\").toInt(), firstArg);\n    }\n\n    QVector<QVariantMap> items;\n    if (firstArg.toVariant().canConvert<QVariantMap>()) {\n        for (int i = begin; i < end; ++i)\n            items.append( fromScriptValue<QVariantMap>(argument(i), m_engine) );\n    } else if (end - begin == 1) {\n        QVariantMap data;\n        QJSValue value = argument(begin);\n        setTextData( &data, toString(value) );\n        items.append(data);\n    } else {\n        if ((end - begin) % 2 != 0) {\n            *error = QStringLiteral(\"Unexpected uneven number of mimeType/data arguments\");\n            return {};\n        }\n        QVariantMap data;\n        for (int i = begin; i < end; i += 2) {\n            // MIME\n            const QString mime = toString(argument(i));\n            // DATA\n            toItemData( argument(i + 1), mime, &data );\n        }\n        items.append(data);\n    }\n\n    return items;\n}\n\nQVector<QVariantMap> Scriptable::getItemList(int begin, int end, const QJSValue &arguments)\n{\n    if (end < begin)\n        return {};\n\n    QVector<QVariantMap> items;\n    items.reserve(end - begin);\n\n    for (int i = begin; i < end; ++i) {\n        const auto arg = arguments.property( static_cast<quint32>(i) );\n        if ( arg.isObject() && getByteArray(arg) == nullptr && !arg.isArray() )\n            items.append( fromScriptValue<QVariantMap>(arg, m_engine) );\n        else\n            items.append( createDataMap(mimeText, toString(arg)) );\n    }\n\n    return items;\n}\n\nQJSValue Scriptable::copy(ClipboardMode mode)\n{\n    const int args = argumentCount();\n\n    if (args == 0) {\n        // Reset clipboard first.\n        const QString mime = COPYQ_MIME_PREFIX \"invalid\";\n        const QByteArray value = \"invalid\";\n        const QVariantMap data = createDataMap(mime, value);\n        m_proxy->setClipboard(data, mode);\n\n        if ( !m_proxy->copyFromCurrentWindow() )\n            return throwError( QStringLiteral(\"Failed to copy from current window\") );\n\n        // Wait for clipboard to be set.\n        for (int i = 0; i < 10; ++i) {\n            if ( getClipboardData(mime) != value )\n                return true;\n            waitFor(5 + i * 25);\n        }\n\n        return throwError( tr(\"Failed to copy to clipboard!\") );\n    }\n\n    QString error;\n    const QVector<QVariantMap> items = getItemArguments(0, args, &error);\n    if ( !error.isEmpty() )\n        return throwError(error);\n\n    if (items.size() != 1)\n        return throwError(QStringLiteral(\"Expected single item\"));\n\n    m_proxy->setClipboard(items[0], mode);\n    return true;\n}\n\nvoid Scriptable::abortEvaluation(Abort abort)\n{\n    if (m_abort >= abort)\n        return;\n\n    m_abort = abort;\n    m_engine->setInterrupted(true);\n    m_proxy->abortEvaluation();\n\n    emit finished();\n\n    // This effectively stops all QEventLoop.\n    // In some cases connecting the Scriptable::finished signal to\n    // QEventLoop::quit does not work well.\n    if (abort == Abort::AllEvaluations)\n        QCoreApplication::exit(m_abortWithSuccess ? CommandFinished : CommandStop);\n}\n\nQJSValue Scriptable::changeItem(bool create)\n{\n    int row;\n    int args = argumentCount();\n    int i;\n\n    // [ROW]\n    if ( toInt(argument(0), &row) ) {\n        i = 1;\n    } else {\n        row = 0;\n        i = 0;\n    }\n\n    QString error;\n    const VariantMapList items{getItemArguments(i, args, &error)};\n    if ( !error.isEmpty() )\n        return throwError(error);\n\n    if (create) {\n        error = m_proxy->browserInsert(m_tabName, row, items);\n        if ( !error.isEmpty() )\n            return throwError(error);\n    } else {\n        error = m_proxy->browserChange(m_tabName, row, items);\n        if ( !error.isEmpty() )\n            return throwError(error);\n    }\n    return QJSValue();\n}\n\nvoid Scriptable::nextToClipboard(int where)\n{\n    QVariantMap data = m_proxy->nextItem(m_tabName, where);\n    if (data.isEmpty())\n        return;\n\n    m_proxy->setClipboard(data, ClipboardMode::Clipboard);\n#ifdef HAS_MOUSE_SELECTIONS\n    m_proxy->setClipboard(data, ClipboardMode::Selection);\n#endif\n}\n\nvoid Scriptable::editContent(\n        int editRow, const QString &format, const QByteArray &content, bool changeClipboard)\n{\n    if ( m_proxy->browserOpenEditor(m_tabName, editRow, format, content, changeClipboard) )\n        return;\n\n    m_proxy->showBrowser(m_tabName);\n    if (editRow >= 0) {\n        m_proxy->browserSetCurrent(m_tabName, editRow);\n        m_proxy->browserEditRow(m_tabName, editRow, format);\n    } else {\n        m_proxy->browserEditNew(m_tabName, format, content, changeClipboard);\n    }\n}\n\nQJSValue Scriptable::screenshot(bool select)\n{\n    m_skipArguments = 2;\n\n    const auto format = arg(0, \"png\");\n    const auto screen = arg(1);\n    const auto imageData = m_proxy->screenshot(format, screen, select);\n\n    if ( imageData.isEmpty() ) {\n        QString error = \"Failed to grab screenshot\";\n        if ( !screen.isEmpty() ) {\n            const auto screenNames = m_proxy->screenNames();\n            error.append( \" (valid screen names are \" + screenNames.join(\", \") + \")\" );\n        }\n        throwError(error);\n        return QJSValue();\n    }\n\n    return newByteArray(imageData);\n}\n\nQJSValue Scriptable::eval(const QString &script, const QString &label)\n{\n    m_stack.prepend(QStringLiteral(\"eval:\") + label);\n    COPYQ_LOG_VERBOSE( QStringLiteral(\"Stack push: %1\").arg(m_stack.join('|')) );\n    const auto result = m_safeEval.call({QJSValue(script)});\n    m_stack.pop_front();\n    COPYQ_LOG_VERBOSE( QStringLiteral(\"Stack pop: %1\").arg(m_stack.join('|')) );\n    return result;\n}\n\nvoid Scriptable::setActionId(int actionId)\n{\n    m_actionId = actionId;\n    getActionData();\n}\n\nvoid Scriptable::setActionName(const QString &actionName)\n{\n    m_actionName = actionName;\n}\n\nQJSValue Scriptable::eval(const QString &script)\n{\n    return eval(script, scriptToLabel(script));\n}\n\nbool Scriptable::runAction(Action *action)\n{\n    if (!canContinue())\n        return false;\n\n    // Shortcut to run script in current Scriptable\n    // instead of spawning new process.\n    const auto &cmd = action->command();\n    const auto cmd1 = cmd.value(0).value(0);\n    if ( cmd.size() == 1 && cmd[0].size() == 1\n         && cmd1.size() >= 2\n         && cmd1[0] == \"copyq\"\n         && (!cmd1[1].startsWith(\"-\") || cmd1[1] == \"-e\") )\n    {\n        const auto oldInput = m_input;\n        m_input = newByteArray(action->input());\n\n        const auto oldAction = m_action;\n        m_action = action;\n\n        const auto exitCode = executeArgumentsSimple(cmd1.mid(1));\n        action->setExitCode(exitCode);\n        clearExceptions();\n\n        m_action = oldAction;\n        m_input = oldInput;\n\n        return true;\n    }\n\n    // Update data for the new action.\n    setActionData();\n\n    action->setWorkingDirectory( getCurrentPath() );\n\n    QEventLoop loop;\n    connect(action, &Action::actionFinished, &loop, &QEventLoop::quit);\n    connect(this, &Scriptable::finished, &loop, &QEventLoop::quit);\n    action->start();\n    loop.exec();\n\n    if ( !action->waitForFinished() ) {\n        action->terminate();\n        return false;\n    }\n\n    // Data could have changed so refetch them.\n    getActionData();\n\n    return true;\n}\n\nbool Scriptable::runCommands(CommandType::CommandType type)\n{\n    Q_ASSERT(type == CommandType::Automatic || type == CommandType::Display);\n\n    const auto label = type == CommandType::Automatic\n            ? \"Automatic command \\\"%1\\\": %2\"\n            : \"Display command \\\"%1\\\": %2\";\n\n    auto commands = type == CommandType::Automatic\n            ? m_proxy->automaticCommands()\n            : m_proxy->displayCommands();\n    const QString tabName = getTextData(m_data, mimeCurrentTab);\n\n    for (auto &command : commands) {\n        PerformanceLogger logger( QStringLiteral(\"Command \\\"%1\\\"\").arg(command.name) );\n\n        if ( command.outputTab.isEmpty() )\n            command.outputTab = tabName;\n\n        QStringList arguments;\n        if ( !canExecuteCommand(command, &arguments) )\n            continue;\n\n        if ( canContinue() && !command.cmd.isEmpty() ) {\n            Action action;\n            action.setCommand(command.cmd, arguments);\n            action.setInputWithFormat(m_data, command.input);\n            action.setName(command.name);\n            action.setData(m_data);\n\n            // FIXME: Handle automatic and display command output.\n            //action.setOutputFormat(command.output);\n            //action.setItemSeparator(QRegularExpression(command.sep));\n            //action.setOutputTab(command.outputTab);\n\n            if ( !runAction(&action) && canContinue() ) {\n                throwError( QString(label).arg(command.name, \"Failed to start\") );\n                return false;\n            }\n        }\n\n        if (!canContinue()) {\n            COPYQ_LOG( QString(label).arg(command.name, \"Interrupted\") );\n            return false;\n        }\n\n        if ( type == CommandType::Automatic ) {\n            if ( !command.tab.isEmpty() ) {\n                COPYQ_LOG( QString(label).arg(command.name, \"Saving to tab: \" + command.tab) );\n                saveData(command.tab);\n            }\n\n            if ( command.remove || command.transform || m_data.contains(mimeIgnore) ) {\n                COPYQ_LOG( QString(label).arg(command.name, \"Ignoring data\") );\n                return false;\n            }\n        }\n\n        COPYQ_LOG_VERBOSE( QString(label).arg(command.name, \"Finished\") );\n    }\n\n    return true;\n}\n\nbool Scriptable::canExecuteCommand(const Command &command, QStringList *arguments)\n{\n    // Verify that data for given MIME is available.\n    if ( !command.input.isEmpty() ) {\n        if (command.input == mimeItems || command.input == \"!OUTPUT\") {\n            // Disallow applying action that takes serialized item more times.\n            if ( m_data.contains(command.output) )\n                return false;\n        } else if ( !m_data.contains(command.input) ) {\n            return false;\n        }\n    }\n\n    const QString text = getTextData(m_data);\n    arguments->append(text);\n\n    // Verify that and text matches given regexp.\n    if ( !command.re.pattern().isEmpty() ) {\n        QRegularExpressionMatchIterator it = command.re.globalMatch(text);\n        if ( !it.isValid() || !it.hasNext() )\n            return false;\n\n        while (it.hasNext())\n            arguments->append( it.next().capturedTexts().mid(1) );\n    }\n\n    // Verify that window title matches given regexp.\n    if ( !command.wndre.pattern().isEmpty() && !getTextData(m_data, mimeWindowTitle).contains(command.wndre) )\n        return false;\n\n    return canExecuteCommandFilter(command.matchCmd);\n}\n\nbool Scriptable::canExecuteCommandFilter(const QString &matchCommand)\n{\n    if ( matchCommand.isEmpty() )\n        return true;\n\n    Action action;\n\n    const QString text = getTextData(m_data);\n    action.setInput(text.toUtf8());\n    action.setData(m_data);\n\n    const QString arg = getTextData(action.input());\n    action.setCommand(matchCommand, QStringList(arg));\n\n    return runAction(&action) && action.exitCode() == 0;\n}\n\nbool Scriptable::verifyClipboardAccess()\n{\n    if ( isGuiApplication() )\n        return true;\n\n    throwError(\"Cannot access system clipboard with QCoreApplication\");\n    return false;\n}\n\nvoid Scriptable::provideClipboard(ClipboardMode mode)\n{\n    if (!verifyClipboardAccess())\n        return;\n\n    const auto owner = makeClipboardOwnerData();\n    m_data.insert(mimeOwner, owner);\n\n    const auto type = mode == ClipboardMode::Clipboard ? \"clipboard\" : \"selection\";\n    ClipboardSpy spy(mode, owner);\n    connect( this, &Scriptable::finished, &spy, &ClipboardSpy::stop );\n\n    if ( !spy.setClipboardData(m_data) ) {\n        if (m_abort != Abort::None)\n            return;\n\n        log( QStringLiteral(\"Failed to provide %1\").arg(type), LogWarning );\n        return;\n    }\n\n    if (m_abort != Abort::None)\n        return;\n\n    // Register this action as the clipboard provider for the given mode.\n    // The server sends CommandStop to the previous provider and waits for it to\n    // exit. Returns false if another provider registered during the call\n    // (re-entrancy in the nested event loop), meaning this provider is stale.\n    if ( !m_proxy->registerClipboardProviderAction(m_actionId, mode) ) {\n        COPYQ_LOG( QStringLiteral(\"Not providing %1: another provider registered\").arg(type) );\n        return;\n    }\n\n    if (m_abort != Abort::None)\n        return;\n\n    COPYQ_LOG( QStringLiteral(\"Started providing %1\").arg(type) );\n    spy.wait(-1, 8000);\n    COPYQ_LOG( QStringLiteral(\"Finished providing %1\").arg(type) );\n}\n\nvoid Scriptable::insert(int argumentsEnd)\n{\n    int row;\n    if ( !toInt(argument(0), &row) ) {\n        throwError(argumentError());\n        return;\n    }\n\n    insert(row, 1, argumentsEnd);\n}\n\nvoid Scriptable::insert(int row, int argumentsBegin, int argumentsEnd)\n{\n    m_skipArguments = argumentsEnd;\n\n    const VariantMapList items{getItemList(argumentsBegin, argumentsEnd, argumentsArray())};\n    if ( const auto error = m_proxy->browserInsert(m_tabName, row, items); !error.isEmpty() )\n        throwError(error);\n}\n\nQStringList Scriptable::arguments()\n{\n    QStringList args;\n    args.reserve( argumentCount() );\n\n    for (int i = 0; i < argumentCount(); ++i)\n        args.append( arg(i) );\n\n    return args;\n}\n\nQVariantList Scriptable::argumentsAsVariants()\n{\n    QVariantList args;\n    args.reserve( argumentCount() );\n\n    for (int i = 0; i < argumentCount(); ++i)\n        args.append( toVariant(argument(i)) );\n\n    return args;\n}\n\nvoid Scriptable::print(const QByteArray &message)\n{\n    if (m_action) {\n        m_action->appendOutput(message);\n    } else {\n        QFile f;\n        if ( f.open(stdout, QIODevice::WriteOnly) )\n            f.write(message);\n    }\n}\n\nvoid Scriptable::printError(const QByteArray &message)\n{\n    if (m_action) {\n        m_action->appendErrorOutput(message);\n    } else {\n        QFile f;\n        if ( f.open(stderr, QIODevice::WriteOnly) ) {\n            f.write(message);\n            if ( !message.endsWith('\\n') )\n                f.write(\"\\n\");\n        }\n    }\n}\n\nvoid Scriptable::getActionData()\n{\n    getActionData(m_actionId);\n}\n\nvoid Scriptable::getActionData(int actionId)\n{\n    if (actionId != -1)\n        m_data = m_oldData = m_proxy->getActionData(actionId);\n}\n\nvoid Scriptable::setActionData()\n{\n    if (m_actionId != -1 && m_oldData != m_data) {\n        m_proxy->setActionData(m_actionId, m_data);\n        m_oldData = m_data;\n    }\n}\n\nQByteArray Scriptable::getClipboardData(const QString &mime, ClipboardMode mode)\n{\n    return m_proxy->getClipboardData(mime, mode);\n}\n\nbool Scriptable::hasClipboardFormat(const QString &mime, ClipboardMode mode)\n{\n    return m_proxy->hasClipboardFormat(mime, mode);\n}\n\nbool Scriptable::canSynchronizeSelection(ClipboardMode targetMode)\n{\n#ifdef HAS_MOUSE_SELECTIONS\n    if (!verifyClipboardAccess())\n        return false;\n\n    // Make sure a clipboard instance is created so as to monitor any changes;\n    clipboardInstance();\n\n    SleepTimer tMin(50);\n\n    // Avoid changing clipboard after a text is selected just before it's copied\n    // with a keyboard shortcut.\n    SleepTimer t(5000);\n    const auto waitForReleased = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier;\n    while ( QGuiApplication::queryKeyboardModifiers() & waitForReleased ) {\n        if ( !t.sleep() || !canContinue() ) {\n            COPYQ_LOG(\"Sync: Cancelled - keyboard modifiers still being held\");\n            return false;\n        }\n    }\n\n    const auto sourceMode = targetMode == ClipboardMode::Selection ? ClipboardMode::Clipboard : ClipboardMode::Selection;\n\n    // Wait at least few milliseconds before synchronization\n    // to avoid overriding just changed clipboard/selection.\n    while ( tMin.sleep() ) {}\n\n    // Stop if the clipboard/selection text already changed again.\n    const QVariantMap sourceData = clipboardInstance()->data(\n        sourceMode, {mimeTextUtf8, mimeText, mimeUriList});\n    QByteArray source;\n    if (!sourceData.isEmpty()) {\n        source = sourceData.value(mimeText).toByteArray();\n        const QString owner = sourceData.value(mimeOwner).toString();\n        if ( owner.isEmpty() && !source.isEmpty() ) {\n            const auto sourceTextHash = m_data.value(COPYQ_MIME_PREFIX \"source-text-hash\").toByteArray().toUInt();\n            const uint newSourceTextHash = qHash(source);\n            if (sourceTextHash != newSourceTextHash) {\n                COPYQ_LOG(\"Sync: Cancelled - source text changed\");\n                return false;\n            }\n        }\n    } else {\n        COPYQ_LOG(\"Sync: Failed to fetch source data\");\n    }\n\n    const QVariantMap targetData = clipboardInstance()->data(\n        targetMode, {mimeText});\n    if (!targetData.isEmpty()) {\n        const QByteArray target = targetData.value(mimeText).toByteArray();\n        const QString owner = targetData.value(mimeOwner).toString();\n        if ( owner.isEmpty() && !target.isEmpty() ) {\n            const auto targetTextHash = m_data.value(COPYQ_MIME_PREFIX \"target-text-hash\").toByteArray().toUInt();\n            const uint newTargetTextHash = qHash(target);\n            if (targetTextHash != newTargetTextHash) {\n                COPYQ_LOG(\"Sync: Cancelled - target text changed\");\n                return false;\n            }\n        }\n\n        // Stop if the clipboard and selection text is already synchronized\n        // or user selected text and copied it to clipboard.\n        if (!sourceData.isEmpty() && source == target) {\n            COPYQ_LOG(\"Sync: Cancelled - target text is already same as source\");\n            return false;\n        }\n    } else {\n        COPYQ_LOG(\"Sync: Failed to fetch target data\");\n    }\n\n    if (m_abort != Abort::None) {\n        COPYQ_LOG(\"Sync: Aborting\");\n        return false;\n    }\n\n    m_data = sourceData;\n    return true;\n#else\n    Q_UNUSED(targetMode)\n    return false;\n#endif\n}\n\nvoid Scriptable::saveData(const QString &tab)\n{\n    const auto data = copyWithoutInternalData(m_data);\n    const auto clipboardMode = isClipboardData(m_data)\n            ? ClipboardMode::Clipboard\n            : ClipboardMode::Selection;\n    m_proxy->saveData(tab, data, clipboardMode);\n}\n\nQJSValue Scriptable::readInput()\n{\n    // Try to read stdin in a non-blocking way.\n    class InputReaderThread final : public QThread {\n    public:\n        QByteArray input;\n\n    protected:\n        void run() override {\n            QFile in;\n            if ( in.open(stdin, QIODevice::ReadOnly) )\n                input = in.readAll();\n        }\n    };\n\n    auto inputReaderThread = new InputReaderThread;\n    QEventLoop loop;\n    connect(inputReaderThread, &QThread::finished, &loop, &QEventLoop::quit);\n    connect(this, &Scriptable::finished, &loop, &QEventLoop::quit);\n    inputReaderThread->start();\n    loop.exec();\n\n    if ( inputReaderThread->isRunning() ) {\n        inputReaderThread->terminate();\n        COPYQ_LOG(\"Terminating input reader\");\n        if ( !inputReaderThread->wait(4000) )\n            COPYQ_LOG(\"Failed to terminate input reader\");\n        return QJSValue();\n    }\n\n    inputReaderThread->deleteLater();\n    COPYQ_LOG_VERBOSE(\n        QStringLiteral(\"Read Input %1 bytes\")\n        .arg(inputReaderThread->input.length()));\n    return newByteArray(inputReaderThread->input);\n}\n\nPlatformClipboard *Scriptable::clipboardInstance()\n{\n    if (m_clipboard == nullptr)\n        m_clipboard = platformNativeInterface()->clipboard();\n    return m_clipboard.get();\n}\n\nvoid Scriptable::interruptibleSleep(int msec)\n{\n    if ( !canContinue() )\n        return;\n\n    QEventLoop loop;\n    connect(this, &Scriptable::finished, &loop, &QEventLoop::quit);\n\n    QTimer t;\n    t.setTimerType(Qt::PreciseTimer);\n    t.setInterval(msec);\n    connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);\n    t.start();\n\n    loop.exec();\n}\n\nQJSValue Scriptable::newQObject(QObject *obj, const QJSValue &prototype) const\n{\n    auto value = m_engine->newQObject(obj);\n    value.setPrototype(prototype);\n    return value;\n}\n\nvoid Scriptable::installObject(QObject *fromObj, const QMetaObject *metaObject, QJSValue &toObject)\n{\n    const auto from = m_engine->newQObject(fromObj);\n\n    for (int i = 0; i < metaObject->methodCount(); ++i) {\n        const QMetaMethod slot = metaObject->method(i);\n        if ( slot.methodType() != QMetaMethod::Slot )\n            continue;\n\n        if ( slot.access() != QMetaMethod::Public )\n            continue;\n\n        if ( slot.parameterCount() != 0 )\n            continue;\n\n        const QLatin1String name( slot.name() );\n        const bool hasByteArrayReturnType = slot.returnType() == QMetaType::QByteArray;\n\n        // Allow passing variable number of arguments to scriptable methods\n        // and handle exceptions.\n        const auto v = hasByteArrayReturnType\n            ? m_createFnB.call({from, name})\n            : m_createFn.call({from, name});\n        if ( v.isError() ) {\n            log( QStringLiteral(\"Exception while wrapping %1.%2: %3\").arg(fromObj->objectName(), name, v.toString()), LogError );\n            Q_ASSERT(false);\n        } else {\n            toObject.setProperty(name, v);\n        }\n    }\n\n    for (int i = 0; i < metaObject->propertyCount(); ++i) {\n        const QMetaProperty prop = metaObject->property(i);\n        const QLatin1String name( prop.name() );\n        const auto v = m_createProperty.call({toObject, name, from});\n        if ( v.isError() ) {\n            log( QStringLiteral(\"Exception while adding property %1.%2: %3\").arg(fromObj->objectName(), name, v.toString()), LogError );\n            Q_ASSERT(false);\n        }\n    }\n}\n\nScriptablePlugins::ScriptablePlugins(Scriptable *scriptable, ItemFactory *factory)\n    : QObject(scriptable)\n    , m_scriptable(scriptable)\n    , m_factory(factory)\n{\n}\n\nQJSValue ScriptablePlugins::load(const QString &name)\n{\n    const auto it = m_plugins.find(name);\n    if (it != std::end(m_plugins))\n        return it.value();\n\n    auto obj = m_factory->scriptableObject(name);\n    if (!obj) {\n        m_scriptable->throwError(\n            QStringLiteral(\"Plugin \\\"%1\\\" is not installed\").arg(name) );\n        return QJSValue();\n    }\n\n    auto plugin = m_scriptable->engine()->newObject();\n    m_plugins.insert(name, plugin);\n    m_scriptable->installObject(obj, obj->metaObject(), plugin);\n    obj->setScriptable(m_scriptable);\n    obj->start();\n\n    return plugin;\n}\n"
  },
  {
    "path": "src/scriptable/scriptable.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n#include \"common/command.h\"\n#include \"common/mimetypes.h\"\n\n#include <QObject>\n#include <QString>\n#include <QJSValue>\n#include <QVariantMap>\n#include <QVector>\n\n#include \"platform/platformnativeinterface.h\"\n\nclass Action;\nclass ScriptableByteArray;\nclass ClipboardBrowser;\nclass ItemFactory;\nclass ScriptableProxy;\n\nclass QFile;\nclass QMimeData;\nclass QJSEngine;\n\nenum class ClipboardOwnership;\n\nclass Scriptable final : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QJSValue inputSeparator READ getInputSeparator WRITE setInputSeparator)\n    Q_PROPERTY(QJSValue mimeText READ getMimeText CONSTANT)\n    Q_PROPERTY(QJSValue mimeTextUtf8 READ getMimeTextUtf8 CONSTANT)\n    Q_PROPERTY(QJSValue mimeHtml READ getMimeHtml CONSTANT)\n    Q_PROPERTY(QJSValue mimeUriList READ getMimeUriList CONSTANT)\n    Q_PROPERTY(QJSValue mimeWindowTitle READ getMimeWindowTitle CONSTANT)\n    Q_PROPERTY(QJSValue mimeItems READ getMimeItems CONSTANT)\n    Q_PROPERTY(QJSValue mimeItemNotes READ getMimeItemNotes CONSTANT)\n    Q_PROPERTY(QJSValue mimeIcon READ getMimeIcon CONSTANT)\n    Q_PROPERTY(QJSValue mimeOwner READ getMimeOwner CONSTANT)\n    Q_PROPERTY(QJSValue mimeClipboardMode READ getMimeClipboardMode CONSTANT)\n    Q_PROPERTY(QJSValue mimeCurrentTab READ getMimeCurrentTab CONSTANT)\n    Q_PROPERTY(QJSValue mimeSelectedItems READ getMimeSelectedItems CONSTANT)\n    Q_PROPERTY(QJSValue mimeCurrentItem READ getMimeCurrentItem CONSTANT)\n    Q_PROPERTY(QJSValue mimeHidden READ getMimeHidden CONSTANT)\n    Q_PROPERTY(QJSValue mimeShortcut READ getMimeShortcut CONSTANT)\n    Q_PROPERTY(QJSValue mimeColor READ getMimeColor CONSTANT)\n    Q_PROPERTY(QJSValue mimeOutputTab READ getMimeOutputTab CONSTANT)\n    Q_PROPERTY(QJSValue mimeDisplayItemInMenu READ getMimeDisplayItemInMenu CONSTANT)\n    Q_PROPERTY(QJSValue mimeSecret READ getMimeSecret CONSTANT)\n\n    Q_PROPERTY(QJSValue plugins READ getPlugins CONSTANT)\n\n    Q_PROPERTY(QJSValue _copyqUncaughtException READ uncaughtException WRITE setUncaughtException)\n    Q_PROPERTY(QJSValue _copyqHasUncaughtException READ hasUncaughtException)\n\npublic:\n    Scriptable(\n            QJSEngine *engine,\n            ScriptableProxy *proxy,\n            ItemFactory *factory = nullptr,\n            QObject *parent = nullptr);\n\n    enum class Abort {\n        None,\n        CurrentEvaluation,\n        AllEvaluations,\n    };\n\n    QJSValue argumentsArray() const;\n    int argumentCount() const;\n    QJSValue argument(int index) const;\n\n    QJSValue newByteArray(const QByteArray &bytes) const;\n    QJSValue newByteArray(ScriptableByteArray *ba) const;\n\n    QByteArray fromString(const QString &value) const;\n    QVariant toVariant(const QJSValue &value);\n    bool toInt(const QJSValue &value, int *number) const;\n    QVariantMap toDataMap(const QJSValue &value) const;\n    QJSValue fromDataMap(const QVariantMap &dataMap) const;\n\n    QByteArray makeByteArray(const QJSValue &value) const;\n\n    /**\n     * Set data for item converted from @a value.\n     * Return true if data was successfully converted and set.\n     *\n     * If mime starts with \"text/\" or isn't byte array the value is re-encoded\n     * from local encoding to UTF8.\n     */\n    bool toItemData(const QJSValue &value, const QString &mime, QVariantMap *data) const;\n\n    QJSValue getInputSeparator() const;\n    void setInputSeparator(const QJSValue &separator);\n\n    QString getCurrentPath() const;\n    void setCurrentPath(const QString &path);\n\n    QString getAbsoluteFilePath(const QString &fileName) const;\n\n    QString arg(int i, const QString &defaultValue = QString());\n\n    QJSValue throwError(const QString &errorMessage);\n    QJSValue throwExportError(const QString &filePath);\n    QJSValue throwImportError(const QString &filePath);\n\n    bool hasUncaughtException() const;\n    void clearExceptions();\n    QJSValue uncaughtException() const { return m_uncaughtException; }\n    void setUncaughtException(const QJSValue &exc);\n\n    QJSEngine *engine() const { return m_engine; }\n\n    bool canContinue() const { return m_abort == Abort::None; }\n\n    void installObject(QObject *fromObj, const QMetaObject *metaObject, QJSValue &toObject);\n\n    QJSValue getMimeText() const { return mimeText; }\n    QJSValue getMimeTextUtf8() const { return mimeTextUtf8; }\n    QJSValue getMimeHtml() const { return mimeHtml; }\n    QJSValue getMimeUriList() const { return mimeUriList; }\n    QJSValue getMimeWindowTitle() const { return mimeWindowTitle; }\n    QJSValue getMimeItems() const { return mimeItems; }\n    QJSValue getMimeItemNotes() const { return mimeItemNotes; }\n    QJSValue getMimeIcon() const { return mimeIcon; }\n    QJSValue getMimeOwner() const { return mimeOwner; }\n    QJSValue getMimeClipboardMode() const { return mimeClipboardMode; }\n    QJSValue getMimeCurrentTab() const { return mimeCurrentTab; }\n    QJSValue getMimeSelectedItems() const { return mimeSelectedItems; }\n    QJSValue getMimeCurrentItem() const { return mimeCurrentItem; }\n    QJSValue getMimeHidden() const { return mimeHidden; }\n    QJSValue getMimeShortcut() const { return mimeShortcut; }\n    QJSValue getMimeColor() const { return mimeColor; }\n    QJSValue getMimeOutputTab() const { return mimeOutputTab; }\n    QJSValue getMimeDisplayItemInMenu() const { return mimeDisplayItemInMenu; }\n    QJSValue getMimeSecret() const { return mimeSecret; }\n\n    QJSValue getPlugins();\n\n    QJSValue eval(const QString &script, const QString &label);\n\n    QJSValue call(const QString &label, QJSValue *fn, const QVariantList &arguments);\n    QJSValue call(const QString &label, QJSValue *fn, const QJSValueList &arguments = QJSValueList());\n\n    void setActionId(int actionId);\n    void setActionName(const QString &actionName);\n    int executeArguments(const QStringList &args);\n    int executeArgumentsSimple(const QStringList &args);\n\n    void abortEvaluation(Abort abort = Abort::AllEvaluations);\n\npublic slots:\n    QJSValue ByteArray() const;\n    QJSValue File() const;\n    QJSValue TemporaryFile() const;\n    QJSValue Dir() const;\n    QJSValue ItemSelection() const;\n    QJSValue Settings() const;\n    QJSValue NetworkRequest() const;\n    QJSValue NetworkReply() const;\n\n    QJSValue version();\n    QJSValue help();\n\n    void show();\n    void showAt();\n    void hide();\n    QJSValue toggle();\n    QJSValue menu();\n    void exit();\n    void disable();\n    void enable();\n    QJSValue monitoring();\n    QJSValue visible();\n    QJSValue focused();\n\n    QJSValue focusPrevious();\n\n    QJSValue preview();\n\n    QJSValue filter();\n\n    void ignore();\n\n    QJSValue clipboard();\n    QJSValue selection();\n    QJSValue hasClipboardFormat();\n    QJSValue hasSelectionFormat();\n    QJSValue isClipboard();\n    QJSValue copy();\n    QJSValue copySelection();\n    QJSValue paste();\n\n    QJSValue tab();\n    QJSValue removeTab();\n    QJSValue removetab() { return removeTab(); }\n    QJSValue renameTab();\n    QJSValue renametab() { return renameTab(); }\n    QJSValue tabIcon();\n    QJSValue tabicon() { return tabIcon(); }\n    QJSValue unload();\n    void forceUnload();\n\n    QJSValue length();\n    QJSValue size() { return length(); }\n    QJSValue count() { return length(); }\n\n    QJSValue select();\n    void next();\n    void previous();\n    void add();\n    void insert();\n    QJSValue remove();\n    void edit();\n    QJSValue editItem();\n    QJSValue move();\n\n    QJSValue read();\n    QJSValue write();\n    QJSValue change();\n    void separator();\n\n    void action();\n    void popup();\n    QJSValue notification();\n    QJSValue playSound();\n\n    QJSValue exportTab();\n    void exporttab() { exportTab(); }\n    QJSValue importTab();\n    void importtab() { importTab(); }\n\n    QJSValue importData();\n    QJSValue exportData();\n\n    QJSValue config();\n    QJSValue toggleConfig();\n\n    QJSValue info();\n\n    QJSValue eval();\n\n    QJSValue source();\n\n    QJSValue currentPath();\n    QJSValue currentpath() { return currentPath(); }\n\n    QJSValue str();\n    QJSValue input();\n    QJSValue toUnicode();\n    QJSValue fromUnicode();\n\n    QJSValue dataFormats();\n    QJSValue data();\n    QJSValue setData();\n    QJSValue removeData();\n    void print();\n    void abort();\n    void fail();\n\n    QJSValue testSelected();\n    void serverLog();\n    QJSValue logs();\n\n    void setCurrentTab();\n\n    QJSValue selectItems();\n    QJSValue selectitems() { return selectItems(); }\n\n    QJSValue selectedTab();\n    QJSValue selectedtab() { return selectedTab(); }\n    QJSValue selectedItems();\n    QJSValue selecteditems() { return selectedItems(); }\n    QJSValue currentItem();\n    QJSValue currentitem() { return currentItem(); }\n    QJSValue index() { return currentItem(); }\n\n    QJSValue selectedItemData();\n    QJSValue setSelectedItemData();\n    QJSValue selectedItemsData();\n    void setSelectedItemsData();\n\n    QJSValue escapeHtml();\n    QJSValue escapeHTML() { return escapeHtml(); }\n\n    QJSValue unpack();\n    QJSValue pack();\n\n    QJSValue getItem();\n    QJSValue getitem() { return getItem(); }\n    void setItem();\n    void setitem() { setItem(); }\n\n    QJSValue toBase64();\n    QJSValue tobase64() { return toBase64(); }\n    QJSValue fromBase64();\n    QJSValue frombase64() { return fromBase64(); }\n\n    QJSValue md5sum();\n    QJSValue sha1sum();\n    QJSValue sha256sum();\n    QJSValue sha512sum();\n\n    QJSValue open();\n    QJSValue execute();\n\n    QJSValue currentWindowTitle();\n    QJSValue currentClipboardOwner();\n\n    QJSValue dialog();\n\n    QJSValue menuItems();\n\n    QJSValue settings();\n\n    QJSValue dateString();\n\n    QJSValue commands();\n    void setCommands();\n    void addCommands();\n    QJSValue importCommands();\n    QJSValue exportCommands();\n\n    QJSValue networkGet();\n    QJSValue networkPost();\n    QJSValue networkGetAsync();\n    QJSValue networkPostAsync();\n\n    QJSValue env();\n    QJSValue setEnv();\n\n    QJSValue sleep();\n    QJSValue afterMilliseconds();\n\n    // Call scriptable method.\n    QVariant call(const QString &method, const QVariantList &arguments);\n    QVariantList currentArguments();\n    void throwException(const QString &errorMessage);\n\n    QJSValue screenshot();\n    QJSValue screenshotSelect();\n    QJSValue screenNames();\n\n    QJSValue queryKeyboardModifiers();\n    QJSValue pointerPosition();\n    QJSValue setPointerPosition();\n\n    QJSValue iconColor();\n\n    QJSValue iconTag();\n\n    QJSValue iconTagColor();\n\n    QJSValue loadTheme();\n\n    void onClipboardChanged();\n    void onOwnClipboardChanged();\n    void onHiddenClipboardChanged();\n    void onClipboardUnchanged();\n    void onSecretClipboardChanged();\n\n    void onStart() {}\n    void onExit() {}\n\n    void synchronizeToSelection();\n    void synchronizeFromSelection();\n\n    void setClipboardData();\n    void updateTitle();\n    void setTitle();\n    void saveData();\n    QJSValue hasData();\n    void showDataNotification();\n    void hideDataNotification();\n    void updateClipboardData();\n    void clearClipboardData();\n    QJSValue runAutomaticCommands();\n\n    void runDisplayCommands();\n\n    void runMenuCommandFilters();\n\n    void monitorClipboard();\n    void provideClipboard();\n    void provideSelection();\n    QJSValue isClipboardMonitorRunning();\n\n    QJSValue clipboardFormatsToSave();\n\n    QJSValue styles();\n\n    QJSValue stats();\n\n    void onItemsAdded() {}\n    void onItemsRemoved() {}\n    void onItemsChanged() {}\n    void onTabSelected() {}\n    void onItemsLoaded() {}\n    void collectScriptOverrides();\n\n    QByteArray serializeScriptValue(const QJSValue &value);\n\n    QJSValue callPlugin();\n\nsignals:\n    void finished();\n    void dataReceived(const QByteArray &data);\n    void receiveData();\n\nprivate:\n    void onMonitorClipboardChanged(const QVariantMap &data);\n    void onMonitorSecretClipboardChanged(const QVariantMap &data);\n    void onMonitorHiddenClipboardChanged(const QVariantMap &data);\n    void onMonitorOwnClipboardChanged(const QVariantMap &data);\n    void onMonitorClipboardUnchanged(const QVariantMap &data);\n    void onSynchronizeSelection(ClipboardMode sourceMode, uint sourceTextHash, uint targetTextHash);\n    void onFetchCurrentClipboardOwner(QString *title);\n\n    bool sourceScriptCommands();\n    void callDisplayFunctions(QJSValueList displayFunctions);\n    void processUncaughtException(const QString &cmd);\n    void showExceptionMessage(const QString &message);\n    QVector<int> getRows() const;\n\n    /**\n     * Parses arguments as one of these or raises an argument error:\n     * - item...\n     * - mimeType, data, [mimeType, data]...\n     * - list of items\n     * - text\n     */\n    QVector<QVariantMap> getItemArguments(int begin, int end, QString *error);\n    QVector<QVariantMap> getItemList(int begin, int end, const QJSValue &arguments);\n\n    QJSValue copy(ClipboardMode mode);\n    QJSValue changeItem(bool create);\n    void nextToClipboard(int where);\n    void editContent(int editRow, const QString &format, const QByteArray &content, bool changeClipboard);\n    QJSValue screenshot(bool select);\n    QByteArray serialize(const QJSValue &value);\n    QJSValue eval(const QString &script);\n    bool runAction(Action *action);\n    bool runCommands(CommandType::CommandType type);\n    bool canExecuteCommand(const Command &command, QStringList *arguments);\n    bool canExecuteCommandFilter(const QString &matchCommand);\n    bool verifyClipboardAccess();\n    void provideClipboard(ClipboardMode mode);\n\n    void insert(int argumentsEnd);\n    void insert(int row, int argumentsBegin, int argumentsEnd);\n\n    QStringList arguments();\n    QVariantList argumentsAsVariants();\n\n    void print(const QByteArray &message);\n    void printError(const QByteArray &message);\n\n    void getActionData();\n    void getActionData(int actionId);\n    void setActionData();\n\n    QByteArray getClipboardData(const QString &mime = QString(), ClipboardMode mode = ClipboardMode::Clipboard);\n    bool hasClipboardFormat(const QString &mime, ClipboardMode mode = ClipboardMode::Clipboard);\n\n    bool canSynchronizeSelection(ClipboardMode targetMode);\n\n    void saveData(const QString &tab);\n\n    QJSValue readInput();\n\n    PlatformClipboard *clipboardInstance();\n\n    void interruptibleSleep(int msec);\n\n    QJSValue newQObject(QObject *obj, const QJSValue &prototype) const;\n\n    ScriptableProxy *m_proxy;\n    QJSEngine *m_engine;\n    ItemFactory *m_factory;\n    QJSValue m_temporaryFileClass;\n    QString m_inputSeparator;\n    QJSValue m_input;\n    QVariantMap m_data;\n    QVariantMap m_oldData;\n    int m_actionId = -1;\n    QString m_actionName;\n    Abort m_abort = Abort::None;\n    bool m_abortWithSuccess = false;\n    int m_skipArguments = 0;\n\n    bool m_modifySelectionData = true;\n\n    QJSValue m_plugins;\n\n    Action *m_action = nullptr;\n\n    QString m_tabName;\n\n    PlatformClipboardPtr m_clipboard;\n\n    QJSValue m_uncaughtException;\n    bool m_hasUncaughtException = false;\n\n    QStringList m_stack;\n    QStringList m_uncaughtExceptionStack;\n\n    QJSValue m_safeCall;\n    QJSValue m_safeEval;\n    QJSValue m_createFn;\n    QJSValue m_createFnB;\n    QJSValue m_createProperty;\n\n    QJSValue m_byteArrayPrototype;\n    QJSValue m_filePrototype;\n    QJSValue m_temporaryFilePrototype;\n    QJSValue m_dirPrototype;\n    QJSValue m_itemSelectionPrototype;\n    QJSValue m_settingsPrototype;\n    QJSValue m_networkRequestPrototype;\n    QJSValue m_networkReplyPrototype;\n};\n\nclass ScriptablePlugins final : public QObject {\n    Q_OBJECT\n\npublic:\n    ScriptablePlugins(Scriptable *scriptable, ItemFactory *factory);\n\npublic slots:\n    QJSValue load(const QString &name);\n\nprivate:\n    Scriptable *m_scriptable;\n    ItemFactory *m_factory;\n    QMap<QString, QJSValue> m_plugins;\n};\n"
  },
  {
    "path": "src/scriptable/scriptablebytearray.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptablebytearray.h\"\n\n#include \"common/textdata.h\"\n\n#include <QJSEngine>\n#include <QJSValue>\n\nScriptableByteArray::ScriptableByteArray(const QByteArray &bytes)\n    : m_self(bytes)\n{\n}\n\nScriptableByteArray::ScriptableByteArray(const QString &text)\n    : m_self(text.toUtf8())\n{\n}\n\nScriptableByteArray::ScriptableByteArray(const QVariant &value)\n    : m_variant(value)\n{\n}\n\nScriptableByteArray::ScriptableByteArray(int size)\n    : m_self(size, /*ch=*/0)\n{\n}\n\nScriptableByteArray::ScriptableByteArray(const ScriptableByteArray &other)\n    : QObject()\n    , m_self(other.m_self)\n    , m_variant(other.m_variant)\n{\n}\n\nvoid ScriptableByteArray::chop(int n)\n{\n    self().chop(n);\n}\n\nbool ScriptableByteArray::equals(const QJSValue &other)\n{\n    const auto byteArray = engine()->fromScriptValue<ScriptableByteArray*>(other);\n    return byteArray && self() == *byteArray->data();\n}\n\nQJSValue ScriptableByteArray::left(int len)\n{\n    return newByteArray( self().left(len) );\n}\n\nQJSValue ScriptableByteArray::mid(int pos, int len)\n{\n    return newByteArray( self().mid(pos, len) );\n}\n\nQJSValue ScriptableByteArray::remove(int pos, int len)\n{\n    return newByteArray( self().remove(pos, len) );\n}\n\nQJSValue ScriptableByteArray::right(int len)\n{\n    return newByteArray( self().right(len) );\n}\n\nQJSValue ScriptableByteArray::simplified()\n{\n    return newByteArray( self().simplified() );\n}\n\nQJSValue ScriptableByteArray::toBase64()\n{\n    return newByteArray( self().toBase64() );\n}\n\nQJSValue ScriptableByteArray::toLower()\n{\n    return newByteArray( self().toLower() );\n}\n\nQJSValue ScriptableByteArray::toUpper()\n{\n    return newByteArray( self().toUpper() );\n}\n\nQJSValue ScriptableByteArray::trimmed()\n{\n    return newByteArray( self().trimmed() );\n}\n\nvoid ScriptableByteArray::truncate(int pos)\n{\n    self().truncate(pos);\n}\n\nQJSValue ScriptableByteArray::valueOf()\n{\n    return toString();\n}\n\nint ScriptableByteArray::size()\n{\n    return self().size();\n}\n\nQString ScriptableByteArray::toString()\n{\n    return getTextData(self());\n}\n\nQString ScriptableByteArray::toLatin1String()\n{\n    return QString::fromLatin1(self());\n}\n\nQJSValue ScriptableByteArray::length()\n{\n    return static_cast<int>(self().length());\n}\n\nvoid ScriptableByteArray::setLength(QJSValue size)\n{\n    self().resize(size.toInt());\n}\n\nQJSEngine *ScriptableByteArray::engine() const\n{\n    return qjsEngine(this);\n}\n\nQJSValue ScriptableByteArray::newByteArray(const QByteArray &bytes) const\n{\n    return engine()->newQObject( new ScriptableByteArray(bytes) );\n}\n\nQByteArray &ScriptableByteArray::self()\n{\n    // Convert lazily to QByteArray from QVariant when needed.\n    // This avoids expensive conversion from DataFile type.\n    if (m_variant.isValid()) {\n        m_self = m_variant.toByteArray();\n        m_variant.clear();\n    }\n\n    return m_self;\n}\n\nconst QByteArray *getByteArray(const QJSValue &value)\n{\n    const auto obj1 = value.toQObject();\n    const auto obj = qobject_cast<ScriptableByteArray*>(obj1);\n    return obj ? obj->data() : nullptr;\n}\n\nQByteArray toByteArray(const QJSValue &value)\n{\n    const auto byteArray = qobject_cast<ScriptableByteArray*>(value.toQObject());\n    if (byteArray)\n        return *byteArray->data();\n\n    const QVariant variant = value.toVariant();\n    if (variant.canConvert<QByteArray>())\n        return variant.toByteArray();\n\n    return value.toString().toUtf8();\n}\n\nQString toString(const QJSValue &value)\n{\n    const QByteArray *bytes = getByteArray(value);\n    return (bytes == nullptr) ? value.toString() : getTextData(*bytes);\n}\n"
  },
  {
    "path": "src/scriptable/scriptablebytearray.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QByteArray>\n#include <QJSValue>\n#include <QObject>\n#include <QVariant>\n\nclass ScriptableByteArray final : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(QJSValue length READ length WRITE setLength)\n\npublic:\n    Q_INVOKABLE ScriptableByteArray() {}\n    Q_INVOKABLE explicit ScriptableByteArray(const QByteArray &bytes);\n    Q_INVOKABLE explicit ScriptableByteArray(const QString &text);\n    Q_INVOKABLE explicit ScriptableByteArray(const QVariant &value);\n    Q_INVOKABLE explicit ScriptableByteArray(int size);\n\n    Q_INVOKABLE ScriptableByteArray(const ScriptableByteArray &other);\n\n    const QByteArray *data() { return &self(); }\n\npublic slots:\n    void chop(int n);\n    bool equals(const QJSValue &other);\n    QJSValue left(int len);\n    QJSValue mid(int pos, int len = -1);\n    QJSValue remove(int pos, int len);\n    QJSValue right(int len);\n    QJSValue simplified();\n    QJSValue toBase64();\n    QJSValue toLower();\n    QJSValue toUpper();\n    QJSValue trimmed();\n    void truncate(int pos);\n    QJSValue valueOf();\n\n    int size();\n\n    QString toString();\n    QString toLatin1String();\n\n    QJSValue length();\n    void setLength(QJSValue size);\n\nprivate:\n    QJSEngine *engine() const;\n\n    QJSValue newByteArray(const QByteArray &bytes) const;\n\n    QByteArray &self();\n\n    QByteArray m_self;\n    QVariant m_variant;\n};\n\nconst QByteArray *getByteArray(const QJSValue &value);\n\nQByteArray toByteArray(const QJSValue &value);\n\nQString toString(const QJSValue &value);\n"
  },
  {
    "path": "src/scriptable/scriptabledir.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptabledir.h\"\n\n#include <QJSEngine>\n\nScriptableDir::ScriptableDir(const QString &path)\n    : m_path(path)\n{\n}\n\nScriptableDir::~ScriptableDir()\n{\n    delete m_self;\n}\n\nQJSValue ScriptableDir::absoluteFilePath(const QJSValue &fileName)\n{\n    return self()->absoluteFilePath(fileName.toString());\n}\n\nQJSValue ScriptableDir::absolutePath()\n{\n    return self()->absolutePath();\n}\n\nQJSValue ScriptableDir::canonicalPath()\n{\n    return self()->canonicalPath();\n}\n\nbool ScriptableDir::cd(const QJSValue &dirName)\n{\n    return self()->cd(dirName.toString());\n}\n\nbool ScriptableDir::cdUp()\n{\n    return self()->cdUp();\n}\n\nuint ScriptableDir::count()\n{\n    return self()->count();\n}\n\nQJSValue ScriptableDir::dirName()\n{\n    return self()->dirName();\n}\n\nQStringList ScriptableDir::entryList(const QStringList &nameFilters)\n{\n    return self()->entryList(nameFilters);\n}\n\nbool ScriptableDir::exists(const QJSValue &name)\n{\n    return self()->exists(name.toString());\n}\n\nbool ScriptableDir::exists()\n{\n    return self()->exists();\n}\n\nQJSValue ScriptableDir::filePath(const QJSValue &fileName)\n{\n    return self()->filePath(fileName.toString());\n}\n\nbool ScriptableDir::isAbsolute()\n{\n    return self()->isAbsolute();\n}\n\nbool ScriptableDir::isReadable()\n{\n    return self()->isReadable();\n}\n\nbool ScriptableDir::isRelative()\n{\n    return self()->isRelative();\n}\n\nbool ScriptableDir::isRoot()\n{\n    return self()->isRoot();\n}\n\nbool ScriptableDir::makeAbsolute()\n{\n    return self()->makeAbsolute();\n}\n\nbool ScriptableDir::mkdir(const QJSValue &dirName)\n{\n    return self()->mkdir(dirName.toString());\n}\n\nbool ScriptableDir::mkpath(const QJSValue &dirPath)\n{\n    return self()->mkpath(dirPath.toString());\n}\n\nQStringList ScriptableDir::nameFilters()\n{\n    return self()->nameFilters();\n}\n\nQJSValue ScriptableDir::path()\n{\n    return self()->path();\n}\n\nvoid ScriptableDir::refresh()\n{\n    self()->refresh();\n}\n\nQJSValue ScriptableDir::relativeFilePath(const QJSValue &fileName)\n{\n    return self()->relativeFilePath(fileName.toString());\n}\n\nbool ScriptableDir::remove(const QJSValue &fileName)\n{\n    return self()->remove(fileName.toString());\n}\n\nbool ScriptableDir::rename(const QJSValue &oldName, const QJSValue &newName)\n{\n    return self()->rename(oldName.toString(), newName.toString());\n}\n\nbool ScriptableDir::rmdir(const QJSValue &dirName)\n{\n    return self()->rmdir(dirName.toString());\n}\n\nbool ScriptableDir::rmpath(const QJSValue &dirPath)\n{\n    return self()->rmpath(dirPath.toString());\n}\n\nvoid ScriptableDir::setNameFilters(const QStringList &nameFilters)\n{\n    self()->setNameFilters(nameFilters);\n}\n\nvoid ScriptableDir::setPath(const QJSValue &path)\n{\n    self()->setPath(path.toString());\n}\n\nvoid ScriptableDir::addSearchPath(const QJSValue &prefix, const QJSValue &path)\n{\n    QDir::addSearchPath(prefix.toString(), path.toString());\n}\n\nQJSValue ScriptableDir::cleanPath(const QJSValue &path)\n{\n    return QDir::cleanPath(path.toString());\n}\n\nQJSValue ScriptableDir::currentPath()\n{\n    return QDir::currentPath();\n}\n\nQJSValue ScriptableDir::fromNativeSeparators(const QJSValue &pathName)\n{\n    return QDir::fromNativeSeparators(pathName.toString());\n}\n\nQJSValue ScriptableDir::home()\n{\n    return newDir(QDir::home());\n}\n\nQJSValue ScriptableDir::homePath()\n{\n    return QDir::homePath();\n}\n\nbool ScriptableDir::isAbsolutePath(const QJSValue &path)\n{\n    return QDir::isAbsolutePath(path.toString());\n}\n\nbool ScriptableDir::isRelativePath(const QJSValue &path)\n{\n    return QDir::isRelativePath(path.toString());\n}\n\nbool ScriptableDir::match(const QJSValue &filter, const QJSValue &fileName)\n{\n    return QDir::match(filter.toString(), fileName.toString());\n}\n\nbool ScriptableDir::match(const QStringList &filters, const QJSValue &fileName)\n{\n    return QDir::match(filters, fileName.toString());\n}\n\nQJSValue ScriptableDir::root()\n{\n    return newDir(QDir::root());\n}\n\nQJSValue ScriptableDir::rootPath()\n{\n    return QDir::rootPath();\n}\n\nQStringList ScriptableDir::searchPaths(const QJSValue &prefix)\n{\n    return QDir::searchPaths(prefix.toString());\n}\n\nQJSValue ScriptableDir::separator()\n{\n    return QString(QDir::separator());\n}\n\nbool ScriptableDir::setCurrent(const QJSValue &path)\n{\n    return QDir::setCurrent(path.toString());\n}\n\nvoid ScriptableDir::setSearchPaths(const QJSValue &prefix, const QStringList &searchPaths)\n{\n    QDir::setSearchPaths(prefix.toString(), searchPaths);\n}\n\nQJSValue ScriptableDir::temp()\n{\n    return newDir(QDir::temp());\n}\n\nQJSValue ScriptableDir::tempPath()\n{\n    return QDir::tempPath();\n}\n\nQJSValue ScriptableDir::toNativeSeparators(const QJSValue &pathName)\n{\n    return QDir::toNativeSeparators(pathName.toString());\n}\n\nQDir *ScriptableDir::self()\n{\n    if (!m_self)\n        m_self = new QDir(m_path);\n    return m_self;\n}\n\nQJSEngine *ScriptableDir::engine() const\n{\n    return qjsEngine(this);\n}\n\nQJSValue ScriptableDir::newDir(const QDir &dir) const\n{\n    return engine()->newQObject( new ScriptableDir(dir.absolutePath()) );\n}\n"
  },
  {
    "path": "src/scriptable/scriptabledir.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QDir>\n#include <QObject>\n#include <QJSValue>\n\nclass ScriptableDir final : public QObject\n{\n    Q_OBJECT\npublic:\n    Q_INVOKABLE explicit ScriptableDir(const QString &path = QString());\n\n    ~ScriptableDir();\n\npublic slots:\n    QJSValue absoluteFilePath(const QJSValue &fileName);\n    QJSValue absolutePath();\n    QJSValue canonicalPath();\n    bool cd(const QJSValue &dirName);\n    bool cdUp();\n    uint count();\n    QJSValue dirName();\n    QStringList entryList(const QStringList &nameFilters = QStringList());\n    bool exists(const QJSValue &name);\n    bool exists();\n    QJSValue filePath(const QJSValue &fileName);\n    bool isAbsolute();\n    bool isReadable();\n    bool isRelative();\n    bool isRoot();\n    bool makeAbsolute();\n    bool mkdir(const QJSValue &dirName);\n    bool mkpath(const QJSValue &dirPath);\n    QStringList nameFilters();\n    QJSValue path();\n    void refresh();\n    QJSValue relativeFilePath(const QJSValue &fileName);\n    bool remove(const QJSValue &fileName);\n    bool rename(const QJSValue &oldName, const QJSValue &newName);\n    bool rmdir(const QJSValue &dirName);\n    bool rmpath(const QJSValue &dirPath);\n    void setNameFilters(const QStringList &nameFilters);\n    void setPath(const QJSValue &path);\n\n    void addSearchPath(const QJSValue &prefix, const QJSValue &path);\n    QJSValue cleanPath(const QJSValue &path);\n    QJSValue currentPath();\n    QJSValue fromNativeSeparators(const QJSValue &pathName);\n    QJSValue home();\n    QJSValue homePath();\n    bool isAbsolutePath(const QJSValue &path);\n    bool isRelativePath(const QJSValue &path);\n    bool match(const QJSValue &filter, const QJSValue &fileName);\n    bool match(const QStringList &filters, const QJSValue &fileName);\n    QJSValue root();\n    QJSValue rootPath();\n    QStringList searchPaths(const QJSValue &prefix);\n    QJSValue separator();\n    bool setCurrent(const QJSValue &path);\n    void setSearchPaths(const QJSValue &prefix, const QStringList &searchPaths);\n    QJSValue temp();\n    QJSValue tempPath();\n    QJSValue toNativeSeparators(const QJSValue &pathName);\n\nprivate:\n    QDir *self();\n    QJSEngine *engine() const;\n\n    QJSValue newDir(const QDir &dir) const;\n\n    QDir *m_self = nullptr;\n    QString m_path;\n};\n"
  },
  {
    "path": "src/scriptable/scriptablefile.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptablefile.h\"\n\n#include \"scriptable/scriptablebytearray.h\"\n\n#include <QDir>\n#include <QFile>\n#include <QJSEngine>\n#include <QJSValue>\n\nQ_DECLARE_METATYPE(QByteArray*)\nQ_DECLARE_METATYPE(QFile*)\n\nScriptableFile::ScriptableFile(const QString &path)\n    : m_path(path)\n{\n}\n\nbool ScriptableFile::open()\n{\n    return self()->open(QIODevice::ReadWrite);\n}\n\nbool ScriptableFile::openReadOnly()\n{\n    return self()->open(QIODevice::ReadOnly);\n}\n\nbool ScriptableFile::openWriteOnly()\n{\n    return self()->open(QIODevice::WriteOnly);\n}\n\nbool ScriptableFile::openAppend()\n{\n    return self()->open(QIODevice::Append);\n}\n\nvoid ScriptableFile::close()\n{\n    self()->close();\n}\n\nQJSValue ScriptableFile::read(qint64 maxSize)\n{\n    return newByteArray(self()->read(maxSize));\n}\n\nQJSValue ScriptableFile::readLine(qint64 maxSize)\n{\n    return newByteArray(self()->readLine(maxSize));\n}\n\nQJSValue ScriptableFile::readAll()\n{\n    return newByteArray(self()->readAll());\n}\n\nqint64 ScriptableFile::write(const QJSValue &value)\n{\n    return self()->write(toByteArray(value));\n}\n\nbool ScriptableFile::atEnd()\n{\n    return self()->atEnd();\n}\n\nqint64 ScriptableFile::bytesAvailable()\n{\n    return self()->bytesAvailable();\n}\n\nqint64 ScriptableFile::bytesToWrite()\n{\n    return self()->bytesToWrite();\n}\n\nbool ScriptableFile::canReadLine()\n{\n    return self()->canReadLine();\n}\n\nQJSValue ScriptableFile::errorString()\n{\n    return self()->errorString();\n}\n\nbool ScriptableFile::isOpen()\n{\n    return self()->isOpen();\n}\n\nbool ScriptableFile::isReadable()\n{\n    return self()->isReadable();\n}\n\nbool ScriptableFile::isWritable()\n{\n    return self()->isWritable();\n}\n\nQJSValue ScriptableFile::peek(qint64 maxSize)\n{\n    return newByteArray(self()->peek(maxSize));\n}\n\nqint64 ScriptableFile::pos()\n{\n    return self()->pos();\n}\n\nbool ScriptableFile::reset()\n{\n    return self()->reset();\n}\n\nbool ScriptableFile::seek(qint64 pos)\n{\n    return self()->seek(pos);\n}\n\nvoid ScriptableFile::setTextModeEnabled(bool enabled)\n{\n    self()->setTextModeEnabled(enabled);\n}\n\nqint64 ScriptableFile::size()\n{\n    return self()->size();\n}\n\nQJSValue ScriptableFile::fileName()\n{\n    return self()->fileName();\n}\n\nbool ScriptableFile::exists()\n{\n    return self()->exists();\n}\n\nbool ScriptableFile::flush()\n{\n    return self()->flush();\n}\n\nbool ScriptableFile::remove()\n{\n    return self()->remove();\n}\n\nQFile *ScriptableFile::self()\n{\n    if (m_self)\n        return m_self;\n\n    setFile( new QFile(this) );\n    return m_self;\n}\n\nvoid ScriptableFile::setFile(QFile *file)\n{\n    Q_ASSERT(m_self == nullptr);\n    m_self = file;\n\n    if ( !m_path.isNull() ) {\n        m_self->setFileName(m_path);\n    }\n}\n\nQJSEngine *ScriptableFile::engine() const\n{\n    return qjsEngine(this);\n}\n\nQJSValue ScriptableFile::newByteArray(const QByteArray &bytes)\n{\n    return engine()->newQObject( new ScriptableByteArray(bytes) );\n}\n"
  },
  {
    "path": "src/scriptable/scriptablefile.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QJSValue>\n#include <QObject>\n\nclass QJSEngine;\nclass QFile;\n\nclass ScriptableFile : public QObject\n{\n    Q_OBJECT\n\npublic:\n    Q_INVOKABLE explicit ScriptableFile(const QString &path = QString());\n\npublic slots:\n    bool open();\n    bool openReadOnly();\n    bool openWriteOnly();\n    bool openAppend();\n\n    void close();\n\n    QJSValue read(qint64 maxSize);\n    QJSValue readLine(qint64 maxSize = 0);\n    QJSValue readAll();\n\n    qint64 write(const QJSValue &value);\n\n    bool atEnd();\n    qint64 bytesAvailable();\n    qint64 bytesToWrite();\n    bool canReadLine();\n    QJSValue errorString();\n    bool isOpen();\n    bool isReadable();\n    bool isWritable();\n    QJSValue peek(qint64 maxSize);\n    qint64 pos();\n    bool reset();\n    bool seek(qint64 pos);\n    void setTextModeEnabled(bool enabled);\n    qint64 size();\n\n    QJSValue fileName();\n    bool exists();\n    bool flush();\n    bool remove();\n\n    virtual QFile *self();\n\nprotected:\n    void setFile(QFile *file);\n    QJSEngine *engine() const;\n\nprivate:\n    QJSValue newByteArray(const QByteArray &bytes);\n\n    QFile *m_self = nullptr;\n    QString m_path;\n};\n"
  },
  {
    "path": "src/scriptable/scriptableitemselection.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptableitemselection.h\"\n#include \"scriptableproxy.h\"\n\n#include \"scriptable/scriptablebytearray.h\"\n#include \"scriptable/scriptvaluefactory.h\"\n\n#include <QJSEngine>\n\nScriptableItemSelection::ScriptableItemSelection(const QString &tabName)\n    : m_tabName(tabName)\n{\n}\n\nScriptableItemSelection::~ScriptableItemSelection()\n{\n    if (m_proxy)\n        m_proxy->destroySelection(m_id);\n}\n\nQJSValue ScriptableItemSelection::length()\n{\n    return m_proxy->selectionGetSize(m_id);\n}\n\nQJSValue ScriptableItemSelection::tab()\n{\n    return m_proxy->selectionGetTabName(m_id);\n}\n\nQJSValue ScriptableItemSelection::valueOf()\n{\n    return toString();\n}\n\nQJSValue ScriptableItemSelection::str()\n{\n    return toString();\n}\n\nQString ScriptableItemSelection::toString()\n{\n    const auto rows = m_proxy->selectionGetRows(m_id);\n    const auto tabName = m_proxy->selectionGetTabName(m_id);\n\n    QString rowString;\n    auto it1 = rows.constBegin();\n    while (it1 != rows.constEnd()) {\n        auto it2 = std::adjacent_find(it1, rows.constEnd(), [](int lhs, int rhs) {\n            return lhs + 1 != rhs;\n        });\n        if (it2 == rows.constEnd())\n            --it2;\n        if (it1 == it2)\n            rowString.append(QStringLiteral(\"%1,\").arg(*it1));\n        else if (it1 + 1 == it2)\n            rowString.append(QStringLiteral(\"%1,%2,\").arg(*it1).arg(*it2));\n        else\n            rowString.append(QStringLiteral(\"%1..%2,\").arg(*it1).arg(*it2));\n        it1 = it2 + 1;\n    }\n    rowString.chop(1);\n\n    return QStringLiteral(\"ItemSelection(tab=\\\"%1\\\", rows=[%2])\")\n            .arg(tabName, rowString);\n}\n\nQJSValue ScriptableItemSelection::selectAll()\n{\n    m_proxy->selectionSelectAll(m_id);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::select(const QJSValue &re, const QString &mimeFormat)\n{\n    const QVariant regexp = re.isRegExp()\n        ? fromScriptValue<QRegularExpression>(re, qjsEngine(this))\n        : QVariant();\n    m_proxy->selectionSelect(m_id, regexp, mimeFormat);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::selectRemovable()\n{\n    m_proxy->selectionSelectRemovable(m_id);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::invert()\n{\n    m_proxy->selectionInvert(m_id);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::deselectIndexes(const QJSValue &indexes)\n{\n    const auto indexes2 = fromScriptValue<QVector<int>>(indexes, qjsEngine(this));\n    m_proxy->selectionDeselectIndexes(m_id, indexes2);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::deselectSelection(const QJSValue &selection)\n{\n    const auto other = qobject_cast<ScriptableItemSelection*>(selection.toQObject());\n    m_proxy->selectionDeselectSelection(m_id, other->m_id);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::current()\n{\n    m_proxy->selectionGetCurrent(m_id);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::removeAll()\n{\n    m_proxy->selectionRemoveAll(m_id);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::copy()\n{\n    const int newId = m_proxy->selectionCopy(m_id);\n    auto cloneQObj = new ScriptableItemSelection(m_tabName);\n    const QJSValue clone = qjsEngine(this)->newQObject(cloneQObj);\n    cloneQObj->m_proxy = m_proxy;\n    cloneQObj->m_id = newId;\n    cloneQObj->m_self = clone;\n    return clone;\n}\n\nQJSValue ScriptableItemSelection::rows()\n{\n    const auto rows = m_proxy->selectionGetRows(m_id);\n    QJSValue array = qjsEngine(this)->newArray(rows.size());\n    for ( int i = 0; i < rows.size(); ++i )\n        array.setProperty( static_cast<quint32>(i), QJSValue(rows[i]) );\n    return array;\n}\n\nQJSValue ScriptableItemSelection::itemAtIndex(int index)\n{\n    const auto item = m_proxy->selectionGetItemIndex(m_id, index);\n    return toScriptValue(item, qjsEngine(this));\n}\n\nQJSValue ScriptableItemSelection::setItemAtIndex(int index, const QJSValue &item)\n{\n    const QVariantMap data = fromScriptValue<QVariantMap>(item, qjsEngine(this));\n    m_proxy->selectionSetItemIndex(m_id, index, data);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::items()\n{\n    const QVariantList dataList = m_proxy->selectionGetItemsData(m_id);\n    return toScriptValue(dataList, qjsEngine(this));\n}\n\nQJSValue ScriptableItemSelection::setItems(const QJSValue &items)\n{\n    const QVariantList dataList = fromScriptValue<QVariantList>(items, qjsEngine(this));\n    m_proxy->selectionSetItemsData(m_id, dataList);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::itemsFormat(const QJSValue &format)\n{\n    const QVariantList dataList = m_proxy->selectionGetItemsFormat(m_id, ::toString(format));\n    return toScriptValue(dataList, qjsEngine(this));\n}\n\nQJSValue ScriptableItemSelection::setItemsFormat(const QJSValue &format, const QJSValue &value)\n{\n    const QVariant variant = value.isUndefined() ? QVariant() : QVariant(toByteArray(value));\n    m_proxy->selectionSetItemsFormat(m_id, ::toString(format), variant);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::move(int row)\n{\n    m_proxy->selectionMove(m_id, row);\n    return m_self;\n}\n\nQJSValue ScriptableItemSelection::sort(QJSValue compareFn)\n{\n    const int size = m_proxy->selectionGetSize(m_id);\n    QVector<int> indexes;\n    indexes.reserve(size);\n    for (int i = 0; i < size; ++i)\n        indexes.append(i);\n\n    std::sort( indexes.begin(), indexes.end(), [&](int lhs, int rhs) {\n        return compareFn.call({lhs, rhs}).toBool();\n    } );\n    m_proxy->selectionSort(m_id, indexes);\n    return m_self;\n}\n\nvoid ScriptableItemSelection::init(const QJSValue &self, ScriptableProxy *proxy, const QString &currentTabName)\n{\n    m_self = self;\n    m_proxy = proxy;\n    connect(m_proxy, &QObject::destroyed, this, [this](){ m_proxy = nullptr; });\n\n    if ( m_tabName.isEmpty() )\n        m_tabName = currentTabName;\n\n    m_id = m_proxy->createSelection(m_tabName);\n}\n"
  },
  {
    "path": "src/scriptable/scriptableitemselection.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include <QJSValue>\n#include <QObject>\n\nclass ScriptableProxy;\n\nclass ScriptableItemSelection final : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QJSValue length READ length)\n    Q_PROPERTY(QJSValue tab READ tab)\n\npublic:\n    Q_INVOKABLE explicit ScriptableItemSelection(const QString &tabName = QString());\n\n    ~ScriptableItemSelection();\n\n    void init(const QJSValue &self, ScriptableProxy *proxy, const QString &currentTabName);\n\npublic slots:\n    QJSValue length();\n    QJSValue tab();\n\n    QJSValue valueOf();\n    QJSValue str();\n    QString toString();\n\n    QJSValue selectAll();\n    QJSValue select(const QJSValue &re, const QString &mimeFormat = QString());\n    QJSValue selectRemovable();\n    QJSValue invert();\n    QJSValue deselectIndexes(const QJSValue &indexes);\n    QJSValue deselectSelection(const QJSValue &selection);\n\n    QJSValue current();\n\n    QJSValue removeAll();\n\n    QJSValue copy();\n\n    QJSValue rows();\n\n    QJSValue itemAtIndex(int index);\n\n    QJSValue setItemAtIndex(int index, const QJSValue &item);\n\n    QJSValue items();\n    QJSValue setItems(const QJSValue &items);\n\n    QJSValue itemsFormat(const QJSValue &format);\n    QJSValue setItemsFormat(const QJSValue &format, const QJSValue &value);\n\n    QJSValue move(int row);\n\n    QJSValue sort(QJSValue compareFn);\n\nprivate:\n    int m_id = -1;\n    QString m_tabName;\n    ScriptableProxy *m_proxy = nullptr;\n    QJSValue m_self;\n};\n"
  },
  {
    "path": "src/scriptable/scriptablenetworkreply.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptablenetworkreply.h\"\n\n#include \"scriptable/scriptablebytearray.h\"\n\n#include <QJSEngine>\n#include <QEventLoop>\n#include <QNetworkReply>\n\nScriptableNetworkReply::~ScriptableNetworkReply()\n{\n    if (m_reply)\n        m_reply->deleteLater();\n}\n\nQJSValue ScriptableNetworkReply::data()\n{\n    if (!m_reply)\n        return {};\n\n    if ( !m_data.isUndefined() )\n        return m_data;\n\n    if ( !m_reply->isFinished() ) {\n        QEventLoop loop;\n        connect(m_reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);\n        loop.exec();\n    }\n\n    if ( !m_reply->isFinished() )\n        return QJSValue();\n\n    m_data = newByteArray(m_rawData);\n\n    return m_data;\n}\n\nQJSValue ScriptableNetworkReply::error()\n{\n    if (!m_reply)\n        return {};\n\n    data();\n\n    if (m_reply->error() != QNetworkReply::NoError)\n        return m_reply->errorString();\n\n    return QJSValue();\n}\n\nQJSValue ScriptableNetworkReply::status()\n{\n    if (!m_reply)\n        return {};\n\n    data();\n\n    const QVariant v = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);\n    if (v.isValid())\n        return v.toInt();\n    return QJSValue();\n}\n\nQJSValue ScriptableNetworkReply::redirect()\n{\n    if (!m_reply)\n        return {};\n\n    data();\n\n    const QVariant v = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute);\n    if (v.isValid())\n        return v.toUrl().resolved(m_reply->url()).toString();\n    return QJSValue();\n}\n\nQJSValue ScriptableNetworkReply::headers()\n{\n    if (!m_reply)\n        return {};\n\n    data();\n\n    QJSValue headers = engine()->newArray();\n    int i = 0;\n    for ( const auto &header : m_reply->rawHeaderList() ) {\n        QJSValue pair = engine()->newArray();\n        pair.setProperty( 0, newByteArray(header) );\n        pair.setProperty( 1, newByteArray(m_reply->rawHeader(header)) );\n        headers.setProperty( static_cast<quint32>(i), pair );\n        ++i;\n    }\n\n    return headers;\n}\n\nQJSValue ScriptableNetworkReply::finished()\n{\n    return !m_reply || m_reply->isFinished();\n}\n\nQJSValue ScriptableNetworkReply::url()\n{\n    if (!m_reply)\n        return {};\n\n    data();\n\n    return m_reply->url().toString();\n}\n\nvoid ScriptableNetworkReply::setReply(QNetworkReply *reply)\n{\n    m_reply = reply;\n\n    connect(m_reply, &QNetworkReply::readyRead, this, [this](){\n        const qint64 available = m_reply->bytesAvailable();\n        m_rawData.append( m_reply->read(available) );\n    });\n    const qint64 available = m_reply->bytesAvailable();\n    m_rawData.append( m_reply->read(available) );\n}\n\nQJSEngine *ScriptableNetworkReply::engine() const\n{\n    return qjsEngine(this);\n}\n\nQJSValue ScriptableNetworkReply::newByteArray(const QByteArray &bytes) const\n{\n    return engine()->newQObject( new ScriptableByteArray(bytes) );\n}\n"
  },
  {
    "path": "src/scriptable/scriptablenetworkreply.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QJSValue>\n#include <QObject>\n\nclass QNetworkReply;\n\nclass ScriptableNetworkReply final : public QObject {\n    Q_OBJECT\n    Q_PROPERTY(QJSValue data READ data CONSTANT)\n    Q_PROPERTY(QJSValue error READ error CONSTANT)\n    Q_PROPERTY(QJSValue status READ status CONSTANT)\n    Q_PROPERTY(QJSValue redirect READ redirect CONSTANT)\n    Q_PROPERTY(QJSValue headers READ headers CONSTANT)\n    Q_PROPERTY(QJSValue finished READ finished CONSTANT)\n    Q_PROPERTY(QJSValue url READ url CONSTANT)\n\npublic:\n    Q_INVOKABLE ScriptableNetworkReply() = default;\n\n    ~ScriptableNetworkReply();\n\n    QJSValue data();\n\n    QJSValue error();\n\n    QJSValue status();\n    QJSValue redirect();\n    QJSValue headers();\n\n    QJSValue finished();\n\n    QJSValue url();\n\n    void setReply(QNetworkReply *reply);\n\nprivate:\n    QJSEngine *engine() const;\n    QJSValue newByteArray(const QByteArray &bytes) const;\n\n    QNetworkReply *m_reply = nullptr;\n    QJSValue m_data;\n    QJSValue m_self;\n    QByteArray m_rawData;\n};\n"
  },
  {
    "path": "src/scriptable/scriptablenetworkrequest.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptablenetworkrequest.h\"\n#include \"scriptablenetworkreply.h\"\n\n#include \"scriptable/scriptablebytearray.h\"\n#include \"common/log.h\"\n#include \"common/version.h\"\n\n#include <QJSEngine>\n#include <QJSValueIterator>\n#include <QNetworkAccessManager>\n#include <QNetworkRequest>\n\nQ_DECLARE_METATYPE(QByteArray*)\n\nScriptableNetworkReply *ScriptableNetworkRequest::requestRaw(const QByteArray &method, const QString &url, const QByteArray &data) const\n{\n    QNetworkRequest request;\n\n    const int maxRedirects = m_maxRedirects.toInt();\n    request.setUrl(QUrl(url));\n    request.setMaximumRedirectsAllowed(maxRedirects);\n\n    QJSValueIterator it(m_headers);\n    while (it.hasNext()) {\n        it.next();\n        const QByteArray name = it.name().toUtf8();\n        const QByteArray value = toByteArray(it.value());\n        request.setRawHeader(name, value);\n    }\n\n    auto reply = new ScriptableNetworkReply();\n    auto manager = new QNetworkAccessManager(reply);\n    manager->setRedirectPolicy(\n        maxRedirects > 0\n        ? QNetworkRequest::NoLessSafeRedirectPolicy\n        : QNetworkRequest::ManualRedirectPolicy);\n    COPYQ_LOG(\n        QStringLiteral(\n            \"ScriptableNetworkRequest: method=%1, url=%2, data=%3, maxRedirects=%4\")\n        .arg(QString::fromUtf8(method), url, QString::fromUtf8(data), QString::number(maxRedirects)));\n    QNetworkReply *managerReply = data.isNull()\n        ? manager->sendCustomRequest(request, method)\n        : manager->sendCustomRequest(request, method, data);\n    reply->setReply(managerReply);\n    return reply;\n}\n\nQJSValue ScriptableNetworkRequest::headers()\n{\n    if (m_headers.isUndefined() || m_headers.isNull()) {\n        m_headers = engine()->newObject();\n        m_headers.setProperty(\n            QStringLiteral(\"User-Agent\"),\n            QStringLiteral(\"CopyQ/%1\").arg(versionString));\n    }\n    return m_headers;\n}\n\nQJSValue ScriptableNetworkRequest::request(const QJSValue &method, const QJSValue &url, const QJSValue &data) const\n{\n    const QByteArray postData = (data.isUndefined() || data.isNull())\n        ? QByteArray()\n        : toByteArray(data);\n    auto reply = requestRaw(toByteArray(method), toString(url), postData);\n    return engine()->newQObject(reply);\n}\n\nQJSEngine *ScriptableNetworkRequest::engine() const\n{\n    return qjsEngine(this);\n}\n\nQJSValue ScriptableNetworkRequest::newByteArray(const QByteArray &bytes) const\n{\n    return engine()->newQObject( new ScriptableByteArray(bytes) );\n}\n"
  },
  {
    "path": "src/scriptable/scriptablenetworkrequest.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include <QJSValue>\n#include <QObject>\n\nclass ScriptableNetworkReply;\n\nclass ScriptableNetworkRequest final : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QJSValue headers READ headers WRITE setHeaders)\n    Q_PROPERTY(QJSValue maxRedirects READ maxRedirects WRITE setMaxRedirects)\n\npublic:\n    Q_INVOKABLE ScriptableNetworkRequest() = default;\n\n    QJSValue headers();\n    void setHeaders(const QJSValue &headers) { m_headers = headers; }\n\n    QJSValue maxRedirects() const { return m_maxRedirects; }\n    void setMaxRedirects(const QJSValue &redirect) { m_maxRedirects = redirect; }\n\n    ScriptableNetworkReply *requestRaw(\n        const QByteArray &method, const QString &url, const QByteArray &data) const;\n\npublic slots:\n    QJSValue request(\n        const QJSValue &method, const QJSValue &url, const QJSValue &data = {}) const;\n\nprivate:\n    QJSEngine *engine() const;\n    QJSValue newByteArray(const QByteArray &bytes) const;\n\n    QJSValue m_headers;\n    QJSValue m_maxRedirects = 0;\n};\n"
  },
  {
    "path": "src/scriptable/scriptableproxy.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptableproxy.h\"\n\n#include \"common/action.h\"\n#include \"common/audioplayer.h\"\n#include \"common/appconfig.h\"\n#include \"common/command.h\"\n#include \"common/commandstatus.h\"\n#include \"common/commandstore.h\"\n#include \"common/common.h\"\n#include \"common/config.h\"\n#include \"common/contenttype.h\"\n#include \"common/display.h\"\n#include \"common/log.h\"\n#include \"common/mimetypes.h\"\n#include \"common/textdata.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/filedialog.h\"\n#include \"gui/geometry.h\"\n#include \"gui/iconfactory.h\"\n#include \"gui/icons.h\"\n#include \"gui/mainwindow.h\"\n#include \"gui/notification.h\"\n#include \"gui/pixelratio.h\"\n#include \"gui/screen.h\"\n#include \"gui/selectiondata.h\"\n#include \"gui/tabicons.h\"\n#include \"gui/traymenu.h\"\n#include \"gui/windowgeometryguard.h\"\n#include \"item/serialize.h\"\n#include \"item/clipboardmodel.h\"\n#include \"platform/platformnativeinterface.h\"\n#include \"platform/platformwindow.h\"\n\n#include <QDialog>\n#include <QHBoxLayout>\n#include <QVBoxLayout>\n#include <QScrollArea>\n\n#include <QApplication>\n#include <QBuffer>\n#include <QDataStream>\n#include <QDrag>\n#include <QCheckBox>\n#include <QComboBox>\n#include <QCursor>\n#include <QDateTimeEdit>\n#include <QDesktopServices>\n#include <QDialogButtonBox>\n#include <QFile>\n#include <QFileInfo>\n#include <QDirIterator>\n#include <QFileDialog>\n#include <QWidget>\n#include <QLabel>\n#include <QLineEdit>\n#include <QListWidget>\n#include <QMetaMethod>\n#include <QMetaType>\n#include <QMimeData>\n#include <QPainter>\n#include <QPaintEvent>\n#include <QPen>\n#include <QPixmap>\n#include <QPushButton>\n#include <QScreen>\n#include <QShortcut>\n#include <QSpinBox>\n#include <QStyleFactory>\n#include <QTextEdit>\n#include <QUrl>\n#include <QAbstractItemModel>\n\n#include <type_traits>\n\nnamespace {\n\nconst quint32 serializedFunctionCallMagicNumber = 0x58746908;\nconst quint32 serializedFunctionCallVersion = 2;\nconstexpr bool hasPriority = false;\n\nQString formatDataSize(qint64 bytes)\n{\n    if (bytes < 1024)\n        return QStringLiteral(\"%1 B\").arg(bytes);\n    if (bytes < 1024 * 1024)\n        return QStringLiteral(\"%1 KiB\").arg(bytes / 1024.0, 0, 'f', 1);\n    if (bytes < 1024 * 1024 * 1024)\n        return QStringLiteral(\"%1 MiB\").arg(bytes / (1024.0 * 1024.0), 0, 'f', 1);\n    return QStringLiteral(\"%1 GiB\").arg(bytes / (1024.0 * 1024.0 * 1024.0), 0, 'f', 1);\n}\n\nvoid registerMetaTypes() {\n    static bool registered = false;\n    if (registered)\n        return;\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    qRegisterMetaType<QPointer<QWidget>>(\"QPointer<QWidget>\");\n    qRegisterMetaTypeStreamOperators<ClipboardMode>(\"ClipboardMode\");\n    qRegisterMetaTypeStreamOperators<Command>(\"Command\");\n    qRegisterMetaTypeStreamOperators<NamedValueList>(\"NamedValueList\");\n    qRegisterMetaTypeStreamOperators<NotificationButtonList>(\"NotificationButtonList\");\n    qRegisterMetaTypeStreamOperators<QVector<int>>(\"QVector<int>\");\n    qRegisterMetaTypeStreamOperators<QVector<Command>>(\"QVector<Command>\");\n    qRegisterMetaTypeStreamOperators<VariantMapList>(\"VariantMapList\");\n    qRegisterMetaTypeStreamOperators<KeyboardModifierList>(\"KeyboardModifierList\");\n    qRegisterMetaTypeStreamOperators<MessageData>(\"MessageData\");\n#else\n    qRegisterMetaType<QPointer<QWidget>>(\"QPointer<QWidget>\");\n    qRegisterMetaType<ClipboardMode>(\"ClipboardMode\");\n    qRegisterMetaType<Command>(\"Command\");\n    qRegisterMetaType<NamedValueList>(\"NamedValueList\");\n    qRegisterMetaType<NotificationButtonList>(\"NotificationButtonList\");\n    qRegisterMetaType<QVector<int>>(\"QVector<int>\");\n    qRegisterMetaType<QVector<Command>>(\"QVector<Command>\");\n    qRegisterMetaType<VariantMapList>(\"VariantMapList\");\n    qRegisterMetaType<KeyboardModifierList>(\"KeyboardModifierList\");\n    qRegisterMetaType<MessageData>(\"MessageData\");\n#endif\n\n    registered = true;\n}\n\ntemplate<typename Predicate>\nvoid selectionRemoveIf(QList<QPersistentModelIndex> *indexes, Predicate predicate)\n{\n    indexes->erase(\n        std::remove_if(indexes->begin(), indexes->end(), predicate),\n        indexes->end());\n}\n\nvoid selectionRemoveInvalid(QList<QPersistentModelIndex> *indexes)\n{\n    selectionRemoveIf(\n        indexes,\n        [](const QPersistentModelIndex &index){\n            return !index.isValid();\n        });\n}\n\n} // namespace\n\n#define BROWSER(tabName, call) \\\n    ClipboardBrowser *c = fetchBrowser(tabName); \\\n    if (c) \\\n        (c->call)\n\n#define STR(str) str\n\n#define INVOKE_(function, arguments, functionCallId) do { \\\n    static const auto f = FunctionCallSerializer(QByteArrayLiteral(STR(#function))).withSlotArguments arguments; \\\n    const auto args = f.argumentList arguments; \\\n    emit sendMessage(f.serialize(functionCallId, args), \\\n        hasPriority ? CommandFunctionCallPriority : CommandFunctionCall); \\\n} while(false)\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n#   define CHECK_STREAM_OPERATORS(CALL) \\\n        static constexpr auto metaType = QMetaType::fromType<Result>(); \\\n        COPYQ_LOG_VERBOSE( \\\n            QStringLiteral(\"%1 invoking: %2 \" CALL)\\\n                .arg(m_wnd ? \"Server\" : \"Client\") \\\n                .arg(metaType.name())); \\\n        Q_ASSERT(metaType.hasRegisteredDataStreamOperators())\n#else\n#   define CHECK_STREAM_OPERATORS(CALL) \\\n        if ( hasLogLevel(LogTrace) ) { \\\n            static const auto metaTypeName = QMetaType::typeName(qMetaTypeId<Result>()); \\\n            COPYQ_LOG_VERBOSE( \\\n                QStringLiteral(\"%1 invoking: %2 \" CALL)\\\n                    .arg(m_wnd ? \"Server\" : \"Client\") \\\n                    .arg(metaTypeName) \\\n            ); \\\n        }\n#endif\n\n#define INVOKE(FUNCTION, ARGUMENTS) do { \\\n    using Result = decltype(FUNCTION ARGUMENTS); \\\n    CHECK_STREAM_OPERATORS(STR(#FUNCTION #ARGUMENTS)); \\\n    if (!m_wnd) { \\\n        const auto functionCallId = ++m_lastFunctionCallId; \\\n        INVOKE_(FUNCTION, ARGUMENTS, functionCallId); \\\n        const auto result = waitForFunctionCallFinished(functionCallId); \\\n        return result.value<Result>(); \\\n    } \\\n} while(false)\n\n#define INVOKE2(FUNCTION, ARGUMENTS) do { \\\n    if (!m_wnd) { \\\n        const auto functionCallId = ++m_lastFunctionCallId; \\\n        INVOKE_(FUNCTION, ARGUMENTS, functionCallId); \\\n        waitForFunctionCallFinished(functionCallId); \\\n        return; \\\n    } \\\n} while(false)\n\nQ_DECLARE_METATYPE(QFile*)\n\nQDataStream &operator<<(QDataStream &out, const NotificationButtonList &list)\n{\n    out << list.items.size();\n    for (const auto &button : list.items)\n        out << button.name << button.script << button.data;\n    Q_ASSERT(out.status() == QDataStream::Ok);\n    return out;\n}\n\nQDataStream &operator>>(QDataStream &in, NotificationButtonList &list)\n{\n    decltype(list.items.size()) size;\n    in >> size;\n    list.items.reserve(size);\n    for (int i = 0; i < size; ++i) {\n        NotificationButton button;\n        in >> button.name >> button.script >> button.data;\n        list.items.append(button);\n    }\n    Q_ASSERT(in.status() == QDataStream::Ok);\n    return in;\n}\n\nQDataStream &operator<<(QDataStream &out, const NamedValueList &list)\n{\n    out << list.items.size();\n    for (const auto &item : list.items)\n        out << item.name << item.value;\n    Q_ASSERT(out.status() == QDataStream::Ok);\n    return out;\n}\n\nQDataStream &operator>>(QDataStream &in, NamedValueList &list)\n{\n    decltype(list.items.size()) size;\n    in >> size;\n    list.items.reserve(size);\n    for (int i = 0; i < size; ++i) {\n        NamedValue item;\n        in >> item.name >> item.value;\n        list.items.append(item);\n    }\n    Q_ASSERT(in.status() == QDataStream::Ok);\n    return in;\n}\n\nQDataStream &operator<<(QDataStream &out, const VariantMapList &items)\n{\n    out << items.items;\n    Q_ASSERT(out.status() == QDataStream::Ok);\n    return out;\n}\n\nQDataStream &operator>>(QDataStream &in, VariantMapList &items)\n{\n    in >> items.items;\n    Q_ASSERT(in.status() == QDataStream::Ok);\n    return in;\n}\n\nQDataStream &operator<<(QDataStream &out, ClipboardMode mode)\n{\n    const int modeId = static_cast<int>(mode);\n    out << modeId;\n    Q_ASSERT(out.status() == QDataStream::Ok);\n    return out;\n}\n\nQDataStream &operator>>(QDataStream &in, ClipboardMode &mode)\n{\n    int modeId;\n    in >> modeId;\n    Q_ASSERT(in.status() == QDataStream::Ok);\n    mode = static_cast<ClipboardMode>(modeId);\n    return in;\n}\n\nQDataStream &operator<<(QDataStream &out, KeyboardModifierList value)\n{\n    return out << static_cast<int>(value.items);\n}\n\nQDataStream &operator>>(QDataStream &in, KeyboardModifierList &value)\n{\n    int valueInt;\n    in >> valueInt;\n    Q_ASSERT(in.status() == QDataStream::Ok);\n    value.items = static_cast<Qt::KeyboardModifiers>(valueInt);\n    return in;\n}\n\nQDataStream &operator<<(QDataStream &out, const MessageData &value)\n{\n    out << value.title\n        << value.message\n        << value.timeoutMs\n        << value.icon\n        << value.notificationId\n        << value.buttons\n        << value.urgency\n        << value.persistency;\n    return out;\n}\n\nQDataStream &operator>>(QDataStream &in, MessageData &value)\n{\n    in >> value.title\n       >> value.message\n       >> value.timeoutMs\n       >> value.icon\n       >> value.notificationId\n       >> value.buttons\n       >> value.urgency\n       >> value.persistency;\n    return in;\n}\n\nnamespace {\n\nconst char propertyWidgetName[] = \"CopyQ_widget_name\";\nconst char propertyWidgetProperty[] = \"CopyQ_widget_property\";\n\nstruct InputDialog {\n    QPointer<QDialog> dialog;\n    QWidget *parent;\n    QVariant defaultChoice; /// Default text for list widgets.\n};\n\nclass FunctionCallSerializer final {\npublic:\n    explicit FunctionCallSerializer(QByteArray functionName)\n        : m_slotName(std::move(functionName))\n    {\n    }\n\n    template<typename ...Ts>\n    FunctionCallSerializer &withSlotArguments(Ts... arguments)\n    {\n        QByteArray args;\n        for (const auto argType : std::initializer_list<const char *>{ argumentType(arguments)... }) {\n            args.append(argType);\n            args.append(',');\n        }\n        args.chop(1);\n        setSlotArgumentTypes(args);\n        return *this;\n    }\n\n    QByteArray serialize(int functionCallId, const QVector<QVariant> args) const\n    {\n        QByteArray bytes;\n        QDataStream stream(&bytes, QIODevice::WriteOnly);\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n        stream.setVersion(QDataStream::Qt_6_0);\n#else\n        stream.setVersion(QDataStream::Qt_5_0);\n#endif\n        stream << serializedFunctionCallMagicNumber << serializedFunctionCallVersion\n               << functionCallId << m_slotName << args;\n        return bytes;\n    }\n\n    template<typename ...Ts>\n    static QVector<QVariant> argumentList(Ts... arguments)\n    {\n        return { QVariant::fromValue(arguments)... };\n    }\n\n    template<typename T>\n    static const char *argumentType(const T &)\n    {\n        if ( std::is_same<QVariant, T>::value )\n            return \"QVariant\";\n\n        return QMetaType::typeName(qMetaTypeId<T>());\n    }\n\nprivate:\n    void setSlotArgumentTypes(const QByteArray &args)\n    {\n        m_slotName += \"(\" + args + \")\";\n        const int slotIndex = ScriptableProxy::staticMetaObject.indexOfSlot(m_slotName);\n        if (slotIndex == -1) {\n            log(\"Failed to find scriptable proxy slot: \" + m_slotName, LogError);\n            Q_ASSERT(false);\n        }\n    }\n\n    QByteArray m_slotName;\n};\n\nclass ScreenshotRectWidget final : public QLabel {\npublic:\n    explicit ScreenshotRectWidget(const QPixmap &pixmap)\n    {\n        setWindowFlags(Qt::Widget | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);\n        setCursor(Qt::CrossCursor);\n        setPixmap(pixmap);\n    }\n\n    void paintEvent(QPaintEvent *ev) override\n    {\n        QLabel::paintEvent(ev);\n        if (selectionRect.isValid()) {\n            QPainter p(this);\n            const auto w = pointsToPixels(1, this);\n\n            p.setPen(QPen(Qt::white, w));\n            p.drawRect(selectionRect);\n\n            p.setPen(QPen(Qt::black, w));\n            p.drawRect(selectionRect.adjusted(-w, -w, w, w));\n        }\n    }\n\n    void keyPressEvent(QKeyEvent *ev) override\n    {\n        QWidget::keyPressEvent(ev);\n        hide();\n    }\n\n    void mousePressEvent(QMouseEvent *ev) override\n    {\n        if ( ev->button() == Qt::LeftButton ) {\n            m_pos = ev->pos();\n            selectionRect.setTopLeft(m_pos);\n            update();\n        } else {\n            hide();\n        }\n    }\n\n    void mouseReleaseEvent(QMouseEvent *) override\n    {\n        hide();\n    }\n\n    void mouseMoveEvent(QMouseEvent *ev) override\n    {\n        if ( !ev->buttons().testFlag(Qt::LeftButton) )\n            return;\n\n        const auto pos = ev->pos();\n        // Types need to be explicitly specified because minmax() returns pair of references.\n        const std::pair<int,int> x = std::minmax(pos.x(), m_pos.x());\n        const std::pair<int,int> y = std::minmax(pos.y(), m_pos.y());\n        selectionRect = QRect( QPoint(x.first, y.first), QPoint(x.second, y.second) );\n        update();\n    }\n\n    QRect selectionRect;\n\nprivate:\n    QPoint m_pos;\n};\n\n/// Load icon from icon font, path or theme.\nQIcon loadIcon(const QString &idPathOrName)\n{\n    if (idPathOrName.size() == 1)\n        return createPixmap(idPathOrName[0].unicode(), Qt::white, 64);\n\n    if ( QFile::exists(idPathOrName) )\n        return QIcon(idPathOrName);\n\n    return QIcon::fromTheme(idPathOrName);\n}\n\nQWidget *label(Qt::Orientation orientation, const QString &name, QWidget *w)\n{\n    QWidget *parent = w->parentWidget();\n\n    if ( !name.isEmpty() ) {\n        QBoxLayout *layout;\n        if (orientation == Qt::Horizontal)\n            layout = new QHBoxLayout;\n        else\n            layout = new QVBoxLayout;\n\n        parent->layout()->addItem(layout);\n\n        QLabel *label = new QLabel(name + \":\", parent);\n        label->setBuddy(w);\n        layout->addWidget(label);\n        layout->addWidget(w, 1);\n    }\n\n    w->setProperty(propertyWidgetName, name);\n\n    return w;\n}\n\nQWidget *label(const QString &name, QWidget *w)\n{\n    w->setProperty(\"text\", name);\n    w->setProperty(propertyWidgetName, name);\n    return w;\n}\n\ntemplate <typename Widget>\nWidget *createAndSetWidget(const char *propertyName, const QVariant &value, QWidget *parent)\n{\n    auto w = new Widget(parent);\n    w->setProperty(propertyName, value);\n    w->setProperty(propertyWidgetProperty, propertyName);\n    parent->layout()->addWidget(w);\n    return w;\n}\n\nQWidget *createDateTimeEdit(\n        const QString &name, const char *propertyName, const QVariant &value, QWidget *parent)\n{\n    QDateTimeEdit *w = createAndSetWidget<QDateTimeEdit>(propertyName, value, parent);\n    w->setCalendarPopup(true);\n    return label(Qt::Horizontal, name, w);\n}\n\nvoid installShortcutToCloseDialog(QDialog *dialog, QWidget *shortcutParent, int shortcut)\n{\n    QShortcut *s = new QShortcut(QKeySequence(shortcut), shortcutParent);\n    QObject::connect(s, &QShortcut::activated, dialog, &QDialog::accept);\n    QObject::connect(s, &QShortcut::activatedAmbiguously, dialog, &QDialog::accept);\n}\n\nQWidget *createListWidget(const QString &name, const QStringList &items, InputDialog *inputDialog)\n{\n    const QString currentText = inputDialog->defaultChoice.isValid()\n            ? inputDialog->defaultChoice.toString()\n            : items.value(0);\n\n    const QLatin1String listPrefix(\".list:\");\n    if ( name.startsWith(listPrefix) ) {\n        QListWidget *w = createAndSetWidget<QListWidget>(\"currentRow\", QVariant(), inputDialog->parent);\n        w->addItems(items);\n        const int i = items.indexOf(currentText);\n        if (i != -1)\n            w->setCurrentRow(i);\n        w->setAlternatingRowColors(true);\n        installShortcutToCloseDialog(inputDialog->dialog, w, Qt::Key_Enter);\n        installShortcutToCloseDialog(inputDialog->dialog, w, Qt::Key_Return);\n        return label(Qt::Vertical, name.mid(listPrefix.size()), w);\n    }\n\n    QComboBox *w = createAndSetWidget<QComboBox>(\"currentText\", QVariant(), inputDialog->parent);\n    w->setEditable(true);\n    w->addItems(items);\n    w->setCurrentIndex(items.indexOf(currentText));\n    w->lineEdit()->setText(currentText);\n    w->lineEdit()->selectAll();\n    installShortcutToCloseDialog(inputDialog->dialog, w, Qt::Key_Enter);\n    installShortcutToCloseDialog(inputDialog->dialog, w, Qt::Key_Return);\n\n    const QLatin1String comboPrefix(\".combo:\");\n    if ( name.startsWith(comboPrefix) ) {\n        w->setEditable(false);\n        return label(Qt::Horizontal, name.mid(comboPrefix.size()), w);\n    }\n\n    return label(Qt::Horizontal, name, w);\n}\n\nQWidget *createSpinBox(const QString &name, const QVariant &value, QWidget *parent)\n{\n    QSpinBox *w = createAndSetWidget<QSpinBox>(\"value\", value, parent);\n    w->setRange(-1e9, 1e9);\n    return label(Qt::Horizontal, name, w);\n}\n\nQLineEdit *createLineEdit(const QVariant &value, QWidget *parent)\n{\n    QLineEdit *lineEdit = createAndSetWidget<QLineEdit>(\"text\", value, parent);\n    lineEdit->selectAll();\n    return lineEdit;\n}\n\nQWidget *createFileNameEdit(const QString &name, const QString &path, QWidget *parent)\n{\n    QWidget *w = new QWidget(parent);\n    parent->layout()->addWidget(w);\n\n    auto layout = new QHBoxLayout(w);\n    layout->setContentsMargins(0, 0, 0, 0);\n\n    QLineEdit *lineEdit = createLineEdit(path, w);\n    lineEdit->setProperty(propertyWidgetName, name);\n\n    QPushButton *browseButton = new QPushButton(\"...\");\n\n    FileDialog *dialog = new FileDialog(w, name, path);\n    QObject::connect( browseButton, &QAbstractButton::clicked,\n                      dialog, &FileDialog::exec );\n    QObject::connect( dialog, &FileDialog::fileSelected,\n                      lineEdit, &QLineEdit::setText );\n\n    layout->addWidget(lineEdit);\n    layout->addWidget(browseButton);\n\n    label(Qt::Vertical, name, w);\n\n    return lineEdit;\n}\n\nQWidget *createTextEdit(const QString &name, const QVariant &value, QWidget *parent)\n{\n    QTextEdit *w = createAndSetWidget<QTextEdit>(\"plainText\", value, parent);\n    w->setTabChangesFocus(true);\n    return label(Qt::Vertical, name, w);\n}\n\nQWidget *createWidget(const QString &name, const QVariant &value, InputDialog *inputDialog)\n{\n    QWidget *parent = inputDialog->parent;\n\n    switch ( value.type() ) {\n    case QVariant::Bool:\n        return label(name, createAndSetWidget<QCheckBox>(\"checked\", value, parent));\n    case QVariant::Int:\n        return createSpinBox(name, value, parent);\n    case QVariant::Date:\n        return createDateTimeEdit(name, \"date\", value, parent);\n    case QVariant::Time:\n        return createDateTimeEdit(name, \"time\", value, parent);\n    case QVariant::DateTime:\n        return createDateTimeEdit(name, \"dateTime\", value, parent);\n    case QVariant::List:\n    case QVariant::StringList:\n        return createListWidget(name, value.toStringList(), inputDialog);\n    default:\n        if ( value.type() == QVariant::Url ) {\n            const auto path = value.toUrl();\n            return createFileNameEdit(name, path.toLocalFile(), parent);\n        }\n\n        const QString text = value.toString();\n        if (text.contains('\\n'))\n            return createTextEdit(name, value.toStringList(), parent);\n\n        return label(Qt::Horizontal, name, createLineEdit(value, parent));\n    }\n}\n\nvoid setGeometryWithoutSave(QWidget *window, QRect geometry)\n{\n    setGeometryGuardBlockedUntilHidden(window, true);\n\n    window->setWindowState(window->windowState() & ~Qt::WindowMaximized);\n\n    const auto pos = (geometry.x() == -1 && geometry.y() == -1)\n            ? QCursor::pos()\n            : geometry.topLeft();\n\n    const int w = pointsToPixels(geometry.width(), window);\n    const int h = pointsToPixels(geometry.height(), window);\n    if (w > 0 && h > 0)\n        window->resize(w, h);\n\n    moveWindowOnScreen(window, pos);\n}\n\nQString tabNotFoundError()\n{\n    return ScriptableProxy::tr(\"Tab with given name doesn't exist!\");\n}\n\nQString tabNameEmptyError()\n{\n    return ScriptableProxy::tr(\"Tab name cannot be empty!\");\n}\n\n} // namespace\n\nScriptableProxy::ScriptableProxy(MainWindow *mainWindow, QObject *parent)\n    : QObject(parent)\n    , m_wnd(mainWindow)\n{\n    registerMetaTypes();\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    Q_ASSERT(QMetaType::fromType<Command>().hasRegisteredDataStreamOperators());\n    Q_ASSERT(QMetaType::fromType<ClipboardMode>().hasRegisteredDataStreamOperators());\n#endif\n}\n\nvoid ScriptableProxy::callFunction(const QByteArray &serializedFunctionCall)\n{\n    if (m_shouldBeDeleted)\n        return;\n\n    ++m_functionCallStack;\n    auto t = new QTimer(this);\n    t->setSingleShot(true);\n    QObject::connect( t, &QTimer::timeout, this, [=]() {\n        const auto result = callFunctionHelper(serializedFunctionCall);\n        emit sendMessage(result, CommandFunctionCallReturnValue);\n        t->deleteLater();\n\n        --m_functionCallStack;\n        if (m_shouldBeDeleted && m_functionCallStack == 0)\n            deleteLater();\n    });\n    t->start(0);\n}\n\nQByteArray ScriptableProxy::callFunctionHelper(const QByteArray &serializedFunctionCall)\n{\n    QVector<QVariant> arguments;\n    QByteArray slotName;\n    int functionCallId;\n    {\n        QDataStream stream(serializedFunctionCall);\n        stream.setVersion(QDataStream::Qt_5_0);\n\n        quint32 magicNumber;\n        quint32 version;\n        stream >> magicNumber >> version;\n        if (stream.status() != QDataStream::Ok) {\n            log(\"Failed to read scriptable proxy slot call preamble\", LogError);\n            Q_ASSERT(false);\n            return QByteArray();\n        }\n\n        if (magicNumber != serializedFunctionCallMagicNumber) {\n            log(\"Unexpected scriptable proxy slot call preamble magic number\", LogError);\n            Q_ASSERT(false);\n            return QByteArray();\n        }\n\n        if (version != serializedFunctionCallVersion) {\n            log(\"Unexpected scriptable proxy slot call preamble version\", LogError);\n            Q_ASSERT(false);\n            return QByteArray();\n        }\n\n        stream >> functionCallId;\n        if (stream.status() != QDataStream::Ok) {\n            log(\"Failed to read scriptable proxy slot call ID\", LogError);\n            Q_ASSERT(false);\n            return QByteArray();\n        }\n\n        stream >> slotName;\n        if (stream.status() != QDataStream::Ok) {\n            log(\"Failed to read scriptable proxy slot call name\", LogError);\n            Q_ASSERT(false);\n            return QByteArray();\n        }\n\n        stream >> arguments;\n        if (stream.status() != QDataStream::Ok) {\n            log(\"Failed to read scriptable proxy slot call\", LogError);\n            Q_ASSERT(false);\n            return QByteArray();\n        }\n    }\n\n    const auto slotIndex = metaObject()->indexOfSlot(slotName);\n    if (slotIndex == -1) {\n        log(\"Failed to find scriptable proxy slot: \" + slotName, LogError);\n        Q_ASSERT(false);\n        return QByteArray();\n    }\n\n    const auto metaMethod = metaObject()->method(slotIndex);\n    const auto typeId = metaMethod.returnType();\n\n    QGenericArgument args[9];\n    for (int i = 0; i < arguments.size(); ++i) {\n        auto &value = arguments[i];\n        const int argumentTypeId = metaMethod.parameterType(i);\n        if (argumentTypeId == QMetaType::QVariant) {\n            args[i] = QGenericArgument( \"QVariant\", static_cast<void*>(value.data()) );\n        } else if ( value.userType() == argumentTypeId ) {\n            args[i] = QGenericArgument( value.typeName(), static_cast<void*>(value.data()) );\n        } else {\n            log( QString(\"Bad argument type (at index %1) for scriptable proxy slot: %2\")\n                 .arg(i)\n                 .arg(metaMethod.methodSignature().constData()), LogError);\n            Q_ASSERT(false);\n            return QByteArray();\n        }\n    }\n\n    QVariant returnValue;\n    bool called;\n\n    if (typeId == QMetaType::Void) {\n        called = metaMethod.invoke(\n                this, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);\n    } else {\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n        const QMetaType metaType(typeId);\n        COPYQ_LOG_VERBOSE(QStringLiteral(\"Script function return type: %1\").arg(metaType.name()));\n        Q_ASSERT(metaType.hasRegisteredDataStreamOperators());\n        returnValue = QVariant(metaType, nullptr);\n#else\n        returnValue = QVariant(typeId, nullptr);\n#endif\n        const auto genericReturnValue = returnValue.isValid()\n                ? QGenericReturnArgument( returnValue.typeName(), static_cast<void*>(returnValue.data()) )\n                : QGenericReturnArgument( \"QVariant\", static_cast<void*>(returnValue.data()) );\n\n        called = metaMethod.invoke(\n                this, genericReturnValue,\n                args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);\n    }\n\n    if (!called) {\n        log( QString(\"Bad scriptable proxy slot call: %1\")\n             .arg(metaMethod.methodSignature().constData()), LogError);\n        Q_ASSERT(false);\n    }\n\n    QByteArray bytes;\n    {\n        QDataStream stream(&bytes, QIODevice::WriteOnly);\n        stream << functionCallId << returnValue;\n        if (stream.status() != QDataStream::Ok) {\n            log(\"Failed to write scriptable proxy slot call return value\", LogError);\n            Q_ASSERT(false);\n        }\n    }\n\n    return bytes;\n}\n\nvoid ScriptableProxy::setFunctionCallReturnValue(const QByteArray &bytes)\n{\n    QDataStream stream(bytes);\n    int functionCallId;\n    QVariant returnValue;\n    stream >> functionCallId >> returnValue;\n    if (stream.status() != QDataStream::Ok) {\n        log(\"Failed to read scriptable proxy slot call return value\", LogError);\n        Q_ASSERT(false);\n        return;\n    }\n    emit functionCallFinished(functionCallId, returnValue);\n}\n\nvoid ScriptableProxy::setInputDialogResult(const QByteArray &bytes)\n{\n    QDataStream stream(bytes);\n    int dialogId;\n    NamedValueList result;\n    stream >> dialogId >> result;\n    if (stream.status() != QDataStream::Ok) {\n        log(\"Failed to read input dialog result\", LogError);\n        Q_ASSERT(false);\n        return;\n    }\n    emit inputDialogFinished(dialogId, result);\n}\n\nvoid ScriptableProxy::safeDeleteLater()\n{\n    m_shouldBeDeleted = true;\n    if (m_functionCallStack == 0)\n        deleteLater();\n}\n\nvoid ScriptableProxy::disconnectClient()\n{\n    m_disconnected = true;\n    abortEvaluation();\n}\n\nvoid ScriptableProxy::abortEvaluation()\n{\n    emit abortEvaluationRequest();\n}\n\nQVariantMap ScriptableProxy::getActionData(int id)\n{\n    constexpr bool hasPriority = true;\n    INVOKE(getActionData, (id));\n    m_actionData = m_wnd->actionData(id);\n    m_actionId = id;\n    emit actionIdChanged(id);\n\n    auto data = m_actionData;\n    data.remove(mimeSelectedItems);\n    data.remove(mimeCurrentItem);\n    return data;\n}\n\nvoid ScriptableProxy::setActionData(int id, const QVariantMap &data)\n{\n    INVOKE2(setActionData, (id, data));\n    m_wnd->setActionData(id, data);\n}\n\nvoid ScriptableProxy::exit()\n{\n    constexpr bool hasPriority = true;\n    INVOKE2(exit, ());\n    qApp->quit();\n}\n\nvoid ScriptableProxy::close()\n{\n    INVOKE2(close, ());\n    m_wnd->hideWindow();\n}\n\nbool ScriptableProxy::focusPrevious()\n{\n    INVOKE(focusPrevious, ());\n    return m_wnd->focusPrevious();\n}\n\nbool ScriptableProxy::showWindow()\n{\n    INVOKE(showWindow, ());\n    m_wnd->showWindow();\n    return m_wnd->isVisible();\n}\n\nbool ScriptableProxy::showWindowAt(QRect rect)\n{\n    INVOKE(showWindowAt, (rect));\n    setGeometryWithoutSave(m_wnd, rect);\n    return showWindow();\n}\n\nbool ScriptableProxy::pasteToCurrentWindow()\n{\n    INVOKE(pasteToCurrentWindow, ());\n\n    PlatformWindowPtr window = platformNativeInterface()->getCurrentWindow();\n    if (!window) {\n        log(\"Failed to get current window for pasting from clipboard\", LogWarning);\n        return false;\n    }\n\n    return window->pasteFromClipboard();\n}\n\nbool ScriptableProxy::copyFromCurrentWindow()\n{\n    INVOKE(copyFromCurrentWindow, ());\n\n    PlatformWindowPtr window = platformNativeInterface()->getCurrentWindow();\n    if (!window) {\n        log(\"Failed to get current window for copying to clipboard\", LogWarning);\n        return false;\n    }\n\n    return window->copyToClipboard();\n}\n\nbool ScriptableProxy::isMonitoringEnabled()\n{\n    INVOKE(isMonitoringEnabled, ());\n    return m_wnd->isMonitoringEnabled();\n}\n\nbool ScriptableProxy::isMainWindowVisible()\n{\n    INVOKE(isMainWindowVisible, ());\n    return !m_wnd->isMinimized() && m_wnd->isVisible();\n}\n\nbool ScriptableProxy::isMainWindowFocused()\n{\n    INVOKE(isMainWindowFocused, ());\n    return m_wnd->isActiveWindow();\n}\n\nbool ScriptableProxy::preview(const QVariant &arg)\n{\n    INVOKE(preview, (arg));\n\n    const bool wasVisible = m_wnd->isItemPreviewVisible();\n\n    if ( arg.isValid() ) {\n        const bool enable =\n                arg.canConvert<bool>() ? arg.toBool()\n              : arg.canConvert<int>() ? arg.toInt() != 0\n              : arg.toString() == QLatin1String(\"true\");\n        m_wnd->setItemPreviewVisible(enable);\n    }\n\n    return wasVisible;\n}\n\nvoid ScriptableProxy::disableMonitoring(bool arg1)\n{\n    INVOKE2(disableMonitoring, (arg1));\n    m_wnd->disableClipboardStoring(arg1);\n}\n\nvoid ScriptableProxy::setClipboard(const QVariantMap &data, ClipboardMode mode)\n{\n    INVOKE2(setClipboard, (data, mode));\n    m_wnd->setClipboard(data, mode);\n}\n\nbool ScriptableProxy::registerClipboardProviderAction(int actionId, ClipboardMode mode)\n{\n    INVOKE(registerClipboardProviderAction, (actionId, mode));\n    const bool ok = m_wnd->registerClipboardProviderAction(actionId, mode);\n    if (ok)\n        emit clipboardProviderRegistered(m_clientSocketId, mode);\n    return ok;\n}\n\nQString ScriptableProxy::renameTab(const QString &arg1, const QString &arg2)\n{\n    INVOKE(renameTab, (arg1, arg2));\n\n    if ( arg1.isEmpty() || arg2.isEmpty() )\n        return tabNameEmptyError();\n\n    const int i = m_wnd->findTabIndex(arg2);\n    if (i == -1)\n        return tabNotFoundError();\n\n    if ( m_wnd->findTabIndex(arg1) != -1 )\n        return ScriptableProxy::tr(\"Tab with given name already exists!\");\n\n    m_wnd->renameTab(arg1, i);\n\n    return QString();\n}\n\nQString ScriptableProxy::removeTab(const QString &arg1)\n{\n    INVOKE(removeTab, (arg1));\n\n    if ( arg1.isEmpty() )\n        return tabNameEmptyError();\n\n    const int i = m_wnd->findTabIndex(arg1);\n    if (i == -1)\n        return tabNotFoundError();\n\n    m_wnd->removeTab(false, i);\n    return QString();\n}\n\nQString ScriptableProxy::tabIcon(const QString &tabName)\n{\n    INVOKE(tabIcon, (tabName));\n    return getIconNameForTabName(tabName);\n}\n\nvoid ScriptableProxy::setTabIcon(const QString &tabName, const QString &icon)\n{\n    INVOKE2(setTabIcon, (tabName, icon));\n    m_wnd->setTabIcon(tabName, icon);\n}\n\nQStringList ScriptableProxy::unloadTabs(const QStringList &tabs)\n{\n    INVOKE(unloadTabs, (tabs));\n    QStringList unloaded;\n    for (const auto &tab : tabs) {\n        if ( m_wnd->unloadTab(tab) )\n            unloaded.append(tab);\n    }\n    return unloaded;\n}\n\nvoid ScriptableProxy::forceUnloadTabs(const QStringList &tabs)\n{\n    INVOKE2(forceUnloadTabs, (tabs));\n    for (const auto &tab : tabs)\n        m_wnd->forceUnloadTab(tab);\n}\n\nbool ScriptableProxy::showBrowser(const QString &tabName)\n{\n    INVOKE(showBrowser, (tabName));\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (c)\n        m_wnd->showBrowser(c);\n    return m_wnd->isVisible();\n}\n\nbool ScriptableProxy::showBrowserAt(const QString &tabName, QRect rect)\n{\n    INVOKE(showBrowserAt, (tabName, rect));\n    setGeometryWithoutSave(m_wnd, rect);\n    return showBrowser(tabName);\n}\n\nvoid ScriptableProxy::action(const QVariantMap &arg1, const Command &arg2)\n{\n    INVOKE2(action, (arg1, arg2));\n    m_wnd->action(arg1, arg2, QModelIndex());\n}\n\nvoid ScriptableProxy::runInternalAction(const QVariantMap &data, const QString &command)\n{\n    INVOKE2(runInternalAction, (data, command));\n    auto action = new Action();\n    action->setCommand(command);\n    action->setData(data);\n    m_wnd->runInternalAction(action);\n}\n\nvoid ScriptableProxy::showMessage(const MessageData &messageData)\n{\n    INVOKE2(showMessage, (messageData));\n\n    auto notification = m_wnd->createNotification(messageData.notificationId);\n    notification->setTitle(messageData.title);\n    notification->setMessage(messageData.message, Qt::AutoText);\n    notification->setIcon(messageData.icon);\n    notification->setInterval(messageData.timeoutMs);\n    notification->setButtons(messageData.buttons.items);\n    notification->setUrgency(messageData.urgency);\n    notification->setPersistency(messageData.persistency);\n}\n\nQString ScriptableProxy::playSound(const QString &filePath, float volume)\n{\n    INVOKE(playSound, (filePath, volume));\n    return AudioPlayer::instance().play(filePath, volume);\n}\n\nQVariantMap ScriptableProxy::nextItem(const QString &tabName, int where)\n{\n    INVOKE(nextItem, (tabName, where));\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    if (!c)\n        return QVariantMap();\n\n    const int row = qMax(0, c->currentIndex().row()) + where;\n    const QModelIndex index = c->index(row);\n\n    if (!index.isValid())\n        return QVariantMap();\n\n    c->selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);\n    return c->copyIndex(index);\n}\n\nvoid ScriptableProxy::browserMoveToClipboard(const QString &tabName, int row)\n{\n    INVOKE2(browserMoveToClipboard, (tabName, row));\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    m_wnd->moveToClipboard(c, row);\n}\n\nvoid ScriptableProxy::browserSetCurrent(const QString &tabName, int arg1)\n{\n    INVOKE2(browserSetCurrent, (tabName, arg1));\n    BROWSER(tabName, setCurrent(arg1));\n}\n\nQString ScriptableProxy::browserRemoveRows(const QString &tabName, QVector<int> rows)\n{\n    INVOKE(browserRemoveRows, (tabName, rows));\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (!c)\n        return QStringLiteral(\"Invalid tab\");\n\n    std::sort( rows.begin(), rows.end(), std::greater<int>() );\n\n    QModelIndexList indexes;\n    indexes.reserve(rows.size());\n\n    for (int row : rows) {\n        const QModelIndex indexToRemove = c->index(row);\n        if ( indexToRemove.isValid() )\n            indexes.append(indexToRemove);\n    }\n\n    QString error;\n    c->removeIndexes(indexes, &error);\n\n    if ( !error.isEmpty() )\n        return error;\n\n    return QString();\n}\n\nvoid ScriptableProxy::browserMoveSelected(int targetRow, const QString &tabName)\n{\n    INVOKE2(browserMoveSelected, (targetRow, tabName));\n\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    if (c == nullptr)\n        return;\n\n    QList<QPersistentModelIndex> selected = selectedIndexes(c);\n    selectionRemoveInvalid(&selected);\n\n    QModelIndexList indexes;\n    indexes.reserve(selected.size());\n    for (const auto &index : selected)\n        indexes.append(index);\n    c->move(indexes, targetRow);\n}\n\nvoid ScriptableProxy::browserEditRow(const QString &tabName, int row, const QString &format)\n{\n    INVOKE2(browserEditRow, (tabName, row, format));\n    BROWSER(tabName, editRow(row, format));\n}\n\nvoid ScriptableProxy::browserEditNew(const QString &tabName, const QString &format, const QByteArray &content, bool changeClipboard)\n{\n    INVOKE2(browserEditNew, (tabName, format, content, changeClipboard));\n    BROWSER(tabName, editNew(format, content, changeClipboard));\n}\n\nQStringList ScriptableProxy::tabs()\n{\n    INVOKE(tabs, ());\n    return m_wnd->tabs();\n}\n\nbool ScriptableProxy::toggleVisible()\n{\n    INVOKE(toggleVisible, ());\n    return m_wnd->toggleVisible();\n}\n\nbool ScriptableProxy::toggleMenu(const QString &tabName, int maxItemCount, QPoint position)\n{\n    INVOKE(toggleMenu, (tabName, maxItemCount, position));\n    return m_wnd->toggleMenu(tabName, maxItemCount, position);\n}\n\nbool ScriptableProxy::toggleCurrentMenu()\n{\n    INVOKE(toggleCurrentMenu, ());\n    return m_wnd->toggleMenu();\n}\n\nint ScriptableProxy::findTabIndex(const QString &arg1)\n{\n    INVOKE(findTabIndex, (arg1));\n    return m_wnd->findTabIndex(arg1);\n}\n\nint ScriptableProxy::menuItems(const VariantMapList &items)\n{\n    INVOKE(menuItems, (items));\n\n    TrayMenu menu;\n    menu.setObjectName(\"CustomMenu\");\n    menu.setRowIndexFromOne( AppConfig().option<Config::row_index_from_one>() );\n\n    const auto addMenuItems = [&](const QString &searchText) {\n        menu.clearClipboardItems();\n        for (const QVariantMap &data : items.items) {\n            const QString text = getTextData(data);\n            if ( text.contains(searchText, Qt::CaseInsensitive) )\n                menu.addClipboardItemAction(data, true);\n        }\n    };\n    addMenuItems(QString());\n\n    connect(&menu, &TrayMenu::searchRequest, addMenuItems);\n\n    const QPoint pos = QCursor::pos();\n    QAction *act = menu.exec(pos);\n    if (act == nullptr)\n        return -1;\n\n    return items.items.indexOf(act->data().toMap());\n}\n\nvoid ScriptableProxy::openActionDialog(const QVariantMap &arg1)\n{\n    INVOKE2(openActionDialog, (arg1));\n    m_wnd->openActionDialog(arg1);\n}\n\nbool ScriptableProxy::loadTab(const QString &fileName)\n{\n    INVOKE(loadTab, (fileName));\n    return m_wnd->loadTab(fileName);\n}\n\nbool ScriptableProxy::saveTab(\n    const QString &tabName, const QString &fileName)\n{\n    INVOKE(saveTab, (tabName, fileName));\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (!c)\n        return false;\n\n    const int i = m_wnd->findTabIndex( c->tabName() );\n    return m_wnd->saveTab(fileName, i);\n}\n\nbool ScriptableProxy::importData(const QString &fileName)\n{\n    INVOKE(importData, (fileName));\n    return m_wnd->importDataFrom(fileName, ImportOptions::All);\n}\n\nbool ScriptableProxy::exportData(const QString &fileName)\n{\n    INVOKE(exportData, (fileName));\n    return m_wnd->exportAllData(fileName);\n}\n\nQVariant ScriptableProxy::config(const QVariantList &nameValue)\n{\n    INVOKE(config, (nameValue));\n    return m_wnd->config(nameValue);\n}\n\nQString ScriptableProxy::configDescription()\n{\n    INVOKE(configDescription, ());\n    return m_wnd->configDescription();\n}\n\nQVariant ScriptableProxy::toggleConfig(const QString &optionName)\n{\n    INVOKE(toggleConfig, (optionName));\n\n    QVariantList nameValue;\n    nameValue.append(optionName);\n    const auto values = m_wnd->config(nameValue);\n    if ( values.type() == QVariant::StringList )\n        return values;\n\n    const auto oldValue = values.toMap().constBegin().value();\n    if ( oldValue.type() != QVariant::Bool )\n        return QVariant();\n\n    const auto newValue = !QVariant(oldValue).toBool();\n    nameValue.append(newValue);\n    return m_wnd->config(nameValue).toMap().constBegin().value();\n}\n\nint ScriptableProxy::browserLength(const QString &tabName)\n{\n    INVOKE(browserLength, (tabName));\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    return c ? c->length() : 0;\n}\n\nbool ScriptableProxy::browserOpenEditor(\n    const QString &tabName, int row, const QString &format, const QByteArray &content, bool changeClipboard)\n{\n    INVOKE(browserOpenEditor, (tabName, row, format, content, changeClipboard));\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (!c)\n        return false;\n\n    const auto index = c->index(row);\n    return c->openEditor(index, format, content, changeClipboard);\n}\n\nQString ScriptableProxy::browserInsert(const QString &tabName, int row, const VariantMapList &items)\n{\n    INVOKE(browserInsert, (tabName, row, items));\n\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (!c)\n        return QStringLiteral(\"Invalid tab\");\n\n    if ( !c->allocateSpaceForNewItems(items.items.size()) )\n        return QStringLiteral(\"Tab is full (cannot remove any items)\");\n\n    if ( !c->addReversed(items.items, row) )\n        return QStringLiteral(\"Failed to add items\");\n\n    return QString();\n}\n\nQString ScriptableProxy::browserChange(const QString &tabName, int row, const VariantMapList &items)\n{\n    INVOKE(browserChange, (tabName, row, items));\n\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (!c)\n        return QStringLiteral(\"Invalid tab\");\n\n    QMap<QPersistentModelIndex, QVariantMap> itemsData;\n\n    int currentRow = row;\n    for (const auto &data : items.items) {\n        const auto index = c->index(currentRow);\n        QVariantMap itemData = index.data(contentType::data).toMap();\n        for (auto it = data.constBegin(); it != data.constEnd(); ++it) {\n            if ( it.value().isValid() )\n                itemData.insert( it.key(), it.value() );\n            else\n                itemData.remove( it.key() );\n        }\n        itemsData[index] = itemData;\n        ++currentRow;\n    }\n    c->setItemsData(itemsData);\n\n    return QString();\n}\n\nQByteArray ScriptableProxy::browserItemData(const QString &tabName, int arg1, const QString &arg2)\n{\n    INVOKE(browserItemData, (tabName, arg1, arg2));\n    return itemData(tabName, arg1, arg2);\n}\n\nQVariantMap ScriptableProxy::browserItemData(const QString &tabName, int arg1)\n{\n    INVOKE(browserItemData, (tabName, arg1));\n    return itemData(tabName, arg1);\n}\n\nvoid ScriptableProxy::setCurrentTab(const QString &tabName)\n{\n    INVOKE2(setCurrentTab, (tabName));\n    m_wnd->addAndFocusTab(tabName);\n}\n\nQString ScriptableProxy::tab(const QString &tabName)\n{\n    INVOKE(tab, (tabName));\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    return c ? c->tabName() : QString();\n}\n\nint ScriptableProxy::currentItem(const QString &tabName)\n{\n    INVOKE(currentItem, (tabName));\n\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    if (!c)\n        return -1;\n\n    const QPersistentModelIndex current = currentIndex(c);\n    return current.isValid() ? current.row() : -1;\n}\n\nbool ScriptableProxy::selectItems(const QString &tabName, const QVector<int> &rows)\n{\n    INVOKE(selectItems, (tabName, rows));\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (!c)\n        return false;\n\n    c->clearSelection();\n\n    if ( !rows.isEmpty() ) {\n        c->setCurrent(rows.last());\n\n        for (int i : rows) {\n            const QModelIndex index = c->index(i);\n            if ( index.isValid() && !c->isFiltered(i) )\n                c->selectionModel()->select(index, QItemSelectionModel::Select);\n        }\n    }\n\n    return true;\n}\n\nQVector<int> ScriptableProxy::selectedItems(const QString &tabName)\n{\n    INVOKE(selectedItems, (tabName));\n\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    if (c == nullptr)\n        return {};\n\n    QVector<int> selectedRows;\n    QList<QPersistentModelIndex> selected = selectedIndexes(c);\n    selectedRows.reserve(selected.count());\n\n    for (const auto &index : selected)\n        selectedRows.append(index.row());\n\n    return selectedRows;\n}\n\nQString ScriptableProxy::selectedTab()\n{\n    INVOKE(selectedTab, ());\n\n    ClipboardBrowser *c = selectedBrowser();\n    return (c != nullptr)\n        ? c->tabName()\n        : m_actionData.value(mimeCurrentTab).toString();\n}\n\nQVariantMap ScriptableProxy::selectedItemData(int selectedIndex, const QString &tabName)\n{\n    INVOKE(selectedItemData, (selectedIndex, tabName));\n\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    if (c == nullptr)\n        return {};\n\n    const auto index = selectedIndexes().value(selectedIndex);\n    if ( !index.isValid() )\n        return {};\n\n    return c->copyIndex(index);\n}\n\nbool ScriptableProxy::setSelectedItemData(int selectedIndex, const QVariantMap &data, const QString &tabName)\n{\n    INVOKE(setSelectedItemData, (selectedIndex, data, tabName));\n\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (c == nullptr)\n        return {};\n\n    const auto index = selectedIndexes(c).value(selectedIndex);\n    if ( !index.isValid() )\n        return false;\n\n    return c->model()->setData(index, data, contentType::data);\n}\n\nVariantMapList ScriptableProxy::selectedItemsData(const QString &tabName)\n{\n    INVOKE(selectedItemsData, (tabName));\n\n    ClipboardBrowser *c = fetchExistingBrowser(tabName);\n    if (c == nullptr)\n        return {};\n\n    QList<QPersistentModelIndex> selected = selectedIndexes(c);\n    QVector<QVariantMap> dataList;\n    dataList.reserve(selected.size());\n\n    for (const auto &index : selected)\n        dataList.append( c->copyIndex(index) );\n\n    return {dataList};\n}\n\nvoid ScriptableProxy::setSelectedItemsData(const VariantMapList &dataList, const QString &tabName)\n{\n    INVOKE2(setSelectedItemsData, (dataList, tabName));\n\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (c == nullptr)\n        return;\n\n    const QList<QPersistentModelIndex> selected = selectedIndexes(c);\n    QMap<QPersistentModelIndex, QVariantMap> itemsData;\n    const auto count = std::min( selected.size(), dataList.items.size() );\n    for ( int i = 0; i < count; ++i ) {\n        const auto &index = selected[i];\n        if ( index.isValid() )\n            itemsData[index] = dataList.items[i];\n    }\n\n    c->setItemsData(itemsData);\n}\n\nint ScriptableProxy::createSelection(const QString &tabName)\n{\n    INVOKE(createSelection, (tabName));\n    const int newSelectionId = ++m_lastSelectionId;\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (c)\n        m_selections[newSelectionId] = {c, {}};\n    return newSelectionId;\n}\n\nint ScriptableProxy::selectionCopy(int id)\n{\n    INVOKE(selectionCopy, (id));\n    const int newSelectionId = ++m_lastSelectionId;\n    auto selection = m_selections.value(id);\n    if (selection.browser)\n        m_selections[newSelectionId] = selection;\n    return newSelectionId;\n}\n\nvoid ScriptableProxy::destroySelection(int id)\n{\n    INVOKE2(destroySelection, (id));\n    m_selections.remove(id);\n}\n\nvoid ScriptableProxy::selectionRemoveAll(int id)\n{\n    INVOKE2(selectionRemoveAll, (id));\n    auto selection = m_selections.take(id);\n    if (!selection.browser)\n        return;\n    selectionRemoveInvalid(&selection.indexes);\n\n    QModelIndexList indexes;\n    for (const auto &index : selection.indexes)\n        indexes.append(index);\n\n    selection.browser->removeIndexes(indexes);\n\n    selectionRemoveInvalid(&selection.indexes);\n    m_selections[id] = selection;\n}\n\nvoid ScriptableProxy::selectionSelectRemovable(int id)\n{\n    INVOKE2(selectionSelectRemovable, (id));\n    auto selection = m_selections.take(id);\n    if (!selection.browser)\n        return;\n\n    // Use error argument for canRemoveItems() to ensure that a message dialog is not shown.\n    QString error;\n    QList<QPersistentModelIndex> indexes;\n    for (int row = 0; row < selection.browser->length(); ++row) {\n        const auto index = selection.browser->index(row);\n        if ( !selection.indexes.contains(index) && selection.browser->canRemoveItems({index}, &error) )\n            indexes.append(index);\n    }\n    selection.indexes.append(indexes);\n    m_selections[id] = selection;\n}\n\nvoid ScriptableProxy::selectionInvert(int id)\n{\n    INVOKE2(selectionInvert, (id));\n    auto selection = m_selections.take(id);\n    if (!selection.browser)\n        return;\n\n    QList<QPersistentModelIndex> indexes;\n    for (int row = 0; row < selection.browser->length(); ++row) {\n        const auto index = selection.browser->index(row);\n        if ( !selection.indexes.contains(index) )\n            indexes.append(index);\n    }\n    selection.indexes = indexes;\n    m_selections[id] = selection;\n}\n\nvoid ScriptableProxy::selectionSelectAll(int id)\n{\n    INVOKE2(selectionSelectAll, (id));\n    auto selection = m_selections.take(id);\n    if (!selection.browser)\n        return;\n\n    selection.indexes.clear();\n    for (int row = 0; row < selection.browser->length(); ++row)\n        selection.indexes.append(selection.browser->index(row));\n    m_selections[id] = selection;\n}\n\nvoid ScriptableProxy::selectionSelect(int id, const QVariant &maybeRe, const QString &mimeFormat)\n{\n    INVOKE2(selectionSelect, (id, maybeRe, mimeFormat));\n    auto selection = m_selections.take(id);\n    if (!selection.browser)\n        return;\n\n    const QRegularExpression re = maybeRe.toRegularExpression();\n    QList<QPersistentModelIndex> indexes;\n    for (int row = 0; row < selection.browser->length(); ++row) {\n        const auto index = selection.browser->index(row);\n        if ( selection.indexes.contains(index) )\n            continue;\n\n        const QVariantMap dataMap = index.data(contentType::data).toMap();\n        if ( mimeFormat.isEmpty() ) {\n            if ( !maybeRe.isValid() )\n                continue;\n            const QString text = getTextData(dataMap);\n            if ( text.contains(re) )\n                indexes.append(index);\n        } else if ( dataMap.contains(mimeFormat) == maybeRe.isValid() ) {\n            const QString text = getTextData(dataMap, mimeFormat);\n            if ( text.contains(re) )\n                indexes.append(index);\n        }\n    }\n    selection.indexes.append(indexes);\n    m_selections[id] = selection;\n}\n\nvoid ScriptableProxy::selectionDeselectIndexes(int id, const QVector<int> &indexes)\n{\n    INVOKE2(selectionDeselectIndexes, (id, indexes));\n\n    auto selection = m_selections.take(id);\n    auto indexesSorted = indexes;\n    std::sort(indexesSorted.begin(), indexesSorted.end(), std::greater<int>());\n    for (int index : indexesSorted)\n        selection.indexes.removeAt(index);\n    m_selections[id] = selection;\n}\n\nvoid ScriptableProxy::selectionDeselectSelection(int id, int toDeselectId)\n{\n    INVOKE2(selectionDeselectSelection, (id, toDeselectId));\n    auto selection = m_selections.take(id);\n    const auto deselection = m_selections.value(toDeselectId);\n\n    selectionRemoveIf(\n        &selection.indexes,\n        [&](const QPersistentModelIndex &index){\n            return !index.isValid() || deselection.indexes.contains(index);\n        });\n    m_selections[id] = selection;\n}\n\nvoid ScriptableProxy::selectionGetCurrent(int id)\n{\n    INVOKE2(selectionGetCurrent, (id));\n\n    ClipboardBrowser *c = m_selections.value(id).browser;\n    if (c == nullptr)\n        return;\n\n    QList<QPersistentModelIndex> selected = selectedIndexes(c);\n    m_selections[id] = {c, selected};\n}\n\nint ScriptableProxy::selectionGetSize(int id)\n{\n    INVOKE(selectionGetSize, (id));\n    return m_selections.value(id).indexes.size();\n}\n\nQString ScriptableProxy::selectionGetTabName(int id)\n{\n    INVOKE(selectionGetTabName, (id));\n    const auto selection = m_selections.value(id);\n    return selection.browser ? selection.browser->tabName() : QString();\n}\n\nQVector<int> ScriptableProxy::selectionGetRows(int id)\n{\n    INVOKE(selectionGetRows, (id));\n\n    auto selection = m_selections.value(id);\n    QVector<int> rows;\n    rows.reserve(selection.indexes.size());\n    for (const auto &index : selection.indexes)\n        rows.append(index.row());\n    return rows;\n}\n\nQVariantMap ScriptableProxy::selectionGetItemIndex(int id, int index)\n{\n    INVOKE(selectionGetItemIndex, (id, index));\n\n    auto selection = m_selections.value(id);\n    if ( selection.indexes.isEmpty() || index < 0 || index >= selection.indexes.size() )\n        return {};\n\n    return selection.indexes[index].data(contentType::data).toMap();\n}\n\nvoid ScriptableProxy::selectionSetItemIndex(int id, int index, const QVariantMap &item)\n{\n    INVOKE2(selectionSetItemIndex, (id, index, item));\n\n    const auto selection = m_selections.value(id);\n    if ( !selection.browser || index < 0 || index >= selection.indexes.size() )\n        return;\n\n    const QModelIndex ind = selection.indexes[index];\n    selection.browser->model()->setData(ind, item, contentType::data);\n}\n\nQVariantList ScriptableProxy::selectionGetItemsData(int id)\n{\n    INVOKE(selectionGetItemsData, (id));\n\n    QVariantList dataList;\n    const auto selection = m_selections.value(id);\n    for (const auto &index : selection.indexes) {\n        const auto data = index.data(contentType::data).toMap();\n        dataList.append(data);\n    }\n    return dataList;\n}\n\nvoid ScriptableProxy::selectionSetItemsData(int id, const QVariantList &dataList)\n{\n    INVOKE2(selectionSetItemsData, (id, dataList));\n\n    QMap<QPersistentModelIndex, QVariantMap> itemsData;\n    const auto selection = m_selections.value(id);\n    const auto count = std::min( selection.indexes.size(), dataList.size() );\n    for ( int i = 0; i < count; ++i ) {\n        const auto &index = selection.indexes[i];\n        if ( index.isValid() )\n            itemsData[index] = dataList[i].toMap();\n    }\n\n    selection.browser->setItemsData(itemsData);\n}\n\nQVariantList ScriptableProxy::selectionGetItemsFormat(int id, const QString &format)\n{\n    INVOKE(selectionGetItemsFormat, (id, format));\n\n    QVariantList dataList;\n    const auto selection = m_selections.value(id);\n    for (const auto &index : selection.indexes) {\n        const auto data = index.data(contentType::data).toMap();\n        dataList.append( data.value(format) );\n    }\n    return dataList;\n}\n\nvoid ScriptableProxy::selectionSetItemsFormat(int id, const QString &mime, const QVariant &value)\n{\n    INVOKE2(selectionSetItemsFormat, (id, mime, value));\n\n    const auto selection = m_selections.value(id);\n    setItemsData(selection.browser, selection.indexes, mime, value);\n}\n\nvoid ScriptableProxy::selectionMove(int id, int row)\n{\n    INVOKE2(selectionMove, (id, row));\n    auto selection = m_selections.value(id);\n    if (!selection.browser)\n        return;\n\n    QModelIndexList indexes;\n    indexes.reserve(selection.indexes.size());\n    for (const auto &index : selection.indexes) {\n        if (index.isValid())\n            indexes.append(index);\n    }\n\n    if ( !indexes.isEmpty() )\n        selection.browser->move(indexes, row);\n}\n\nvoid ScriptableProxy::selectionSort(int id, const QVector<int> &indexes)\n{\n    INVOKE2(selectionSort, (id, indexes));\n\n    auto selection = m_selections.value(id);\n\n    QList<QPersistentModelIndex> sorted;\n    sorted.reserve( indexes.size() );\n    for (const int i : indexes) {\n        if (i < 0 || i >= selection.indexes.size())\n            continue;\n\n        const auto index = selection.indexes[i];\n        if ( index.isValid() )\n            sorted.append(index);\n    }\n    selection.indexes = sorted;\n\n    if ( !sorted.isEmpty() )\n        selection.browser->sortItems(sorted);\n}\n\nQVariant ScriptableProxy::callPlugin(const QVariantList &arguments)\n{\n    constexpr bool hasPriority = true;\n    INVOKE(callPlugin, (arguments));\n    return m_wnd->callPlugin(arguments);\n}\n\nQString ScriptableProxy::testSelected()\n{\n    INVOKE(testSelected, ());\n\n    ClipboardBrowser *browser = m_wnd->browser();\n    if (!browser)\n        return QString();\n\n    if (browser->length() == 0)\n        return browser->tabName();\n\n    QModelIndexList selectedIndexes = browser->selectionModel()->selectedIndexes();\n\n    QStringList result;\n    result.reserve( selectedIndexes.size() + 1 );\n\n    const QModelIndex currentIndex = browser->currentIndex();\n    result.append(\n        currentIndex.isValid() && !browser->isIndexHidden(currentIndex)\n        ? QString::number(currentIndex.row()) : \"_\");\n\n    QList<int> selectedRows;\n    selectedRows.reserve( selectedIndexes.size() );\n    for (const auto &index : selectedIndexes) {\n        if ( !browser->isIndexHidden(index) )\n            selectedRows.append(index.row());\n    }\n\n    for (int row : selectedRows)\n        result.append(QString::number(row));\n\n    return browser->tabName() + \" \" + result.join(\" \");\n}\n\nvoid ScriptableProxy::serverLog(const QString &text)\n{\n    INVOKE2(serverLog, (text));\n    log(text, LogAlways);\n}\n\nQString ScriptableProxy::currentWindowTitle()\n{\n    INVOKE(currentWindowTitle, ());\n    PlatformWindowPtr window = platformNativeInterface()->getCurrentWindow();\n    return window ? window->getTitle() : QString();\n}\n\nint ScriptableProxy::inputDialog(const NamedValueList &values)\n{\n    INVOKE(inputDialog, (values));\n\n    InputDialog inputDialog;\n    inputDialog.dialog = new QDialog(m_wnd);\n    QDialog &dialog = *inputDialog.dialog;\n    dialog.setLayout(new QVBoxLayout(&dialog));\n\n    QString dialogTitle;\n    QIcon icon;\n    QWidgetList widgets;\n    widgets.reserve(values.items.size());\n\n    QString styleSheet;\n    QRect geometry(-1, -1, 0, 0);\n\n    auto area = new QScrollArea(&dialog);\n    area->setFocusPolicy(Qt::NoFocus);\n    area->setBackgroundRole(QPalette::Window);\n    area->setFrameShape(QFrame::NoFrame);\n    area->setWidgetResizable(true);\n    dialog.layout()->addWidget(area);\n    auto parent = new QWidget(area);\n    parent->setLayout(new QVBoxLayout(parent));\n    area->setWidget(parent);\n    inputDialog.parent = parent;\n\n    for (const auto &value : values.items) {\n        if (value.name == \".title\")\n            dialogTitle = value.value.toString();\n        else if (value.name == \".icon\")\n            icon = loadIcon(value.value.toString());\n        else if (value.name == \".style\")\n            styleSheet = value.value.toString();\n        else if (value.name == \".height\")\n            geometry.setHeight( pointsToPixels(value.value.toInt()) );\n        else if (value.name == \".width\")\n            geometry.setWidth( pointsToPixels(value.value.toInt()) );\n        else if (value.name == \".x\")\n            geometry.setX(value.value.toInt());\n        else if (value.name == \".y\")\n            geometry.setY(value.value.toInt());\n        else if (value.name == \".label\")\n            createAndSetWidget<QLabel>(\"text\", value.value, parent);\n        else if (value.name == \".defaultChoice\")\n            inputDialog.defaultChoice = value.value.toString();\n        else if (value.name == \".modal\")\n            dialog.setModal(value.value.toBool());\n        else if (value.name == \".onTop\")\n            dialog.setWindowFlag(Qt::WindowStaysOnTopHint, value.value.toBool());\n        else\n            widgets.append( createWidget(value.name, value.value, &inputDialog) );\n    }\n\n    if ( !dialogTitle.isNull() ) {\n        dialog.setWindowTitle(dialogTitle);\n        dialog.setObjectName(QStringLiteral(\"dialog_\") + dialogTitle);\n        WindowGeometryGuard::create(&dialog);\n    }\n\n    // WORKAROUND for broken initial focus in Qt 6.6 (QTBUG-121514)\n    if (!widgets.isEmpty())\n        widgets.first()->setFocus();\n\n    if (geometry.height() == 0)\n        geometry.setHeight(dialog.height());\n    if (geometry.width() == 0)\n        geometry.setWidth(dialog.width());\n\n    if (geometry.isValid())\n        dialog.resize(geometry.size());\n    else\n        dialog.adjustSize();\n\n    if (geometry.x() >= 0 && geometry.y() >= 0)\n        dialog.move(geometry.topLeft());\n\n    if ( !styleSheet.isEmpty() )\n        dialog.setStyleSheet(styleSheet);\n\n    auto buttons = new QDialogButtonBox(\n                QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &dialog);\n    QObject::connect( buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept );\n    QObject::connect( buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject );\n    dialog.layout()->addWidget(buttons);\n\n    installShortcutToCloseDialog(&dialog, &dialog, Qt::ControlModifier | Qt::Key_Enter);\n    installShortcutToCloseDialog(&dialog, &dialog, Qt::ControlModifier | Qt::Key_Return);\n\n    if (icon.isNull())\n        icon = appIcon();\n    dialog.setWindowIcon(icon);\n\n    const int dialogId = ++m_lastInputDialogId;\n    connect(&dialog, &QDialog::finished, this, [this, dialogId, inputDialog, widgets]() {\n        if (inputDialog.dialog == nullptr)\n            return;\n\n        NamedValueList result;\n        result.items.reserve( widgets.size() );\n\n        if ( inputDialog.dialog->result() ) {\n            for ( auto w : widgets ) {\n                const QString propertyName = w->property(propertyWidgetProperty).toString();\n                const QString name = w->property(propertyWidgetName).toString();\n                const QVariant value = w->property(propertyName.toUtf8().constData());\n                result.items.append( NamedValue(name, value) );\n            }\n            if ( widgets.isEmpty() )\n                result.items.append( NamedValue(QString(), true) );\n        }\n\n        QByteArray bytes;\n        {\n            QDataStream stream(&bytes, QIODevice::WriteOnly);\n            stream << dialogId << result;\n        }\n\n        inputDialog.dialog->deleteLater();\n        emit sendMessage(bytes, CommandInputDialogFinished);\n    });\n\n    // Connecting this directly to QEventLoop::quit() doesn't seem to work always.\n    connect(this, &ScriptableProxy::abortEvaluationRequest, &dialog, &QDialog::reject);\n\n    dialog.show();\n\n    raiseWindow(&dialog);\n\n    return dialogId;\n}\n\nvoid ScriptableProxy::setSelectedItemsData(const QString &mime, const QVariant &value, const QString &tabName)\n{\n    INVOKE2(setSelectedItemsData, (mime, value, tabName));\n\n    ClipboardBrowser *c = fetchBrowser(tabName);\n    if (c == nullptr)\n        return;\n\n    QList<QPersistentModelIndex> selected = selectedIndexes(c);\n    selectionRemoveInvalid(&selected);\n    setItemsData(c, selected, mime, value);\n}\n\nvoid ScriptableProxy::filter(const QString &text)\n{\n    INVOKE2(filter, (text));\n    m_wnd->setFilter(text);\n}\n\nQString ScriptableProxy::filter()\n{\n    INVOKE(filter, ());\n    return m_wnd->filter();\n}\n\nQVector<Command> ScriptableProxy::commands()\n{\n    constexpr bool hasPriority = true;\n    INVOKE(commands, ());\n    return loadAllCommands();\n}\n\nvoid ScriptableProxy::setCommands(const QVector<Command> &commands)\n{\n    INVOKE2(setCommands, (commands));\n    m_wnd->setCommands(commands);\n}\n\nvoid ScriptableProxy::addCommands(const QVector<Command> &commands)\n{\n    INVOKE2(addCommands, (commands));\n    m_wnd->addCommands(commands);\n}\n\nQByteArray ScriptableProxy::screenshot(const QString &format, const QString &screenName, bool select)\n{\n    INVOKE(screenshot, (format, screenName, select));\n\n    QScreen *selectedScreen = nullptr;\n    if ( screenName.isEmpty() ) {\n        const auto mousePosition = QCursor::pos();\n        const int screenNumber = ::screenNumberAt(mousePosition);\n        if (screenNumber != -1)\n            selectedScreen = QGuiApplication::screens().value(screenNumber);\n    } else {\n        for ( const auto screen : QApplication::screens() ) {\n            if (screen->name() == screenName) {\n                selectedScreen = screen;\n                break;\n            }\n        }\n    }\n\n    if (!selectedScreen)\n        return QByteArray();\n\n    auto pixmap = selectedScreen->grabWindow(0);\n\n    const auto geometry = selectedScreen->geometry();\n\n    if (select) {\n        ScreenshotRectWidget rectWidget(pixmap);\n        rectWidget.setGeometry(geometry);\n        rectWidget.setWindowState(Qt::WindowFullScreen);\n        rectWidget.setWindowModality(Qt::ApplicationModal);\n        rectWidget.show();\n        raiseWindow(&rectWidget);\n\n        while ( !rectWidget.isHidden() )\n            QCoreApplication::processEvents();\n        const auto rect = rectWidget.selectionRect;\n        if ( rect.isValid() ) {\n            const auto ratio = pixelRatio(&pixmap);\n            const QRect rect2( rect.topLeft() * ratio, rect.size() * ratio );\n            pixmap = pixmap.copy(rect2);\n        }\n    }\n\n    QByteArray bytes;\n    {\n        QBuffer buffer(&bytes);\n        buffer.open(QIODevice::WriteOnly);\n        if ( !pixmap.save(&buffer, format.toUtf8().constData()) )\n            return QByteArray();\n    }\n\n    return bytes;\n}\n\nQStringList ScriptableProxy::screenNames()\n{\n    INVOKE(screenNames, ());\n\n    QStringList result;\n    const auto screens = QApplication::screens();\n    result.reserve( screens.size() );\n\n    for ( const auto screen : screens )\n        result.append(screen->name());\n\n    return result;\n}\n\nKeyboardModifierList ScriptableProxy::queryKeyboardModifiers()\n{\n    INVOKE(queryKeyboardModifiers, ());\n    return {QApplication::queryKeyboardModifiers()};\n}\n\nQPoint ScriptableProxy::pointerPosition()\n{\n    INVOKE(pointerPosition, ());\n    return QCursor::pos();\n}\n\nvoid ScriptableProxy::setPointerPosition(int x, int y)\n{\n    INVOKE2(setPointerPosition, (x, y));\n    const QPoint pos(x, y);\n    QScreen *screen = QGuiApplication::screenAt(pos);\n    if (screen)\n        QCursor::setPos(screen, pos);\n}\n\nQString ScriptableProxy::pluginsPath()\n{\n    INVOKE(pluginsPath, ());\n    return ::pluginsPath();\n}\n\nQString ScriptableProxy::themesPath()\n{\n    INVOKE(themesPath, ());\n    return ::themesPath();\n}\n\nQString ScriptableProxy::translationsPath()\n{\n    INVOKE(translationsPath, ());\n    return ::translationsPath();\n}\n\nQString ScriptableProxy::iconColor()\n{\n    INVOKE(iconColor, ());\n    const auto color = m_wnd->sessionIconColor();\n    return color.isValid() ? color.name() : QString();\n}\n\nbool ScriptableProxy::setIconColor(const QString &colorName)\n{\n    INVOKE(setIconColor, (colorName));\n\n    QColor color(colorName);\n    if ( !colorName.isEmpty() && !color.isValid() )\n        return false;\n\n    m_wnd->setSessionIconColor(color);\n    return true;\n}\n\nQString ScriptableProxy::iconTag()\n{\n    INVOKE(iconTag, ());\n    return m_wnd->sessionIconTag();\n}\n\nvoid ScriptableProxy::setIconTag(const QString &tag)\n{\n    INVOKE2(setIconTag, (tag));\n    m_wnd->setSessionIconTag(tag);\n}\n\nQString ScriptableProxy::iconTagColor()\n{\n    INVOKE(iconTagColor, ());\n    return m_wnd->sessionIconTagColor().name();\n}\n\nbool ScriptableProxy::setIconTagColor(const QString &colorName)\n{\n    INVOKE(setIconTagColor, (colorName));\n    QColor color(colorName);\n    if ( !color.isValid() )\n        return false;\n\n    m_wnd->setSessionIconTagColor(color);\n    return true;\n}\n\nvoid ScriptableProxy::setClipboardData(const QVariantMap &data)\n{\n    INVOKE2(setClipboardData, (data));\n    m_wnd->setClipboardData(data);\n}\n\nvoid ScriptableProxy::setTitle(const QString &title)\n{\n    INVOKE2(setTitle, (title));\n\n    if (title.isEmpty()) {\n        const QString defaultTitle = isMonitoringEnabled()\n            ? QString()\n            : tr(\"*Clipboard Storing Disabled*\", \"Main window title if clipboard storing is disabled\");\n        m_wnd->setWindowTitle(defaultTitle);\n        m_wnd->setTrayTooltip(defaultTitle);\n    } else {\n        m_wnd->setWindowTitle(title);\n        m_wnd->setTrayTooltip(title);\n    }\n}\n\nvoid ScriptableProxy::setTitleForData(const QVariantMap &data)\n{\n    INVOKE2(setTitleForData, (data));\n\n    const QString clipboardContent = textLabelForData(data);\n    setTitle(clipboardContent);\n}\n\nvoid ScriptableProxy::saveData(const QString &tab, const QVariantMap &data, ClipboardMode mode)\n{\n    INVOKE2(saveData, (tab, data, mode));\n\n    auto c = m_wnd->tab(tab);\n    if (c)\n        c->addUnique(data, mode);\n}\n\nvoid ScriptableProxy::showDataNotification(const QVariantMap &data)\n{\n    INVOKE2(showDataNotification, (data));\n\n    const AppConfig appConfig;\n    const auto maxLines = appConfig.option<Config::clipboard_notification_lines>();\n    if (maxLines <= 0)\n        return;\n\n    const auto intervalSeconds = appConfig.option<Config::item_popup_interval>();\n    if (intervalSeconds == 0)\n        return;\n\n    auto notification = m_wnd->createNotification(\"CopyQ_clipboard_notification\");\n    notification->setIcon(IconPaste);\n    notification->setInterval(intervalSeconds * 1000);\n\n    const int maximumWidthPoints = appConfig.option<Config::notification_maximum_width>();\n    const int width = pointsToPixels(maximumWidthPoints) - 16 - 8;\n\n    const QStringList formats = data.keys();\n    const int imageIndex = formats.indexOf(QRegularExpression(\"^image/.*\"));\n    const QFont &font = notification->widget()\n        ? notification->widget()->font()\n        : qApp->font();\n    const bool isHidden = data.contains(mimeHidden);\n\n    QString title;\n\n    if (data.isEmpty()) {\n        notification->setInterval(0);\n    } if ( !isHidden && data.contains(mimeText) ) {\n        QString text = getTextData(data);\n        const int n = text.count('\\n') + 1;\n\n        if (n > 1) {\n            title = QObject::tr(\"Text Copied (%n lines)\",\n                                 \"Notification title for multi-line text in clipboard\", n);\n        } else {\n            title = QObject::tr(\"Text Copied\", \"Notification title for single-line text in clipboard\");\n        }\n\n        text = elideText(text, font, QString(), false, width, maxLines);\n        notification->setMessage(text);\n    } else if (!isHidden && imageIndex != -1) {\n        QPixmap pix;\n        const QString &imageFormat = formats[imageIndex];\n        pix.loadFromData( data[imageFormat].toByteArray(), imageFormat.toLatin1() );\n\n        const int height = maxLines * QFontMetrics(font).lineSpacing();\n        if (pix.width() > width || pix.height() > height)\n            pix = pix.scaled(QSize(width, height), Qt::KeepAspectRatio);\n\n        notification->setPixmap(pix);\n    } else {\n        title = QObject::tr(\"Data Copied\", \"Notification title for a copied data in clipboard\");\n        const QString text = textLabelForData(data, font, QString(), false, width, maxLines);\n        notification->setMessage(text);\n    }\n\n    notification->setTitle(title);\n\n    notification->setUrgency(Notification::Urgency::Normal);\n    notification->setPersistency(Notification::Persistency::NonPersistent);\n}\n\nbool ScriptableProxy::enableMenuItem(int actionId, int currentRun, int menuItemMatchCommandIndex, const QVariantMap &menuItem)\n{\n    INVOKE(enableMenuItem, (actionId, currentRun, menuItemMatchCommandIndex, menuItem));\n    return m_wnd->setMenuItemEnabled(actionId, currentRun, menuItemMatchCommandIndex, menuItem);\n}\n\nQVariantMap ScriptableProxy::setDisplayData(int actionId, const QVariantMap &displayData)\n{\n    INVOKE(setDisplayData, (actionId, displayData));\n    m_actionData = m_wnd->setDisplayData(actionId, displayData);\n    return m_actionData;\n}\n\nQVector<Command> ScriptableProxy::automaticCommands()\n{\n    constexpr bool hasPriority = true;\n    INVOKE(automaticCommands, ());\n    return m_wnd->automaticCommands();\n}\n\nQVector<Command> ScriptableProxy::displayCommands()\n{\n    constexpr bool hasPriority = true;\n    INVOKE(displayCommands, ());\n    return m_wnd->displayCommands();\n}\n\nQVector<Command> ScriptableProxy::scriptCommands()\n{\n    constexpr bool hasPriority = true;\n    INVOKE(scriptCommands, ());\n    return m_wnd->scriptCommands();\n}\n\nbool ScriptableProxy::openUrls(const QStringList &urls)\n{\n    INVOKE(openUrls, (urls));\n\n    for (const auto &url : urls) {\n        if ( !QDesktopServices::openUrl(QUrl(url)) )\n            return false;\n    }\n\n    return true;\n}\n\nQString ScriptableProxy::loadTheme(const QString &path)\n{\n    INVOKE(loadTheme, (path));\n\n    {\n        const QFileInfo fileInfo(path);\n        if ( !fileInfo.isFile() || !fileInfo.isReadable() )\n            return \"Failed to read theme\";\n    }\n\n    const QSettings settings(path, QSettings::IniFormat);\n    if ( settings.status() != QSettings::NoError )\n        return \"Failed to load theme\";\n\n    m_wnd->loadTheme(settings);\n    if ( settings.status() != QSettings::NoError )\n        return \"Failed to parse theme\";\n\n    return QString();\n}\n\nQByteArray ScriptableProxy::getClipboardData(const QString &mime, ClipboardMode mode)\n{\n    INVOKE(getClipboardData, (mime, mode));\n\n    const QMimeData *data = m_wnd->getClipboardData(mode);\n    if (!data)\n        return QByteArray();\n\n    if (mime == \"?\")\n        return data->formats().join(\"\\n\").toUtf8() + '\\n';\n\n    if (mime.isEmpty()) {\n        const auto dataMap = cloneData(data, {mimeTextUtf8, mimeText, mimeUriList});\n        return getTextData(dataMap).toUtf8();\n    }\n\n    return cloneData(data, QStringList(mime)).value(mime).toByteArray();\n}\n\nbool ScriptableProxy::hasClipboardFormat(const QString &mime, ClipboardMode mode)\n{\n    INVOKE(hasClipboardFormat, (mime, mode));\n\n    const QMimeData *data = m_wnd->getClipboardData(mode);\n    return data && data->hasFormat(mime);\n}\n\nQStringList ScriptableProxy::styles()\n{\n    INVOKE(styles, ());\n    return QStyleFactory::keys();\n}\n\nQString ScriptableProxy::stats()\n{\n    INVOKE(stats, ());\n    QMap<QString, int> stats;\n    QSet<const QObject*> visited;\n    struct AddressObj {\n        QString address;\n        const QObject *obj;\n    };\n    QList<AddressObj> toVisit;\n    QStringList modelLines;\n    QStringList extraLines;\n\n    for (const QObject *obj : QApplication::topLevelWidgets())\n        toVisit.append(AddressObj{{}, obj});\n\n    toVisit.append(AddressObj{{}, qApp});\n\n    QObject *server = qApp->property(\"CopyQ_server\").value<QObject*>();\n    if (server)\n        toVisit.append(AddressObj{{}, server});\n\n    while ( !toVisit.isEmpty() ) {\n        const AddressObj addressObj = toVisit.takeFirst();\n        if (visited.contains(addressObj.obj))\n            continue;\n\n        visited.insert(addressObj.obj);\n\n        const QString className = QString::fromUtf8(addressObj.obj->metaObject()->className());\n        stats[className] += 1;\n\n        const QString objectName = addressObj.obj->objectName();\n        if (!objectName.isEmpty() && objectName != className)\n            stats[objectName] += 1;\n\n        const QString address = objectName.isEmpty()\n            ? QStringLiteral(\"%1/%2\").arg(addressObj.address, className)\n            : QStringLiteral(\"%1/%2\").arg(addressObj.address, objectName);\n        if (!addressObj.address.isEmpty())\n            stats[address] += 1;\n\n        if (auto *model = qobject_cast<const QAbstractItemModel*>(addressObj.obj)) {\n            QString modelLine = QStringLiteral(\"MODEL %1: rows=%2\")\n                .arg(address).arg(model->rowCount());\n            if (auto *clipModel = dynamic_cast<const ClipboardModel*>(addressObj.obj)) {\n                qint64 dataSize = 0;\n                for (int i = 0; i < clipModel->rowCount(); ++i) {\n                    const QVariantMap itemData = clipModel->data(\n                        clipModel->index(i), contentType::data).toMap();\n                    dataSize += estimateDataSize(itemData);\n                }\n                modelLine += QStringLiteral(\", dataSize=%1 (%2)\")\n                    .arg(dataSize).arg(formatDataSize(dataSize));\n            }\n            modelLines.append(modelLine);\n        }\n\n        // Collect stats from any QObject exposing copyqStats property\n        const QVariant statsVar = addressObj.obj->property(\"copyqStats\");\n        if (statsVar.isValid())\n            extraLines += statsVar.toStringList();\n\n        for (const QObject *obj : addressObj.obj->findChildren<QObject*>(QString(), Qt::FindDirectChildrenOnly))\n            toVisit.append(AddressObj{address, obj});\n    };\n\n    QStringList result;\n    result.reserve( stats.size() + 1 );\n    result.append( QStringLiteral(\"TOTAL: %1\").arg(visited.size()) );\n    for (auto it = stats.constBegin(); it != stats.constEnd(); ++it) {\n        result += QStringLiteral(\"%1: %2\").arg(it.key()).arg(it.value());\n    }\n    result += modelLines;\n\n    const QString dataPath = itemDataPath();\n    if (!dataPath.isEmpty()) {\n        qint64 dataDirSize = 0;\n        QDirIterator it(dataPath, QDir::Files, QDirIterator::Subdirectories);\n        while (it.hasNext()) {\n            it.next();\n            dataDirSize += it.fileInfo().size();\n        }\n        result += QStringLiteral(\"DATA_DIR %1: size=%2 (%3)\")\n            .arg(dataPath).arg(dataDirSize).arg(formatDataSize(dataDirSize));\n    }\n\n    result += extraLines;\n\n    // Log file total size\n    {\n        const QFileInfoList logFiles = logFileNames();\n        qint64 logSize = 0;\n        for (const auto &fi : logFiles)\n            logSize += fi.size();\n        result += QStringLiteral(\"LOG_FILES: count=%1, size=%2 (%3)\")\n            .arg(logFiles.size()).arg(logSize).arg(formatDataSize(logSize));\n    }\n\n    // Process memory via platform interface\n    {\n        const qint64 rss = platformNativeInterface()->processResidentMemoryBytes();\n        if (rss >= 0) {\n            result += QStringLiteral(\"MEMORY: rss=%1 (%2)\")\n                .arg(rss).arg(formatDataSize(rss));\n        }\n    }\n\n    return result.join(\"\\n\");\n}\n\nvoid ScriptableProxy::setScriptOverrides(const QVector<int> &overrides)\n{\n    INVOKE2(setScriptOverrides, (overrides));\n    m_wnd->setScriptOverrides(overrides, m_actionId);\n}\n\nClipboardBrowser *ScriptableProxy::fetchBrowser(const QString &tabName)\n{\n    if (tabName.isEmpty()) {\n        const QString defaultTabName = m_actionData.value(mimeCurrentTab).toString();\n        if (!defaultTabName.isEmpty())\n            return fetchBrowser(defaultTabName);\n        return m_wnd->browser(0);\n    }\n\n    return m_wnd->tab(tabName);\n}\n\nClipboardBrowser *ScriptableProxy::fetchExistingBrowser(const QString &tabName)\n{\n    if (tabName.isEmpty()) {\n        const QString defaultTabName = m_actionData.value(mimeCurrentTab).toString();\n        if (!defaultTabName.isEmpty())\n            return fetchExistingBrowser(defaultTabName);\n        return m_wnd->browser(0);\n    }\n\n    const int i = m_wnd->findTabIndex(tabName);\n    if (i == -1)\n        return nullptr;\n\n    return m_wnd->browser(i);\n}\n\nClipboardBrowser *ScriptableProxy::selectedBrowser()\n{\n    const QPersistentModelIndex current = currentIndex();\n    ClipboardBrowser *c = m_wnd->browserForItem(current);\n    if (c != nullptr)\n        return c;\n\n    const QList<QPersistentModelIndex> selected = selectedIndexes();\n    return browserForIndexes(selected);\n}\n\nQVariantMap ScriptableProxy::itemData(const QString &tabName, int i)\n{\n    auto c = fetchExistingBrowser(tabName);\n    return c ? c->copyIndex( c->index(i) ) : QVariantMap();\n}\n\nQByteArray ScriptableProxy::itemData(const QString &tabName, int i, const QString &mime)\n{\n    const QVariantMap data = itemData(tabName, i);\n    if ( data.isEmpty() )\n        return QByteArray();\n\n    if (mime == \"?\")\n        return QStringList(data.keys()).join(\"\\n\").toUtf8() + '\\n';\n\n    if (mime == mimeItems)\n        return serializeData(data);\n\n    if (mime.isEmpty())\n        return getTextData(data).toUtf8();\n\n    return data.value(mime).toByteArray();\n}\n\nvoid ScriptableProxy::setItemsData(\n    ClipboardBrowser *c, const QList<QPersistentModelIndex> &indexes, const QString &mime, const QVariant &value)\n{\n    QMap<QPersistentModelIndex, QVariantMap> itemsData;\n\n    for (const auto &index : indexes) {\n        if ( !index.isValid() )\n            continue;\n\n        QVariantMap data = index.data(contentType::data).toMap();\n        if (value.isValid())\n            data[mime] = value;\n        else\n            data.remove(mime);\n        itemsData[index] = data;\n    }\n\n    c->setItemsData(itemsData);\n}\n\ntemplate<typename T>\nT ScriptableProxy::getSelectionData(const QString &mime)\n{\n    QVariant value = m_actionData.value(mime);\n    if ( !value.isValid() && !m_actionData.contains(mimeCurrentTab) && getSelectionData() )\n        value = m_actionData.value(mime);\n    return value.value<T>();\n}\n\nQPersistentModelIndex ScriptableProxy::currentIndex(ClipboardBrowser *c)\n{\n    return (c == nullptr || c == selectedBrowser())\n        ? getSelectionData<QPersistentModelIndex>(mimeCurrentItem)\n        : QPersistentModelIndex(c->currentIndex());\n}\n\nQList<QPersistentModelIndex> ScriptableProxy::selectedIndexes(ClipboardBrowser *c)\n{\n    if (c == nullptr || c == selectedBrowser())\n        return getSelectionData<QList<QPersistentModelIndex>>(mimeSelectedItems);\n\n    QList<QPersistentModelIndex> indexes;\n    const QModelIndexList selected = c->selectionModel()->selectedIndexes();\n    indexes.reserve(selected.size());\n    for (const auto &index : selected)\n        indexes.append(QPersistentModelIndex(index));\n    return indexes;\n}\n\nClipboardBrowser *ScriptableProxy::browserForIndexes(const QList<QPersistentModelIndex> &indexes) const\n{\n    for (const auto &index : indexes) {\n        if ( index.isValid() )\n            return m_wnd->browserForItem(index);\n    }\n    return nullptr;\n}\n\nQVariant ScriptableProxy::waitForFunctionCallFinished(int functionCallId)\n{\n    if (m_disconnected)\n        return QVariant();\n\n    QVariant result;\n\n    QEventLoop loop;\n    connect(this, &ScriptableProxy::functionCallFinished, &loop,\n            [&](int receivedFunctionCallId, const QVariant &returnValue) {\n                if (receivedFunctionCallId != functionCallId)\n                    return;\n                result = returnValue;\n                loop.quit();\n            });\n    connect(this, &ScriptableProxy::abortEvaluationRequest, &loop, &QEventLoop::quit);\n\n    connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, &loop, &QEventLoop::quit);\n    loop.exec();\n\n    return result;\n}\n\nbool ScriptableProxy::getSelectionData()\n{\n    auto c = m_wnd->browser();\n    if (c == nullptr)\n        return false;\n\n    const QVariantMap data = selectionData(*c);\n    for (auto it = data.constBegin(); it != data.constEnd(); ++it)\n        m_actionData[it.key()] = it.value();\n    return true;\n}\n\nQString pluginsPath()\n{\n    QDir dir;\n    if (platformNativeInterface()->findPluginDir(&dir))\n        return dir.absolutePath();\n\n    return QString();\n}\n\nQString themesPath()\n{\n    return platformNativeInterface()->themePrefix();\n}\n\nQString translationsPath()\n{\n    return platformNativeInterface()->translationPrefix();\n}\n\nvoid setClipboardMonitorRunning(bool running)\n{\n    QSettings settings(\n          QSettings::IniFormat,\n          QSettings::UserScope,\n          QCoreApplication::organizationName(),\n          QCoreApplication::applicationName() + \"-monitor\");\n    settings.setValue(QStringLiteral(\"running\"), running);\n}\nbool isClipboardMonitorRunning()\n{\n    const QSettings settings(\n          QSettings::IniFormat,\n          QSettings::UserScope,\n          QCoreApplication::organizationName(),\n          QCoreApplication::applicationName() + \"-monitor\");\n    return settings.value(QStringLiteral(\"running\")).toBool();\n}\n"
  },
  {
    "path": "src/scriptable/scriptableproxy.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n#include \"common/command.h\"\n#include \"common/clientsocket.h\"\n#include \"gui/clipboardbrowser.h\"\n#include \"gui/notificationbutton.h\"\n#include \"gui/notification.h\"\n\n#include <QList>\n#include <QMetaObject>\n#include <QObject>\n#include <QPersistentModelIndex>\n#include <QPoint>\n#include <QRect>\n#include <QVariant>\n#include <QVector>\n\nclass ClipboardBrowser;\nclass MainWindow;\nclass QEventLoop;\nclass QPersistentModelIndex;\nclass QPixmap;\n\nstruct NamedValue {\n    NamedValue() {}\n    NamedValue(const QString &name, const QVariant &value) : name(name), value(value) {}\n    QString name;\n    QVariant value;\n};\n\nstruct VariantMapList {\n    QVector<QVariantMap> items;\n};\n\nstruct NamedValueList {\n    QList<NamedValue> items;\n};\n\nstruct NotificationButtonList {\n    QList<NotificationButton> items;\n};\n\nstruct KeyboardModifierList {\n    Qt::KeyboardModifiers items;\n};\n\nstruct ItemSelection {\n    QPointer<ClipboardBrowser> browser;\n    QList<QPersistentModelIndex> indexes;\n};\n\nstruct MessageData {\n    QString title;\n    QString message;\n    int timeoutMs = -1;\n    QString icon;\n    QString notificationId;\n    NotificationButtonList buttons;\n    Notification::Urgency urgency = Notification::Urgency::Default;\n    Notification::Persistency persistency = Notification::Persistency::Default;\n};\n\nQ_DECLARE_METATYPE(NamedValueList)\nQ_DECLARE_METATYPE(NotificationButtonList)\nQ_DECLARE_METATYPE(VariantMapList)\nQ_DECLARE_METATYPE(KeyboardModifierList)\nQ_DECLARE_METATYPE(MessageData)\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\nQ_DECLARE_METATYPE(ClipboardMode)\n#endif\n\nQDataStream &operator<<(QDataStream &out, const NotificationButtonList &list);\nQDataStream &operator>>(QDataStream &in, NotificationButtonList &list);\nQDataStream &operator<<(QDataStream &out, const NamedValueList &list);\nQDataStream &operator>>(QDataStream &in, NamedValueList &list);\nQDataStream &operator<<(QDataStream &out, const VariantMapList &list);\nQDataStream &operator>>(QDataStream &in, VariantMapList &list);\nQDataStream &operator<<(QDataStream &out, ClipboardMode mode);\nQDataStream &operator>>(QDataStream &in, ClipboardMode &mode);\nQDataStream &operator<<(QDataStream &out, KeyboardModifierList value);\nQDataStream &operator>>(QDataStream &in, KeyboardModifierList &value);\nQDataStream &operator<<(QDataStream &out, const MessageData &value);\nQDataStream &operator>>(QDataStream &in, MessageData &value);\n\nclass ScriptableProxy final : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit ScriptableProxy(MainWindow* mainWindow, QObject *parent = nullptr);\n\n    void callFunction(const QByteArray &serializedFunctionCall);\n\n    int actionId() const { return m_actionId; }\n    ClientSocketId clientSocketId() const { return m_clientSocketId; }\n    void setClientSocketId(ClientSocketId id) { m_clientSocketId = id; }\n\n    void setFunctionCallReturnValue(const QByteArray &bytes);\n    void setInputDialogResult(const QByteArray &bytes);\n\n    void safeDeleteLater();\n\n    void disconnectClient();\n    void abortEvaluation();\n\npublic slots:\n    QVariantMap getActionData(int id);\n    void setActionData(int id, const QVariantMap &data);\n\n    void exit();\n\n    void close();\n    bool showWindow();\n    bool showWindowAt(QRect rect);\n    bool pasteToCurrentWindow();\n    bool copyFromCurrentWindow();\n\n    bool focusPrevious();\n\n    bool isMonitoringEnabled();\n    bool isMainWindowVisible();\n    bool isMainWindowFocused();\n    bool preview(const QVariant &arg);\n    void disableMonitoring(bool arg1);\n    void setClipboard(const QVariantMap &data, ClipboardMode mode);\n    bool registerClipboardProviderAction(int actionId, ClipboardMode mode);\n\n    QString renameTab(const QString &arg1, const QString &arg2);\n\n    QString removeTab(const QString &arg1);\n\n    QString tabIcon(const QString &tabName);\n    void setTabIcon(const QString &tabName, const QString &icon);\n\n    QStringList unloadTabs(const QStringList &tabs);\n    void forceUnloadTabs(const QStringList &tabs);\n\n    bool showBrowser(const QString &tabName);\n    bool showBrowserAt(const QString &tabName, QRect rect);\n\n    void action(const QVariantMap &arg1, const Command &arg2);\n\n    void runInternalAction(const QVariantMap &data, const QString &command);\n\n    void showMessage(const MessageData &messageData);\n\n    QString playSound(const QString &filePath, float volume);\n\n    QVariantMap nextItem(const QString &tabName, int where);\n    void browserMoveToClipboard(const QString &tabName, int row);\n    void browserSetCurrent(const QString &tabName, int arg1);\n    QString browserRemoveRows(const QString &tabName, QVector<int> rows);\n    void browserMoveSelected(int targetRow, const QString &tabName);\n\n    void browserEditRow(const QString &tabName, int arg1, const QString &format);\n    void browserEditNew(const QString &tabName, const QString &format, const QByteArray &content, bool changeClipboard);\n\n    QStringList tabs();\n    bool toggleVisible();\n    bool toggleMenu(const QString &tabName, int maxItemCount, QPoint position);\n    bool toggleCurrentMenu();\n    int findTabIndex(const QString &arg1);\n\n    int menuItems(const VariantMapList &items);\n\n    void openActionDialog(const QVariantMap &arg1);\n\n    bool loadTab(const QString &fileName);\n    bool saveTab(const QString &tabName, const QString &fileName);\n\n    bool importData(const QString &fileName);\n    bool exportData(const QString &fileName);\n\n    QVariant config(const QVariantList &nameValue);\n    QString configDescription();\n    QVariant toggleConfig(const QString &optionName);\n\n    int browserLength(const QString &tabName);\n    bool browserOpenEditor(\n        const QString &tabName, int row, const QString &format, const QByteArray &content, bool changeClipboard);\n\n    QString browserInsert(const QString &tabName, int row, const VariantMapList &items);\n    QString browserChange(const QString &tabName, int row, const VariantMapList &items);\n\n    QByteArray browserItemData(const QString &tabName, int arg1, const QString &arg2);\n    QVariantMap browserItemData(const QString &tabName, int arg1);\n\n    void setCurrentTab(const QString &tabName);\n\n    QString tab(const QString &tabName);\n\n    int currentItem(const QString &tabName);\n    bool selectItems(const QString &tabName, const QVector<int> &rows);\n\n    QVector<int> selectedItems(const QString &tabName);\n    QString selectedTab();\n\n    QVariantMap selectedItemData(int selectedIndex, const QString &tabName);\n    bool setSelectedItemData(int selectedIndex, const QVariantMap &data, const QString &tabName);\n\n    VariantMapList selectedItemsData(const QString &tabName);\n    void setSelectedItemsData(const VariantMapList &dataList, const QString &tabName);\n\n    int createSelection(const QString &tabName);\n    int selectionCopy(int id);\n    void destroySelection(int id);\n    void selectionRemoveAll(int id);\n    void selectionSelectRemovable(int id);\n    void selectionInvert(int id);\n    void selectionSelectAll(int id);\n    void selectionSelect(int id, const QVariant &maybeRe, const QString &mimeFormat);\n    void selectionDeselectIndexes(int id, const QVector<int> &indexes);\n    void selectionDeselectSelection(int id, int toDeselectId);\n    void selectionGetCurrent(int id);\n    int selectionGetSize(int id);\n    QString selectionGetTabName(int id);\n    QVector<int> selectionGetRows(int id);\n    QVariantMap selectionGetItemIndex(int id, int index);\n    void selectionSetItemIndex(int id, int index, const QVariantMap &item);\n    QVariantList selectionGetItemsData(int id);\n    void selectionSetItemsData(int id, const QVariantList &dataList);\n    QVariantList selectionGetItemsFormat(int id, const QString &format);\n    void selectionSetItemsFormat(int id, const QString &mime, const QVariant &value);\n    void selectionMove(int id, int row);\n    void selectionSort(int id, const QVector<int> &indexes);\n\n    QString testSelected();\n\n    QVariant callPlugin(const QVariantList &arguments);\n\n    void serverLog(const QString &text);\n\n    QString currentWindowTitle();\n\n    int inputDialog(const NamedValueList &values);\n\n    void setSelectedItemsData(const QString &mime, const QVariant &value, const QString &tabName);\n\n    void filter(const QString &text);\n    QString filter();\n\n    QVector<Command> commands();\n    void setCommands(const QVector<Command> &commands);\n    void addCommands(const QVector<Command> &commands);\n\n    QByteArray screenshot(const QString &format, const QString &screenName, bool select);\n\n    QStringList screenNames();\n\n    KeyboardModifierList queryKeyboardModifiers();\n    QPoint pointerPosition();\n    void setPointerPosition(int x, int y);\n\n    QString pluginsPath();\n    QString themesPath();\n    QString translationsPath();\n\n    QString iconColor();\n    bool setIconColor(const QString &name);\n\n    QString iconTag();\n    void setIconTag(const QString &tag);\n\n    QString iconTagColor();\n    bool setIconTagColor(const QString &name);\n\n    void setClipboardData(const QVariantMap &data);\n    void setTitle(const QString &title);\n    void setTitleForData(const QVariantMap &data);\n    void saveData(const QString &tab, const QVariantMap &data, ClipboardMode mode);\n    void showDataNotification(const QVariantMap &data);\n\n    bool enableMenuItem(int actionId, int currentRun, int menuItemMatchCommandIndex, const QVariantMap &menuItem);\n\n    QVariantMap setDisplayData(int actionId, const QVariantMap &displayData);\n\n    QVector<Command> automaticCommands();\n    QVector<Command> displayCommands();\n    QVector<Command> scriptCommands();\n\n    bool openUrls(const QStringList &urls);\n\n    QString loadTheme(const QString &path);\n\n    QByteArray getClipboardData(const QString &mime, ClipboardMode mode);\n    bool hasClipboardFormat(const QString &mime, ClipboardMode mode);\n\n    QStringList styles();\n\n    QString stats();\n\n    void setScriptOverrides(const QVector<int> &overrides);\n\nsignals:\n    void functionCallFinished(int functionCallId, const QVariant &returnValue);\n    void inputDialogFinished(int dialogId, const NamedValueList &result);\n    void sendMessage(const QByteArray &message, int messageCode);\n    void abortEvaluationRequest();\n    void actionIdChanged(int actionId);\n    void clipboardProviderRegistered(ClientSocketId clientId, ClipboardMode mode);\n\nprivate:\n    ClipboardBrowser *fetchBrowser(const QString &tabName);\n    ClipboardBrowser *fetchExistingBrowser(const QString &tabName);\n\n    ClipboardBrowser *selectedBrowser();\n\n    QVariantMap itemData(const QString &tabName, int i);\n    QByteArray itemData(const QString &tabName, int i, const QString &mime);\n\n    void setItemsData(\n        ClipboardBrowser *c, const QList<QPersistentModelIndex> &indexes, const QString &mime, const QVariant &value);\n\n    template<typename T>\n    T getSelectionData(const QString &mime);\n\n    QPersistentModelIndex currentIndex(ClipboardBrowser *c = nullptr);\n    QList<QPersistentModelIndex> selectedIndexes(ClipboardBrowser *c = nullptr);\n\n    ClipboardBrowser *browserForIndexes(const QList<QPersistentModelIndex> &indexes) const;\n\n    QVariant waitForFunctionCallFinished(int functionId);\n\n    QByteArray callFunctionHelper(const QByteArray &serializedFunctionCall);\n\n    bool getSelectionData();\n\n    MainWindow* m_wnd;\n    QVariantMap m_actionData;\n    int m_actionId = -1;\n\n    int m_lastFunctionCallId = -1;\n    int m_lastInputDialogId = -1;\n\n    int m_functionCallStack = 0;\n    bool m_shouldBeDeleted = false;\n\n    int m_lastSelectionId = -1;\n    QMap<int, ItemSelection> m_selections;\n\n    bool m_disconnected = false;\n    ClientSocketId m_clientSocketId = 0;\n};\n\nQString pluginsPath();\nQString themesPath();\nQString translationsPath();\n\nvoid setClipboardMonitorRunning(bool running);\nbool isClipboardMonitorRunning();\n"
  },
  {
    "path": "src/scriptable/scriptablesettings.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptablesettings.h\"\n\nScriptableSettings::ScriptableSettings()\n    : QObject()\n    , m_settings()\n{\n}\n\nScriptableSettings::ScriptableSettings(const QString &fileName)\n    : QObject()\n    , m_settings(fileName, QSettings::IniFormat)\n{\n}\n"
  },
  {
    "path": "src/scriptable/scriptablesettings.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include <QJSValue>\n#include <QObject>\n#include <QSettings>\n\nclass ScriptableSettings final : public QObject\n{\n    Q_OBJECT\npublic:\n    Q_INVOKABLE explicit ScriptableSettings();\n    Q_INVOKABLE explicit ScriptableSettings(const QString &fileName);\n\npublic slots:\n    QStringList allKeys() { return m_settings.allKeys(); }\n    void beginGroup(const QString &prefix) { m_settings.beginGroup(prefix); }\n    QJSValue beginReadArray(const QString &prefix) { return m_settings.beginReadArray(prefix); }\n    void beginWriteArray(const QString &prefix, int size = -1) { m_settings.beginWriteArray(prefix, size); }\n    QStringList childGroups() { return m_settings.childGroups(); }\n    QStringList childKeys() { return m_settings.childKeys(); }\n    void clear() { m_settings.clear(); }\n    QJSValue contains(const QString &key) { return m_settings.contains(key); }\n    void endArray() { m_settings.endArray(); }\n    void endGroup() { m_settings.endGroup(); }\n    QJSValue fileName() { return m_settings.fileName(); }\n    QJSValue group() { return m_settings.group(); }\n    QJSValue isWritable() { return m_settings.isWritable(); }\n    void remove(const QString &key) { m_settings.remove(key); }\n    void setArrayIndex(int i) { m_settings.setArrayIndex(i); }\n    void setValue(const QString &key, const QJSValue &value) { m_settings.setValue(key, value.toVariant()); }\n    void sync() { m_settings.sync(); }\n    QVariant value(const QString &key, const QJSValue &defaultValue = QJSValue()) { return m_settings.value(key, defaultValue.toVariant()); }\n\nprivate:\n    QSettings m_settings;\n};\n"
  },
  {
    "path": "src/scriptable/scriptabletemporaryfile.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"scriptabletemporaryfile.h\"\n\n#include <QTemporaryFile>\n\nQ_DECLARE_METATYPE(QTemporaryFile*)\n\nScriptableTemporaryFile::ScriptableTemporaryFile(const QString &path)\n    : ScriptableFile(path)\n{\n}\n\nbool ScriptableTemporaryFile::autoRemove()\n{\n    return tmpFile()->autoRemove();\n}\n\nQString ScriptableTemporaryFile::fileTemplate()\n{\n    return tmpFile()->fileTemplate();\n}\n\nvoid ScriptableTemporaryFile::setAutoRemove(bool autoRemove)\n{\n    tmpFile()->setAutoRemove(autoRemove);\n}\n\nvoid ScriptableTemporaryFile::setFileTemplate(const QJSValue &name)\n{\n    tmpFile()->setFileTemplate(name.toString());\n}\n\nQFile *ScriptableTemporaryFile::self()\n{\n    return tmpFile();\n}\n\nQTemporaryFile *ScriptableTemporaryFile::tmpFile()\n{\n    if (m_self)\n        return m_self;\n\n    m_self = new QTemporaryFile(this);\n    setFile(m_self);\n    return m_self;\n}\n"
  },
  {
    "path": "src/scriptable/scriptabletemporaryfile.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"scriptablefile.h\"\n\nclass QJSValue;\nclass QTemporaryFile;\n\nclass ScriptableTemporaryFile final : public ScriptableFile\n{\n    Q_OBJECT\npublic:\n    Q_INVOKABLE explicit ScriptableTemporaryFile(const QString &path = QString());\n\npublic slots:\n    bool autoRemove();\n    QString fileTemplate();\n    void setAutoRemove(bool autoRemove);\n    void setFileTemplate(const QJSValue &name);\n\n    QFile *self() override;\n\nprivate:\n    QTemporaryFile *tmpFile();\n\n    QTemporaryFile *m_self = nullptr;\n};\n"
  },
  {
    "path": "src/scriptable/scriptoverrides.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\nnamespace ScriptOverrides {\nenum ScriptOverrides {\n    Paste = 0,\n    OnItemsAdded = 1,\n    OnItemsRemoved = 2,\n    OnItemsChanged = 3,\n    OnTabSelected = 4,\n    OnItemsLoaded = 5,\n    OnExit = 6,\n};\n}\n"
  },
  {
    "path": "src/scriptable/scriptvaluefactory.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include \"common/command.h\"\n#include \"scriptable/scriptablebytearray.h\"\n#include \"scriptable/scriptablefile.h\"\n\n#include <QFileInfo>\n#include <QJSEngine>\n#include <QJSValueIterator>\n#include <QRegularExpression>\n#include <QUrl>\n\nstatic QFile *getFile(const QJSValue &value, QJSEngine *engine)\n{\n    auto obj = engine->fromScriptValue<ScriptableFile*>(value);\n    return obj ? obj->self() : nullptr;\n}\n\nstatic QJSValue newByteArray(ScriptableByteArray *ba, QJSEngine *engine)\n{\n    const QJSValue globalObject = engine->globalObject();\n    const QJSValue byteArrayPrototype = globalObject.property(\"ByteArray\").property(QStringLiteral(\"prototype\"));\n    auto value = engine->newQObject(ba);\n    value.setPrototype(byteArrayPrototype);\n    return value;\n}\n\nstatic QVariant toVariant(const QJSValue &value)\n{\n    const auto variant = value.toVariant();\n    Q_ASSERT(value.isUndefined() || value.isNull() || variant.isValid());\n    return variant;\n}\n\ntemplate <typename T>\nstruct ScriptValueFactory {\n    static QJSValue toScriptValue(const T &value, QJSEngine *)\n    {\n        return QJSValue(value);\n    }\n\n    static T fromScriptValue(const QJSValue &value, QJSEngine *)\n    {\n        const auto variant = toVariant(value);\n        Q_ASSERT( variant.canConvert<T>() );\n        return variant.value<T>();\n    }\n};\n\ntemplate <typename T>\nQJSValue toScriptValue(const T &value, QJSEngine *engine)\n{\n    return ScriptValueFactory<T>::toScriptValue(value, engine);\n}\n\ntemplate <typename T>\nT fromScriptValue(const QJSValue &value, QJSEngine *engine)\n{\n    return ScriptValueFactory<T>::fromScriptValue(value, engine);\n}\n\ntemplate <typename T>\nvoid fromScriptValueIfValid(const QJSValue &value, QJSEngine *engine, T *outputValue)\n{\n    if (!value.isUndefined())\n        *outputValue = ScriptValueFactory<T>::fromScriptValue(value, engine);\n}\n\ntemplate <typename List, typename T>\nstruct ScriptValueListFactory {\n    static QJSValue toScriptValue(const List &list, QJSEngine *engine)\n    {\n        QJSValue array = engine->newArray();\n        for ( int i = 0; i < list.size(); ++i ) {\n            const auto value = ScriptValueFactory<T>::toScriptValue(list[i], engine);\n            array.setProperty( static_cast<quint32>(i), value );\n        }\n        return array;\n    }\n\n    static List fromScriptValue(const QJSValue &value, QJSEngine *engine)\n    {\n        if ( !value.isArray() )\n            return List();\n\n        const quint32 length = value.property(\"length\").toUInt();\n        List list;\n        for ( quint32 i = 0; i < length; ++i ) {\n            const auto item = value.property(i);\n            list.append( ScriptValueFactory<T>::fromScriptValue(item, engine) );\n        }\n        return list;\n    }\n};\n\ntemplate <typename T>\nstruct ScriptValueFactory< QList<T> > : ScriptValueListFactory< QList<T>, T > {};\n\n// QVector is alias for a QList in Qt 6.\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\ntemplate <typename T>\nstruct ScriptValueFactory< QVector<T> > : ScriptValueListFactory< QVector<T>, T > {};\n#endif\n\ntemplate <>\nstruct ScriptValueFactory<QVariantMap> {\n    static QJSValue toScriptValue(const QVariantMap &dataMap, QJSEngine *engine)\n    {\n        QJSValue value = engine->newObject();\n\n        for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it)\n            value.setProperty( it.key(), ::toScriptValue(it.value(), engine) );\n\n        return value;\n    }\n\n    static QVariantMap fromScriptValue(const QJSValue &value, QJSEngine *engine)\n    {\n        QVariantMap result;\n        QJSValueIterator it(value);\n        while ( it.hasNext() ) {\n            it.next();\n            auto itemValue = ::fromScriptValue<QVariant>( it.value(), engine );\n            if (itemValue.type() == QVariant::String)\n                itemValue = itemValue.toString().toUtf8();\n            result.insert(it.name(), itemValue);\n        }\n        return result;\n    }\n};\n\ntemplate <>\nstruct ScriptValueFactory<QByteArray> {\n    static QJSValue toScriptValue(const QByteArray &bytes, QJSEngine *engine)\n    {\n        return newByteArray(new ScriptableByteArray(bytes), engine);\n    }\n};\n\n#if QT_VERSION < QT_VERSION_CHECK(6,0,0)\ntemplate <>\nstruct ScriptValueFactory<QStringList> {\n    static QJSValue toScriptValue(const QStringList &list, QJSEngine *engine)\n    {\n        return ScriptValueFactory< QList<QString> >::toScriptValue(list, engine);\n    }\n\n    static QStringList fromScriptValue(const QJSValue &value, QJSEngine *engine)\n    {\n        return ScriptValueFactory< QList<QString> >::fromScriptValue(value, engine);\n    }\n};\n#endif\n\ntemplate <>\nstruct ScriptValueFactory<QString> {\n    static QJSValue toScriptValue(const QString &text, QJSEngine *)\n    {\n        return QJSValue(text);\n    }\n\n    static QString fromScriptValue(const QJSValue &value, QJSEngine *)\n    {\n        return toString(value);\n    }\n};\n\ntemplate <>\nstruct ScriptValueFactory<QRegularExpression> {\n    static QJSValue toScriptValue(const QRegularExpression &re, QJSEngine *engine)\n    {\n        return engine->toScriptValue(re);\n    }\n\n    static QRegularExpression fromScriptValue(const QJSValue &value, QJSEngine *)\n    {\n        if (value.isRegExp()) {\n            return value.toVariant().toRegularExpression();\n        }\n\n        if (value.isVariant()) {\n            return value.toVariant().toRegularExpression();\n        }\n\n        return QRegularExpression( toString(value) );\n    }\n};\n\ntemplate <>\nstruct ScriptValueFactory<Command> {\n    static QJSValue toScriptValue(const Command &command, QJSEngine *engine)\n    {\n        QJSValue value = engine->newObject();\n\n        value.setProperty(QStringLiteral(\"name\"), command.name);\n        value.setProperty(QStringLiteral(\"re\"), ::toScriptValue(command.re, engine));\n        value.setProperty(QStringLiteral(\"wndre\"), ::toScriptValue(command.wndre, engine));\n        value.setProperty(QStringLiteral(\"matchCmd\"), command.matchCmd);\n        value.setProperty(QStringLiteral(\"cmd\"), command.cmd);\n        value.setProperty(QStringLiteral(\"sep\"), command.sep);\n        value.setProperty(QStringLiteral(\"input\"), command.input);\n        value.setProperty(QStringLiteral(\"output\"), command.output);\n        value.setProperty(QStringLiteral(\"wait\"), command.wait);\n        value.setProperty(QStringLiteral(\"automatic\"), command.automatic);\n        value.setProperty(QStringLiteral(\"display\"), command.display);\n        value.setProperty(QStringLiteral(\"inMenu\"), command.inMenu);\n        value.setProperty(QStringLiteral(\"isGlobalShortcut\"), command.isGlobalShortcut);\n        value.setProperty(QStringLiteral(\"isScript\"), command.isScript);\n        value.setProperty(QStringLiteral(\"transform\"), command.transform);\n        value.setProperty(QStringLiteral(\"remove\"), command.remove);\n        value.setProperty(QStringLiteral(\"hideWindow\"), command.hideWindow);\n        value.setProperty(QStringLiteral(\"enable\"), command.enable);\n        value.setProperty(QStringLiteral(\"icon\"), command.icon);\n        value.setProperty(QStringLiteral(\"shortcuts\"), ::toScriptValue(command.shortcuts, engine));\n        value.setProperty(QStringLiteral(\"globalShortcuts\"), ::toScriptValue(command.globalShortcuts, engine));\n        value.setProperty(QStringLiteral(\"tab\"), command.tab);\n        value.setProperty(QStringLiteral(\"outputTab\"), command.outputTab);\n        value.setProperty(QStringLiteral(\"internalId\"), command.internalId);\n\n        QVariantMap nameLocalization;\n        for (auto it = command.nameLocalization.constBegin(); it != command.nameLocalization.constEnd(); ++it)\n            nameLocalization[it.key()] = it.value();\n        value.setProperty(QStringLiteral(\"nameLocalization\"), ::toScriptValue(nameLocalization, engine));\n\n        return value;\n    }\n\n    static Command fromScriptValue(const QJSValue &value, QJSEngine *engine)\n    {\n        Command command;\n\n        ::fromScriptValueIfValid( value.property(\"name\"), engine, &command.name );\n        ::fromScriptValueIfValid( value.property(\"re\"), engine, &command.re );\n        ::fromScriptValueIfValid( value.property(\"wndre\"), engine, &command.wndre );\n        ::fromScriptValueIfValid( value.property(\"matchCmd\"), engine, &command.matchCmd );\n        ::fromScriptValueIfValid( value.property(\"cmd\"), engine, &command.cmd );\n        ::fromScriptValueIfValid( value.property(\"sep\"), engine, &command.sep );\n        ::fromScriptValueIfValid( value.property(\"input\"), engine, &command.input );\n        ::fromScriptValueIfValid( value.property(\"output\"), engine, &command.output );\n        ::fromScriptValueIfValid( value.property(\"wait\"), engine, &command.wait );\n        ::fromScriptValueIfValid( value.property(\"automatic\"), engine, &command.automatic );\n        ::fromScriptValueIfValid( value.property(\"display\"), engine, &command.display );\n        ::fromScriptValueIfValid( value.property(\"inMenu\"), engine, &command.inMenu );\n        ::fromScriptValueIfValid( value.property(\"isGlobalShortcut\"), engine, &command.isGlobalShortcut );\n        ::fromScriptValueIfValid( value.property(\"isScript\"), engine, &command.isScript );\n        ::fromScriptValueIfValid( value.property(\"transform\"), engine, &command.transform );\n        ::fromScriptValueIfValid( value.property(\"remove\"), engine, &command.remove );\n        ::fromScriptValueIfValid( value.property(\"hideWindow\"), engine, &command.hideWindow );\n        ::fromScriptValueIfValid( value.property(\"enable\"), engine, &command.enable );\n        ::fromScriptValueIfValid( value.property(\"icon\"), engine, &command.icon );\n        ::fromScriptValueIfValid( value.property(\"shortcuts\"), engine, &command.shortcuts );\n        ::fromScriptValueIfValid( value.property(\"globalShortcuts\"), engine, &command.globalShortcuts );\n        ::fromScriptValueIfValid( value.property(\"tab\"), engine, &command.tab );\n        ::fromScriptValueIfValid( value.property(\"outputTab\"), engine, &command.outputTab );\n        ::fromScriptValueIfValid( value.property(\"internalId\"), engine, &command.internalId );\n\n        QJSValue nameLocalization = value.property(\"nameLocalization\");\n        QJSValueIterator it(nameLocalization);\n        while (it.hasNext()) {\n            it.next();\n            command.nameLocalization[it.name()] = it.value().toString();\n        }\n\n        return command;\n    }\n};\n\ntemplate <>\nstruct ScriptValueFactory<QVariant> {\n    static QJSValue toScriptValue(const QVariant &variant, QJSEngine *engine)\n    {\n        if ( !variant.isValid() )\n            return QJSValue(QJSValue::UndefinedValue);\n\n        if (variant.type() == QVariant::Bool)\n            return ::toScriptValue(variant.toBool(), engine);\n\n        if (variant.type() == QVariant::ByteArray)\n            return ::toScriptValue(variant.toByteArray(), engine);\n\n        if (variant.type() == QVariant::String)\n            return ::toScriptValue(variant.toString(), engine);\n\n        if (variant.type() == QVariant::Char)\n            return ::toScriptValue(variant.toString(), engine);\n\n        if (variant.type() == QVariant::RegularExpression)\n            return ::toScriptValue(variant.toRegularExpression(), engine);\n\n        if (variant.canConvert<QVariantList>())\n            return ::toScriptValue(variant.value<QVariantList>(), engine);\n\n        if (variant.canConvert<QVariantMap>())\n            return ::toScriptValue(variant.value<QVariantMap>(), engine);\n\n        if (variant.canConvert<QByteArray>())\n            return newByteArray(new ScriptableByteArray(variant), engine);\n\n        return engine->toScriptValue(variant);\n    }\n\n    static QVariant fromScriptValue(const QJSValue &value, QJSEngine *engine)\n    {\n        const auto bytes = getByteArray(value);\n        if (bytes)\n            return QVariant(*bytes);\n\n        auto file = getFile(value, engine);\n        if (file) {\n            const QFileInfo fileInfo(*file);\n            const auto path = fileInfo.absoluteFilePath();\n            return QVariant::fromValue( QUrl::fromLocalFile(path) );\n        }\n\n        if (value.isCallable())\n            return {};\n\n        if (value.isArray())\n            return ScriptValueFactory<QVariantList>::fromScriptValue(value, engine);\n\n        const auto variant = toVariant(value);\n        if (variant.type() == QVariant::ByteArray)\n            return variant;\n\n        if (value.isObject())\n            return ScriptValueFactory<QVariantMap>::fromScriptValue(value, engine);\n\n        Q_ASSERT(value.isUndefined() || value.isNull() || variant.isValid());\n        return variant;\n    }\n};\n"
  },
  {
    "path": "src/tests/itemencryptedtests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemencryptedtests.h\"\n\n#include \"tests/test_utils.h\"\n\nItemEncryptedTests::ItemEncryptedTests(const TestInterfacePtr &test, QObject *parent)\n    : QObject(parent)\n    , m_test(test)\n{\n    setProperty(\"CopyQ_test_id\", QStringLiteral(\"itemencrypted\"));\n}\n\nvoid ItemEncryptedTests::initTestCase()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_ITEMENCRYPT\");\n\n    TEST(m_test->initTestCase());\n}\n\nvoid ItemEncryptedTests::cleanupTestCase()\n{\n    TEST(m_test->cleanupTestCase());\n}\n\nvoid ItemEncryptedTests::init()\n{\n    TEST(m_test->init());\n\n    QVERIFY(isGpgInstalled());\n}\n\nvoid ItemEncryptedTests::cleanup()\n{\n    TEST( m_test->cleanup() );\n}\n\nvoid ItemEncryptedTests::encryptDecryptData()\n{\n    RUN(\"plugins.itemencrypted.generateTestKeys()\", \"\\n\");\n\n    // Test gpg errors first.\n    RUN(\"plugins.itemencrypted.encrypt(input());print('')\", \"\");\n\n    const QByteArray input(\"\\x00\\x01\\x02\\x03\\x04\", 5);\n    QByteArray stdoutActual;\n\n    // Encrypted data differs.\n    QCOMPARE( m_test->run(Args(\"-e\") << \"plugins.itemencrypted.encrypt(input())\", &stdoutActual, nullptr, input), 0 );\n    QVERIFY(!stdoutActual.isEmpty());\n    QVERIFY(stdoutActual != input);\n\n    QCOMPARE( m_test->run(Args(\"-e\") << \"plugins.itemencrypted.decrypt(plugins.itemencrypted.encrypt(input()))\", &stdoutActual, nullptr, input), 0 );\n    QCOMPARE(stdoutActual, input);\n}\n\nvoid ItemEncryptedTests::encryptDecryptItems()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Ctrl+L shortcut doesn't seem work on OS X\");\n#endif\n\n    RUN(\"plugins.itemencrypted.generateTestKeys()\", \"\\n\");\n\n    // Load commands from the plugin generating keys.\n    KEYS(\"Ctrl+P\" << \"ENTER\");\n    RUN(\"commands().length\", \"4\\n\");\n\n    const auto tab = testTab(1);\n    RUN(\"setCurrentTab\" << tab, \"\");\n    RUN(\"tab\" << tab << \"add\" << \"TEST\", \"\");\n    RUN(\"tab\" << tab << \"read\" << \"0\", \"TEST\");\n\n    // Encrypt.\n    KEYS(\"Ctrl+L\");\n    WAIT_ON_OUTPUT(\"tab\" << tab << \"read\" << \"?\" << \"0\", \"application/x-copyq-encrypted\\n\");\n\n    // Decrypt and check text.\n    KEYS(\"Ctrl+L\");\n    WAIT_ON_OUTPUT(\"tab\" << tab << \"read\" << \"?\" << \"0\", \"text/plain\\n\");\n    RUN(\"tab\" << tab << \"read\" << \"0\", \"TEST\");\n\n    // Encrypt and add note.\n    KEYS(\"Ctrl+L\");\n    WAIT_ON_OUTPUT(\"tab\" << tab << \"read\" << \"?\" << \"0\", \"application/x-copyq-encrypted\\n\");\n    KEYS(\"Shift+F2\" << \":NOTE\" << \"F2\");\n    RUN(\"tab\" << tab << \"read\" << \"application/x-copyq-item-notes\" << \"0\", \"NOTE\");\n\n    // Decrypt and check note and text.\n    KEYS(\"Ctrl+L\");\n    WAIT_ON_OUTPUT(\"tab\" << tab << \"read\" << \"0\", \"TEST\");\n    RUN(\"tab\" << tab << \"read\" << \"application/x-copyq-item-notes\" << \"0\", \"NOTE\");\n}\n\nbool ItemEncryptedTests::isGpgInstalled() const\n{\n    QByteArray actualStdout;\n    const auto exitCode = m_test->run(Args(\"-e\") << \"plugins.itemencrypted.isGpgInstalled()\", &actualStdout);\n    Q_ASSERT(exitCode == 0);\n    Q_ASSERT(actualStdout == \"true\\n\" || actualStdout == \"false\\n\");\n    return actualStdout == \"true\\n\";\n}\n"
  },
  {
    "path": "src/tests/itemencryptedtests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n\nclass ItemEncryptedTests final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit ItemEncryptedTests(const TestInterfacePtr &test, QObject *parent = nullptr);\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void init();\n    void cleanup();\n\n    void encryptDecryptData();\n\n    void encryptDecryptItems();\n\nprivate:\n    bool isGpgInstalled() const;\n\n    TestInterfacePtr m_test;\n};\n"
  },
  {
    "path": "src/tests/itemfakevimtests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemfakevimtests.h\"\n\n#include \"tests/test_utils.h\"\n\n#include <QDir>\n\n#ifdef Q_OS_DARWIN\n#define FAKEVIM_CTRL \"META\"\n#else\n#define FAKEVIM_CTRL \"CTRL\"\n#endif\n\nItemFakeVimTests::ItemFakeVimTests(const TestInterfacePtr &test, QObject *parent)\n    : QObject(parent)\n    , m_test(test)\n{\n    setProperty(\"CopyQ_test_id\", QStringLiteral(\"itemfakevim\"));\n    const QVariantMap settings{\n        {QStringLiteral(\"really_enable\"), true},\n        {QStringLiteral(\"source_file\"), QString(ItemFakeVimTests::fileNameToSource())},\n    };\n    setProperty(\"CopyQ_test_settings\", settings);\n}\n\nQString ItemFakeVimTests::fileNameToSource()\n{\n    return QDir::tempPath() + \"/itemfakevim.rc\";\n}\n\nvoid ItemFakeVimTests::initTestCase()\n{\n    TEST(m_test->initTestCase());\n}\n\nvoid ItemFakeVimTests::cleanupTestCase()\n{\n    TEST(m_test->cleanupTestCase());\n}\n\nvoid ItemFakeVimTests::init()\n{\n    TEST(m_test->init());\n\n    // Don't use default external editor.\n    RUN(\"config\" << \"editor\" << \"\", \"\\n\");\n}\n\nvoid ItemFakeVimTests::cleanup()\n{\n    TEST( m_test->cleanup() );\n}\n\nvoid ItemFakeVimTests::createItem()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n\n    RUN(args << \"size\", \"0\\n\");\n\n    RUN(args << \"edit\", \"\");\n    KEYS(\":iABC\" << \"ENTER\" << \":DEF\"\n        << \"ESC\" << \"::wq\" << \"ENTER\");\n\n    RUN(args << \"read\" << \"0\", \"ABC\\nDEF\");\n\n    KEYS(\"F2\" << \":GccXYZ\" << \"ESC\" << \"::w\" << \"ENTER\");\n    RUN(args << \"read\" << \"0\", \"ABC\\nXYZ\");\n    KEYS(\":p:wq\" << \"ENTER\");\n    RUN(args << \"read\" << \"0\", \"ABC\\nXYZ\\nDEF\");\n}\n\nvoid ItemFakeVimTests::blockSelection()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n\n    RUN(args << \"edit\", \"\");\n    KEYS(\":iABC\" << \"ENTER\" << \":DEF\" << \"ENTER\" << \":GHI\" << \"ESC\" << \"::wq\" << \"ENTER\");\n    RUN(args << \"read\" << \"0\", \"ABC\\nDEF\\nGHI\");\n\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(\":ggl\" << FAKEVIM_CTRL \"+V\" << \":jjs_\" << \"ESC\" << \"::wq\" << \"ENTER\");\n    RUN(args << \"read\" << \"0\", \"A_C\\nD_F\\nG_I\");\n}\n\nvoid ItemFakeVimTests::search()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n\n    RUN(args << \"edit\", \"\");\n    KEYS(\":iABC\" << \"ENTER\" << \":DEF\" << \"ENTER\" << \":GHI\" << \"ESC\" << \"::wq\" << \"ENTER\");\n    RUN(args << \"read\" << \"0\", \"ABC\\nDEF\\nGHI\");\n\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(\":gg/[EH]\" << \"ENTER\" << \":r_nr_\" << \"F2\");\n    RUN(args << \"read\" << \"0\", \"ABC\\nD_F\\nG_I\");\n}\n\nvoid ItemFakeVimTests::incDecNumbers()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \" 0\", \"\");\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(FAKEVIM_CTRL \"+a\" << \"F2\");\n    RUN(args << \"read\" << \"0\", \" 1\");\n\n    RUN(args << \"add\" << \" -1\", \"\");\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(FAKEVIM_CTRL \"+a\" << \"F2\");\n    RUN(args << \"read\" << \"0\", \" 0\");\n\n    RUN(args << \"add\" << \" 0xff\", \"\");\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(FAKEVIM_CTRL \"+a\" << \"F2\");\n    RUN(args << \"read\" << \"0\", \" 0x100\");\n\n    RUN(args << \"add\" << \"9 9 9\", \"\");\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(\"l\" << FAKEVIM_CTRL \"+a\" << \"l\" << FAKEVIM_CTRL \"+a\" << \"F2\");\n    RUN(args << \"read\" << \"0\", \"9 10 10\");\n\n    RUN(args << \"add\" << \"-1 -1 -1\", \"\");\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(\":ll\" << \"2\" << FAKEVIM_CTRL \"+a\" << \"l\" << \"3\" << FAKEVIM_CTRL \"+a\" << \"F2\");\n    RUN(args << \"read\" << \"0\", \"-1 1 2\");\n\n    RUN(args << \"add\" << \"1 1 1\", \"\");\n    RUN(args << \"edit\" << \"0\", \"\");\n    KEYS(\"l\" << \"2\" << FAKEVIM_CTRL \"+x\" << \"l\" << \"3\" << FAKEVIM_CTRL \"+x\" << \"F2\");\n    RUN(args << \"read\" << \"0\", \"1 -1 -2\");\n}\n"
  },
  {
    "path": "src/tests/itemfakevimtests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n\nclass ItemFakeVimTests final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit ItemFakeVimTests(const TestInterfacePtr &test, QObject *parent = nullptr);\n\n    static QString fileNameToSource();\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void init();\n    void cleanup();\n\n    void createItem();\n\n    void blockSelection();\n\n    void search();\n\n    void incDecNumbers();\n\nprivate:\n    TestInterfacePtr m_test;\n};\n"
  },
  {
    "path": "src/tests/itemimagetests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemimagetests.h\"\n\n#include \"tests/test_utils.h\"\n\n#include <QBuffer>\n#include <QImageReader>\n#include <QImageWriter>\n#include <QImage>\n\nItemImageTests::ItemImageTests(const TestInterfacePtr &test, QObject *parent)\n    : QObject(parent)\n    , m_test(test)\n{\n    setProperty(\"CopyQ_test_id\", QStringLiteral(\"itemimage\"));\n}\n\nvoid ItemImageTests::initTestCase()\n{\n    TEST(m_test->initTestCase());\n}\n\nvoid ItemImageTests::cleanupTestCase()\n{\n    TEST(m_test->cleanupTestCase());\n}\n\nvoid ItemImageTests::init()\n{\n    TEST(m_test->init());\n}\n\nvoid ItemImageTests::cleanup()\n{\n    TEST( m_test->cleanup() );\n}\n\nvoid ItemImageTests::supportedFormats()\n{\n    const auto supportedRead = QImageReader::supportedImageFormats();\n    QVERIFY(supportedRead.contains(\"png\"));\n    QVERIFY(supportedRead.contains(\"bmp\"));\n\n#if defined(Q_OS_WIN) || defined(Q_OS_MAC)\n    QVERIFY(supportedRead.contains(\"gif\"));\n    QVERIFY(supportedRead.contains(\"webp\"));\n#endif\n\n    const auto supportedWrite = QImageWriter::supportedImageFormats();\n    QVERIFY(supportedWrite.contains(\"png\"));\n    QVERIFY(supportedWrite.contains(\"bmp\"));\n}\n\nvoid ItemImageTests::savePng()\n{\n    QImage image({8, 8}, QImage::Format_RGB32);\n    image.fill(Qt::green);\n\n    QByteArray data;\n    QBuffer buffer(&data);\n    buffer.open(QBuffer::ReadWrite);\n\n    QVERIFY(image.save(&buffer, \"PNG\"));\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"TEST\");\n    TEST( m_test->setClipboard(data, \"image/png\") );\n    WAIT_ON_OUTPUT(\"read('image/png', 0).length > 0\", \"true\\n\");\n}\n\nvoid ItemImageTests::saveBmp()\n{\n    QImage image({8, 8}, QImage::Format_RGB32);\n    image.fill(Qt::green);\n\n    QByteArray data;\n    QBuffer buffer(&data);\n    buffer.open(QBuffer::ReadWrite);\n\n    QVERIFY(image.save(&buffer, \"BMP\"));\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"TEST\");\n    TEST( m_test->setClipboard(data, \"image/bmp\") );\n    WAIT_ON_OUTPUT(\"read('image/png', 0).length > 0\", \"true\\n\");\n}\n\nvoid ItemImageTests::saveGif()\n{\n    if ( !QImageReader::supportedImageFormats().contains(\"gif\") )\n        SKIP(\"GIF image format is unsopported on this platform\");\n\n    const auto data = QByteArray::fromBase64(\n        \"R0lGODlhCAAIAPQAAAAAAE5WUURsU0ZuVVxkX3Jycnx8fFKCZFyRcFyScF6Ucl+Wc1+WdGmLdmuMeGGadmqqgmurg5OUlJubm56dnaGhobW1tb2+vgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAAIf8LSW1hZ2VNYWdpY2sNZ2FtbWE9MC40NTQ1NQAsAAAAAAgACAAABSYgAAwiKSZLkjCJ+AhRJDzikTTOcohAIF0EHmBSsVCEhkLBIGwCQgA7\");\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"TEST\");\n    TEST( m_test->setClipboard(data, \"image/gif\") );\n    WAIT_ON_OUTPUT(\"read('image/png', 0).length > 0\", \"true\\n\");\n}\n\nvoid ItemImageTests::saveWebp()\n{\n    if ( !QImageReader::supportedImageFormats().contains(\"webp\") )\n        SKIP(\"WEBP image format is unsopported on this platform\");\n\n    const auto data = QByteArray::fromBase64(\n        \"UklGRrgAAABXRUJQVlA4WAoAAAAQAAAABwAABwAAQUxQSEEAAAAACFmTUFCTWQhN3url5ereTXLuwPn5wO5yLrvx/v7xuy4AIbD//7AhAAARw/z8wxEAAA2vqKivDAAAAEc2NkcAAABWUDggUAAAAPABAJ0BKggACAACADQljAJ0AQ8M/qJ2gAD+3i3bP+bdQx6F+ZyiDZNsPKvgXJjteWOHwsl4XY+Utm/aW5R74XTu3MMrnj1KVx5aDzswFkAA\");\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"TEST\");\n    TEST( m_test->setClipboard(data, \"image/webp\") );\n    WAIT_ON_OUTPUT(\"read('image/png', 0).length > 0\", \"true\\n\");\n}\n"
  },
  {
    "path": "src/tests/itemimagetests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n#pragma once\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n\nclass ItemImageTests final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit ItemImageTests(const TestInterfacePtr &test, QObject *parent = nullptr);\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void init();\n    void cleanup();\n\n    void supportedFormats();\n    void savePng();\n    void saveBmp();\n    void saveGif();\n    void saveWebp();\n\nprivate:\n    TestInterfacePtr m_test;\n};\n"
  },
  {
    "path": "src/tests/itempinnedtests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itempinnedtests.h\"\n\n#include \"tests/test_utils.h\"\n\n#include \"common/commandstatus.h\"\n\n#include <QRegularExpression>\n\nItemPinnedTests::ItemPinnedTests(const TestInterfacePtr &test, QObject *parent)\n    : QObject(parent)\n    , m_test(test)\n{\n    setProperty(\"CopyQ_test_id\", QStringLiteral(\"itempinned\"));\n}\n\nvoid ItemPinnedTests::initTestCase()\n{\n    TEST(m_test->initTestCase());\n}\n\nvoid ItemPinnedTests::cleanupTestCase()\n{\n    TEST(m_test->cleanupTestCase());\n}\n\nvoid ItemPinnedTests::init()\n{\n    TEST(m_test->init());\n}\n\nvoid ItemPinnedTests::cleanup()\n{\n    TEST( m_test->cleanup() );\n}\n\nvoid ItemPinnedTests::isPinned()\n{\n    RUN(\"add\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"false\\n\");\n}\n\nvoid ItemPinnedTests::pin()\n{\n    RUN(\"add\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(1)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"false\\n\");\n\n    RUN(\"-e\" << \"plugins.itempinned.pin(0)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"true\\n\");\n}\n\nvoid ItemPinnedTests::pinMultiple()\n{\n    RUN(\"add\" << \"d\" << \"c\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(1, 2)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(2)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(3)\", \"false\\n\");\n\n    RUN(\"-e\" << \"plugins.itempinned.pin(1, 2 ,3)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(2)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(3)\", \"true\\n\");\n}\n\nvoid ItemPinnedTests::unpin()\n{\n    RUN(\"add\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(0, 1)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"true\\n\");\n\n    RUN(\"-e\" << \"plugins.itempinned.unpin(0)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"true\\n\");\n\n    RUN(\"-e\" << \"plugins.itempinned.unpin(1)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"false\\n\");\n}\n\nvoid ItemPinnedTests::unpinMultiple()\n{\n    RUN(\"add\" << \"d\" << \"c\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(0, 1, 2, 3)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(2)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(3)\", \"true\\n\");\n\n    RUN(\"-e\" << \"plugins.itempinned.unpin(1, 2)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(2)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(3)\", \"true\\n\");\n\n    RUN(\"-e\" << \"plugins.itempinned.unpin(2, 3)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(0)\", \"true\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(1)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(2)\", \"false\\n\");\n    RUN(\"-e\" << \"plugins.itempinned.isPinned(3)\", \"false\\n\");\n}\n\nvoid ItemPinnedTests::removePinnedThrows()\n{\n    RUN(\"add\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(0, 1)\", \"\");\n\n    RUN_EXPECT_ERROR(\"remove\" << \"0\" << \"1\", CommandException);\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\", \"a b\");\n}\n\nvoid ItemPinnedTests::pinToRow()\n{\n    const auto read = Args() << \"separator\" << \" \" << \"read\";\n\n    RUN(\"add\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(0)\", \"\");\n    RUN(\"add\" << \"b\", \"\");\n    RUN(read << \"0\" << \"1\", \"a b\");\n\n    RUN(\"add\" << \"c\", \"\");\n    RUN(read << \"0\" << \"1\" << \"2\", \"a c b\");\n\n    RUN(\"-e\" << \"plugins.itempinned.pin(1)\", \"\");\n    RUN(\"add\" << \"d\", \"\");\n    RUN(read << \"0\" << \"1\" << \"2\" << \"3\", \"a c d b\");\n\n    RUN(\"-e\" << \"plugins.itempinned.pin(2)\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.unpin(1); remove(1)\", \"\");\n    RUN(read << \"0\" << \"1\" << \"2\", \"a b d\");\n}\n\nvoid ItemPinnedTests::fullTab()\n{\n    RUN(\"config\" << \"maxitems\" << \"3\", \"3\\n\");\n    RUN(\"add\" << \"c\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(0,1,2)\", \"\");\n\n    // Tab is full and no items can be removed.\n    m_test->ignoreErrors(\n        QRegularExpression(R\"(Cannot add new items\\. Tab \"CLIPBOARD\" reached the maximum number of items\\.)\") );\n    RUN_EXPECT_ERROR(\"add\" << \"X\", CommandException);\n    RUN_EXPECT_ERROR(\"write\" << \"1\" << \"text/plain\" << \"X\", CommandException);\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\" << \"2\", \"a b c\");\n    RUN(\"size\", \"3\\n\");\n}\n\nvoid ItemPinnedTests::keepPinnedIfMaxItemsChanges()\n{\n    const auto read = Args() << \"separator\" << \" \" << \"read\";\n\n    RUN(\"config\" << \"maxitems\" << \"3\", \"3\\n\");\n    RUN(\"add\" << \"pin2\" << \"no-pin\" << \"pin1\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(0,2)\", \"\");\n\n    RUN(\"config\" << \"maxitems\" << \"2\", \"2\\n\");\n    RUN(read << \"0\" << \"1\" << \"2\", \"pin1 pin2 \");\n\n    RUN(\"config\" << \"maxitems\" << \"1\", \"1\\n\");\n    RUN(read << \"0\" << \"1\" << \"2\", \"pin1 pin2 \");\n}\n\nvoid ItemPinnedTests::noDuplicateWhenAllPinned()\n{\n    const auto read = Args() << \"separator\" << \" \" << \"read\";\n\n    RUN(\"config\" << \"move\" << \"true\", \"true\\n\");\n\n    // Add items and pin them all.\n    RUN(\"add\" << \"c\" << \"b\" << \"a\", \"\");\n    RUN(\"-e\" << \"plugins.itempinned.pin(0,1,2)\", \"\");\n    RUN(read << \"0\" << \"1\" << \"2\", \"a b c\");\n    RUN(\"size\", \"3\\n\");\n\n    // Activate second pinned item by pressing ENTER.\n    // This sets the clipboard but must not move or duplicate the item.\n    RUN(\"show\", \"\");\n    KEYS(clipboardBrowserId << \"DOWN\" << \"ENTER\");\n    WAIT_FOR_CLIPBOARD(\"b\");\n\n    // Wait for provideClipboard to take clipboard ownership before\n    // setting clipboard externally — otherwise provideClipboard may\n    // overwrite the external clipboard data.\n    WAIT_ON_OUTPUT(\"str(clipboard(mimeOwner)).includes('provideClipboard')\", \"true\\n\");\n\n    // Use a sentinel clipboard change to ensure all prior\n    // async clipboard processing (provideClipboard exit) completed.\n    TEST(m_test->setClipboard(\"d\"));\n    WAIT_FOR_CLIPBOARD(\"d\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"a\\nb\\nc\\nd\");\n\n    // Pinned items must stay in place; only the sentinel \"d\" was added.\n    RUN(\"size\", \"4\\n\");\n    RUN(read << \"0\" << \"1\" << \"2\" << \"3\", \"a b c d\");\n\n    // Set clipboard to same text as a pinned item externally.\n    // This triggers addUnique() which must detect the duplicate\n    // even though the pinned item's data contains mimePinned\n    // but the clipboard data does not.\n    TEST(m_test->setClipboard(\"a\"));\n    WAIT_FOR_CLIPBOARD(\"a\");\n\n    // Another sentinel to confirm the above was fully processed.\n    TEST(m_test->setClipboard(\"e\"));\n    WAIT_FOR_CLIPBOARD(\"e\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"a\\nb\\nc\\ne\\nd\");\n\n    // Verify: 5 items total (a, b, c pinned + e, d new), no duplicates.\n    // \"e\" appears before \"d\" because new unpinned items are inserted\n    // at the top and shifted past pinned items.\n    RUN(\"size\", \"5\\n\");\n    RUN(read << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"a b c e d\");\n}\n"
  },
  {
    "path": "src/tests/itempinnedtests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n\nclass ItemPinnedTests final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit ItemPinnedTests(const TestInterfacePtr &test, QObject *parent = nullptr);\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void init();\n    void cleanup();\n\n    void isPinned();\n    void pin();\n    void pinMultiple();\n    void unpin();\n    void unpinMultiple();\n\n    void removePinnedThrows();\n\n    void pinToRow();\n\n    void fullTab();\n\n    void keepPinnedIfMaxItemsChanges();\n\n    void noDuplicateWhenAllPinned();\n\nprivate:\n    TestInterfacePtr m_test;\n};\n"
  },
  {
    "path": "src/tests/itemsynctests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemsynctests.h\"\n\n#include \"common/commandstatus.h\"\n#include \"common/mimetypes.h\"\n#include \"common/sleeptimer.h\"\n#include \"tests/test_utils.h\"\n#include \"gui/fromiconid.h\"\n#include \"gui/icons.h\"\n\n#include <QDir>\n#include <QFile>\n#include <QUrl>\n\n#include <memory>\n\nnamespace {\n\nusing FilePtr = std::shared_ptr<QFile>;\n\nconst char sep[] = \" ;; \";\n\nconst auto confirmRemoveDialogId =\n    \"focus::QPushButton'Yes'<qt_msgbox_buttonbox:QDialogButtonBox<:QMessageBox\"\n    \"'Do you really want to remove items and associated files\\\\\\\\?'\";\n\nclass TestDir final {\npublic:\n    explicit TestDir(int i, bool createPath = true)\n        : m_dir(ItemSyncTests::testDir(i))\n    {\n        clear();\n        if (createPath)\n            create();\n    }\n\n    ~TestDir()\n    {\n        clear();\n    }\n\n    void clear()\n    {\n        if (isValid())\n            m_dir.removeRecursively();\n    }\n\n    void create()\n    {\n        if ( !m_dir.mkpath(\".\") )\n            Q_ASSERT(false);\n    }\n\n    bool isValid() const\n    {\n        return m_dir.exists();\n    }\n\n    QStringList files() const\n    {\n        QStringList files = m_dir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::Name);\n        files.removeOne(QStringLiteral(\".copyq_lock\"));\n        return files;\n    }\n\n    FilePtr file(const QString &fileName) const\n    {\n        return std::make_shared<QFile>(filePath(fileName));\n    }\n\n    QString filePath(const QString &fileName) const\n    {\n        return m_dir.absoluteFilePath(fileName);\n    }\n\n    bool remove(const QString &fileName)\n    {\n        return QFile::remove(filePath(fileName));\n    }\n\nprivate:\n    Q_DISABLE_COPY(TestDir)\n    QDir m_dir;\n};\n\nQByteArray createFile(const TestDir &dir, const QString &fileName, const QByteArray &content)\n{\n    FilePtr file(dir.file(fileName));\n    if ( file->exists() )\n        return \"File already exists!\";\n\n    if ( !file->open(QIODevice::WriteOnly) )\n        return \"Cannot open file!\";\n\n    if ( file->write(content) == -1 )\n        return \"Cannot write to file!\";\n\n    file->close();\n    return \"\";\n}\n\n} // namespace\n\nItemSyncTests::ItemSyncTests(const TestInterfacePtr &test, QObject *parent)\n    : QObject(parent)\n    , m_test(test)\n{\n    setProperty(\"CopyQ_test_id\", QStringLiteral(\"itemsync\"));\n    m_test->setEnv(\"COPYQ_SYNC_UPDATE_INTERVAL_MS\", \"100\");\n\n    QStringList tabPaths;\n    for (int i = 0; i < 10; ++i) {\n        tabPaths.append(ItemSyncTests::testTab(i));\n        tabPaths.append(ItemSyncTests::testDir(i));\n    }\n\n    QVariantList formatSettings;\n    QVariantMap format;\n\n    format[\"formats\"] = QStringList() << \"xxx\";\n    format[\"itemMime\"] = QString(COPYQ_MIME_PREFIX \"test-xxx\");\n    format[\"icon\"] = QString(fromIconId(IconTrash));\n    formatSettings << format;\n\n    format[\"formats\"] = QStringList() << \"zzz\" << \".yyy\";\n    format[\"itemMime\"] = QString(COPYQ_MIME_PREFIX \"test-zzz\");\n    format[\"icon\"] = QString();\n    formatSettings << format;\n\n    QVariantMap settings;\n    settings[\"sync_tabs\"] = tabPaths;\n    settings[\"format_settings\"] = formatSettings;\n\n    setProperty(\"CopyQ_test_settings\", settings);\n}\n\nQString ItemSyncTests::testTab(int i)\n{\n    return ::testTab(i);\n}\n\nQString ItemSyncTests::testDir(int i)\n{\n    return QDir::tempPath() + \"/copyq_test_dirs/itemsync_\" + QString::number(i);\n}\n\nvoid ItemSyncTests::initTestCase()\n{\n    TEST(m_test->initTestCase());\n}\n\nvoid ItemSyncTests::cleanupTestCase()\n{\n    TEST(m_test->cleanupTestCase());\n}\n\nvoid ItemSyncTests::init()\n{\n    TEST(m_test->init());\n\n    QDir tmpDir(QDir::cleanPath(testDir(0) + \"/..\"));\n    if ( tmpDir.exists() )\n        QVERIFY(tmpDir.removeRecursively());\n}\n\nvoid ItemSyncTests::cleanup()\n{\n    TEST( m_test->cleanup() );\n}\n\nvoid ItemSyncTests::createRemoveTestDir()\n{\n    TestDir dir1(1);\n    TestDir dir2(2);\n\n    QVERIFY(dir1.isValid());\n    QCOMPARE(dir1.files().join(sep), QString());\n\n    QVERIFY(dir2.isValid());\n    QCOMPARE(dir2.files().join(sep), QString());\n\n    const QString testFileName1 = \"test1.txt\";\n    FilePtr f1(dir1.file(testFileName1));\n    QVERIFY(!f1->exists());\n    QVERIFY(f1->open(QIODevice::WriteOnly));\n    f1->close();\n\n    QCOMPARE(dir1.files().join(sep), testFileName1);\n\n    dir1.clear();\n    QVERIFY(!dir1.isValid());\n    QVERIFY(!f1->exists());\n    QVERIFY(dir2.isValid());\n\n    dir2.clear();\n    QVERIFY(!dir1.isValid());\n    QVERIFY(!dir2.isValid());\n\n    dir1.create();\n    QVERIFY(dir1.isValid());\n    QCOMPARE(dir2.files().join(sep), QString());\n}\n\nvoid ItemSyncTests::itemsToFiles()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"C\\nB\\nA\");\n    RUN(args << \"size\", \"3\\n\");\n\n    const auto files = dir1.files();\n    QVERIFY2( files.size() == 3, files.join(sep).toUtf8() );\n    QVERIFY2( files[0].startsWith(\"copyq_\"), files[0].toUtf8() );\n    QVERIFY2( files[1].startsWith(\"copyq_\"), files[1].toUtf8() );\n    QVERIFY2( files[2].startsWith(\"copyq_\"), files[2].toUtf8() );\n}\n\nvoid ItemSyncTests::filesToItems()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args()\n        << \"tab\" << tab1\n        << \"read.apply(this, [...Array(size()).keys()])\";\n\n    RUN(args, \"\");\n\n    QStringList expectedItems;\n\n    const QByteArray text1 = \"TEST1\";\n    TEST(createFile(dir1, \"test1.txt\", text1));\n    // Hidden files (starting with dot) should be ignored\n    const QByteArray hiddenFile = \"HIDDEN\";\n    TEST(createFile(dir1, \".hidden.txt\", hiddenFile));\n    const QByteArray text2 = \"TEST2\";\n    TEST(createFile(dir1, \"test2.txt\", text2));\n    // Non-owned files are sorted by name\n    expectedItems = QStringList{text1, text2};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    const QByteArray nested1_1 = \"nested 1 item 1\";\n    QVERIFY(QDir(dir1.filePath(\"nested1\")).mkpath(\".\"));\n    TEST(createFile(dir1, \"nested1/test1.txt\", nested1_1));\n    // More nested items come later\n    expectedItems = QStringList{text1, text2, nested1_1};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    const QByteArray text3 = \"TEST3\";\n    TEST(createFile(dir1, \"test3.txt\", text3));\n    expectedItems = QStringList{text1, text2, text3, nested1_1};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    const QByteArray text0 = \"TEST0\";\n    TEST(createFile(dir1, \"test0.txt\", text0));\n    expectedItems = QStringList{text0, text1, text2, text3, nested1_1};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    const QByteArray nested2_1 = \"nested 2 item 1\";\n    QVERIFY(QDir(dir1.filePath(\"nested2\")).mkpath(\".\"));\n    TEST(createFile(dir1, \"nested2/test1.txt\", nested2_1));\n    expectedItems = QStringList{text0, text1, text2, text3, nested1_1, nested2_1};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    const QByteArray nested1_0 = \"nested 1 item 0\";\n    TEST(createFile(dir1, \"nested1/test0.txt\", nested1_0));\n    expectedItems = QStringList{\n        text0, text1, text2, text3, nested1_0, nested1_1, nested2_1};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    const QByteArray nested2_0 = \"nested 2 item 0\";\n    TEST(createFile(dir1, \"nested2/test0.txt\", nested2_0));\n    expectedItems = QStringList{\n        text0, text1, text2, text3, nested1_0, nested1_1, nested2_0, nested2_1};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    const QByteArray nested1_1_0 = \"nested 1 nested 1 item 0\";\n    QVERIFY(QDir(dir1.filePath(\"nested1/nested1\")).mkpath(\".\"));\n    TEST(createFile(dir1, \"nested1/nested1/test0.txt\", nested1_1_0));\n    expectedItems = QStringList{\n        text0, text1, text2, text3, nested1_0, nested1_1, nested2_0, nested2_1, nested1_1_0};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n\n    SKIP_ON_ENV(\"COPYQ_TESTS_NO_SYMLINKS\");\n    // Ignore symlink to already added directory\n    QFile dirLink(dir1.filePath(\"nested1\"));\n    if (!dirLink.link(dir1.filePath(\"nested3\")))\n        QFAIL(\"Failed to create directory link: \" + dirLink.errorString().toUtf8());\n    // Allow other symlinks\n    QFile fileLink(dir1.filePath(\"test1.txt\"));\n    if (!fileLink.link(dir1.filePath(\"test4.txt\")))\n        QFAIL(\"Failed to create file link: \" + fileLink.errorString().toUtf8());\n    expectedItems = QStringList{\n        text0, text1, text2, text3, text1, nested1_0, nested1_1, nested2_0, nested2_1, nested1_1_0};\n    WAIT_ON_OUTPUT(args, expectedItems.join('\\n'));\n}\n\nvoid ItemSyncTests::removeOwnItems()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\" << \"D\", \"\");\n\n    const auto files = dir1.files();\n    QVERIFY2( files.size() == 4, files.join(sep).toUtf8() );\n    QVERIFY2( files[0].startsWith(\"copyq_\"), files[0].toUtf8() );\n    QVERIFY2( files[1].startsWith(\"copyq_\"), files[1].toUtf8() );\n    QVERIFY2( files[2].startsWith(\"copyq_\"), files[2].toUtf8() );\n    QVERIFY2( files[3].startsWith(\"copyq_\"), files[3].toUtf8() );\n\n    // Move to test tab and select second and third item.\n    RUN(\"setCurrentTab\" << tab1, \"\");\n    RUN(args << \"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    TEST_SELECTED(tab1.toUtf8() + \" 2 1 2\\n\");\n\n    // Remove selected items.\n    KEYS(m_test->shortcutToRemove());\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"D,A,,\");\n    QCOMPARE( dir1.files().join(sep),\n              files[0]\n              + sep + files[3]\n              );\n\n    // Removing own items works from script.\n    RUN(args << \"remove\" << \"1\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"D,,,\");\n    QCOMPARE( dir1.files().join(sep), files[3] );\n}\n\nvoid ItemSyncTests::removeNotOwnedItems()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    const QString fileA = \"test1.txt\";\n    const QString fileB = \"test2.txt\";\n    const QString fileC = \"test3.txt\";\n    const QString fileD = \"test4.txt\";\n\n    TEST(createFile(dir1, fileA, \"A\"));\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    TEST(createFile(dir1, fileB, \"B\"));\n    WAIT_ON_OUTPUT(args << \"size\", \"2\\n\");\n    TEST(createFile(dir1, fileC, \"C\"));\n    WAIT_ON_OUTPUT(args << \"size\", \"3\\n\");\n    TEST(createFile(dir1, fileD, \"D\"));\n    WAIT_ON_OUTPUT(args << \"size\", \"4\\n\");\n\n    QCOMPARE( dir1.files().join(sep),\n              fileA\n              + sep + fileB\n              + sep + fileC\n              + sep + fileD\n              );\n\n    // Move to test tab and select second and third item.\n    RUN(\"setCurrentTab\" << tab1, \"\");\n    RUN(args << \"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    TEST_SELECTED(tab1.toUtf8() + \" 2 1 2\\n\");\n\n    // Accept the \"Remove Items?\" dialog.\n    KEYS(clipboardBrowserId << m_test->shortcutToRemove() << confirmRemoveDialogId);\n    KEYS(confirmRemoveDialogId << \"ENTER\" << clipboardBrowserId);\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"A,D,,\");\n    QCOMPARE( dir1.files().join(sep),\n              fileA\n              + sep + fileD\n              );\n\n    // Removing not owned items from script doesn't work.\n    RUN_EXPECT_ERROR(args << \"remove\" << \"1\", CommandException);\n    QCOMPARE( dir1.files().join(sep),\n              fileA\n              + sep + fileD\n              );\n}\n\nvoid ItemSyncTests::removeNotOwnedItemsCancel()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    const QString fileA = \"test1.txt\";\n    const QString fileB = \"test2.txt\";\n\n    TEST(createFile(dir1, fileA, \"A\"));\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    TEST(createFile(dir1, fileB, \"B\"));\n    WAIT_ON_OUTPUT(args << \"size\", \"2\\n\");\n\n    QCOMPARE(dir1.files().join(sep), fileA + sep + fileB );\n\n    // Move to test tab and select second item.\n    RUN(\"setCurrentTab\" << tab1, \"\");\n    RUN(args << \"selectItems\" << \"1\", \"true\\n\");\n    TEST_SELECTED(tab1.toUtf8() + \" 1 1\\n\");\n\n    // Don't accept the \"Remove Items?\" dialog.\n    KEYS(clipboardBrowserId << m_test->shortcutToRemove() << confirmRemoveDialogId);\n    TEST_SELECTED(tab1.toUtf8() + \" 1 1\\n\");\n    KEYS(confirmRemoveDialogId << \"ESCAPE\" << clipboardBrowserId);\n    RUN(args << \"read\" << \"0\" << \"1\", \"A,B\");\n    QCOMPARE( dir1.files().join(sep), fileA + sep + fileB );\n    TEST_SELECTED(tab1.toUtf8() + \" 1 1\\n\");\n}\n\nvoid ItemSyncTests::removeFiles()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\" << \"D\", \"\");\n\n    const auto files = dir1.files();\n    QVERIFY2( files.size() == 4, files.join(sep).toUtf8() );\n    QVERIFY2( files[0].startsWith(\"copyq_\"), files[0].toUtf8() );\n    QVERIFY2( files[1].startsWith(\"copyq_\"), files[1].toUtf8() );\n    QVERIFY2( files[2].startsWith(\"copyq_\"), files[2].toUtf8() );\n    QVERIFY2( files[3].startsWith(\"copyq_\"), files[3].toUtf8() );\n\n    FilePtr file = dir1.file(files[2]);\n    QVERIFY(file->open(QIODevice::ReadOnly));\n    QCOMPARE(file->readAll().data(), QByteArray(\"C\").data());\n    file->remove();\n\n    WAIT_ON_OUTPUT(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"D,B,A\");\n\n    dir1.file(files[1])->remove();\n    dir1.file(files[0])->remove();\n\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    RUN(args << \"read\" << \"0\", \"D\");\n}\n\nvoid ItemSyncTests::modifyItems()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\" << \"D\", \"\");\n\n    const auto files = dir1.files();\n    QVERIFY2( files.size() == 4, files.join(sep).toUtf8() );\n\n    FilePtr file = dir1.file(files[2]);\n    QVERIFY(file->open(QIODevice::ReadOnly));\n    QCOMPARE(file->readAll().data(), QByteArray(\"C\").data());\n    file->close();\n\n    KEYS(\"HOME\" << \"DOWN\" << \"F2\" << \":XXX\" << \"F2\");\n    RUN(args << \"size\", \"4\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"D,XXX,B,A,\");\n\n    file = dir1.file(files[2]);\n    QVERIFY(file->open(QIODevice::ReadOnly));\n    QCOMPARE(file->readAll().data(), QByteArray(\"XXX\").data());\n    file->close();\n\n    const auto script = R\"(\n        setCommands([{\n            name: 'Modify current item',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            cmd: `\n                copyq: item = selectedItemsData()[0]\n                item[mimeText] = \"ZZZ\"\n                setSelectedItemData(0, item)\n            `\n        }])\n        )\";\n    RUN(script, \"\");\n    KEYS(\"HOME\" << \"DOWN\" << \"CTRL+F1\");\n    WAIT_ON_OUTPUT(args << \"read\" << \"1\", \"ZZZ\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"D,ZZZ,B,A,\");\n    RUN(args << \"unload\" << tab1, \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"D,ZZZ,B,A,\");\n\n    file = dir1.file(files[2]);\n    QVERIFY(file->open(QIODevice::ReadOnly));\n    QCOMPARE(file->readAll().data(), QByteArray(\"ZZZ\").data());\n    file->close();\n}\n\nvoid ItemSyncTests::modifyFiles()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\" << \"D\", \"\");\n\n    const auto files = dir1.files();\n    QVERIFY2( files.size() == 4, files.join(sep).toUtf8() );\n    QVERIFY2( files[0].startsWith(\"copyq_\"), files[0].toUtf8() );\n    QVERIFY2( files[1].startsWith(\"copyq_\"), files[1].toUtf8() );\n    QVERIFY2( files[2].startsWith(\"copyq_\"), files[2].toUtf8() );\n    QVERIFY2( files[3].startsWith(\"copyq_\"), files[3].toUtf8() );\n\n    FilePtr file = dir1.file(files[2]);\n    QVERIFY(file->open(QIODevice::ReadWrite));\n    QCOMPARE(file->readAll().data(), QByteArray(\"C\").data());\n    file->write(\"X\");\n    file->close();\n\n    WAIT_ON_OUTPUT(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"D,CX,B,A\");\n    RUN(args << \"size\", \"4\\n\");\n}\n\nvoid ItemSyncTests::itemToClipboard()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(\"show\" << tab1, \"\");\n\n    const Args args = Args() << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \"TESTING2\" << \"TESTING1\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\", \"TESTING1\\nTESTING2\");\n\n    RUN(\"config\"\n        << \"activate_closes\" << \"false\"\n        << \"activate_focuses\" << \"false\"\n        << \"activate_pastes\" << \"false\"\n        ,\n        \"activate_closes=false\\n\"\n        \"activate_focuses=false\\n\"\n        \"activate_pastes=false\\n\"\n        );\n\n    // select second item and move to top\n    RUN(\"config\" << \"move\" << \"true\", \"true\\n\");\n    RUN(args << \"selectItems\" << \"1\", \"true\\n\");\n    KEYS(\"ENTER\");\n    RUN(args << \"read\" << \"0\" << \"1\", \"TESTING2\\nTESTING1\");\n\n    WAIT_FOR_CLIPBOARD(\"TESTING2\");\n    RUN(\"clipboard\", \"TESTING2\");\n\n    // select without moving\n    RUN(\"config\" << \"move\" << \"0\", \"false\\n\");\n    RUN(args << \"selectItems\" << \"1\", \"true\\n\");\n    KEYS(\"ENTER\");\n    RUN(args << \"read\" << \"0\" << \"1\", \"TESTING2\\nTESTING1\");\n\n    WAIT_FOR_CLIPBOARD(\"TESTING1\");\n    RUN(\"clipboard\", \"TESTING1\");\n}\n\nvoid ItemSyncTests::notes()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \";\" << \"tab\" << tab1;\n\n    RUN(args << \"add\" << \"TEST1\", \"\");\n\n    KEYS(\"CTRL+N\" << \":TEST2\" << \"F2\"\n      << \"CTRL+N\" << \":TEST3\" << \"F2\");\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"TEST3;TEST2;TEST1\");\n\n    const auto files = dir1.files();\n    QVERIFY2( files.size() == 3, files.join(sep).toUtf8() );\n    QVERIFY2( files[0].startsWith(\"copyq_\"), files[0].toUtf8() );\n    QVERIFY2( files[1].startsWith(\"copyq_\"), files[1].toUtf8() );\n    QVERIFY2( files[2].startsWith(\"copyq_\"), files[2].toUtf8() );\n\n    KEYS(\"HOME\" << \"DOWN\" << \"SHIFT+F2\" << \":NOTE1\" << \"F2\");\n    RUN(args << \"read\" << mimeItemNotes << \"0\" << \"1\" << \"2\", \";NOTE1;\");\n\n    // One new file for notes.\n    const QStringList files2 = dir1.files();\n    QCOMPARE( files2.size(), files.size() + 1 );\n    QString fileNote;\n    for (const auto &file : files2) {\n        if ( !files.contains(file) ) {\n            fileNote = file;\n            break;\n        }\n    }\n\n    // Read file with the notes.\n    FilePtr file = dir1.file(fileNote);\n    QVERIFY(file->open(QIODevice::ReadWrite));\n    QCOMPARE(file->readAll().data(), QByteArray(\"NOTE1\").data());\n\n    // Modify notes.\n    file->write(\"+NOTE2\");\n    file->close();\n\n    WAIT_ON_OUTPUT(args << \"read\" << mimeItemNotes << \"0\" << \"1\" << \"2\", \";NOTE1+NOTE2;\");\n    RUN(args << \"size\", \"3\\n\");\n\n    // Remove notes.\n    QVERIFY(file->remove());\n\n    WAIT_ON_OUTPUT(args << \"read\" << mimeItemNotes << \"0\" << \"1\" << \"2\", \";;\");\n    RUN(args << \"size\", \"3\\n\");\n}\n\nvoid ItemSyncTests::customFormats()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \";\" << \"tab\" << tab1;\n\n    createFile(dir1, \"test1.xxx\", \"TEST1\");\n\n    const auto mime1 = COPYQ_MIME_PREFIX \"test-xxx\";\n    const auto mime2 = COPYQ_MIME_PREFIX \"test-zzz\";\n\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    RUN(args << \"read\" << mime1 << \"0\", \"TEST1\");\n\n    createFile(dir1, \"test2.yyy\", \"TEST2\");\n\n    WAIT_ON_OUTPUT(args << \"size\", \"2\\n\");\n    RUN(args << \"read\" << mime2 << \"1\", \"TEST2\");\n\n    createFile(dir1, \"test3.zzz\", \"TEST3\");\n\n    const auto script = QString(R\"_(\n        print('  size: ')\n        print(size())\n        print('  basename: ')\n        print(read(plugins.itemsync.mimeBaseName, 0, 1, 2))\n        print('  mime1: ')\n        print(read('%1', 0, 1, 2))\n        print('  mime2: ')\n        print(read('%2', 0, 1, 2))\n        )_\")\n        .arg(mime1)\n        .arg(mime2);\n\n    WAIT_ON_OUTPUT(\n        args << script,\n        \"  size: 3\"\n        \"  basename: test1;test2;test3\"\n        \"  mime1: TEST1;;\"\n        \"  mime2: ;TEST2;TEST3\"\n        );\n\n    // Remove\n    dir1.remove(\"test2.yyy\");\n\n    WAIT_ON_OUTPUT(\n        args << script,\n        \"  size: 2\"\n        \"  basename: test1;test3;\"\n        \"  mime1: TEST1;;\"\n        \"  mime2: ;TEST3;\"\n        );\n\n    // Modify file\n    FilePtr file = dir1.file(\"test1.xxx\");\n    QVERIFY(file->open(QIODevice::Append));\n    file->write(\"UPDATE\");\n    file->close();\n\n    WAIT_ON_OUTPUT(\n        args << script,\n        \"  size: 2\"\n        \"  basename: test1;test3;\"\n        \"  mime1: TEST1UPDATE;;\"\n        \"  mime2: ;TEST3;\"\n        );\n\n    // Create item with custom data\n    RUN(args << \"write\" << mime2 << \"NEW_ITEM\", \"\");\n\n    RUN(args << \"size\", \"3\\n\");\n\n    const auto files = dir1.files();\n    QVERIFY2( files[0].startsWith(\"copyq_\"), files[0].toUtf8() );\n    const QString fileData = QString(files[0]).replace(\"txt\", \"zzz\");\n    QVERIFY2( fileData.endsWith(\".zzz\"), fileData.toUtf8() );\n\n    // Check data\n    file = dir1.file(fileData);\n    QVERIFY(file->exists());\n    QVERIFY(file->open(QIODevice::ReadWrite));\n    QCOMPARE(file->readAll().data(), \"NEW_ITEM\");\n\n    // Modify data\n    file->write(\"+UPDATE\");\n    file->close();\n\n    WAIT_ON_OUTPUT(\n        Args(args) << \"read\" << mime2 << \"0\" << \"2\" << mime1 << \"1\",\n        \"NEW_ITEM+UPDATE;TEST3;TEST1UPDATE\");\n    RUN(args << \"size\", \"3\\n\");\n}\n\nvoid ItemSyncTests::getAbsoluteFilePath()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \";\" << \"tab\" << tab1;\n\n    const auto code = QString(\n            R\"(\n            var path = plugins.itemsync.tabPaths[\"%1\"]\n            var baseName = str(getItem(0)[plugins.itemsync.mimeBaseName])\n            var absoluteFilePath = Dir(path).absoluteFilePath(baseName)\n            print(absoluteFilePath)\n            )\")\n            .arg(tab1);\n\n    createFile(dir1, \"test1.txt\", QByteArray());\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n\n    RUN(args << code, dir1.filePath(\"test1\"));\n}\n\nvoid ItemSyncTests::addItemsWhenFull()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"separator\" << \";\" << \"tab\" << tab1;\n    RUN(args << \"show\" << tab1, \"\");\n\n    RUN(\"config\" << \"maxitems\" << \"2\", \"2\\n\");\n    RUN(args << \"add\" << \"A\" << \"B\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"B;A;\");\n    RUN(args << \"add\" << \"C\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"C;B;\");\n}\n\nvoid ItemSyncTests::addItemsWhenFullOmitDeletingNotOwned()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"separator\" << \";\" << \"tab\" << tab1;\n    RUN(args << \"show\" << tab1, \"\");\n\n    RUN(\"config\" << \"maxitems\" << \"1\", \"1\\n\");\n\n    const QString testFileName1 = \"test1.txt\";\n    createFile(dir1, testFileName1, \"NOT-OWNED\");\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\", \"NOT-OWNED;\");\n\n    RUN(args << \"add\" << \"A\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\", \"A;\");\n    RUN(args << \"remove\" << \"0\", \"\");\n\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\", \"NOT-OWNED;\");\n\n    FilePtr f1(dir1.file(testFileName1));\n    QVERIFY(f1->exists());\n}\n\nvoid ItemSyncTests::moveOwnItemsSortsBaseNames()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    const QString testScript = R\"(\n        var baseNames = [];\n        for (var i = 0; i < 4; ++i) {\n            baseNames.push(str(read(plugins.itemsync.mimeBaseName, i)));\n        }\n        for (var i = 0; i < 3; ++i) {\n            var j = i + 1;\n            if (baseNames[i] <= baseNames[j]) {\n                print(\"Failed test: baseNames[\"+i+\"] > baseNames[\"+j+\"]\\\\n\");\n                print(\"  Where baseNames[\"+i+\"] = '\" + baseNames[i] + \"'\\\\n\");\n                print(\"        baseNames[\"+j+\"] = '\" + baseNames[j] + \"'\\\\n\");\n            }\n        }\n    )\";\n\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\" << \"D\", \"\");\n    RUN(args << \"read(0,1,2,3)\", \"D,C,B,A\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"END\" << \"CTRL+UP\");\n    RUN(args << \"read(0,1,2,3)\", \"D,C,A,B\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"DOWN\" << \"CTRL+UP\");\n    RUN(args << \"read(0,1,2,3)\", \"D,C,B,A\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"DOWN\" << \"SHIFT+UP\" << \"CTRL+UP\");\n    RUN(args << \"read(0,1,2,3)\", \"D,B,A,C\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"CTRL+UP\");\n    RUN(args << \"read(0,1,2,3)\", \"B,A,D,C\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"CTRL+DOWN\");\n    RUN(args << \"read(0,1,2,3)\", \"D,B,A,C\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"END\" << \"CTRL+HOME\");\n    RUN(args << \"read(0,1,2,3)\", \"C,D,B,A\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"END\" << \"UP\" << \"CTRL+HOME\");\n    RUN(args << \"read(0,1,2,3)\", \"B,C,D,A\");\n    RUN(args << testScript, \"\");\n\n    KEYS(\"HOME\" << \"CTRL+END\");\n    RUN(args << \"read(0,1,2,3)\", \"C,D,A,B\");\n    RUN(args << testScript, \"\");\n}\n\nvoid ItemSyncTests::moveOwnItemsKeepsLargeTextData()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    const QString script = R\"(\n        add('A'.repeat(4096), 'B'.repeat(3072));\n        read(0).length + ',' + read(1).length;\n    )\";\n    RUN(args << script, \"3072,4096\\n\");\n\n    // Reload so large data is represented by SyncDataFile values in memory.\n    RUN(\"unload\" << tab1, \"\");\n    RUN(args << \"read(0).length + ',' + read(1).length\", \"3072,4096\\n\");\n\n    RUN(args << \"selectItems\" << \"1\", \"true\\n\");\n    KEYS(\"CTRL+UP\");\n\n    RUN(args << \"read(0).length + ',' + read(1).length\", \"4096,3072\\n\");\n    RUN(args << \"getItem(0)[mimeText].length + ',' + getItem(1)[mimeText].length\", \"4096,3072\\n\");\n}\n\nvoid ItemSyncTests::avoidDuplicateItemsAddedFromClipboard()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(\"show\" << tab1, \"\");\n\n    const Args args = Args() << \"separator\" << \",\" << \"tab\" << tab1;\n\n    RUN(\"config\" << \"clipboard_tab\" << tab1, tab1 + \"\\n\");\n    WAIT_ON_OUTPUT(\"isClipboardMonitorRunning\", \"true\\n\");\n\n    TEST( m_test->setClipboard(\"one\") );\n    WAIT_ON_OUTPUT(args << \"read(0,1,2,3)\", \"one,,,\");\n\n    TEST( m_test->setClipboard(\"two\") );\n    WAIT_ON_OUTPUT(args << \"read(0,1,2,3)\", \"two,one,,\");\n\n    TEST( m_test->setClipboard(\"one\") );\n    WAIT_ON_OUTPUT(args << \"read(0,1,2,3)\", \"one,two,,\");\n}\n\nvoid ItemSyncTests::saveLargeItem()\n{\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab;\n\n    const auto script = R\"(\n        write(0, [{\n            'text/plain': '1234567890'.repeat(10000),\n            'application/x-copyq-test-data': 'abcdefghijklmnopqrstuvwxyz'.repeat(10000),\n        }])\n        )\";\n    RUN(args << script, \"\");\n\n    for (int i = 0; i < 2; ++i) {\n        RUN(args << \"read(0).left(20)\", \"12345678901234567890\");\n        RUN(args << \"read(0).length\", \"100000\\n\");\n        RUN(args << \"getItem(0)[mimeText].left(20)\", \"12345678901234567890\");\n        RUN(args << \"getItem(0)[mimeText].length\", \"100000\\n\");\n        RUN(args << \"getItem(0)['application/x-copyq-test-data'].left(26)\", \"abcdefghijklmnopqrstuvwxyz\");\n        RUN(args << \"getItem(0)['application/x-copyq-test-data'].length\", \"260000\\n\");\n        RUN(args << \"ItemSelection().selectAll().itemAtIndex(0)[mimeText].length\", \"100000\\n\");\n        RUN(\"unload\" << tab, tab + \"\\n\");\n    }\n\n    RUN(\"show\" << tab, \"\");\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Copy));\n    WAIT_ON_OUTPUT(\"clipboard().left(20)\", \"12345678901234567890\");\n    RUN(\"clipboard('application/x-copyq-test-data').left(26)\", \"abcdefghijklmnopqrstuvwxyz\");\n    RUN(\"clipboard('application/x-copyq-test-data').length\", \"260000\\n\");\n\n    const auto tab2 = testTab(2);\n    const auto args2 = Args(\"tab\") << tab2;\n    RUN(\"show\" << tab2, \"\");\n    waitFor(waitMsPasteClipboard);\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Paste));\n    RUN(args2 << \"read(0).left(20)\", \"12345678901234567890\");\n    RUN(args2 << \"read(0).length\", \"100000\\n\");\n    RUN(args << \"getItem(0)['application/x-copyq-test-data'].left(26)\", \"abcdefghijklmnopqrstuvwxyz\");\n    RUN(args << \"getItem(0)['application/x-copyq-test-data'].length\", \"260000\\n\");\n}\n\nvoid ItemSyncTests::sortItemsSimple()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"tab\" << tab1 << \"separator\" << \",\";\n\n    RUN(\"config\" << \"maxitems\" << \"4\", \"4\\n\");\n    const QString initScript = R\"(\n        add(1,2,0,3);\n        read(0,1,2,3);\n    )\";\n    RUN(args << initScript, \"3,0,2,1\");\n    RUN(args << \"size\", \"4\\n\");\n\n    const QString sortScript = R\"(\n        let sel = ItemSelection().selectAll();\n        let items = sel.itemsFormat(mimeText);\n        serverLog(\"SORT BEGIN\");\n        sel.sort((i, j) => items[i] < items[j]);\n        serverLog(\"SORT END\");\n        read(0,1,2,3);\n    )\";\n    RUN(args << sortScript, \"0,1,2,3\");\n    RUN(args << \"size\", \"4\\n\");\n}\n\nvoid ItemSyncTests::sortItems()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"tab\" << tab1 << \"separator\" << \",\";\n\n    RUN(\"config\" << \"maxitems\" << \"4\", \"4\\n\");\n    const QString initScript = R\"(\n        add(\n            {[mimeText]: 1, [mimeHtml]: \"I\"},\n            {[mimeText]: 2, [mimeHtml]: \"II\"},\n            {[mimeText]: 0, [mimeHtml]: \"O\"},\n            {[mimeText]: 3, [mimeHtml]: \"III\"},\n        );\n        read(0,1,2,3);\n    )\";\n    RUN(args << initScript, \"3,0,2,1\");\n    RUN(args << \"read(mimeHtml,0,1,2,3)\", \"III,O,II,I\");\n    RUN(args << \"size\", \"4\\n\");\n\n    const QString sortScript = R\"(\n        let sel = ItemSelection().selectAll();\n        let items = sel.itemsFormat(mimeText);\n        serverLog(\"SORT BEGIN\");\n        sel.sort((i, j) => items[i] < items[j]);\n        serverLog(\"SORT END\");\n        read(0,1,2,3);\n    )\";\n    RUN(args << sortScript, \"0,1,2,3\");\n    RUN(args << \"read(mimeHtml,0,1,2,3)\", \"O,I,II,III\");\n    RUN(args << \"size\", \"4\\n\");\n}\n\nvoid ItemSyncTests::copyFiles()\n{\n    TestDir dir1(1);\n    TestDir dir2(2);\n    TestDir dir3(3);\n    const QString tab1 = testTab(1);\n    const QString tab2 = testTab(2);\n    const QString tab3 = testTab(3);\n    RUN(\"setCurrentTab\" << tab1, \"\");\n\n    const QString getFirstItemFormats = R\"(\n        Object.keys(getItem(0))\n        .filter(x => !x.startsWith('application/x-copyq-'))\n        .join('\\\\n')\n    )\";\n\n    TEST(createFile(dir1, \"test.txt\", \"TEST\"));\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"size\", \"1\\n\");\n    RUN(\"tab\" << tab1 << \"read(0)\", \"TEST\");\n    QCOMPARE(dir1.files().join(\" \"), \"test.txt\");\n\n    // Copying synced item from another tab, creates a new item with the same\n    // content and file name as original - not overwriting existing files.\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Copy));\n    WAIT_FOR_CLIPBOARD(\"TEST\");\n    RUN(\"setCurrentTab\" << tab2, \"\");\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Paste));\n    RUN(\"tab\" << tab2 << \"size\", \"1\\n\");\n    RUN(\"tab\" << tab2 << \"read(0)\", \"TEST\");\n#ifdef Q_OS_MAC\n    RUN(\"tab\" << tab2 << getFirstItemFormats, \"public.utf16-plain-text\\ntext/plain\\n\");\n    QCOMPARE(dir2.files().join(\" \"), \"test.txt test_copyq.dat\");\n#else\n    RUN(\"tab\" << tab2 << getFirstItemFormats, \"text/plain\\n\");\n    QCOMPARE(dir2.files().join(\" \"), \"test.txt\");\n#endif\n\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Paste));\n    RUN(\"tab\" << tab2 << \"size\", \"2\\n\");\n    RUN(\"tab\" << tab2 << \"read(0)\", \"TEST\");\n#ifdef Q_OS_MAC\n    RUN(\"tab\" << tab2 << getFirstItemFormats, \"public.utf16-plain-text\\ntext/plain\\n\");\n    QCOMPARE(dir2.files().join(\" \"), \"test-0001.txt test-0001_copyq.dat test.txt test_copyq.dat\");\n#else\n    RUN(\"tab\" << tab2 << getFirstItemFormats, \"text/plain\\n\");\n    QCOMPARE(dir2.files().join(\" \"), \"test-0001.txt test.txt\");\n#endif\n\n    // Adding a local file URI, creates a new item with the file content and\n    // the same file name as original - not overwriting existing files.\n    const QString fileUri = QUrl::fromLocalFile(dir1.filePath(\"test.txt\")).toString();\n    RUN(\"setCurrentTab\" << tab3, \"\");\n    RUN(\"tab\" << tab3 << \"add({[mimeUriList]: '\" + fileUri + \"'})\", \"\");\n    RUN(\"tab\" << tab3 << \"size\", \"1\\n\");\n    RUN(\"tab\" << tab3 << getFirstItemFormats, \"text/plain\\n\");\n    QCOMPARE(dir3.files().join(\" \"), \"test.txt\");\n\n    RUN(\"tab\" << tab3 << \"add({[mimeUriList]: '\" + fileUri + \"'})\", \"\");\n    RUN(\"tab\" << tab3 << \"size\", \"2\\n\");\n    RUN(\"tab\" << tab3 << getFirstItemFormats, \"text/plain\\n\");\n    QCOMPARE(dir3.files().join(\" \"), \"test-0001.txt test.txt\");\n}\n\nvoid ItemSyncTests::encryptionShouldNotAffectFiles()\n{\n    TestDir dir1(1);\n    const QString tab1 = testTab(1);\n    RUN(Args() << \"show\" << tab1, \"\");\n\n    const Args args = Args() << \"tab\" << tab1;\n    const QString inspect = R\"(\n        const sel = ItemSelection().selectAll();\n        const items = sel.items();\n        for (const i in items) {\n            if (i > 0) { print(' ;; '); }\n            print(i + ':');\n            const item = items[i];\n            for (const format in item) {\n                if (!format.includes('itemsync') || format.includes('itemsync-basename')) {\n                    const fmt = format.replace('application/x-copyq-', '');\n                    print(' ' + fmt + ':' + item[format]);\n                }\n            }\n        }\n    )\";\n\n    const QString file1 = \"test1.txt\";\n    TEST(createFile(dir1, file1, \"TEXT1\"));\n    QCOMPARE(dir1.files().join(sep), file1);\n\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    RUN(args << inspect, \"0: itemsync-basename:test1 text/plain:TEXT1\");\n\n    const QString file2_yyy = \"test2.yyy\";\n    const QString file2_txt = \"test2.txt\";\n    TEST(createFile(dir1, file2_yyy, \"YYY\"));\n    TEST(createFile(dir1, file2_txt, \"TEXT2\"));\n\n    WAIT_ON_OUTPUT(\n        args << inspect, \"0: itemsync-basename:test1 text/plain:TEXT1 ;; 1: itemsync-basename:test2 test-zzz:YYY text/plain:TEXT2\");\n\n    const QStringList files({file1, file2_txt, file2_yyy});\n    QCOMPARE(dir1.files().join(sep), files.join(sep));\n\n    RUN(Args() << \"show\" << \"CLIPBOARD\", \"\");\n    RUN(Args() << \"unload\" << tab1, tab1 + \"\\n\");\n\n    QCOMPARE(dir1.files().join(sep), files.join(sep));\n\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    RUN(args << inspect,\n        \"0: itemsync-basename:test1 text/plain:TEXT1 ;; \"\n        \"1: itemsync-basename:test2 test-zzz:YYY text/plain:TEXT2\");\n    QCOMPARE(dir1.files().join(sep), files.join(sep));\n}\n"
  },
  {
    "path": "src/tests/itemsynctests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n\nclass ItemSyncTests final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit ItemSyncTests(const TestInterfacePtr &test, QObject *parent = nullptr);\n\n    static QString testTab(int i);\n\n    static QString testDir(int i);\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void init();\n    void cleanup();\n\n    void createRemoveTestDir();\n\n    void itemsToFiles();\n    void filesToItems();\n\n    void removeOwnItems();\n    void removeNotOwnedItems();\n    void removeNotOwnedItemsCancel();\n    void removeFiles();\n\n    void modifyItems();\n    void modifyFiles();\n\n    void itemToClipboard();\n\n    void notes();\n\n    void customFormats();\n\n    void getAbsoluteFilePath();\n\n    void addItemsWhenFull();\n\n    void addItemsWhenFullOmitDeletingNotOwned();\n\n    void moveOwnItemsSortsBaseNames();\n    void moveOwnItemsKeepsLargeTextData();\n\n    void avoidDuplicateItemsAddedFromClipboard();\n\n    void saveLargeItem();\n\n    void sortItemsSimple();\n    void sortItems();\n\n    void copyFiles();\n\n    void encryptionShouldNotAffectFiles();\n\nprivate:\n    TestInterfacePtr m_test;\n};\n"
  },
  {
    "path": "src/tests/itemtagstests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemtagstests.h\"\n\n#include \"tests/test_utils.h\"\n\nnamespace {\n\nQString testTag(int i)\n{\n    return \"TAG_&\" + QString::number(i);\n}\n\n} // namespace\n\nItemTagsTests::ItemTagsTests(const TestInterfacePtr &test, QObject *parent)\n    : QObject(parent)\n    , m_test(test)\n{\n    setProperty(\"CopyQ_test_id\", QStringLiteral(\"itemtags\"));\n    const QVariantMap settings{\n        {QStringLiteral(\"tags\"), ItemTagsTests::testTags()}\n    };\n    setProperty(\"CopyQ_test_settings\", settings);\n}\n\nQStringList ItemTagsTests::testTags()\n{\n    return QStringList()\n            << testTag(1)\n            << testTag(2)\n            << testTag(3)\n            << testTag(4)\n            << testTag(5);\n}\n\nvoid ItemTagsTests::initTestCase()\n{\n    TEST(m_test->initTestCase());\n}\n\nvoid ItemTagsTests::cleanupTestCase()\n{\n    TEST(m_test->cleanupTestCase());\n}\n\nvoid ItemTagsTests::init()\n{\n    TEST(m_test->init());\n}\n\nvoid ItemTagsTests::cleanup()\n{\n    TEST( m_test->cleanup() );\n}\n\nvoid ItemTagsTests::userTags()\n{\n    RUN(\"-e\" << \"plugins.itemtags.userTags\",\n        QString(testTags().join(\"\\n\") + \"\\n\").toUtf8());\n}\n\nvoid ItemTagsTests::tag()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"\");\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(3)\", \"\");\n    RUN(args << \"size\", \"3\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('x', 0)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 0)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 0)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 1)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 1)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 2)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 2)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(3)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 3)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 3)\", \"false\\n\");\n    RUN(args << \"size\", \"3\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('y', 0, 1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\ny\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 0)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 0)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"y\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 1)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 1)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 2)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 2)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(3)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 3)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 3)\", \"false\\n\");\n    RUN(args << \"size\", \"3\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('z', 2, 3, 4)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\ny\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 0)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 0)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('z', 0)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"y\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 1)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 1)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('z', 1)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"z\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 2)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 2)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('z', 2)\", \"true\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(3)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('x', 3)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('y', 3)\", \"false\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.hasTag('z', 3)\", \"false\\n\");\n    RUN(args << \"size\", \"3\\n\");\n}\n\nvoid ItemTagsTests::untag()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"\");\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('x', 0, 1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('y', 1, 2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"x\\ny\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"y\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.untag('x', 1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"y\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"y\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.untag('y', 1, 2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"\");\n}\n\nvoid ItemTagsTests::clearTags()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"\");\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('x', 0, 1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('y', 1, 2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"x\\ny\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"y\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.clearTags(1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"y\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('a', 1, 2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"a\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"a\\ny\\n\");\n\n    RUN(args << \"-e\" << \"plugins.itemtags.clearTags(0, 2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"a\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"\");\n}\n\nvoid ItemTagsTests::searchTags()\n{\n    const QString tab1 = testTab(1);\n    const Args args = Args() << \"tab\" << tab1;\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"\");\n    RUN(args << \"add\" << \"A\" << \"B\" << \"C\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('tag1', 0, 1)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('tag2', 1, 2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tag('tag3', 2)\", \"\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(0)\", \"tag1\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(1)\", \"tag1\\ntag2\\n\");\n    RUN(args << \"-e\" << \"plugins.itemtags.tags(2)\", \"tag2\\ntag3\\n\");\n\n    KEYS(\"RIGHT\");\n    KEYS(\"t\" << \"a\" << \"g\" << \"1\");\n    KEYS(\"TAB\" << \"CTRL+A\");\n    TEST_SELECTED(tab1 + \" 0 0 1\\n\");\n\n    KEYS(\"ESCAPE\");\n    KEYS(\"t\" << \"a\" << \"g\" << \"2\");\n    KEYS(\"TAB\" << \"CTRL+A\");\n    TEST_SELECTED(tab1 + \" 1 1 2\\n\");\n\n    KEYS(\"ESCAPE\");\n    KEYS(\"t\" << \"a\" << \"g\" << \"3\");\n    KEYS(\"TAB\" << \"CTRL+A\");\n    TEST_SELECTED(tab1 + \" 2 2\\n\");\n}\n\nvoid ItemTagsTests::tagSelected()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'Add Tag x',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            cmd: 'copyq: plugins.itemtags.tag(\"x\")'\n          },\n          {\n            name: 'Add Tag y',\n            inMenu: true,\n            shortcuts: ['Ctrl+F2'],\n            cmd: 'copyq: plugins.itemtags.tag(\"y\")'\n          }])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"add\" << \"A\" << \"B\" << \"C\", \"\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"plugins.itemtags.tags(0)\", \"x\\n\");\n    RUN(\"plugins.itemtags.tags(1)\", \"\");\n    RUN(\"plugins.itemtags.tags(2)\", \"\");\n\n    RUN(\"selectItems(0,1)\", \"true\\n\");\n    KEYS(\"CTRL+F2\");\n    WAIT_ON_OUTPUT(\"plugins.itemtags.tags(0)\", \"x\\ny\\n\");\n    RUN(\"plugins.itemtags.tags(1)\", \"y\\n\");\n    RUN(\"plugins.itemtags.tags(2)\", \"\");\n}\n\nvoid ItemTagsTests::untagSelected()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'Remove Tag x',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            cmd: 'copyq: plugins.itemtags.untag(\"x\")'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"add\" << \"A\" << \"B\" << \"C\", \"\");\n    RUN(\"plugins.itemtags.tag('x', 0, 2)\", \"\");\n    RUN(\"plugins.itemtags.tag('y', 1, 2)\", \"\");\n    RUN(\"plugins.itemtags.tags(0)\", \"x\\n\");\n\n    RUN(\"selectItems(0,1,2)\", \"true\\n\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"plugins.itemtags.tags(0)\", \"\");\n    RUN(\"plugins.itemtags.tags(1)\", \"y\\n\");\n    RUN(\"plugins.itemtags.tags(2)\", \"y\\n\");\n}\n"
  },
  {
    "path": "src/tests/itemtagstests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n\nclass ItemTagsTests final : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit ItemTagsTests(const TestInterfacePtr &test, QObject *parent = nullptr);\n\n    static QStringList testTags();\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void init();\n    void cleanup();\n\n    void userTags();\n    void tag();\n    void untag();\n    void clearTags();\n    void searchTags();\n\n    void tagSelected();\n    void untagSelected();\n\nprivate:\n    TestInterfacePtr m_test;\n};\n"
  },
  {
    "path": "src/tests/itemtests/itemtests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"itemtests.h\"\n\n#include <QAbstractItemView>\n#include <QCheckBox>\n#include <QDrag>\n#include <QItemSelectionModel>\n#include <QLoggingCategory>\n#include <QRegularExpression>\n#include <QTest>\n#include <QTimer>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(plugin)\nQ_LOGGING_CATEGORY(plugin, \"copyq.keys\")\n\n/// Selected items texts for item views: {item1}{item2}...\nQString selectedItemsTexts(QWidget *widget)\n{\n    const auto view = qobject_cast<QAbstractItemView*>(widget);\n    if (!view)\n        return {};\n\n    const auto sel = view->selectionModel();\n    if (!sel)\n        return {};\n\n    QString items;\n    for (const QModelIndex &ind : sel->selectedIndexes()) {\n        const QString text = ind.data().toString().replace(\"\\n\", \"\\\\n\");\n        items.append(QStringLiteral(\"{%1}\").arg(text));\n    }\n    return items;\n}\n\n/// A text visible in the widget\nQString widgetText(QWidget *widget)\n{\n    QString text = widget->property(\"text\").toString()\n        .remove('&')\n        // Remove HTML tags\n        .remove(QRegularExpression(QStringLiteral(\"</?[^>]*>\")));\n\n    if ( text.isEmpty() && widget->isWindow() )\n        text = widget->windowTitle();\n\n    return text.isEmpty() ? QString() : QStringLiteral(\"'%1'\").arg(text);\n}\n\n/// Widget's full address string.\n/// Examples:\n///   :QPushButton'OK'<qt_msgbox_buttonbox:QDialogButtonBox<:QMessageBox'Change Password'<MainWindow\n///   tableView:QTableView{selected_item_text1}{selected_item_text2}<ActionHandlerDialog:QDialog'Process Manager'<MainWindow\nQString widgetAddress(QWidget *widget)\n{\n    if (!widget)\n        return QStringLiteral(\"<null>\");\n\n    QString result;\n    QWidget *current = widget;\n    while (current) {\n        const QString className = current->metaObject()->className();\n        const QString objectName = current->objectName();\n        const QString name = className == objectName\n            ? className : QStringLiteral(\"%1:%2\").arg(objectName, className);\n        // Skip some default widgets.\n        if ( name != QLatin1String(\":QWidget\")\n          && !name.startsWith(QLatin1String(\"qt_scrollarea_viewport:QWidget\")) )\n        {\n            if (!result.isEmpty())\n                result.append('<');\n            result.append(name);\n            result.append(widgetText(current));\n            result.append(selectedItemsTexts(current));\n        }\n        current = current->parentWidget();\n    }\n    return result;\n}\n\nbool matchesProperties(QObject *object, const QStringList &properties)\n{\n    for (auto it = properties.cbegin(); it != properties.cend(); ++it) {\n        const QString key = it->section('=', 0, 0);\n        const QString value = it->section('=', 1, 1);\n        if ( value.isEmpty() ) {\n            if ( object->objectName() != key && object->metaObject()->className() != key )\n                return false;\n        }\n\n        const QVariant propValue = object->property(key.toUtf8());\n        if ( propValue.toString() != value )\n            return false;\n    }\n\n    return true;\n}\n\nQWidget *findWidgetWithProperties(const QString &properties, QWidget *parent)\n{\n    QStringList names = properties.split('<');\n    return std::accumulate(\n        names.cbegin(), names.cend(), parent,\n        [](QWidget *parent, const QString &name) -> QWidget* {\n            if (parent == nullptr)\n                return nullptr;\n\n            const QStringList props = name.split('|', Qt::SkipEmptyParts);\n            for (QWidget *child : parent->findChildren<QWidget*>()) {\n                if (child->isVisible() && matchesProperties(child, props)) {\n                    qCDebug(plugin) << \"Found target:\" << widgetAddress(child);\n                    return child;\n                }\n            }\n            qCCritical(plugin) << \"Failed to find mouse action target:\" << name;\n            return nullptr;\n        });\n}\n\nbool checkEventTarget(\n    QWidget *target, const QString &keys, const QString &widgetName, const char *event)\n{\n    if (target && target->isVisible())\n        return true;\n\n    qCCritical(plugin) << \"Failed to send postponed\" << event\n        << keys << \"to\" << widgetName << \";\"\n        << (target ? \"Target widget is no longer visible\" : \"Target widget no longer exists\");\n    return false;\n}\n\n} // namespace\n\nclass KeyClicker final : public QObject {\npublic:\n    enum Status {\n        Pending,\n        Success,\n        Failed\n    };\n\n    KeyClicker(QObject *parent)\n        : QObject(parent)\n    {\n        for (const auto w : qApp->topLevelWidgets()) {\n            if (w->objectName() == QLatin1String(\"MainWindow\")) {\n                m_wnd = w;\n                break;\n            }\n        }\n        if (m_wnd == nullptr)\n            qCCritical(plugin) << \"Failed to find MainWindow\";\n    }\n\n    void keyClicksRetry(const QRegularExpression &expectedWidgetName, const QString &keys, int delay, int retry)\n    {\n        if (retry > 0)\n            sendKeyClicks(expectedWidgetName, keys, delay + 100, retry - 1);\n        else\n            keyClicksFailed();\n    }\n\n    void keyClicksFailed()\n    {\n        qCCritical(plugin) << \"Failed to send key press to target widget\";\n\n        const auto actual = keyClicksTarget();\n        const auto popup = QApplication::activePopupWidget();\n        const auto widget = QApplication::focusWidget();\n        const auto window = QApplication::activeWindow();\n        const auto modal = QApplication::activeModalWidget();\n        const auto state = qApp->applicationState();\n\n        if (state == Qt::ApplicationActive)\n            qCCritical(plugin) << \"App is INACTIVE! State:\" << state;\n\n        qCCritical(plugin).noquote().nospace()\n            << \"Expected: /\" + m_expectedWidgetName.pattern() + \"/\"\n            << \"\\nActual:   \" + widgetAddress(actual)\n            << \"\\nPopup:    \" + widgetAddress(popup)\n            << \"\\nWidget:   \" + widgetAddress(widget)\n            << \"\\nWindow:   \" + widgetAddress(window)\n            << \"\\nModal:    \" + widgetAddress(modal);\n\n        m_status = Failed;\n    }\n\n    void keyClicks(const QString &keys, int delay, int retry)\n    {\n        auto widget = keyClicksTarget();\n        if (!widget) {\n            keyClicksRetry(m_expectedWidgetName, keys, delay, retry);\n            return;\n        }\n\n#if defined(Q_OS_MAC)\n        // WORKAROUND for focusing back to the main window on macOS.\n        if (qApp->applicationState() != Qt::ApplicationActive && m_wnd->isVisible()) {\n            qCDebug(plugin) << \"Re-activating the main window (macOS)\";\n            m_wnd->activateWindow();\n            m_wnd->raise();\n        }\n#endif\n\n        if (qApp->applicationState() != Qt::ApplicationActive) {\n            qCDebug(plugin) << \"Waiting for application to become active\";\n            keyClicksRetry(m_expectedWidgetName, keys, delay, retry);\n            return;\n        }\n\n        const QString widgetName = widgetAddress(widget);\n        if ( !m_expectedWidgetName.pattern().isEmpty()\n             && !m_expectedWidgetName.match(widgetName).hasMatch() )\n        {\n            keyClicksRetry(m_expectedWidgetName, keys, delay, retry);\n            return;\n        }\n\n        // Only verified focused widget.\n        if ( keys.isEmpty() ) {\n            m_status = Success;\n            return;\n        }\n\n        // There could be some animation/transition effect on check boxes\n        // so wait for checkbox to be set.\n        if ( qobject_cast<QCheckBox*>(widget) )\n            QTest::qWait(100);\n\n        qCDebug(plugin) << \"Sending\" << keys << \"to\" << widgetName;\n\n        static const auto keyClicksPrefix = QLatin1String(\":\");\n        static const auto mousePrefix = QLatin1String(\"mouse|\");\n        static const auto dragPrefix = QLatin1String(\"isDraggingFrom|\");\n        if ( keys.startsWith(keyClicksPrefix) ) {\n            const auto text = keys.mid(keyClicksPrefix.size());\n            QTest::keyClicks(widget, text, Qt::NoModifier);\n        } else if ( keys.startsWith(mousePrefix) ) {\n            const QString action = keys.section('|', 1, 1);\n            const QString properties = keys.section('|', 2);\n            static const auto mousePress = QStringLiteral(\"PRESS\");\n            static const auto mouseRelease = QStringLiteral(\"RELEASE\");\n            static const auto mouseClick = QStringLiteral(\"CLICK\");\n            static const auto mouseDrag = QStringLiteral(\"DRAG\");\n            static const QStringList validActions = {\n                mousePress, mouseRelease, mouseClick, mouseDrag};\n            if ( !validActions.contains(action) ) {\n                qCCritical(plugin) << \"Failed to match mouse action:\" << keys;\n                qCCritical(plugin) << \"Valid mouse actions are:\" << validActions;\n                m_status = Failed;\n                return;\n            }\n            QPointer<QWidget> source = findWidgetWithProperties(properties, m_wnd);\n            if (!source) {\n                m_status = Failed;\n                return;\n            }\n            // Don't block while processing the events.\n            runAfterInterval(delay, [=](){\n                if (!checkEventTarget(source, keys, widgetName, \"mouse\"))\n                    return;\n\n                // Send the event to window instead - it works better.\n                QWidget *windowWidget = source->window();\n                if (!windowWidget || !source->window()->windowHandle()) {\n                    qCCritical(plugin) << \"Target widget has no window handle\";\n                    return;\n                }\n                QWindow *window = windowWidget->windowHandle();\n                const QPoint pos = source->mapTo(windowWidget, source->rect().center());\n\n                if (action == mousePress) {\n                    QTest::mousePress(window, Qt::LeftButton, {}, pos);\n                } else if (action == mouseRelease) {\n                    QTest::mouseRelease(window, Qt::LeftButton, {}, pos);\n                } else if (action == mouseClick) {\n                    QTest::mouseClick(window, Qt::LeftButton, {}, pos);\n                } else if (action == mouseDrag) {\n                    // This should trigger creating a QDrag in a parent widget.\n                    QTest::mouseMove(source, source->rect().topLeft());\n                    QTest::mouseMove(source, source->rect().bottomRight());\n                }\n            });\n        } else if ( keys.startsWith(dragPrefix) ) {\n            const QObject *drag = m_wnd->findChild<QDrag*>();\n            if (!drag) {\n                qCCritical(plugin) << \"QDrag not started\";\n                m_status = Failed;\n                return;\n            }\n            qCDebug(plugin) << \"QDrag started with parent:\" << widgetAddress(qobject_cast<QWidget*>(drag->parent()));\n            const QString properties = keys.section('|', 1);\n            QWidget* source = findWidgetWithProperties(properties, m_wnd);\n            if (!source) {\n                m_status = Failed;\n                return;\n            }\n            if (drag->parent() != source) {\n                qCCritical(plugin) << \"Unexpected QDrag parent; Expected:\" << properties\n                    << \"; Actual:\" << widgetAddress(qobject_cast<QWidget*>(drag->parent()));\n                m_status = Failed;\n                return;\n            }\n        } else {\n            const QKeySequence shortcut(keys, QKeySequence::PortableText);\n            if ( shortcut.isEmpty() ) {\n                qCCritical(plugin) << \"Failed to parse shortcut\" << keys;\n                m_status = Failed;\n                return;\n            }\n\n            const auto key = static_cast<uint>(shortcut[0]);\n            const QPointer<QWidget> target = widget;\n            // Avoid blocking on modal dialogs\n            runAfterInterval(0, [=](){\n                if (!target || !target->isVisible()) {\n                    qCCritical(plugin) << \"Target no longer valid:\" << widgetName;\n                    return;\n                }\n                QTest::keyClick(\n                    target,\n                    Qt::Key(key & ~Qt::KeyboardModifierMask),\n                    Qt::KeyboardModifiers(key & Qt::KeyboardModifierMask));\n            });\n        }\n\n        m_status = Success;\n        qCDebug(plugin) << \"Sent\" << keys << \"to\" << widgetName;\n    }\n\n    void sendKeyClicks(const QRegularExpression &expectedWidgetName, const QString &keys, int delay, int retry)\n    {\n        m_status = Pending;\n        m_expectedWidgetName = expectedWidgetName;\n\n        // Don't stop when modal window is open.\n        runAfterInterval(delay, [=](){ keyClicks(keys, delay, retry); });\n    }\n\n    int status(bool forceRetrieve) {\n        if (m_status == Pending && forceRetrieve) {\n            keyClicksFailed();\n            return Failed;\n        }\n        return m_status;\n    }\n\nprivate:\n    template <typename Callable>\n    void runAfterInterval(int delay, Callable func)\n    {\n        auto t = new QTimer(m_wnd);\n        t->setSingleShot(true);\n        QObject::connect(t, &QTimer::timeout, m_wnd, func);\n        QObject::connect(t, &QTimer::timeout, t, &QTimer::deleteLater);\n        t->start(delay);\n    }\n\n    QWidget *keyClicksTarget()\n    {\n        auto popup = QApplication::activePopupWidget();\n        if (popup)\n            return popup;\n\n        auto widget = QApplication::focusWidget();\n        if (widget)\n            return widget;\n\n        auto window = QApplication::activeWindow();\n        if (window)\n            return window->focusWidget();\n\n        auto modal = QApplication::activeModalWidget();\n        if (modal)\n            return modal->focusWidget();\n\n#ifdef Q_OS_MAC\n        return m_wnd->focusWidget();\n#else\n        return nullptr;\n#endif\n    }\n\n    QWidget *m_wnd = nullptr;\n    Status m_status = Success;\n    QRegularExpression m_expectedWidgetName;\n};\n\nvoid ItemTestsScriptable::keys()\n{\n    bool ok;\n\n    // Wait interval after shortcut pressed or text typed.\n    const auto waitValue = qgetenv(\"COPYQ_TESTS_KEYS_WAIT\");\n    int wait = waitValue.toInt(&ok);\n    if (!ok)\n        wait = 0;\n\n    // Delay while typing.\n    const auto delayValue = qgetenv(\"COPYQ_TESTS_KEY_DELAY\");\n    int delay = delayValue.toInt(&ok);\n    if (!ok)\n        delay = 0;\n\n    QString expectedWidgetName;\n\n    const auto focusPrefix = QLatin1String(\"focus:\");\n    bool interrupted = false;\n    for (const auto &arg : currentArguments()) {\n        if (interrupted) {\n            const auto message =\n                \"Client was interrupted.\"\n                \" This is allowed to happen only when processing the last key event.\";\n            qCCritical(plugin) << message;\n            throwError(message);\n            return;\n        }\n\n        const QString keys = arg.toString();\n\n        if (keys.startsWith(focusPrefix)) {\n            expectedWidgetName = keys.mid(focusPrefix.size());\n            call(\"callPlugin\", {\"itemtests\", \"sendKeys\", expectedWidgetName, QString(), 0});\n        } else {\n            call(\"sleep\", {wait});\n            call(\"callPlugin\", {\"itemtests\", \"sendKeys\", expectedWidgetName, keys, delay});\n            QTest::qWait(qMax(5, delay));\n        }\n\n        // Make sure all keys are send (shortcuts are postponed because they can be blocked by modal windows).\n        for (int i = 1; ; ++i) {\n            const QVariant result = call(\"callPlugin\", {\"itemtests\", \"sendKeysStatus\", i > 15});\n            bool ok = false;\n            const int status = result.toInt(&ok);\n            if (!ok) {\n                qCDebug(plugin) << \"Client interrupted, got status:\" << result;\n                interrupted = true;\n                break;\n            }\n\n            if (status == KeyClicker::Success)\n                break;\n\n            if (status == KeyClicker::Failed) {\n                throwError(\"Failed to send key presses\");\n                return;\n            }\n\n            const int waitMs = 8 * i * i;\n            QTest::qWait(qMin(1000, waitMs));\n        }\n    }\n}\n\nItemScriptable *ItemTestsLoader::scriptableObject()\n{\n    return new ItemTestsScriptable();\n}\n\nQVariant ItemTestsLoader::scriptCallback(const QVariantList &arguments)\n{\n    const auto cmd = arguments[0].toString();\n\n    if (cmd == \"sendKeys\") {\n        const QString expectedWidgetName = arguments.value(1).toString();\n        const QString keys = arguments.value(2).toString();\n        const int delay = arguments.value(3).toInt();\n        const QRegularExpression re = QRegularExpression(\n            QString(expectedWidgetName)\n            .replace(QLatin1String(\"<\"), QLatin1String(\".*<.*\"))\n        );\n        keyClicker()->sendKeyClicks(re, keys, delay, 10);\n        return {};\n    }\n\n    if (cmd == \"sendKeysStatus\")\n        return keyClicker()->status(arguments.value(1).toBool());\n\n    return QStringLiteral(\"Unexpected command: %1\").arg(cmd);\n}\n\nKeyClicker *ItemTestsLoader::keyClicker()\n{\n    if (!m_keyClicker)\n        m_keyClicker = new KeyClicker(this);\n    return m_keyClicker;\n}\n"
  },
  {
    "path": "src/tests/itemtests/itemtests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include \"item/itemwidget.h\"\n\n#include <QObject>\n#include <QVariant>\n\nclass KeyClicker;\n\nclass ItemTestsScriptable final : public ItemScriptable\n{\n    Q_OBJECT\npublic slots:\n    void keys();\n};\n\nclass ItemTestsLoader final : public QObject, public ItemLoaderInterface\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID COPYQ_PLUGIN_ITEM_LOADER_ID)\n    Q_INTERFACES(ItemLoaderInterface)\n\npublic:\n    QString id() const override { return \"itemtests\"; }\n    QString name() const override { return \"Tests\"; }\n    QString author() const override { return {}; }\n    QString description() const override { return {}; }\n    QVariant icon() const override { return {}; }\n    ItemScriptable *scriptableObject() override;\n    QVariant scriptCallback(const QVariantList &arguments) override;\n\nprivate:\n    KeyClicker *keyClicker();\n    KeyClicker *m_keyClicker = nullptr;\n};\n"
  },
  {
    "path": "src/tests/test_utils.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include \"common/log.h\"\n\n#include <QByteArray>\n#include <QKeySequence>\n#include <QString>\n#include <QStringList>\n#include <QTest>\n#include <QThreadPool>\n#include <QTimer>\n#include <QVariantMap>\n\nconstexpr int maxReadLogSize = 1 * 1024 * 1024;\n\nconst QString sessionName = QStringLiteral(\"__COPYQ_TEST\");\n\nconstexpr auto clipboardTabName = \"CLIPBOARD\";\nconstexpr auto defaultSessionColor = \"#ff8800\";\nconstexpr auto defaultTagColor = \"#000000\";\n\nconstexpr auto clipboardBrowserId = \"focus:^ClipboardBrowser\";\nconstexpr auto clipboardBrowserRefreshButtonId = \"focus:ClipboardBrowserRefreshButton\";\nconstexpr auto filterEditId = \"focus:Utils::FilterLineEdit\";\nconstexpr auto trayMenuId = \"focus:TrayMenu\";\nconstexpr auto menuId = \"focus:Menu\";\nconstexpr auto customMenuId = \"focus:CustomMenu\";\nconstexpr auto editorId = \"focus::ItemEditorWidget\";\nconstexpr auto tabDialogLineEditId = \"focus:lineEditTabName\";\nconstexpr auto commandDialogId = \"focus:CommandDialog\";\nconstexpr auto commandDialogSaveButtonId =\n    \"focus::QPushButton'Save'<:QMessageBox'Command dialog has unsaved changes.'\";\nconstexpr auto commandDialogListId = \"focus:listWidgetItems\";\nconstexpr auto configurationDialogId = \"focus:ConfigurationManager\";\nconstexpr auto shortcutButtonId = \"focus::QToolButton<CommandDialog\";\nconstexpr auto shortcutDialogId = \"focus::QKeySequenceEdit<ShortcutDialog\";\nconstexpr auto actionDialogId = \"focus:ActionDialog\";\nconstexpr auto aboutDialogId = \"focus:AboutDialog\";\nconstexpr auto logDialogId = \"focus:LogDialog\";\nconstexpr auto exportDialogId = \"focus:ImportExportDialog:QDialog'Options for Export'\";\nconstexpr auto importDialogId = \"focus:ImportExportDialog:QDialog'Options for Import'\";\nconstexpr auto actionHandlerDialogId = \"focus:ActionHandlerDialog\";\nconstexpr auto actionHandlerFilterId = \"focus:filterLineEdit\";\nconstexpr auto actionHandlerTableId = \"focus:tableView\";\nconstexpr auto clipboardDialogId = \"focus:ClipboardDialog\";\nconstexpr auto clipboardDialogFormatListId = \"focus:listWidgetFormats\";\nconstexpr auto confirmExitDialogId =\n    \"focus::QPushButton'Yes'<:QMessageBox'Do you want to exit CopyQ\\\\\\\\?'\";\nconstexpr auto runningCommandsExitDialogId =\n    \"focus::QPushButton'Exit Anyway'<:QMessageBox'Cancel active commands and exit\\\\\\\\?'\";\nconstexpr auto itemPreviewId = \"focus:<dockWidgetItemPreviewContents\";\nconstexpr auto passwordEntryCurrentId = \"focus:QInputDialog'Current Tab Encryption Password'\";\nconstexpr auto passwordEntryRetypeId = \"focus:QInputDialog'Confirm Encryption Password'\";\nconstexpr auto passwordEntryNewId = \"focus:QInputDialog'New Tab Encryption Password'\";\nconstexpr auto passwordEntryExportId = \"focus:QInputDialog'Export Password'\";\nconstexpr auto passwordEntryImportId = \"focus:QInputDialog'Import Password'\";\nconstexpr auto passwordMessageFailedId = \"focus:QMessageBox'Maximum password attempts exceeded.'\";\nconstexpr auto passwordMessageEmptyId = \"focus:QMessageBox'New password cannot be empty.'\";\nconstexpr auto passwordMessageChangeId = \"focus:QMessageBox'Password has been changed successfully.'\";\n// File name line edit in Qt file dialog\nconstexpr auto fileNameEditId = \"focus:fileNameEdit\";\n\n#define STR_(str) #str\n#define STR(str) STR_(str)\n\n#define SRC_FILE \\\n    QStringLiteral(__FILE__).section(QStringLiteral(\"src/\"), 1, -1, QString::SectionIncludeLeadingSep)\n\n#define NO_ERRORS(ERRORS_OR_EMPTY) !m_test->writeOutErrors(ERRORS_OR_EMPTY)\n\n/**\n * Verify that method call (TestInterface::startServer(), TestInterface::runClient() etc.)\n * didn't fail or print error.\n */\n#define TEST(ERRORS_OR_EMPTY) \\\n    QVERIFY2( NO_ERRORS(ERRORS_OR_EMPTY), \"Failed with errors above.\" )\n\n#define LOG_ACTION(LABEL, ARGUMENTS) \\\n    log(QStringLiteral(\"🔵 %1: %2 --- %3:%4\").arg(LABEL, #ARGUMENTS, SRC_FILE, STR(__LINE__)))\n\n#define RUN(ARGUMENTS, STDOUT_EXPECTED) \\\n    do { \\\n        LOG_ACTION(\"RUN\", ARGUMENTS); \\\n        TEST( m_test->runClient((Args() << ARGUMENTS), toByteArray(STDOUT_EXPECTED)) ); \\\n    } while(false)\n\n#define RUN_MULTIPLE(...) TEST(runMultiple({__VA_ARGS__}))\n\n#define TEST_SELECTED(STDOUT_EXPECTED) \\\n    RUN(\"testSelected\", (STDOUT_EXPECTED))\n\n#define KEYS(ARGUMENTS) \\\n    do { \\\n        LOG_ACTION(\"KEYS\", ARGUMENTS); \\\n        TEST( m_test->runClient((Args() << \"plugins.itemtests.keys\" << ARGUMENTS), QByteArray()) ); \\\n    } while(false)\n\n#define RUN_WITH_INPUT(ARGUMENTS, INPUT, STDOUT_EXPECTED) \\\n    TEST( m_test->runClient((Args() << ARGUMENTS), toByteArray(STDOUT_EXPECTED), toByteArray(INPUT)) )\n\n#define RUN_EXPECT_ERROR(ARGUMENTS, EXIT_CODE) \\\n    TEST( m_test->runClientWithError((Args() << ARGUMENTS), (EXIT_CODE)) )\n\n#define RUN_EXPECT_ERROR_WITH_STDERR(ARGUMENTS, EXIT_CODE, STDERR_CONTAINS) \\\n    TEST( m_test->runClientWithError((Args() << ARGUMENTS), (EXIT_CODE), toByteArray(STDERR_CONTAINS)) )\n\n#define WAIT_FOR_CLIPBOARD(DATA) \\\n    TEST( m_test->verifyClipboard(DATA, \"text/plain\") )\n\n#define WAIT_FOR_CLIPBOARD2(DATA, MIME) \\\n    TEST( m_test->verifyClipboard((DATA), (MIME)) )\n\n#define RETURN_ON_ERROR(CALLBACK, ERROR) \\\n    do { \\\n        const auto errors = (CALLBACK); \\\n        if ( !errors.isEmpty() ) \\\n            return QByteArray(ERROR) + \":\\n\" + QByteArray(errors); \\\n    } while(false)\n\n/// Skip rest of the tests\n#define SKIP(MESSAGE) QSKIP(MESSAGE, SkipAll)\n\n#define WAIT_ON_OUTPUT(ARGUMENTS, OUTPUT) \\\n    TEST( m_test->waitOnOutput((Args() << ARGUMENTS), toByteArray(OUTPUT)) )\n\n#define SKIP_ON_ENV(ENV) \\\n    if ( qgetenv(ENV) == \"1\" ) \\\n        SKIP(\"Unset \" ENV \" to run the tests\")\n\n/// Post-match wait (ms) after clipboard verification succeeds.\nconst int waitMsSetClipboard = 50;\n\n/// Interval to wait (in ms) for pasting clipboard.\nconst int waitMsPasteClipboard = 1000;\n\n/// Interval to wait (in ms) for client process.\nconst int waitClientRun = 10000;\n\nconst int waitClientRunMultiple = waitClientRun + 5000;\n\nusing Args = QStringList;\n\ninline QByteArray toByteArray(const QString &text)\n{\n    return text.toUtf8();\n}\n\ninline QByteArray toByteArray(const QByteArray &text)\n{\n    return text;\n}\n\ninline QByteArray toByteArray(const char *text)\n{\n    return text;\n}\n\n/// Naming scheme for test tabs in application.\ninline QString testTab(int i)\n{\n    return \"Tab_&\" + QString::number(i);\n}\n\ninline QString keyNameFor(QKeySequence::StandardKey standardKey)\n{\n    return QKeySequence(standardKey).toString();\n}\n\n[[nodiscard]] inline QByteArray runMultiple(\n    const std::initializer_list<std::function<void()>> &fns)\n{\n    QThreadPool pool;\n    pool.setMaxThreadCount(fns.size());\n    for (const auto &fn : fns)\n        pool.start(fn);\n\n    if (!pool.waitForDone(waitClientRunMultiple)) {\n        const int remaining = pool.activeThreadCount();\n        return \"Failed RUN_MULTIPLE: Some calls (\"\n            + QByteArray::number(remaining) + \") timed out\";\n    }\n\n    if (QTest::currentTestFailed())\n        return \"Failed RUN_MULTIPLE: Some calls failed\";\n\n    return {};\n}\n"
  },
  {
    "path": "src/tests/testinterface.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"common/clipboardmode.h\"\n\n#include <QByteArray>\n#include <QStringList>\n#include <QVariant>\n#include <QtContainerFwd>\n\n#include <memory>\n\nclass QRegularExpression;\nclass QProcess;\n\n/**\n * Interface for tests.\n */\nclass TestInterface {\npublic:\n    enum ReadStderrFlag {\n        // Read errors from stderr (lines with \"Error:\", \"Warning:\" and similar).\n        ReadErrors = 0,\n        // Read all stderr.\n        ReadAllStderr = 1,\n    };\n\n    TestInterface() = default;\n\n    virtual ~TestInterface() = default;\n\n    /// Start or restart GUI server and return true if successful.\n    virtual QByteArray startServer() = 0;\n\n    /// Stop GUI server and return true if server is was stopped or is not running.\n    virtual QByteArray stopServer() = 0;\n\n    /// Returns an error if server doesn't stop after some interval.\n    virtual QByteArray waitForServerToStop() = 0;\n\n    /// Return true if GUI server is not running.\n    virtual bool isServerRunning() = 0;\n\n    virtual QString executable() = 0;\n\n    /// Run client with given @a arguments and input and read outputs and return exit code.\n    virtual int run(const QStringList &arguments, QByteArray *stdoutData = nullptr,\n                    QByteArray *stderrData = nullptr, const QByteArray &in = QByteArray(),\n                    const QStringList &environment = QStringList()) = 0;\n\n    /// Run client with given @a arguments and read all errors/warnings.\n    virtual QByteArray runClient(const QStringList &arguments, const QByteArray &stdoutExpected,\n                                 const QByteArray &input = QByteArray()) = 0;\n\n    /// Run client with given @a arguments and expect errors/warnings on server and client side.\n    virtual QByteArray runClientWithError(const QStringList &arguments, int expectedExitCode,\n                                          const QByteArray &stderrContains = QByteArray()) = 0;\n\n    /// Run client with given @a arguments and read output, check stderr and exit code.\n    virtual QByteArray getClientOutput(const QStringList &arguments, QByteArray *stdoutActual) = 0;\n\n    /// Waits on client output.\n    virtual QByteArray waitOnOutput(const QStringList &arguments, const QByteArray &stdoutExpected) = 0;\n\n    /// Set clipboard through monitor process.\n    virtual QByteArray setClipboard(const QMap<QString, QVariant> &data, ClipboardMode mode = ClipboardMode::Clipboard) = 0;\n\n    /// Set clipboard through monitor process.\n    virtual QByteArray setClipboard(\n            const QByteArray &bytes,\n            const QString &mime = QLatin1String(\"text/plain\"),\n            ClipboardMode mode = ClipboardMode::Clipboard) = 0;\n\n    /// Verify clipboard content.\n    virtual QByteArray verifyClipboard(const QByteArray &data, const QString &mime, bool exact = true) = 0;\n\n    /**\n     * Return errors/warning from server (otherwise empty output).\n     * If @a readAll is set, read all stderr.\n     */\n    virtual QByteArray readServerErrors(ReadStderrFlag flag = ReadErrors) = 0;\n\n    /// Init test case. Return error string on error.\n    virtual QByteArray initTestCase() = 0;\n\n    /// Clean up test case. Return error string on error.\n    virtual QByteArray cleanupTestCase() = 0;\n\n    /// Init test. Return error string on error.\n    virtual QByteArray init() = 0;\n\n    /// Clean up tabs and items. Return error string on error.\n    virtual QByteArray cleanup() = 0;\n\n    /// Platform specific key to remove (usually Delete, Backspace on OS X).\n    virtual QString shortcutToRemove() = 0;\n\n    /// Set environment variable for test.\n    virtual void setEnv(const QString &name, const QString &value) = 0;\n\n    /// Ignore specific client and server errors.\n    virtual void ignoreErrors(const QRegularExpression &re) = 0;\n\n    virtual bool writeOutErrors(const QByteArray &errors) = 0;\n\n    /// Start a client process with the given arguments without waiting for completion.\n    virtual bool startClient(QProcess *p, const QStringList &arguments) = 0;\n\n    TestInterface(const TestInterface &) = delete;\n    TestInterface &operator=(const TestInterface &) = delete;\n};\n\nusing TestInterfacePtr = std::shared_ptr<TestInterface>;\n"
  },
  {
    "path": "src/tests/tests.cmake",
    "content": "message(STATUS \"Building with tests.\")\n\nfile(GLOB copyq_tests_SOURCES tests/*.cpp)\nadd_executable(copyq-tests\n    ${copyq_tests_SOURCES}\n    $<TARGET_OBJECTS:copyq-common>\n    ${MINIAUDIO_OBJECTS}\n)\nset_target_properties(copyq-tests PROPERTIES COMPILE_DEFINITIONS \"${copyq_DEFINITIONS}\")\n\nfind_package(${copyq_qt}Test REQUIRED)\ntarget_link_libraries(copyq-tests ${copyq_LIBRARIES} ${copyq_qt}::Test)\ntarget_include_directories(copyq-tests PRIVATE .)\n\nset(copyq_pkg itemtests)\nset(copyq_plugin_SOURCES\n    tests/itemtests/itemtests.cpp\n    item/itemwidget.cpp\n    )\nadd_library(${copyq_pkg} MODULE ${copyq_plugin_SOURCES})\ntarget_link_libraries(${copyq_pkg} ${copyq_qt}::Widgets ${copyq_qt}::Test)\ntarget_include_directories(${copyq_pkg} PRIVATE .)\n"
  },
  {
    "path": "src/tests/tests.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"tests.h\"\n#include \"test_utils.h\"\n#include \"tests_common.h\"\n\n#include \"itemencryptedtests.h\"\n#include \"itemfakevimtests.h\"\n#include \"itemimagetests.h\"\n#include \"itempinnedtests.h\"\n#include \"itemsynctests.h\"\n#include \"itemtagstests.h\"\n\n#include \"app/app.h\"\n#include \"common/client_server.h\"\n#include \"common/config.h\"\n#include \"common/log.h\"\n#include \"common/process.h\"\n#include \"common/settings.h\"\n#include \"common/shortcuts.h\"\n#include \"common/sleeptimer.h\"\n#include \"common/textdata.h\"\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QDir>\n#include <QElapsedTimer>\n#include <QFile>\n#include <QFileInfo>\n#include <QGuiApplication>\n#include <QLoggingCategory>\n#include <QMap>\n#include <QProcess>\n#include <QRegularExpression>\n#include <QStandardPaths>\n#include <QTest>\n#include <QTimer>\n\n#include <memory>\n\nnamespace {\n\nQ_DECLARE_LOGGING_CATEGORY(testCategory)\nQ_LOGGING_CATEGORY(testCategory, \"copyq.tests\")\n\nconst QString defaultTestId = QStringLiteral(\"CORE\");\nconst QString defaultTestPlugins = QStringLiteral(\"*itemtext*,*itemnotes*\");\n\nclass PerformanceTimer final {\npublic:\n    PerformanceTimer() {\n        m_timer.start();\n    }\n\n    void printPerformance(const char *label, const QStringList &arguments = QStringList()) {\n        const auto elapsedMs = m_timer.elapsed();\n        if (elapsedMs > 500)\n            qCWarning(testCategory) << \"--- PERFORMANCE ---\" << elapsedMs << \"ms:\" << label << arguments;\n        m_timer.start();\n    }\n\nprivate:\n    QElapsedTimer m_timer;\n};\n\nQByteArray decorateOutput(const QByteArray &label, const QByteArray &stderrOutput)\n{\n    QByteArray output = \"\\n\" + stderrOutput;\n    output.replace('\\n', \"\\n    \");\n    output.prepend(\"\\n  \" + label + \":\");\n    return output;\n}\n\nQStringList pluginPaths()\n{\n    QDir dir(QCoreApplication::applicationDirPath() + \"/src\");\n    const QString pattern = QStringLiteral(\"*itemtests.*\");\n    QStringList files;\n    for (const auto &fileName : dir.entryList({pattern}))\n        files.append( dir.absoluteFilePath(fileName) );\n    if (files.isEmpty()) {\n        qCCritical(testCategory) << \"Failed to find the test plugin\"\n            << pattern << \"in\" << dir.absolutePath();\n    }\n    return files;\n}\n\nclass TestInterfaceImpl final : public TestInterface {\npublic:\n    TestInterfaceImpl()\n        : m_server(nullptr)\n        , m_env(QProcessEnvironment::systemEnvironment())\n    {\n        if ( qEnvironmentVariableIsEmpty(\"COPYQ_PLUGINS\") )\n            m_env.insert(\"COPYQ_PLUGINS\", pluginPaths().join(';'));\n        m_env.insert(\"COPYQ_LOG_LEVEL\", \"DEBUG\");\n        m_env.insert(\"COPYQ_SESSION_COLOR\", defaultSessionColor);\n        m_env.insert(\"COPYQ_CLIPBOARD_COPY_TIMEOUT_MS\", \"2000\");\n        m_env.insert(\"COPYQ_PASSWORD\", \"TEST123\");\n        m_env.insert(\"COPYQ_QT_FILE_DIALOGS\", \"1\");\n        const auto loggingRules = qgetenv(\"COPYQ_TESTS_LOGGING_RULES\");\n        if ( !loggingRules.isEmpty() ) {\n            m_env.insert(\"QT_LOGGING_RULES\", loggingRules);\n        }\n    }\n\n    ~TestInterfaceImpl()\n    {\n        stopServer();\n    }\n\n    QByteArray startServer() override\n    {\n        m_server.reset(new QProcess);\n        if ( !startTestProcess(m_server.get(), QStringList(), QIODevice::NotOpen) ) {\n            return QString::fromLatin1(\"Failed to launch \\\"%1\\\": %2\")\n                .arg(executable())\n                .arg(m_server->errorString())\n                .toUtf8();\n        }\n\n        m_server->closeReadChannel(QProcess::StandardOutput);\n\n        RETURN_ON_ERROR( readServerErrors(), \"Failed to start server\" );\n\n        return waitForServerToStart();\n    }\n\n    QByteArray stopServer() override\n    {\n        if ( !isServerRunning() )\n            return \"Server is not running\";\n\n        QByteArray errors;\n        const int exitCode = run(Args(\"exit\"), nullptr, &errors);\n        if ( !testStderr(errors) || exitCode != 0 ) {\n            return \"Command 'exit' failed.\"\n                    + printClienAndServerStderr(errors, exitCode);\n        }\n\n        return waitForServerToStop();\n    }\n\n    QByteArray waitForServerToStop() override\n    {\n        PerformanceTimer perf;\n\n        // Process events in case we own clipboard and the new process requests the contents.\n        SleepTimer t(30000);\n        while ( m_server->state() != QProcess::NotRunning && !m_server->waitForFinished(50) && t.sleep() ) {}\n\n        perf.printPerformance(\"stopServer\");\n\n        if ( m_server->state() != QProcess::NotRunning ) {\n            qCWarning(testCategory) << \"terminating server process\";\n            m_server->terminate();\n\n            if ( !m_server->waitForFinished() ) {\n                qCWarning(testCategory) << \"killing server process\";\n                terminateProcess(m_server.get());\n            }\n\n            return \"Failed to close server properly!\" + readServerErrors(ReadAllStderr);\n        }\n\n        return readServerErrors();\n    }\n\n    bool isServerRunning() override\n    {\n        return m_server != nullptr && m_server->state() == QProcess::Running;\n    }\n\n    QString executable() override\n    {\n        const QByteArray executable = qgetenv(\"COPYQ_TESTS_EXECUTABLE\");\n        if ( !executable.isEmpty() )\n            return QString::fromUtf8(executable);\n\n        QDir dir(QCoreApplication::applicationDirPath());\n        return dir.absoluteFilePath(\"copyq\");\n    }\n\n    int run(const QStringList &arguments, QByteArray *stdoutData = nullptr,\n            QByteArray *stderrData = nullptr, const QByteArray &in = QByteArray(),\n            const QStringList &environment = QStringList()) override\n    {\n        if (stdoutData != nullptr)\n            stdoutData->clear();\n\n        if (stderrData != nullptr)\n            stderrData->clear();\n\n        QProcess p;\n        if (!startTestProcess(&p, arguments, QIODevice::ReadWrite, environment))\n            return -1;\n\n        if ( p.write(in) != in.size() )\n            return -2;\n\n        p.closeWriteChannel();\n\n        if (stdoutData == nullptr)\n            p.closeReadChannel(QProcess::StandardOutput);\n\n        if (stderrData == nullptr)\n            p.closeReadChannel(QProcess::StandardError);\n\n        PerformanceTimer perf;\n\n        SleepTimer t(waitClientRun);\n        while ( p.state() == QProcess::Running ) {\n            if ( stdoutData != nullptr ) {\n                const auto out = p.readAllStandardOutput();\n                stdoutData->append(out);\n            }\n\n            if (stderrData != nullptr) {\n                const auto err = p.readAllStandardError();\n                stderrData->append(err);\n            }\n\n            if ( !t.sleep() ) {\n                qCWarning(testCategory) << \"Client process timed out\" << arguments;\n                return -1;\n            }\n        }\n\n        if (stderrData != nullptr) {\n            stderrData->append(p.readAllStandardError());\n            stderrData->replace('\\r', \"\");\n        }\n\n        if (stdoutData != nullptr) {\n            stdoutData->append(p.readAllStandardOutput());\n            stdoutData->replace('\\r', \"\");\n        }\n\n        perf.printPerformance(\"run\", arguments);\n\n        return p.exitCode();\n    }\n\n    QByteArray printClienAndServerStderr(const QByteArray &clientStderr, int exitCode)\n    {\n        return \"\\n  Client exit code: \" + QByteArray::number(exitCode) + \"\\n\"\n                + decorateOutput(\"Client STDERR\", clientStderr)\n                + readServerErrors(ReadAllStderr);\n    }\n\n    QByteArray runClient(const QStringList &arguments, const QByteArray &stdoutExpected,\n                         const QByteArray &input = QByteArray()) override\n    {\n        if (!isServerRunning() )\n            return \"Server is not running!\" + readServerErrors(ReadAllStderr);\n\n        QByteArray stdoutActual;\n        QByteArray stderrActual;\n        const int exitCode = run(arguments, &stdoutActual, &stderrActual, input);\n\n        if ( !testStderr(stderrActual) || exitCode != 0 )\n            return printClienAndServerStderr(stderrActual, exitCode);\n\n        if (stdoutActual != stdoutExpected) {\n            return \"Test failed:\"\n                    + decorateOutput(\"Unexpected output\", stdoutActual)\n                    + decorateOutput(\"Expected output\", stdoutExpected)\n                    + printClienAndServerStderr(stderrActual, exitCode);\n        }\n\n        return readServerErrors();\n    }\n\n    QByteArray runClientWithError(const QStringList &arguments, int expectedExitCode,\n                                  const QByteArray &stderrContains = QByteArray()) override\n    {\n        Q_ASSERT(expectedExitCode != 0);\n\n        if ( !isServerRunning() )\n            return \"Server is not running!\" + readServerErrors(ReadAllStderr);\n\n        QByteArray stdoutActual;\n        QByteArray stderrActual;\n        const int exitCode = run(arguments, &stdoutActual, &stderrActual);\n\n        if ( !testStderr(stderrActual) )\n            return printClienAndServerStderr(stderrActual, exitCode);\n\n        if ( !stdoutActual.isEmpty() ) {\n            return \"Test failed: Expected empty output.\"\n                    + decorateOutput(\"Unexpected output\", stdoutActual)\n                    + printClienAndServerStderr(stderrActual, exitCode);\n        }\n\n        if (exitCode != expectedExitCode) {\n            return QString::fromLatin1(\"Test failed: Unexpected exit code %1; expected was %2\")\n                    .arg(exitCode)\n                    .arg(expectedExitCode)\n                    .toUtf8()\n                    + printClienAndServerStderr(stderrActual, exitCode);\n        }\n\n        if ( !stderrActual.contains(stderrContains) ) {\n            return QString::fromLatin1(\"Test failed: Expected error output on client side with \\\"%1\\\".\")\n                    .arg(QString::fromUtf8(stderrContains)).toUtf8()\n                    + printClienAndServerStderr(stderrActual, exitCode);\n        }\n\n        return readServerErrors();\n    }\n\n    QByteArray getClipboard(const QString &mime = QString(\"text/plain\"), ClipboardMode mode = ClipboardMode::Clipboard)\n    {\n        const QString command =\n            mode == ClipboardMode::Clipboard\n            ? QStringLiteral(\"clipboard\")\n            : QStringLiteral(\"selection\");\n        QByteArray stdoutActual;\n        QByteArray stderrActual;\n        const int exitCode = run(Args() << command << mime, &stdoutActual, &stderrActual);\n        if ( !testStderr(stderrActual) || exitCode != 0 )\n            return \"Failed to get clipboard: \" + printClienAndServerStderr(stderrActual, exitCode);\n        return stdoutActual;\n    }\n\n    QByteArray setClipboard(const QVariantMap &data, ClipboardMode mode) override\n    {\n        if ( !data.isEmpty() ) {\n            // Wait for clipboard monitor\n            QByteArray error;\n            SleepTimer t(8000);\n            do {\n                error = runClient(\n                    Args(\"monitoring() == isClipboardMonitorRunning()\"),\n                    QByteArrayLiteral(\"true\\n\"));\n            } while (!error.isEmpty() && t.sleep());\n\n            if (!error.isEmpty())\n                return \"Clipboard monitor is not running:\" + error;\n        }\n\n        clipboard()->setData(mode, data);\n        return {};\n    }\n\n    QByteArray setClipboard(const QByteArray &bytes, const QString &mime, ClipboardMode mode) override\n    {\n        if ( const QByteArray error = setClipboard(createDataMap(mime, bytes), mode);\n                !error.isEmpty() )\n        {\n            return error;\n        }\n\n        return verifyClipboard(bytes, mime);\n    }\n\n    QByteArray verifyClipboard(const QByteArray &data, const QString &mime, bool exact = true) override\n    {\n        // Due to image conversions in clipboard check only if PNG header is present.\n        if ( exact && mime.startsWith(QStringLiteral(\"image/\")) )\n            return verifyClipboard(\"PNG\", QStringLiteral(\"image/png\"), false);\n\n        PerformanceTimer perf;\n\n        SleepTimer t(5000);\n        QByteArray actualBytes;\n        do {\n            actualBytes = getClipboard(mime);\n            if ( exact ? actualBytes == data : actualBytes.contains(data) ) {\n                perf.printPerformance(\"verifyClipboard\", QStringList() << QString::fromUtf8(data) << mime);\n                waitFor(waitMsSetClipboard);\n                RETURN_ON_ERROR( readServerErrors(), \"Failed to set or test clipboard content\" );\n                return QByteArray();\n            }\n        } while (t.sleep());\n\n        return QString::fromLatin1(\"Unexpected clipboard data for MIME \\\"%1\\\":\")\n                .arg(mime).toUtf8()\n                + decorateOutput(\"Unexpected content\", actualBytes)\n                + decorateOutput(\"Expected content\", data)\n                + readServerErrors(ReadAllStderr);\n    }\n\n    QByteArray readServerErrors(ReadStderrFlag flag = ReadErrors) override\n    {\n        if (m_server) {\n            QCoreApplication::processEvents();\n            QByteArray output = readLogFile(maxReadLogSize);\n            if ( flag == ReadAllStderr || !testStderr(output) )\n              return decorateOutput(\"Server STDERR\", output);\n        }\n\n        return QByteArray();\n    }\n\n    QByteArray getClientOutput(const QStringList &arguments, QByteArray *stdoutActual) override\n    {\n        stdoutActual->clear();\n\n        QByteArray stderrActual;\n        int exitCode = run(arguments, stdoutActual, &stderrActual);\n        if ( !testStderr(stderrActual) || exitCode != 0 )\n            return printClienAndServerStderr(stderrActual, exitCode);\n\n        RETURN_ON_ERROR( readServerErrors(), \"Failed getting client output\" );\n\n        return \"\";\n    }\n\n    QByteArray waitOnOutput(const QStringList &arguments, const QByteArray &stdoutExpected) override\n    {\n        PerformanceTimer perf;\n        QByteArray stdoutActual;\n\n        SleepTimer t_(8000);\n        do {\n            RETURN_ON_ERROR( getClientOutput(arguments, &stdoutActual), \"Failed to wait on client output\" );\n        } while (stdoutActual != stdoutExpected && t_.sleep());\n\n        if (stdoutActual == stdoutExpected)\n            return QByteArray();\n\n        return QString::fromLatin1(\"Unexpected output for command \\\"%1\\\":\")\n                .arg(arguments.join(' ')).toUtf8()\n                + decorateOutput(\"Unexpected content\", stdoutActual)\n                + decorateOutput(\"Expected content\", stdoutExpected)\n                + readServerErrors(ReadAllStderr);\n    }\n\n    QByteArray cleanupTestCase() override\n    {\n        return cleanup();\n    }\n\n    QByteArray initTestCase() override\n    {\n        return QByteArray();\n    }\n\n    QByteArray init() override\n    {\n        RETURN_ON_ERROR( cleanup(), \"Failed to cleanup\" );\n\n        // Stop any old server session\n        const QByteArray errors = stopServer();\n        run({\"exit\"}, nullptr, nullptr, {}, {\"COPYQ_WAIT_FOR_SERVER_MS=0\"});\n        if ( isServerRunning() )\n            return \"Failed to stop an old server session: \" + errors;\n        if ( run({\"\"}, nullptr, nullptr, {}, {\"COPYQ_WAIT_FOR_SERVER_MS=0\"}) == 0 )\n            return \"Failed to stop a detached server session: \" + errors;\n\n        m_envBeforeTest = m_env;\n\n        // Remove all configuration files and tab data.\n        const auto settingsPaths = {\n            settingsDirectoryPath(),\n            qEnvironmentVariable(\"COPYQ_SETTINGS_PATH\")\n        };\n        for ( const auto &settingsPath : settingsPaths ) {\n            Q_ASSERT( !settingsPath.isEmpty() );\n            QDir settingsDir(settingsPath);\n            const QStringList settingsFileFilters(QStringLiteral(\"copyq*\"));\n            // Omit using dangerous QDir::removeRecursively().\n            for ( const auto &fileName : settingsDir.entryList(settingsFileFilters, QDir::Files) ) {\n                const auto path = settingsDir.absoluteFilePath(fileName);\n                QFile settingsFile(path);\n                if ( settingsFile.exists() && !settingsFile.remove() ) {\n#ifdef Q_OS_WIN\n                    // On Windows, a monitor subprocess may briefly hold\n                    // a lock file after the server exits.\n                    SleepTimer t(5000);\n                    while ( !settingsFile.remove() && t.sleep() ) {}\n                    if ( settingsFile.exists() )\n#endif\n                    return QString::fromLatin1(\"Failed to remove settings file \\\"%1\\\": %2\")\n                        .arg(path, settingsFile.errorString())\n                        .toUtf8();\n                }\n            }\n        }\n\n        // Update settings for tests.\n        {\n            Settings settings;\n            settings.clear();\n\n            settings.beginGroup(\"Options\");\n            settings.setValue( QStringLiteral(\"language\"), QStringLiteral(\"en\") );\n            settings.setValue( \"clipboard_tab\", clipboardTabName );\n            settings.setValue( \"close_on_unfocus\", false );\n            // Hide the main window even if there is no tray or minimize support.\n            settings.setValue( \"hide_main_window\", true );\n            // Exercise limiting rows in Process Manager dialog when testing.\n            settings.setValue( \"max_process_manager_rows\", 4 );\n            // Avoid using external key store.\n            settings.setValue( \"use_key_store\", false );\n            settings.endGroup();\n\n            if ( !m_settings.isEmpty() ) {\n                const bool pluginsTest = m_testId != defaultTestId;\n\n                if (pluginsTest) {\n                    settings.beginGroup(\"Plugins\");\n                    settings.beginGroup(m_testId);\n                }\n\n                for (auto it = m_settings.constBegin(); it != m_settings.constEnd(); ++it)\n                    settings.setValue( it.key(), it.value() );\n\n                if (pluginsTest) {\n                    settings.endGroup();\n                    settings.endGroup();\n                }\n            }\n        }\n\n        verifyConfiguration();\n\n        // Clear clipboard.\n        RETURN_ON_ERROR( setClipboard({}, ClipboardMode::Clipboard), \"Failed to reset clipboard\" );\n#ifdef HAS_MOUSE_SELECTIONS\n        RETURN_ON_ERROR( setClipboard({}, ClipboardMode::Selection), \"Failed to reset selection\" );\n#endif\n\n        if ( !dropLogsToFileCountAndSize(0, 0) )\n            return \"Failed to remove log files\";\n\n        RETURN_ON_ERROR( startServer(), \"Failed to initialize server\" );\n\n        // Always show main window first so that the results are consistent with desktop environments\n        // where user cannot hide main window (tiling window managers without tray).\n        RETURN_ON_ERROR( runClient(Args(\"show\"), \"\"), \"Failed to show main window\" );\n\n        return QByteArray();\n    }\n\n    QByteArray cleanup() override\n    {\n        m_env = m_envBeforeTest;\n        const QByteArray errors = isServerRunning() ? stopServer() : QByteArray();\n        m_ignoreErrors = {};\n\n        if ( !errors.isEmpty() || QTest::currentTestFailed() )\n            m_failed.append( QString::fromUtf8(QTest::currentTestFunction()) );\n\n        return errors;\n    }\n\n    QString shortcutToRemove() override\n    {\n        return ::shortcutToRemove();\n    }\n\n    void setEnv(const QString &name, const QString &value) override\n    {\n        m_env.insert(name, value);\n    }\n\n    void ignoreErrors(const QRegularExpression &re) override\n    {\n        m_ignoreErrors = re;\n    }\n\n    bool writeOutErrors(const QByteArray &errors) override\n    {\n        if (errors.isEmpty())\n            return false;\n\n        QFile ferr;\n        if ( ferr.open(stderr, QIODevice::WriteOnly) ) {\n            ferr.write(errors);\n            ferr.write(\"\\n\");\n            ferr.close();\n        }\n        return true;\n    }\n\n    void setupTest(const QString &id, const QString &allowPlugins, const QVariant &settings)\n    {\n        m_testId = id;\n        m_settings = settings.toMap();\n        m_env.insert(\"COPYQ_ALLOW_PLUGINS\", \"*itemtests*,*\" + allowPlugins + \"*\");\n        m_envBeforeTest = m_env;\n    }\n\n    int runTests(QObject *testObject, int argc = 0, char **argv = nullptr)\n    {\n        int exitCode = QTest::qExec(testObject, argc, argv);\n\n        const int maxRuns = m_env.value(\"COPYQ_TESTS_RERUN_FAILED\", \"0\").toInt();\n        for (int runCounter = 0; exitCode != 0 && !m_failed.isEmpty() && runCounter < maxRuns; ++runCounter) {\n            qInfo() << QString::fromLatin1(\"Rerunning %1 failed tests (%2/%3): %4\")\n                       .arg(m_failed.size())\n                       .arg(runCounter + 1)\n                       .arg(maxRuns)\n                       .arg(m_failed.join(\", \"));\n            QStringList args = m_failed;\n            m_failed.clear();\n            args.prepend( QString::fromUtf8(argv[0]) );\n            exitCode = QTest::qExec(testObject, args);\n        }\n        m_failed.clear();\n\n        return exitCode;\n    }\n\nprivate:\n    bool testStderr(const QByteArray &stderrData)\n    {\n        return ::testStderr(stderrData, m_ignoreErrors);\n    }\n\n    void verifyConfiguration()\n    {\n        Settings settings;\n        settings.beginGroup(\"Options\");\n        QCOMPARE( settings.value(QStringLiteral(\"close_on_unfocus\")), false );\n        QCOMPARE( settings.value(QStringLiteral(\"clipboard_tab\")), QString(clipboardTabName) );\n        QCOMPARE( settings.value(QStringLiteral(\"tabs\")).toStringList(), QStringList() );\n    }\n\n    bool startClient(QProcess *p, const QStringList &arguments) override\n    {\n        return startTestProcess(p, arguments);\n    }\n\n    bool startTestProcess(QProcess *p, const QStringList &arguments,\n                          QIODevice::OpenMode mode = QIODevice::ReadWrite,\n                          const QStringList &environment = QStringList())\n    {\n        if ( environment.isEmpty() ) {\n            p->setProcessEnvironment(m_env);\n        } else {\n            auto env = m_env;\n            for (const QString &nameValue : environment) {\n                const auto i = nameValue.indexOf(QLatin1Char('='));\n                Q_ASSERT(i != -1);\n                const auto name = nameValue.left(i);\n                const auto value = nameValue.mid(i+1);\n                env.insert(name, value);\n            }\n            p->setProcessEnvironment(env);\n        }\n\n        p->start( executable(), arguments, mode );\n        return p->waitForStarted(2000);\n    }\n\n    QByteArray waitForServerToStart()\n    {\n        SleepTimer t(15000);\n        do {\n            if ( run(Args() << \"\") == 0 )\n                return QByteArray();\n        } while ( t.sleep() );\n\n        return \"Unable to start server!\" + readServerErrors(ReadAllStderr);\n    }\n\n    PlatformClipboard *clipboard()\n    {\n        if (m_clipboard == nullptr)\n            m_clipboard = platformNativeInterface()->clipboard();\n        return m_clipboard.get();\n    }\n\n    std::unique_ptr<QProcess> m_server;\n    QProcessEnvironment m_env;\n    QProcessEnvironment m_envBeforeTest;\n    QString m_testId;\n    QVariantMap m_settings;\n    QRegularExpression m_ignoreErrors;\n\n    QStringList m_failed;\n\n    PlatformClipboardPtr m_clipboard;\n};\n\n} // namespace\n\nTests::Tests(const TestInterfacePtr &test, QObject *parent)\n    : QObject(parent)\n    , m_test(test)\n{\n}\n\nvoid Tests::initTestCase()\n{\n    TEST(m_test->initTestCase());\n}\n\nvoid Tests::cleanupTestCase()\n{\n    TEST(m_test->cleanupTestCase());\n}\n\nvoid Tests::init()\n{\n    TEST(m_test->init());\n}\n\nvoid Tests::cleanup()\n{\n    TEST( m_test->cleanup() );\n}\n\nint Tests::run(\n        const QStringList &arguments, QByteArray *stdoutData, QByteArray *stderrData, const QByteArray &in,\n        const QStringList &environment)\n{\n    return m_test->run(arguments, stdoutData, stderrData, in, environment);\n}\n\nbool Tests::hasTab(const QString &tabName)\n{\n    QByteArray out;\n    run(Args(\"tab\"), &out);\n    return splitLines(out).contains(tabName);\n}\n\nint main(int argc, char **argv)\n{\n    // Avoid verbose logs on stderr if tests are not failing\n    qunsetenv(\"COPYQ_LOG_LEVEL\");\n\n    const QString appName = QStringLiteral(\"copyq.test\");\n    QCoreApplication::setOrganizationName(appName);\n    QCoreApplication::setApplicationName(appName);\n    const auto configPath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);\n    qCInfo(testCategory) << \"Using config directory for tests:\" << configPath;\n    QDir configDir(configPath);\n    qputenv(\"COPYQ_SETTINGS_PATH\", configPath.toLocal8Bit());\n    qputenv(\"COPYQ_LOG_FILE\", configDir.absoluteFilePath(QStringLiteral(\"tests.log\")).toLocal8Bit());\n    qputenv(\"COPYQ_ITEM_DATA_PATH\", configDir.absoluteFilePath(QStringLiteral(\"items\")).toLocal8Bit());\n\n    QRegularExpression onlyPlugins;\n    bool runPluginTests = true;\n\n    if (argc > 1) {\n        QString arg = argv[1];\n        if (arg.startsWith(\"PLUGINS:\")) {\n            arg.remove(QRegularExpression(\"^PLUGINS:\"));\n            onlyPlugins = QRegularExpression(arg, QRegularExpression::CaseInsensitiveOption);\n            --argc;\n            ++argv;\n        } else {\n            // Omit plugin tests if specific core tests requested.\n            const QString lastArg(argv[argc - 1]);\n            runPluginTests = lastArg.startsWith(\"-\");\n        }\n    }\n\n    setSessionName(sessionName);\n    const auto platform = platformNativeInterface();\n    std::unique_ptr<QGuiApplication> app( platform->createTestApplication(argc, argv) );\n    initSession(app.get(), sessionName);\n\n    // Set higher default tests timeout.\n    // The default value is 5 minutes (in Qt 5.15) which is not enough to run\n    // all tests in Tests class on some systems.\n    bool ok;\n    const int timeout = qEnvironmentVariableIntValue(\"QTEST_FUNCTION_TIMEOUT\", &ok);\n    if (!ok || timeout <= 0)\n        qputenv(\"QTEST_FUNCTION_TIMEOUT\", QByteArray::number(15 * 60 * 1000));\n\n    int exitCode = 0;\n    std::shared_ptr<TestInterfaceImpl> test(new TestInterfaceImpl);\n    const auto runTests = [&](QObject *tests){\n        exitCode = std::max(exitCode, test->runTests(tests, argc, argv));\n        test->stopServer();\n    };\n\n    if (onlyPlugins.pattern().isEmpty()) {\n        test->setupTest(\"CORE\", defaultTestPlugins, QVariant());\n        Tests tc(test);\n        runTests(&tc);\n    }\n\n    if (runPluginTests) {\n        const QList<QObject*> pluginTests{\n            new ItemEncryptedTests(test),\n            new ItemFakeVimTests(test),\n            new ItemImageTests(test),\n            new ItemPinnedTests(test),\n            new ItemSyncTests(test),\n            new ItemTagsTests(test),\n        };\n        for (const auto pluginTest : pluginTests) {\n            const auto pluginId = pluginTest->property(\"CopyQ_test_id\").toString();\n            if ( !pluginId.contains(onlyPlugins) )\n                continue;\n\n            const auto settings = pluginTest->property(\"CopyQ_test_settings\");\n            test->setupTest(pluginId, pluginId, settings);\n            runTests(pluginTest);\n        }\n    }\n\n    return exitCode;\n}\n"
  },
  {
    "path": "src/tests/tests.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n#include <QStringList>\n\nclass QProcess;\nclass QByteArray;\n\n/**\n * Tests for the application.\n */\nclass Tests final : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit Tests(const TestInterfacePtr &test, QObject *parent = nullptr);\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void init();\n    void cleanup();\n\n    void configPath();\n    void readLog();\n    void rotateLog();\n    void pluginsDisabled();\n    void commandHelp();\n    void commandVersion();\n    void badCommand();\n    void badSessionName();\n\n    void commandCatchExceptions();\n\n    void commandExit();\n    void commandEval();\n    void commandEvalThrows();\n    void commandEvalSyntaxError();\n    void commandEvalArguments();\n    void commandEvalEndingWithComment();\n    void commandPrint();\n    void commandAbort();\n    void commandFail();\n    void commandSource();\n\n    void commandVisible();\n    void commandToggle();\n    void commandShowHide();\n    void commandShowHideRapid();\n    void commandShowAt();\n    void commandFocused();\n\n    void commandsUnicode();\n\n    void commandsAddRead();\n    void commandsWriteRead();\n    void commandsReadUtf8ByDefault();\n    void commandChange();\n\n    void commandSetCurrentTab();\n\n    void commandConfig();\n    void commandToggleConfig();\n\n    void commandDialog();\n    void commandDialogCloseOnDisconnect();\n\n    void commandMenuItems();\n\n    void commandsPackUnpack();\n    void commandsBase64();\n    void commandsGetSetItem();\n\n    void commandsChecksums();\n\n    void commandEscapeHTML();\n\n    void commandExecute();\n\n    void commandSettings();\n\n    void commandsEnvSetEnv();\n\n    void commandSleep();\n\n    void commandsData();\n\n    void commandCurrentWindowTitle();\n\n    void commandCopy();\n    void commandClipboard();\n    void commandHasClipboardFormat();\n\n    void commandEdit();\n    void commandEditItem();\n\n    void commandGetSetCurrentPath();\n\n    void commandSelectItems();\n\n    void commandsExportImport();\n\n    void commandsGetSetCommands();\n\n    void commandsImportExportCommands();\n    void commandsImportExportCommandsFixIndentation();\n\n    void commandsAddCommandsRegExp();\n\n    void commandScreenshot();\n\n    void commandNotification();\n    void commandNotificationUrgency();\n    void commandNotificationPersistent();\n    void commandPlaySound();\n\n    void commandIcon();\n    void commandIconTag();\n    void commandIconTagColor();\n    void commandLoadTheme();\n\n    void commandDateString();\n\n    void commandAfterMilliseconds();\n\n    void commandAsync();\n\n    void commandFilter();\n\n    void commandMimeTypes();\n\n    void commandUnload();\n    void commandForceUnload();\n\n    void commandServerLogAndLogs();\n\n    void commandStats();\n    void statsQObjectLeak();\n\n    void classByteArray();\n    void classFile();\n    void classDir();\n    void classTemporaryFile();\n    void classItemSelection();\n    void classItemSelectionGetCurrent();\n    void classItemSelectionByteArray();\n    void classItemSelectionSort();\n    void classSettings();\n    void calledWithInstance();\n\n    void pipingCommands();\n\n    void chainingCommands();\n\n    void configMaxitems();\n\n    void keysAndFocusing();\n\n    void navigationDefault();\n    void navigationVi();\n    void navigationEmacs();\n\n    void selectItems();\n\n    void moveItems();\n    void deleteItems();\n    void searchItems();\n    void searchItemsAndSelect();\n    void searchItemsAndCopy();\n    void searchRowNumber();\n    void searchAccented();\n    void searchManyItems();\n    void copyItems();\n    void selectAndCopyOrder();\n\n    void sortAndReverse();\n\n    void createTabDialog();\n\n    void copyPasteCommands();\n\n    void editItems();\n    void createNewItem();\n    void editNotes();\n    void editHtml();\n\n    void toggleClipboardMonitoring();\n\n    void clipboardToItem();\n    void itemToClipboard();\n    void tabAdd();\n    void tabRemove();\n    void tabIcon();\n    void action();\n    void insertRemoveItems();\n    void renameTab();\n    void renameClipboardTab();\n    void importExportTab();\n\n    void removeAllFoundItems();\n\n    void nextPrevious();\n\n    void externalEditor();\n\n    void nextPreviousTab();\n\n    void itemPreview();\n\n    void openAndSavePreferences();\n\n    void pasteFromMainWindow();\n\n    void tray();\n    void menu();\n\n    void traySearch();\n    void trayPaste();\n    void trayShowHideAction();\n    void trayMenuToggleRapid();\n\n    void pasteNext();\n\n    // Options for tray menu.\n    void configTrayTab();\n    void configMove();\n    void configTrayTabIsCurrent();\n\n    void configAutostart();\n\n    void envVariablePaths();\n\n    void configTabs();\n\n    void selectedItems();\n\n    void shortcutCommand();\n    void shortcutCommandOverrideEnter();\n    void shortcutCommandMatchInput();\n    void shortcutCommandMatchCmd();\n\n    void shortcutCommandSelectedItemData();\n    void shortcutCommandSetSelectedItemData();\n    void shortcutCommandSelectedItemsData();\n    void shortcutCommandSetSelectedItemsData();\n    void shortcutCommandSelectedAndCurrent();\n    void shortcutCommandMoveSelected();\n\n    void automaticCommandIgnore();\n    void automaticCommandRemove();\n    void automaticCommandInput();\n    void automaticCommandRegExp();\n    void automaticCommandSetData();\n    void automaticCommandOutputTab();\n    void automaticCommandNoOutputTab();\n    void automaticCommandChaining();\n    void automaticCommandCopyToTab();\n    void automaticCommandStoreSpecialFormat();\n    void automaticCommandIgnoreSpecialFormat();\n\n    void globalCommandInMenu();\n\n    void scriptCommandLoaded();\n    void scriptCommandAddFunction();\n    void scriptCommandOverrideFunction();\n    void scriptCommandEnhanceFunction();\n    void scriptCommandEndingWithComment();\n    void scriptCommandWithError();\n\n    void scriptPaste();\n    void scriptOnTabSelected();\n    void scriptOnItemsRemoved();\n    void scriptOnItemsAdded();\n    void scriptOnItemsChanged();\n    void scriptOnItemsLoaded();\n    void scriptEventMaxRecursion();\n    void scriptSlowCollectOverrides();\n\n    void displayCommand();\n    void displayCommandForMenu();\n\n    void synchronizeInternalCommands();\n\n    void utilityCommands();\n\n    void setTabName();\n\n    void showHideAboutDialog();\n    void showHideClipboardDialog();\n    void showHideItemDialog();\n    void showHideLogDialog();\n    void showHideActionHandlerDialog();\n\n    void shortcutDialogAddShortcut();\n    void shortcutDialogAddTwoShortcuts();\n    void shortcutDialogChangeShortcut();\n    void shortcutDialogSameShortcut();\n    void shortcutDialogCancel();\n\n    void actionDialogCancel();\n    void actionDialogAccept();\n    void actionDialogSelectionInputOutput();\n\n    void exitConfirm();\n    void exitNoConfirm();\n    void exitStopCommands();\n    void terminateActionRequestTerminate();\n    void terminateActionRequestKill();\n\n    void abortInputReader();\n\n    void changeAlwaysOnTop();\n\n    void networkTests();\n\n    void pluginNotInstalled();\n\n    void startServerAndRunCommand();\n\n    void avoidStoringPasswords();\n    void scriptsForPasswords();\n\n    void currentClipboardOwner();\n    void singleClipboardProvider();\n\n    void saveLargeItem();\n\n    void slowClipboard();\n    void clipboardUriList();\n\n    void handleUnexpectedTypes();\n\n    void expireTabs();\n    void expireEncryptionPassword();\n    void expireEncryptionPasswordOnConfigChange();\n\n    void dragNDropItemOrder();\n    void dragNDropItemToTabTree();\n    void dragNDropTreeTab();\n    void dragNDropTreeTabNested();\n    void dragNDropTreeTabChildCollision();\n    void dragNDropTreeTabPartialRenameFailure();\n    void dragNDropTreeTabKeepsCollapsedState();\n\n    void tabEncryption();\n    void tabEncryptionPasswordNew();\n    void tabEncryptionPasswordCurrent();\n    void tabEncryptionPasswordRetry();\n    void tabEncryptionPasswordRetryFail();\n    void tabEncryptionPasswordAbortRetry();\n    void tabEncryptionLargeItems();\n    void tabEncryptionChangePassword();\n\n    void exportImportNoPasswordTab();\n    void exportImportNoPasswordSettingsOnly();\n    void exportImportNoPasswordCommandsOnly();\n    void exportImportPasswordTab();\n    void exportImportPasswordSettingsOnly();\n    void exportImportPasswordCommandsOnly();\n    void exportImportErrors();\n\nprivate:\n    void navigationTestInit();\n    void navigationTestDownUp(const QString &down, const QString &up);\n    void navigationTestEndHome(const QString &end, const QString &home);\n    void navigationTestEscapeEditor(const QString &esc, const QString &editor);\n    void navigationTestEscapeSearch(const QString &esc, const QString &search);\n\n    enum ExportFlags {\n        ExportWithPassword = 1,\n        ExportTab = 2,\n        ExportSettings = 4,\n        ExportCommands = 8\n    };\n    void exportImport(int flags);\n\n    void clearServerErrors();\n    int run(const QStringList &arguments, QByteArray *stdoutData = nullptr,\n            QByteArray *stderrData = nullptr, const QByteArray &in = QByteArray(),\n            const QStringList &environment = QStringList());\n    bool hasTab(const QString &tabName);\n\n    TestInterfacePtr m_test;\n};\n"
  },
  {
    "path": "src/tests/tests_classes.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/appconfig.h\"\n\nvoid Tests::classByteArray()\n{\n    RUN(\"ByteArray\", \"\");\n    RUN(\"ByteArray('test')\", \"test\");\n    RUN(\"ByteArray(ByteArray('test'))\", \"test\");\n    RUN(\"typeof(ByteArray('test'))\", \"object\\n\");\n    RUN(\"ByteArray('test') instanceof ByteArray\", \"true\\n\");\n    RUN(\"b = ByteArray('0123'); b.chop(2); b\", \"01\");\n    RUN(\"ByteArray('0123').equals(ByteArray('0123'))\", \"true\\n\");\n    RUN(\"ByteArray('0123').left(3)\", \"012\");\n    RUN(\"ByteArray('0123').mid(1, 2)\", \"12\");\n    RUN(\"ByteArray('0123').mid(1)\", \"123\");\n    RUN(\"ByteArray('0123').right(3)\", \"123\");\n    RUN(\"ByteArray('0123').remove(1, 2)\", \"03\");\n    RUN(\"ByteArray(' 01  23 ').simplified()\", \"01 23\");\n    RUN(\"ByteArray('0123').toBase64()\", \"MDEyMw==\");\n    RUN(\"ByteArray('ABCd').toLower()\", \"abcd\");\n    RUN(\"ByteArray('abcD').toUpper()\", \"ABCD\");\n    RUN(\"ByteArray(' 01  23 ').trimmed()\", \"01  23\");\n    RUN(\"b = ByteArray('0123'); b.truncate(2); b\", \"01\");\n    RUN(\"ByteArray('0123').toLatin1String() == '0123'\", \"true\\n\");\n    RUN(\"ByteArray('0123').valueOf() == '0123'\", \"true\\n\");\n    RUN(\"ByteArray(8).size()\", \"8\\n\");\n    RUN(\"b = ByteArray(); b.length = 10; b.length\", \"10\\n\");\n\n    // ByteArray implicitly converts to str.\n    RUN(\"ByteArray('test') == 'test'\", \"true\\n\");\n    RUN(\"ByteArray('test1') == 'test2'\", \"false\\n\");\n    RUN(\"ByteArray('test') === 'test'\", \"false\\n\");\n    RUN(\"ByteArray('a') + 'b'\", \"ab\\n\");\n}\n\nvoid Tests::classFile()\n{\n    RUN(\"var f = new File('/copyq_missing_file'); f.exists()\", \"false\\n\");\n}\n\nvoid Tests::classDir()\n{\n    RUN(\"var d = new Dir('/missing_directory/')\"\n        \"; d.exists()\"\n        , \"false\\n\"\n        );\n\n    const auto home = QDir::homePath();\n    RUN(\"Dir().homePath()\", home + \"\\n\");\n    RUN(\"Dir().home().path()\", home + \"\\n\");\n\n    const auto root = QDir::rootPath();\n    RUN(\"Dir().rootPath()\", root + \"\\n\");\n    RUN(\"Dir().root().path()\", root + \"\\n\");\n\n    const auto temp = QDir::tempPath();\n    RUN(\"Dir().tempPath()\", temp + \"\\n\");\n    RUN(\"Dir().temp().path()\", temp + \"\\n\");\n\n    RUN(\"Dir().separator()\", QString(QDir::separator()) + \"\\n\");\n\n    QTemporaryDir tmpDir;\n    QVERIFY(tmpDir.isValid());\n    QDir dir(tmpDir.path());\n    const auto path = dir.path();\n    const auto args = QString::fromLatin1(\"var d = new Dir('%1')\").arg(path);\n\n    RUN(args << \"d.exists()\", \"true\\n\");\n    RUN(args << \"d.isReadable()\", \"true\\n\");\n    RUN(args << \"d.isAbsolute()\", \"true\\n\");\n    RUN(args << \"d.isRelative()\", \"false\\n\");\n    RUN(args << \"d.absolutePath()\", path + \"\\n\");\n    RUN(args << \"d.path()\", path + \"\\n\");\n    RUN(args << \"d.makeAbsolute()\", \"true\\n\");\n\n    RUN(args << \"d.mkdir('test')\", \"true\\n\");\n    QVERIFY( QDir(dir.filePath(\"test\")).exists() );\n    RUN(args << \"d.exists('test')\", \"true\\n\");\n\n    RUN(args << \"d.mkpath('a/b/c')\", \"true\\n\");\n    QVERIFY( QDir(dir.filePath(\"a/b/c\")).exists() );\n    RUN(args << \"d.exists('a/b/c')\", \"true\\n\");\n    RUN(args << \"d.filePath('a/b/c')\", dir.filePath(\"a/b/c\") + \"\\n\");\n    RUN(args << \"d.relativeFilePath('\" + path + \"/a/b/c')\", \"a/b/c\\n\");\n    RUN(\"Dir('\" + path + \"/test/../a//b/c/..').canonicalPath()\", QDir(path + \"/a/b\").canonicalPath() + \"\\n\");\n    RUN(args << \"d.setPath('\" + path + \"/a/b/c')\" << \"d.path()\", dir.filePath(\"a/b/c\") + \"\\n\");\n\n    RUN(args << \"d.cd('a')\" << \"d.cd('b')\", \"true\\n\");\n    RUN(args << \"d.cd('x')\", \"false\\n\");\n    RUN(args << \"d.cd('a')\" << \"d.cd('b')\" << \"d.path()\", dir.filePath(\"a/b\") + \"\\n\");\n    RUN(args << \"d.cd('a')\" << \"d.cd('..')\" << \"d.path()\", path + \"\\n\");\n    RUN(args << \"d.cd('a')\" << \"d.cdUp()\" << \"d.path()\", path + \"\\n\");\n\n    RUN(args << \"d.count()\", QString::fromLatin1(\"%1\\n\").arg(dir.count()));\n    RUN(args << \"d.dirName()\", QString::fromLatin1(\"%1\\n\").arg(dir.dirName()));\n\n    RUN(args << \"d.match(['a*'], 'test')\", \"false\\n\");\n    RUN(args << \"d.match(['t*'], 'test')\", \"true\\n\");\n    RUN(args << \"d.entryList()\", \".\\n..\\na\\ntest\\n\");\n    RUN(args << \"d.entryList(['t*'])\", \"test\\n\");\n    RUN(args << \"d.entryList(['t?st', 'a*'])\", \"a\\ntest\\n\");\n\n    RUN(args << \"d.setNameFilters(['t?st', 'a*'])\" << \"d.nameFilters()\", \"t?st\\na*\\n\");\n\n    QFile f(dir.filePath(\"test.txt\"));\n    QVERIFY( f.open(QIODevice::WriteOnly) );\n    f.close();\n    RUN(args << \"d.exists('test.txt')\", \"true\\n\");\n    RUN(args << \"d.absoluteFilePath('test.txt')\", dir.filePath(\"test.txt\") + \"\\n\");\n    RUN(args << \"d.rename('test.txt', 'test2.txt')\", \"true\\n\");\n    RUN(args << \"d.exists('test2.txt')\", \"true\\n\");\n    RUN(args << \"d.remove('test2.txt')\", \"true\\n\");\n    RUN(args << \"d.exists('test2.txt')\", \"false\\n\");\n\n    RUN(args << \"d.rmdir('test')\", \"true\\n\");\n    RUN(args << \"d.exists('test')\", \"false\\n\");\n\n    RUN(\"Dir().cleanPath('/a//b/../c/')\", QDir::cleanPath(\"/a//b/../c/\") + \"\\n\");\n}\n\nvoid Tests::classTemporaryFile()\n{\n    RUN(\"var f = new TemporaryFile(); f.open()\", \"true\\n\");\n\n    QByteArray err;\n\n    for ( const auto autoRemove : {true, false} ) {\n        QByteArray fileName;\n        const auto script =\n                QString(R\"(\n                        var f = new TemporaryFile()\n                        if (!f.open())\n                            throw 'Failed to open temporary file'\n\n                        f.setAutoRemove(%1)\n                        print(f.fileName())\n                        )\").arg(autoRemove);\n        run(Args() << script, &fileName, &err);\n        QVERIFY2( testStderr(err), err );\n\n        QFile f( QString::fromUtf8(fileName) );\n        QVERIFY( f.exists() != autoRemove );\n\n        if (!autoRemove)\n            f.remove();\n    }\n\n    QByteArray fileName;\n    const auto scriptWrite = R\"(\n        var f = new TemporaryFile()\n        if (!f.open())\n            throw 'Failed to open temporary file'\n\n        if (!f.write('LINE'))\n            throw 'Failed to write to temporary file'\n\n        f.setAutoRemove(false)\n        print(f.fileName())\n        )\";\n    run(Args() << scriptWrite, &fileName);\n    QVERIFY2( testStderr(err), err );\n    QVERIFY( QFile::exists(QString::fromUtf8(fileName)) );\n\n    QByteArray out;\n    const auto scriptRead = R\"(\n        var f = new File(str(input()))\n        if (!f.openReadOnly())\n            throw 'Failed to open file'\n\n        print(''\n            + ' exists()=' + str(f.exists())\n            + ' isOpen()=' + str(f.isOpen())\n            + ' isReadable()=' + str(f.isReadable())\n            + ' isWritable()=' + str(f.isWritable())\n            + ' size()=' + str(f.size())\n            + ' readAll()=' + str(f.readAll())\n            + ' atEnd()=' + str(f.atEnd())\n            + ' seek(0)=' + str(f.seek(0))\n            + ' read(1)=' + str(f.read(1))\n            + ' pos()=' + str(f.pos())\n            + ' peek(1)=' + str(f.peek(1))\n            + ' readLine()=' + str(f.readLine())\n        )\n        )\";\n    const QByteArray expectedOut =\n        \" exists()=true\"\n        \" isOpen()=true\"\n        \" isReadable()=true\"\n        \" isWritable()=false\"\n        \" size()=4\"\n        \" readAll()=LINE\"\n        \" atEnd()=true\"\n        \" seek(0)=true\"\n        \" read(1)=L\"\n        \" pos()=1\"\n        \" peek(1)=I\"\n        \" readLine()=INE\";\n    run(Args() << scriptRead, &out, &err, fileName);\n    QVERIFY2( testStderr(err), err );\n    QCOMPARE(out, expectedOut);\n\n    const auto scriptRemove = R\"(\n        var f = new File(str(input()))\n        if (!f.remove())\n            throw 'Failed to remove file'\n        )\";\n    run(Args() << scriptRemove, &out, &err, fileName);\n    QVERIFY2( testStderr(err), err );\n    QCOMPARE(QByteArray(), out);\n    QVERIFY( !QFile::exists(QString::fromUtf8(fileName)) );\n\n    RUN(\"TemporaryFile().autoRemove()\", \"true\\n\");\n    RUN(\"TemporaryFile().fileTemplate()\", QDir::temp().filePath(QStringLiteral(\"copyq-%1.XXXXXX\").arg(sessionName)) + \"\\n\");\n}\n\nvoid Tests::classItemSelection()\n{\n    const auto tab1 = testTab(1);\n    const Args args = Args(\"tab\") << tab1 << \"separator\" << \",\";\n    const QString outRows(\"ItemSelection(tab=\\\"\" + tab1 + \"\\\", rows=[%1])\\n\");\n\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(args << \"ItemSelection().length\", \"0\\n\");\n    RUN(\"ItemSelection('\" + tab1 + \"').length\", \"0\\n\");\n    RUN(args << \"ItemSelection().selectAll().length\", \"3\\n\");\n    RUN(\"ItemSelection('\" + tab1 + \"').selectAll().length\", \"3\\n\");\n\n    RUN(args << \"a = ItemSelection(); b = a; a === b\", \"true\\n\");\n    RUN(args << \"a = ItemSelection(); b = a.selectAll(); a === b\", \"true\\n\");\n\n    RUN(args << \"ItemSelection().selectAll().str()\", outRows.arg(\"0..2\"));\n    RUN(args << \"ItemSelection().selectRemovable().str()\", outRows.arg(\"0..2\"));\n    RUN(args << \"ItemSelection().selectRemovable().removeAll().str()\", outRows.arg(\"\"));\n    RUN(args << \"read(0,1,2)\", \",,\");\n\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(args << \"ItemSelection().select(/A|C/).str()\", outRows.arg(\"0,2\"));\n    RUN(args << \"ItemSelection().select(/a|c/i).str()\", outRows.arg(\"0,2\"));\n    RUN(args << \"ItemSelection().select(/A/).select(/C/).str()\", outRows.arg(\"0,2\"));\n    RUN(args << \"ItemSelection().select(/C/).select(/A/).str()\", outRows.arg(\"2,0\"));\n    RUN(args << \"ItemSelection().select(/A|C/).invert().str()\", outRows.arg(\"1\"));\n\n    RUN(args << \"ItemSelection().select(/A|C/).deselectIndexes([0]).str()\", outRows.arg(\"2\"));\n    RUN(args << \"ItemSelection().select(/A|C/).deselectIndexes([1]).str()\", outRows.arg(\"0\"));\n    RUN(args << \"ItemSelection().select(/A|C/).deselectIndexes([0,1]).str()\", outRows.arg(\"\"));\n    RUN(args << \"ItemSelection().select(/A|C/).deselectSelection(ItemSelection().select(/A/)).str()\", outRows.arg(\"2\"));\n    RUN(args << \"ItemSelection().select(/A|C/).deselectSelection(ItemSelection().select(/C/)).str()\", outRows.arg(\"0\"));\n    RUN(args << \"ItemSelection().select(/A|C/).deselectSelection(ItemSelection().selectAll()).str()\", outRows.arg(\"\"));\n\n    RUN(args << \"a = ItemSelection().select(/a/i); b = a.copy(); a !== b\", \"true\\n\");\n    RUN(args << \"a = ItemSelection().select(/a/i); b = a.copy(); a.str() == b.str()\", \"true\\n\");\n    RUN(args << \"a = ItemSelection().select(/a|b/i); b = a.copy(); b.select(/C/); [a.rows(), '', b.rows()]\", \"0\\n1\\n\\n0\\n1\\n2\\n\");\n\n    RUN(args << \"s = ItemSelection().selectAll(); insert(1, 'X'); insert(3, 'Y'); s.invert().str()\", outRows.arg(\"1,3\"));\n\n    RUN(args << \"ItemSelection().select(/a/i).invert().removeAll().str()\", outRows.arg(\"\"));\n    RUN(args << \"read(0,1,2)\", \"A,,\");\n\n    RUN(args << \"ItemSelection().selectAll().removeAll().str()\", outRows.arg(\"\"));\n    RUN(args << \"read(0,1,2)\", \",,\");\n\n    RUN(args << \"write('application/x-tst', 'ghi')\", \"\");\n    RUN(args << \"write('application/x-tst', 'def')\", \"\");\n    RUN(args << \"write('application/x-tst', 'abc')\", \"\");\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"abc,def,ghi\");\n    RUN(args << \"ItemSelection().select(/e/, 'application/x-tst').str()\", outRows.arg(\"1\"));\n    RUN(args << \"ItemSelection().select(/e/, 'application/x-tst').removeAll().str()\", outRows.arg(\"\"));\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"abc,ghi,\");\n\n    RUN(args << \"ItemSelection().selectAll().itemAtIndex(0)['application/x-tst']\", \"abc\");\n    RUN(args << \"ItemSelection().selectAll().itemAtIndex(1)['application/x-tst']\", \"ghi\");\n    RUN(args << \"ItemSelection().select(/h/, 'application/x-tst').itemAtIndex(0)['application/x-tst']\", \"ghi\");\n    RUN(args << \"ItemSelection().select(/h/, 'application/x-tst').itemAtIndex(1)['application/x-tst'] == undefined\", \"true\\n\");\n\n    RUN(args << \"ItemSelection().select(/ghi/, 'application/x-tst').setItemAtIndex(0, {'application/x-tst': 'def'}).str()\",\n        outRows.arg(\"1\"));\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"abc,def,\");\n\n    RUN(args << \"d = ItemSelection().selectAll().items(); [d.length, str(d[0]['application/x-tst']), str(d[1]['application/x-tst'])]\", \"2\\nabc\\ndef\\n\");\n    RUN(args << \"ItemSelection().selectAll().setItems([{'application/x-tst': 'xyz'}]).str()\", outRows.arg(\"0,1\"));\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"xyz,def,\");\n\n    RUN(args << \"ItemSelection().selectAll().setItemsFormat(mimeItemNotes, 'test1').str()\", outRows.arg(\"0,1\"));\n    RUN(args << \"read(mimeItemNotes,0,1,2)\", \"test1,test1,\");\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"xyz,def,\");\n\n    RUN(args << \"ItemSelection().selectAll().setItems([{'application/x-tst': ByteArray('abc')}]).str()\", outRows.arg(\"0,1\"));\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"abc,def,\");\n\n    RUN(args << \"ItemSelection().selectAll().setItemsFormat(mimeItemNotes, ByteArray('test2')).str()\", outRows.arg(\"0,1\"));\n    RUN(args << \"read(mimeItemNotes,0,1,2)\", \"test2,test2,\");\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"abc,def,\");\n\n    RUN(args << \"ItemSelection().selectAll().itemsFormat(mimeItemNotes).map(str)\", \"test2\\ntest2\\n\");\n    RUN(args << \"ItemSelection().selectAll().itemsFormat('application/x-tst').map(str)\", \"abc\\ndef\\n\");\n    RUN(args << \"ItemSelection().selectAll().itemsFormat(ByteArray('application/x-tst')).map(str)\", \"abc\\ndef\\n\");\n\n    RUN(args << \"ItemSelection().selectAll().setItemsFormat(mimeItemNotes, undefined).str()\", outRows.arg(\"0,1\"));\n    RUN(args << \"read(mimeItemNotes,0,1,2)\", \",,\");\n    RUN(args << \"read('application/x-tst',0,1,2)\", \"abc,def,\");\n\n    RUN(args << \"ItemSelection().selectAll().removeAll().str()\", outRows.arg(\"\"));\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(args << \"ItemSelection().select(/C/).move(1).str()\", outRows.arg(\"1\"));\n    RUN(args << \"read(0,1,2)\", \"A,C,B\");\n    RUN(args << \"ItemSelection().select(/B/).select(/C/).move(1).str()\", outRows.arg(\"2,1\"));\n    RUN(args << \"read(0,1,2)\", \"A,C,B\");\n    RUN(args << \"ItemSelection().select(/A/).move(2).str()\", outRows.arg(\"1\"));\n    RUN(args << \"read(0,1,2)\", \"C,A,B\");\n    RUN(args << \"ItemSelection().select(/C/).select(/B/).move(2).str()\", outRows.arg(\"1,2\"));\n    RUN(args << \"read(0,1,2)\", \"A,C,B\");\n\n    RUN(args << \"change(1, mimeItemNotes, 'NOTE'); read(mimeItemNotes,0,1,2)\", \",NOTE,\");\n    RUN(args << \"ItemSelection().select(/.*/, mimeItemNotes).str()\", outRows.arg(\"1\"));\n    RUN(args << \"ItemSelection().select(undefined, mimeItemNotes).str()\", outRows.arg(\"0,2\"));\n\n    // Match nothing if select() argument is not a regular expression.\n    RUN(args << \"add\" << \"\", \"\");\n    RUN(args << \"ItemSelection().select('A').str()\", outRows.arg(\"\"));\n}\n\nvoid Tests::classItemSelectionGetCurrent()\n{\n    const auto tab1 = testTab(1);\n    const Args args = Args(\"tab\") << tab1 << \"separator\" << \",\";\n\n    RUN(\"ItemSelection().tab\", \"CLIPBOARD\\n\");\n    RUN(args << \"ItemSelection().tab\", tab1 + \"\\n\");\n\n    RUN(args << \"ItemSelection().current().tab\", tab1 + \"\\n\");\n    RUN(args << \"ItemSelection().current().str()\", \"ItemSelection(tab=\\\"\" + tab1 + \"\\\", rows=[])\\n\");\n    RUN(\"setCurrentTab\" << tab1, \"\");\n    RUN(args << \"ItemSelection().current().tab\", tab1 + \"\\n\");\n    RUN(args << \"ItemSelection().current().str()\", \"ItemSelection(tab=\\\"\" + tab1 + \"\\\", rows=[])\\n\");\n\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(args << \"ItemSelection().current().str()\", \"ItemSelection(tab=\\\"\" + tab1 + \"\\\", rows=[0])\\n\");\n\n    RUN(\"setCommands([{name: 'test', inMenu: true, shortcuts: ['Ctrl+F1'], cmd: 'copyq: add(ItemSelection().current().str())'}])\", \"\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(args << \"read(0)\", \"ItemSelection(tab=\\\"\" + tab1 + \"\\\", rows=[0])\");\n    KEYS(\"END\" << \"SHIFT+UP\" << \"CTRL+F1\");\n    WAIT_ON_OUTPUT(args << \"read(0)\", \"ItemSelection(tab=\\\"\" + tab1 + \"\\\", rows=[3,2])\");\n}\n\nvoid Tests::classItemSelectionByteArray()\n{\n    const auto tab1 = testTab(1);\n    const Args args = Args(\"tab\") << tab1 << \"separator\" << \",\";\n    RUN(\"setCurrentTab\" << tab1, \"\");\n\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(args << \"ByteArray(ItemSelection().selectAll().itemAtIndex(0)[mimeText])\", \"A\");\n    RUN(args << \"str(ItemSelection().selectAll().itemAtIndex(0)[mimeText])\", \"A\\n\");\n    RUN(args << \"write(0, [ItemSelection().selectAll().itemAtIndex(2)])\"\n             << \"read(mimeText, 0)\", \"C\");\n}\n\nvoid Tests::classItemSelectionSort()\n{\n    const auto tab1 = testTab(1);\n    const Args args = Args(\"tab\") << tab1 << \"separator\" << \",\";\n    const QString outRows(\"ItemSelection(tab=\\\"\" + tab1 + \"\\\", rows=[%1])\\n\");\n    RUN(\"setCurrentTab\" << tab1, \"\");\n\n    const QString initScript = R\"(\n        add(\n            {[mimeText]: 2, [mimeHtml]: \"two\"},\n            {[mimeText]: 5, [mimeHtml]: \"five\"},\n            {[mimeText]: 1, [mimeHtml]: \"one\"},\n            {[mimeText]: 3, [mimeHtml]: \"three\"},\n            {[mimeText]: 4, [mimeHtml]: \"four\"},\n        );\n        read(0,1,2,3,4);\n    )\";\n    RUN(args << initScript, \"4,3,1,5,2\");\n\n    const auto script = R\"(\n        var sel = ItemSelection().selectAll();\n        const texts = sel.itemsFormat(mimeText);\n        sel.sort(function(i,j){\n            return texts[i] < texts[j];\n        });\n        sel.str();\n    )\";\n    RUN(args << script, outRows.arg(\"3,2,0,4,1\"));\n    RUN(args << \"read(0,1,2,3,4)\", \"1,2,3,4,5\");\n    RUN(args << \"read(mimeHtml,0,1,2,3,4)\", \"one,two,three,four,five\");\n    RUN(args << \"size\", \"5\\n\");\n}\n\nvoid Tests::classSettings()\n{\n    TemporaryFile configFile;\n    const QString fileName = configFile.fileName();\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); print(s.fileName())\" << fileName, fileName);\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.isWritable() === true\" << fileName, \"true\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.contains('o1')\" << fileName, \"false\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.setValue('o1', 1); s.sync(); s.contains('o1')\" << fileName, \"true\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.value('o1')\" << fileName, \"1\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.setValue('o2', 2)\" << fileName, \"\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.value('o2')\" << fileName, \"2\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.setValue('o2', [1,2,3])\" << fileName, \"\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.value('o2')[0]\" << fileName, \"1\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.value('o2')[1]\" << fileName, \"2\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.value('o2')[2]\" << fileName, \"3\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.setValue('g1/o3', true)\" << fileName, \"\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.value('g1/o3')\" << fileName, \"true\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.childKeys()\" << fileName, \"o1\\no2\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.allKeys()\" << fileName, \"g1/o3\\no1\\no2\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.beginGroup('g1'); s.group()\" << fileName, \"g1\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.beginGroup('g1'); s.setValue('g1.2/o4', 'test')\" << fileName, \"\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.beginGroup('g1'); s.childGroups()\" << fileName, \"g1.2\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.beginGroup('g1'); s.endGroup(); s.childGroups()\" << fileName, \"g1\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.value('g1/g1.2/o4')\" << fileName, \"test\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.allKeys()\" << fileName, \"g1/g1.2/o4\\ng1/o3\\no1\\no2\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.remove('g1/g1.2/o4'); s.allKeys()\" << fileName, \"g1/o3\\no1\\no2\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.beginWriteArray('a1', 3); s.setArrayIndex(1); s.setValue('o1', 'v1'); s.endArray()\" << fileName, \"\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.beginReadArray('a1')\" << fileName, \"3\\n\");\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.beginReadArray('a1'); s.setArrayIndex(1); s.value('o1');\" << fileName, \"v1\\n\");\n\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.clear(); s.allKeys()\" << fileName, \"\");\n\n    QVERIFY(QFile::remove(fileName));\n    QVERIFY(!QFile::exists(fileName));\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.setValue('o1', 1); s.sync(); File(str(arguments[1])).exists()\" << fileName, \"true\\n\");\n    QVERIFY(QFile::exists(fileName));\n\n    QVERIFY(QFile::remove(fileName));\n    QVERIFY(!QFile::exists(fileName));\n    RUN(\"eval\" << \"s=Settings(str(arguments[1])); s.setValue('o1', 1)\" << fileName, \"\");\n    QVERIFY(QFile::exists(fileName));\n\n    const QString appConfigFileName = AppConfig().settings().fileName();\n    RUN(\"Settings().fileName()\", QStringLiteral(\"%1\\n\").arg(appConfigFileName));\n    RUN(\"Settings().value('Options/tabs')\", QStringLiteral(\"%1\\n\").arg(clipboardTabName));\n}\n\nvoid Tests::calledWithInstance()\n{\n    // These would fail with the old deprecated Qt Script module.\n    RUN(\"f=ByteArray().size; f()\", \"0\\n\");\n    RUN(\"f=Dir().path; f()\", \".\\n\");\n    RUN(\"f=File('test').fileName; f()\", \"test\\n\");\n    RUN(\"f=TemporaryFile().autoRemove; f()\", \"true\\n\");\n}\n"
  },
  {
    "path": "src/tests/tests_cli.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/commandstatus.h\"\n#include \"common/config.h\"\n#include \"common/log.h\"\n#include \"common/version.h\"\n#include \"common/settings.h\"\n\n#include <QRegularExpression>\n\nvoid Tests::configPath()\n{\n    RUN(\"print(info('config'))\", Settings().fileName());\n}\n\nvoid Tests::readLog()\n{\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"info\") << \"log\", &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n\n    QCOMPARE(stdoutActual, qEnvironmentVariable(\"COPYQ_LOG_FILE\") + \"\\n\");\n\n    const QString logFile = logFileName();\n    QCOMPARE(stdoutActual, logFile + \"\\n\");\n\n    const QByteArray log = readLogFile(maxReadLogSize);\n    QVERIFY2(!log.isEmpty(), logFile.toUtf8());\n\n    const QStringList lines = splitLines(readLogFile(maxReadLogSize));\n\n    const auto configPattern = QStringLiteral(\n        R\"(^\\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}\\] DEBUG <Server-\\d+>: Loading configuration$)\");\n    QVERIFY2(count(lines, configPattern), log);\n\n    const auto monitorPattern = QStringLiteral(\n        R\"(^\\[.*\\] DEBUG <Server-\\d+>: Starting monitor$)\");\n    QVERIFY2(count(lines, monitorPattern), log);\n\n    {\n        QTemporaryDir tmpDir;\n        QVERIFY(tmpDir.isValid());\n        m_test->setEnv(\"COPYQ_LOG_FILE\", \"\");\n        m_test->setEnv(\"COPYQ_LOG_DIR\", tmpDir.path());\n        QCOMPARE( run(Args(\"info\") << \"log\", &stdoutActual, &stderrActual), 0 );\n        QVERIFY2( testStderr(stderrActual), stderrActual );\n        const QString actualPattern = QString::fromUtf8(stdoutActual)\n            .replace(QRegularExpression(R\"(-\\d*-\\d*\\.log\\n$)\"), \"*\");\n        const QString expectedPattern = QStringLiteral(\"%1/copyq*\").arg(tmpDir.path());\n        QCOMPARE( actualPattern, expectedPattern );\n    }\n\n    {\n        m_test->setEnv(\"COPYQ_LOG_FILE\", \"\");\n        m_test->setEnv(\"COPYQ_LOG_DIR\", \"\");\n        QCOMPARE( run(Args(\"info\") << \"log\", &stdoutActual, &stderrActual), 0 );\n        QVERIFY2( testStderr(stderrActual), stderrActual );\n        const QString actualPattern = QString::fromUtf8(stdoutActual)\n            .replace(QRegularExpression(R\"(-\\d*-\\d*\\.log\\n$)\"), \"*\");\n        const QString expectedPattern = QStringLiteral(\"%1/copyq*\")\n            .arg(getDefaultLogFilePath());\n        QCOMPARE( actualPattern, expectedPattern );\n    }\n}\n\nvoid Tests::rotateLog()\n{\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"info\") << \"log\", &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    const QString logDirPath = QString::fromUtf8(stdoutActual).section(\"/\", 0, -2);\n    QVERIFY( !logDirPath.isEmpty() );\n\n    const QByteArray logData(logFileSize, '-');\n    const QDir logDir(logDirPath);\n    QVERIFY2( logDir.exists(), logDirPath.toUtf8() );\n    const auto listLogFiles = [&](const int rotateNumber = -1) {\n        const QString pattern = rotateNumber == -1\n            ? QStringLiteral(\"tests*.log.*\")\n            : QStringLiteral(\"tests*.log.%1\").arg(rotateNumber);\n        return logDir.entryList({pattern}, QDir::Files, QDir::Name);\n    };\n    const auto logFilesMessage = [&](int i) {\n        return QStringLiteral(\"%2 (rotateCount = %1):\\n  %3\").arg(i).arg(\n            logDirPath.toUtf8(),\n            listLogFiles().join(\"\\n  \")).toUtf8();\n    };\n\n    for (int i = 1; i < logFileCount; ++i) {\n        QCOMPARE( run(Args(\"serverLog\") << \"-\", &stdoutActual, &stderrActual, logData), 0 );\n        QVERIFY2( testStderr(stderrActual), stderrActual );\n        QVERIFY2( listLogFiles().count() >= i, logFilesMessage(i) );\n        QVERIFY2( !listLogFiles(i).isEmpty(), logFilesMessage(i) );\n    }\n    QCOMPARE( run(Args(\"serverLog\") << \"-\", &stdoutActual, &stderrActual, logData), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    const auto logFiles = listLogFiles(logFileCount);\n    QVERIFY2( logFiles.isEmpty(), logFilesMessage(logFileCount) );\n}\n\nvoid Tests::pluginsDisabled()\n{\n    // Ensure that plugins that could interfere with tests are disabled\n    RUN_EXPECT_ERROR(\"plugins.itemsync\", CommandException);\n    RUN_EXPECT_ERROR(\"plugins.itemencrypted\", CommandException);\n    RUN_EXPECT_ERROR(\"plugins.itempinned\", CommandException);\n\n    const QByteArray log = readLogFile(maxReadLogSize);\n    QVERIFY2( !log.contains(\"itemencrypted\"), log );\n    QVERIFY2( !log.contains(\"[copyq.plugin\"), log );\n}\n\nvoid Tests::commandHelp()\n{\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"help\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY(!stdoutActual.isEmpty());\n\n    const QStringList commands = QStringList()\n            << \"show\"\n            << \"hide\"\n            << \"toggle\"\n            << \"menu\"\n            << \"exit\"\n            << \"help\"\n            << \"version\"\n            << \"clipboard\"\n            << \"copy\"\n            << \"paste\"\n            << \"action\"\n            << \"add\"\n            << \"remove\";\n\n    for (const auto &command : commands) {\n        QCOMPARE( run(Args(\"help\") << command, &stdoutActual, &stderrActual), 0 );\n        QVERIFY2( testStderr(stderrActual), stderrActual );\n        QVERIFY( !stdoutActual.isEmpty() );\n        const QString help = QString::fromUtf8(stdoutActual);\n        QVERIFY( help.contains(QRegularExpression(\"\\\\b\" + QRegularExpression::escape(command) + \"\\\\b\")) );\n    }\n\n    // Print error on unknown function name.\n    m_test->ignoreErrors(QRegularExpression(\"Error: Command not found!\"));\n    RUN_EXPECT_ERROR(\"help\" << \"xxx\", CommandException);\n}\n\nvoid Tests::commandVersion()\n{\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"version\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY( !stdoutActual.isEmpty() );\n\n    const QString version = QString::fromUtf8(stdoutActual);\n    // Version contains application name and version.\n    QVERIFY( version.contains(QRegularExpression(\"\\\\bCopyQ\\\\b.*\" + QRegularExpression::escape(versionString))) );\n    // Version contains Qt version.\n    QVERIFY( version.contains(QRegularExpression(\"\\\\bQt:\\\\s+\\\\d\")) );\n}\n\nvoid Tests::badCommand()\n{\n    RUN_EXPECT_ERROR_WITH_STDERR(\"xxx\", CommandException, \"xxx\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\"tab\" << testTab(1) << \"yyy\", CommandException, \"yyy\");\n\n    // Bad command shouldn't create new tab.\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"tab\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY( !QString::fromUtf8(stdoutActual)\n             .contains(QRegularExpression(\"^\" + QRegularExpression::escape(testTab(1)) + \"$\")) );\n}\n\nvoid Tests::badSessionName()\n{\n    m_test->ignoreErrors(QRegularExpression(\n        \"ERROR: Session name must contain at most 16 characters\"\n        \"|ERROR.*which can be letters, digits\"\n    ));\n    RUN_EXPECT_ERROR(\"-s\" << \"max_16_characters_in_session_name_allowed\" << \"\", CommandBadSyntax);\n    RUN_EXPECT_ERROR(\"-s\" << \"spaces disallowed\" << \"\", CommandBadSyntax);\n}\n\nvoid Tests::commandCatchExceptions()\n{\n    RUN(\"try { removeTab('MISSING') } catch(e) { print(e) }\",\n        \"Error: Tab with given name doesn't exist!\");\n}\n"
  },
  {
    "path": "src/tests/tests_commands.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/sleeptimer.h\"\n\nvoid Tests::shortcutCommand()\n{\n    RUN(\"setCommands([{name: 'test', inMenu: true, shortcuts: ['Ctrl+F1'], cmd: 'copyq add OK'}])\", \"\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"OK\");\n}\n\nvoid Tests::shortcutCommandOverrideEnter()\n{\n    RUN(\"setCommands([{name: 'test', inMenu: true, shortcuts: ['Enter'], cmd: 'copyq add OK'}])\", \"\");\n    KEYS(\"ENTER\" << \"ENTER\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\" << \"1\", \"OK\\nOK\");\n}\n\nvoid Tests::shortcutCommandMatchInput()\n{\n    // Activate only one of the two actions depending on input MIME format.\n    const auto script = R\"(\n        function cmd(name) {\n          var format = 'application/x-copyq-' + name\n          return {\n            name: name,\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            input: format,\n            cmd: 'copyq add ' + name\n          }\n        }\n        setCommands([ cmd('test1'), cmd('test2') ])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"write\" << \"application/x-copyq-test1\" << \"\", \"\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"test1\");\n    RUN(\"tab\" << QString(clipboardTabName) << \"size\", \"2\\n\");\n\n    RUN(\"write\" << \"application/x-copyq-test2\" << \"\", \"\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"test2\");\n    RUN(\"tab\" << QString(clipboardTabName) << \"size\", \"4\\n\");\n}\n\nvoid Tests::shortcutCommandMatchCmd()\n{\n    const auto tab = testTab(1);\n    const Args args = Args(\"tab\") << tab;\n\n    // Activate only one of the three actions depending on exit code of command which matches input MIME format.\n    const auto script = R\"(\n        function cmd(name) {\n          var format = 'application/x-copyq-' + name\n          return {\n            name: name,\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            matchCmd: 'copyq: str(data(\"' + format + '\")) || fail()',\n            cmd: 'copyq tab )\" + tab + R\"( add ' + name\n          }\n        }\n        setCommands([ cmd('test1'), cmd('test2') ])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"show\" << tab, \"\");\n\n    RUN(args << \"write\" << \"application/x-copyq-test1\" << \"1\", \"\");\n    WAIT_ON_OUTPUT(args << \"plugins.itemtests.keys('Ctrl+F1'); read(0)\", \"test1\");\n\n    RUN(args << \"write\" << \"application/x-copyq-test2\" << \"2\", \"\");\n    WAIT_ON_OUTPUT(args << \"plugins.itemtests.keys('Ctrl+F1'); read(0)\", \"test2\");\n}\n\nvoid Tests::shortcutCommandSelectedItemData()\n{\n    const auto tab1 = testTab(1);\n    const auto script = R\"(\n        setCommands([{\n            name: 'Move Second Selected Item to Other Tab',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            output: 'text/plain',\n            outputTab: ')\" + tab1 + R\"(',\n            cmd: 'copyq: selectedItemData(1)[\"text/plain\"]'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"read\" << \"0\", \"C\");\n}\n\nvoid Tests::shortcutCommandSetSelectedItemData()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'Set Data for Second Selected Item',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            cmd: 'copyq: setSelectedItemData(1, {\"text/plain\": \"X\", \"DATA\": \"TEST\"})'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"read\" << \"2\", \"X\");\n    RUN(\"read\" << \"DATA\" << \"2\", \"TEST\");\n}\n\nvoid Tests::shortcutCommandSelectedItemsData()\n{\n    const auto tab1 = testTab(1);\n    const auto script = R\"(\n        setCommands([{\n            name: 'Concatenate Selected Items to Other Tab',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            output: 'text/plain',\n            outputTab: ')\" + tab1 + R\"(',\n            cmd: 'copyq: d = selectedItemsData();'\n               + 'for (i in d) { print(d[i][mimeText]); print(\",\") }'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"read\" << \"0\", \"B,C,\");\n}\n\nvoid Tests::shortcutCommandSetSelectedItemsData()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'Set Data for Second Selected Item',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            cmd: 'copyq: setSelectedItemsData([{\"text/plain\": \"X\"}, {\"text/plain\": \"Y\"}])'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\" << \"1\" << \"2\", \"A\\nX\\nY\");\n}\n\nvoid Tests::shortcutCommandSelectedAndCurrent()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'Set Data for Second Selected Item',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            output: 'text/plain',\n            cmd: 'copyq: print(selectedItems() + \"|\" + currentItem() + \"|\" + selectedTab())'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    RUN(\"tab\" << tab1 << \"setCurrentTab\" << tab1 << \"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    KEYS(\"CTRL+F1\");\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"read(0)\", \"1,2|2|\" + tab1.toUtf8());\n}\n\nvoid Tests::shortcutCommandMoveSelected()\n{\n    const QString script = R\"(\n        setCommands([{\n            name: 'Move Selected',\n            inMenu: true,\n            shortcuts: ['Ctrl+F1'],\n            output: 'text/plain',\n            cmd: 'copyq: move(%1); settings(\"done\", 1)'\n        }])\n        )\";\n    RUN(script.arg(1), \"\");\n\n    const Args args = Args(\"tab\") << testTab(1) << \"separator\" << \",\";\n    RUN(\"setCurrentTab\" << testTab(1), \"\");\n    RUN(args << \"add\" << \"4\" << \"3\" << \"2\" << \"1\", \"\");\n\n#define MOVE_SELECTED(EXPECTED_ITEMS) \\\n    RUN(\"settings\" << \"done\" << \"0\" << \"plugins.itemtests.keys\" << \"CTRL+F1\", \"\"); \\\n    WAIT_ON_OUTPUT(\"settings\" << \"done\", \"1\\n\"); \\\n    RUN(args << \"read(0,1,2,3,4)\", EXPECTED_ITEMS)\n\n    RUN(args << \"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    MOVE_SELECTED(\"1,2,3,4,\");\n\n    RUN(args << \"selectItems\" << \"2\" << \"3\", \"true\\n\");\n    MOVE_SELECTED(\"1,3,4,2,\");\n\n    RUN(script.arg(5), \"\");\n    MOVE_SELECTED(\"1,3,4,2,\");\n\n    RUN(script.arg(-1), \"\");\n    MOVE_SELECTED(\"1,3,4,2,\");\n\n    RUN(script.arg(4), \"\");\n    MOVE_SELECTED(\"1,2,3,4,\");\n\n    RUN(script.arg(0), \"\");\n    MOVE_SELECTED(\"3,4,1,2,\");\n\n#undef MOVE_SELECTED\n}\n\nvoid Tests::automaticCommandIgnore()\n{\n    const auto script = R\"(\n        setCommands([\n            { automatic: true, cmd: 'copyq ignore; copyq add OK' },\n            { automatic: true, cmd: 'copyq add \"SHOULD NOT BE EXECUTED\"' }\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"2\\n\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE IGNORED 1\") );\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"OK\");\n    RUN(\"separator\" << \",\" << \"read\" << \"0\" << \"1\" << \"2\", \"OK,,\");\n    RUN(\"size\", \"1\\n\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE IGNORED 2\") );\n    WAIT_ON_OUTPUT(\"size\", \"2\\n\");\n\n    RUN(\"separator\" << \",\" << \"read\" << \"0\" << \"1\" << \"2\", \"OK,OK,\");\n}\n\nvoid Tests::automaticCommandRemove()\n{\n    const auto script = R\"(\n        setCommands([\n            { automatic: true, remove: true, cmd: 'copyq add OK' },\n            { automatic: true, cmd: 'copyq add \"SHOULD NOT BE EXECUTED\"' }\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"2\\n\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE IGNORED 1\") );\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"OK\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE IGNORED 2\") );\n    WAIT_ON_OUTPUT(\"size\", \"2\\n\");\n\n    RUN(\"separator\" << \",\" << \"read\" << \"0\" << \"1\" << \"2\", \"OK,OK,\");\n}\n\nvoid Tests::automaticCommandInput()\n{\n    const auto script = R\"(\n        setCommands([\n            { automatic: true, input: 'DATA', cmd: 'copyq: setData(\"DATA\", \"???\")' },\n            { automatic: true, input: 'text/plain', cmd: 'copyq: setData(\"text/plain\", \"OK\")' },\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"2\\n\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE CHANGED\") );\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"OK\");\n    RUN(\"read\" << \"DATA\" << \"0\", \"\");\n}\n\nvoid Tests::automaticCommandRegExp()\n{\n    const auto script = R\"(\n        setCommands([\n            { automatic: true, re: 'SHOULD BE (CHANGED)$', cmd: 'copyq: setData(mimeText, arguments[1])' },\n            { automatic: true, cmd: 'copyq: setData(\"DATA\", \"DONE\")' },\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"2\\n\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE CHANGED\") );\n    WAIT_ON_OUTPUT(\"read\" << \"DATA\" << \"0\", \"DONE\");\n    RUN(\"read\" << \"0\", \"CHANGED\");\n    RUN(\"remove\" << \"0\", \"\");\n\n    TEST( m_test->setClipboard(\"SHOULD NOT BE CHANGED\") );\n    WAIT_ON_OUTPUT(\"read\" << \"DATA\" << \"0\", \"DONE\");\n    RUN(\"read\" << \"0\", \"SHOULD NOT BE CHANGED\");\n}\n\nvoid Tests::automaticCommandSetData()\n{\n    RUN(\"add\" << \"TEST\", \"\");\n    RUN(\"read\" << \"0\", \"TEST\");\n\n    const auto script = R\"(\n        setCommands([{automatic: true, cmd: 'copyq: setData(\"text/plain\", \"OK\")'}])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE CHANGED\") );\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"OK\");\n\n    // Ensure that previous item is not modified\n    // See: https://github.com/hluk/CopyQ/issues/3324\n    RUN(\"read\" << \"1\", \"TEST\");\n}\n\nvoid Tests::automaticCommandOutputTab()\n{\n    const auto tab1 = testTab(1);\n    const auto script = R\"(\n        var tab1 = ')\" + tab1 + R\"('\n        setCommands([{automatic: true, cmd: 'copyq: setData(mimeOutputTab, \"' + tab1 + '\")'}])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"read\" << \"0\", \"TEST\");\n    RUN(\"tab\" << QString(clipboardTabName) << \"size\", \"0\\n\");\n}\n\nvoid Tests::automaticCommandNoOutputTab()\n{\n    const auto script = R\"(\n        setCommands([{automatic: true, cmd: 'copyq: removeData(mimeOutputTab)'}])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"clipboard\", \"TEST\");\n    RUN(\"tab\" << QString(clipboardTabName) << \"size\", \"0\\n\");\n}\n\nvoid Tests::automaticCommandChaining()\n{\n    const auto script = R\"(\n        setCommands([\n            {automatic: true, cmd: 'copyq: setData(mimeText, 1)'},\n            {automatic: true, cmd: 'copyq: setData(mimeText, str(data(mimeText)) + 2)'},\n            {automatic: true, cmd: 'copyq: setData(mimeText, str(data(mimeText)) + 3)'}\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"3\\n\");\n\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"123\");\n}\n\nvoid Tests::automaticCommandCopyToTab()\n{\n    const auto tab1 = testTab(1);\n    const auto script = R\"(\n        setCommands([{automatic: true, tab: ')\" + tab1 + R\"('}])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n\n    TEST( m_test->setClipboard(\"TEST\") );\n    WAIT_ON_OUTPUT(\"tab\" << QString(clipboardTabName) << \"read\" << \"0\", \"TEST\");\n    RUN(\"tab\" << tab1 << \"read\" << \"0\", \"TEST\");\n}\n\nvoid Tests::automaticCommandStoreSpecialFormat()\n{\n    const auto script = R\"(\n        setCommands([\n            { automatic: true, name: 'CMD1', input: 'test-format' }\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n\n    TEST( m_test->setClipboard(\"DATA\", \"test-format\") );\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read\" << \"test-format\" << \"0\" << \"1\", \"DATA,\");\n}\n\nvoid Tests::automaticCommandIgnoreSpecialFormat()\n{\n    const auto script = R\"(\n        setCommands([\n            { automatic: true, name: 'CMD1', cmd: 'copyq add CMD1', input: 'test-format', remove: true },\n            { automatic: true, name: 'CMD2', cmd: 'copyq add CMD2' },\n            { automatic: true, name: 'CMD3', cmd: 'copyq add CMD3', input: 'test-format' }\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"3\\n\");\n\n    TEST( m_test->setClipboard(\"SHOULD BE IGNORED\", \"test-format\") );\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read\" << \"0\" << \"1\", \"CMD1,\");\n\n    TEST( m_test->setClipboard(\"SHOULD NOT BE IGNORED\") );\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"SHOULD NOT BE IGNORED,CMD2,CMD1,\");\n}\n\nvoid Tests::globalCommandInMenu()\n{\n    const auto script = R\"(\n        setCommands([\n            { isGlobalShortcut: true, name: 'test', cmd: 'copyq add test' },\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n    RUN(\"menu\", \"\");\n    KEYS(trayMenuId << \"DOWN\" << \"ENTER\");\n    KEYS(clipboardBrowserId);\n    WAIT_ON_OUTPUT(\"read(0)\", \"test\");\n\n    RUN(\"setCommands([])\", \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"0\\n\");\n\n    // Test sub-menus\n    const auto script2 = R\"(\n        setCommands([\n            { isGlobalShortcut: true, name: 'test|test1|test2', cmd: 'copyq add test2' },\n        ])\n        )\";\n    RUN(script2, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n    RUN(\"menu\", \"\");\n    KEYS(trayMenuId << \"DOWN\" << \"DOWN\" << \"ENTER\");\n    waitFor(100);\n    KEYS(trayMenuId << \"ENTER\");\n    waitFor(100);\n    KEYS(trayMenuId << \"ENTER\");\n    KEYS(clipboardBrowserId);\n    WAIT_ON_OUTPUT(\"read(0)\", \"test2\");\n}\n"
  },
  {
    "path": "src/tests/tests_common.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests/tests_common.h\"\n\n#include <QRegularExpression>\n#include <QTemporaryFile>\n\nTemporaryFile::TemporaryFile()\n{\n    QTemporaryFile tmp;\n    tmp.setAutoRemove(false);\n    QVERIFY(tmp.open());\n    m_fileName = tmp.fileName();\n    tmp.close();\n}\n\nTemporaryFile::~TemporaryFile()\n{\n    QFile::remove(m_fileName);\n}\n\nbool testStderr(\n    const QByteArray &stderrData,\n    const QRegularExpression &ignoreRe)\n{\n    static const QRegularExpression reFailure(\n        \"(?:^|\\n).*(?:Warning:|Warning <.*>:|ERROR:|ERROR <.*>:|ASSERT).*\",\n        QRegularExpression::CaseInsensitiveOption);\n\n    const auto plain = [](const char *str){\n        return QRegularExpression(QRegularExpression::escape(QLatin1String(str)));\n    };\n    const auto regex = [](const char *str){\n        return QRegularExpression(QLatin1String(str));\n    };\n    // Ignore exceptions and errors from clients in application log\n    // (these are expected in some tests).\n    static const std::array ignoreList{\n        plain(\"CopyQ server is already running\"),\n        plain(\"Cannot connect to server! Start CopyQ server first.\"),\n        plain(\"Aborting clipboard cloning\"),\n        plain(\"Failed to provide clipboard\"),\n        regex(\"Warning <.*>: ELAPSED .* ms accessing\"),\n        regex(\"ERROR <.*>: Connection lost!\"),\n\n        // Always ignore errors and exceptions from scripts.\n        // These are expected in many test cases.\n        plain(\"ScriptError:\"),\n\n        // X11 (Linux)\n        plain(\"QXcbXSettings::QXcbXSettings(QXcbScreen*) Failed to get selection owner for XSETTINGS_S atom\"),\n        plain(\"QXcbConnection: XCB error:\"),\n        plain(\"QXcbClipboard: SelectionRequest too old\"),\n        plain(\"libpng warning: iCCP: known incorrect sRGB profile\"),\n        plain(\"QMime::convertToMime: unhandled mimetype: text/plain\"),\n        plain(\"Failed to register with host portal\"),\n        plain(\"Deleting keychain failed\"),\n\n        // Wayland (Linux)\n        plain(\"Wayland does not support QWindow::requestActivate()\"),\n        plain(\"Unexpected wl_keyboard.enter event\"),\n        plain(\"The compositor sent a wl_pointer.enter\"),\n        plain(\"QObject::connect: No such signal QPlatformNativeInterface::systemTrayWindowChanged(QScreen*)\"),\n        plain(\"Could not init WaylandClipboard, falling back to QtClipboard.\"),\n\n        // KDE Frameworks (Linux)\n        plain(\"[kf.notifications]\"),\n        plain(\"[kf.statusnotifieritem]\"),\n\n        // Windows\n        plain(\"QWindowsPipeWriter: write failed\"),\n        plain(\"QWindowsWindow::setGeometry: Unable to set geometry\"),\n        plain(\"QWinEventNotifier: no event dispatcher, application shutting down? Cannot deliver event.\"),\n        plain(\"setGeometry: Unable to set geometry\"),\n        plain(\"Failed to raise: \"),\n\n        plain(\"[kf.notifications] Received a response for an unknown notification.\"),\n        // KStatusNotifierItem\n        plain(\"[kf.windowsystem] Could not find any platform plugin\"),\n\n        regex(\"QTemporaryDir: Unable to remove .* most likely due to the presence of read-only files.\"),\n\n        // Windows Qt 5.15.2\n        plain(\"[qt.qpa.mime] Retrying to obtain clipboard.\"),\n        plain(\"[default] QSystemTrayIcon::setVisible: No Icon set\"),\n\n        // macOS\n        plain(\"Failed to get QCocoaScreen for NSObject(0x0)\"),\n        plain(\"ERROR: Failed to open session mutex: QSystemSemaphore::handle:: ftok failed\"),\n        plain(\"Warning: [qt.tlsbackend.ossl] Failed to load libssl/libcrypto.\"),\n        regex(R\"(Window position.* outside any known screen.*)\"),\n        regex(R\"(Populating font family aliases took .* ms. Replace uses of missing font family \"Font Awesome.*\" with one that exists to avoid this cost.)\"),\n\n        // New in Qt 5.15.0\n        regex(R\"(Populating font family aliases took .* ms. Replace uses of missing font family \"Monospace\" with one that exists to avoid this cost.)\"),\n\n        // New in Qt 6.5\n        regex(\"Error in contacting registry\"),\n\n        // KNotification bug\n        plain(R\"(QLayout: Attempting to add QLayout \"\" to QWidget \"\", which already has a layout)\"),\n\n        // Warnings from itemsync plugin, not sure what it causes\n        regex(R\"(Could not remove our own lock file .* maybe permissions changed meanwhile)\"),\n    };\n\n    const QString output = QString::fromUtf8(stderrData);\n    QRegularExpressionMatchIterator it = reFailure.globalMatch(output);\n    bool result = true;\n    const bool isIgnoreReValid = !ignoreRe.pattern().isEmpty();\n    while ( it.hasNext() ) {\n        const auto match = it.next();\n        const QString log = match.captured();\n\n        const bool ignore = (isIgnoreReValid && log.contains(ignoreRe))\n            || std::any_of(\n                std::begin(ignoreList), std::end(ignoreList),\n                    [&log](const QRegularExpression &reIgnore){\n                        return log.contains(reIgnore);\n                    });\n\n        if (!ignore) {\n            qWarning() << \"🛑 Failure in logs:\" << log.trimmed();\n            result = false;\n        }\n    }\n\n    if (!result && isIgnoreReValid)\n        qWarning().noquote() << \"🟡 Ignored logs matching:\" << ignoreRe.pattern();\n\n    return result;\n}\n\nint count(const QStringList &items, const QString &pattern)\n{\n    int from = -1;\n    int count = 0;\n    const QRegularExpression re(pattern);\n    while ( (from = items.indexOf(re, from + 1)) != -1 )\n        ++count;\n    return count;\n}\n\nQStringList splitLines(const QByteArray &nativeText)\n{\n    return QString::fromUtf8(nativeText).split(QRegularExpression(\"\\r\\n|\\n|\\r\"));\n}\n\nQByteArray generateData()\n{\n    static int i = 0;\n    const QByteArray id = \"tests_\"\n            + QByteArray::number(QDateTime::currentMSecsSinceEpoch() % 1000);\n    return id + '_' + QByteArray::number(++i);\n}\n\nQString appWindowTitle(const QString &text)\n{\n#ifdef Q_OS_MAC\n    return QStringLiteral(\"CopyQ - %1\\n\").arg(text);\n#elif defined(Q_OS_WIN)\n    return QStringLiteral(\"%1 - CopyQ-%2\\n\").arg(text, sessionName);\n#else\n    return QStringLiteral(\"%1 — CopyQ-%2\\n\").arg(text, sessionName);\n#endif\n}\n"
  },
  {
    "path": "src/tests/tests_common.h",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#pragma once\n\n#include \"tests/testinterface.h\"\n\n#include <QObject>\n#include <QRegularExpression>\n#include <QStringList>\n\nclass QByteArray;\n\n// Similar to QTemporaryFile but allows removing from other process.\nclass TemporaryFile {\npublic:\n    TemporaryFile();\n    ~TemporaryFile();\n    QString fileName() const { return m_fileName; }\n\nprivate:\n    QString m_fileName;\n};\n\nint count(const QStringList &items, const QString &pattern);\n\nQStringList splitLines(const QByteArray &nativeText);\n\nbool testStderr(\n    const QByteArray &stderrData,\n    const QRegularExpression &ignoreRe = {});\n\n/// Generate unique data.\nQByteArray generateData();\n\nQString appWindowTitle(const QString &text);\n"
  },
  {
    "path": "src/tests/tests_dialogs.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/mimetypes.h\"\n\nvoid Tests::createTabDialog()\n{\n    const auto tab1 = testTab(1);\n    KEYS(\n        clipboardBrowserId << \"CTRL+T\"\n        << tabDialogLineEditId << \":\" + tab1 << \"ENTER\");\n    TEST_SELECTED(tab1 + \"\\n\");\n}\n\nvoid Tests::showHideAboutDialog()\n{\n    const auto aboutShortcut = keyNameFor(QKeySequence::QKeySequence::WhatsThis);\n    KEYS(clipboardBrowserId << aboutShortcut << aboutDialogId);\n    KEYS(aboutDialogId << \"ESCAPE\" << clipboardBrowserId);\n}\n\nvoid Tests::showHideClipboardDialog()\n{\n    TEST( m_test->setClipboard(\"TEST\", \"test-format\") );\n    KEYS(clipboardBrowserId << \"CTRL+SHIFT+C\" << clipboardDialogId);\n\n    KEYS(clipboardDialogId << \"DOWN\" << \"HOME\" << clipboardDialogFormatListId);\n\n    KEYS(clipboardDialogFormatListId << keyNameFor(QKeySequence::Copy));\n#ifdef Q_OS_WIN\n    WAIT_FOR_CLIPBOARD(\"application/x-qt-windows-mime;value=\\\"test-format\\\"\");\n#else\n    WAIT_FOR_CLIPBOARD(\"test-format\");\n#endif\n\n    KEYS(clipboardDialogId << \"ESCAPE\" << clipboardBrowserId);\n}\n\nvoid Tests::showHideItemDialog()\n{\n    RUN(\"write\" << \"test-format\" << \"TEST\", \"\");\n    RUN(\"selectItems\" << \"0\", \"true\\n\");\n\n    KEYS(clipboardBrowserId << \"F4\" << clipboardDialogId);\n\n    KEYS(clipboardDialogId << \"DOWN\" << clipboardDialogFormatListId);\n    KEYS(clipboardDialogFormatListId << keyNameFor(QKeySequence::Copy));\n    WAIT_FOR_CLIPBOARD(\"test-format\");\n\n    KEYS(clipboardDialogFormatListId << \"DOWN\");\n    KEYS(clipboardDialogFormatListId << keyNameFor(QKeySequence::Copy));\n    WAIT_FOR_CLIPBOARD(\"test-format\");\n\n    KEYS(clipboardDialogId << \"ESCAPE\" << clipboardBrowserId);\n}\n\nvoid Tests::showHideLogDialog()\n{\n    KEYS(clipboardBrowserId << \"F12\" << logDialogId);\n\n    KEYS(logDialogId << \"CTRL+A\" << \"CTRL+C\" << logDialogId);\n    const QByteArray expectedLog = \"Starting callback: onStart\";\n    TEST( m_test->verifyClipboard(expectedLog, mimeHtml, false) );\n\n    KEYS(logDialogId << \"ESCAPE\" << clipboardBrowserId);\n}\n\nvoid Tests::showHideActionHandlerDialog()\n{\n    KEYS(clipboardBrowserId << \"CTRL+SHIFT+Z\" << actionHandlerDialogId);\n\n    KEYS(actionHandlerFilterId << \":onstart\" << \"TAB\" << actionHandlerTableId);\n\n    KEYS(actionHandlerTableId << \"RIGHT\" << \"CTRL+C\");\n    WAIT_FOR_CLIPBOARD(\"copyq onStart\");\n\n    KEYS(actionHandlerDialogId << \"ESCAPE\" << clipboardBrowserId);\n}\n\nvoid Tests::shortcutDialogAddShortcut()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Mnemonic for focusing shortcut button doesn't work on OS X\");\n#endif\n\n    RUN(\"setCommands([{name: 'test', inMenu: true, cmd: 'copyq add OK'}])\", \"\");\n    RUN(\"commands()[0].shortcuts\", \"\");\n\n    KEYS(clipboardBrowserId << \"F6\" << commandDialogId);\n    KEYS(commandDialogId << \"ALT+S\" << shortcutButtonId);\n    KEYS(shortcutButtonId << \"Space\" << shortcutDialogId);\n    KEYS(shortcutDialogId << \"CTRL+F1\" << shortcutButtonId);\n\n    KEYS(commandDialogId << \"ESCAPE\" << commandDialogSaveButtonId);\n    KEYS(commandDialogSaveButtonId << \"Enter\" << clipboardBrowserId);\n    RUN(\"commands()[0].shortcuts\", \"ctrl+f1\\n\");\n}\n\nvoid Tests::shortcutDialogAddTwoShortcuts()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Mnemonic for focusing shortcut button doesn't work on OS X\");\n#endif\n\n    RUN(\"setCommands([{name: 'test', inMenu: true, shortcuts: ['ctrl+f1'], cmd: 'copyq add OK'}])\", \"\");\n    RUN(\"commands()[0].shortcuts\", \"ctrl+f1\\n\");\n\n    KEYS(clipboardBrowserId << \"F6\" << commandDialogId);\n    KEYS(commandDialogId << \"ALT+S\" << shortcutButtonId);\n\n    KEYS(shortcutButtonId << \"TAB\" << shortcutButtonId);\n    KEYS(shortcutButtonId << \"Space\" << shortcutDialogId);\n    KEYS(shortcutDialogId << \"F1\" << shortcutButtonId);\n\n    KEYS(shortcutButtonId << \"Space\" << shortcutDialogId);\n    KEYS(shortcutDialogId << \"F2\" << shortcutButtonId);\n\n    KEYS(commandDialogId << \"ESCAPE\" << commandDialogSaveButtonId);\n    KEYS(commandDialogSaveButtonId << \"Enter\" << clipboardBrowserId);\n    RUN(\"commands()[0].shortcuts\", \"ctrl+f1\\nf1\\nf2\\n\");\n}\n\nvoid Tests::shortcutDialogChangeShortcut()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Mnemonic for focusing shortcut button doesn't work on OS X\");\n#endif\n\n    RUN(\"setCommands([{name: 'test', inMenu: true, shortcuts: ['f1','f2','f3'], cmd: 'copyq add OK'}])\", \"\");\n    RUN(\"commands()[0].shortcuts\", \"f1\\nf2\\nf3\\n\");\n\n    KEYS(clipboardBrowserId << \"F6\" << commandDialogId);\n    KEYS(commandDialogId << \"ALT+S\" << shortcutButtonId);\n    KEYS(commandDialogId << \"TAB\" << shortcutButtonId);\n    KEYS(shortcutButtonId << \"Space\" << shortcutDialogId);\n    KEYS(shortcutDialogId << \"F4\" << shortcutButtonId);\n\n    KEYS(commandDialogId << \"ESCAPE\" << commandDialogSaveButtonId);\n    KEYS(commandDialogSaveButtonId << \"Enter\" << clipboardBrowserId);\n    RUN(\"commands()[0].shortcuts\", \"f1\\nf4\\nf3\\n\");\n}\n\nvoid Tests::shortcutDialogSameShortcut()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Mnemonic for focusing shortcut button doesn't work on OS X\");\n#endif\n\n    RUN(\"setCommands([{name: 'test', inMenu: true, shortcuts: ['ctrl+f1'], cmd: 'copyq add OK'}])\", \"\");\n    RUN(\"commands()[0].shortcuts\", \"ctrl+f1\\n\");\n\n    KEYS(clipboardBrowserId << \"F6\" << commandDialogId);\n    KEYS(commandDialogId << \"ALT+S\" << shortcutButtonId);\n    KEYS(shortcutButtonId << \"TAB\" << shortcutButtonId);\n    KEYS(shortcutButtonId << \"Space\" << shortcutDialogId);\n    KEYS(shortcutDialogId << \"CTRL+F1\" << shortcutButtonId);\n\n    KEYS(commandDialogId << \"ESCAPE\" << clipboardBrowserId);\n    RUN(\"commands()[0].shortcuts\", \"ctrl+f1\\n\");\n}\n\nvoid Tests::shortcutDialogCancel()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Mnemonic for focusing shortcut button doesn't work on OS X\");\n#endif\n\n    RUN(\"setCommands([{name: 'test', inMenu: true, shortcuts: ['ctrl+f1'], cmd: 'copyq add OK'}])\", \"\");\n    RUN(\"commands()[0].shortcuts\", \"ctrl+f1\\n\");\n\n    KEYS(clipboardBrowserId << \"F6\" << commandDialogId);\n    KEYS(commandDialogId << \"ALT+S\" << shortcutButtonId);\n    KEYS(commandDialogId << \"TAB\" << shortcutButtonId);\n    KEYS(shortcutButtonId << \"Space\" << shortcutDialogId);\n    KEYS(shortcutDialogId << \"TAB\" << \"focus:ShortcutDialog\");\n    KEYS(\"ESCAPE\" << shortcutButtonId);\n\n    KEYS(commandDialogId << \"ESCAPE\" << clipboardBrowserId);\n    RUN(\"commands()[0].shortcuts\", \"ctrl+f1\\n\");\n}\n\nvoid Tests::actionDialogCancel()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'test',\n            inMenu: true,\n            shortcuts: ['ctrl+f1'],\n            wait: true,\n            cmd: 'copyq settings test SHOULD_NOT_BE_SET'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    KEYS(clipboardBrowserId << \"CTRL+F1\" << actionDialogId);\n    KEYS(actionDialogId << \"ESCAPE\" << clipboardBrowserId);\n    RUN(\"settings\" << \"test\", \"\");\n}\n\nvoid Tests::actionDialogAccept()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'test',\n            inMenu: true,\n            shortcuts: ['ctrl+f1'],\n            wait: true,\n            cmd: 'copyq settings test SHOULD_BE_SET'\n        }])\n        )\";\n    RUN(script, \"\");\n\n    KEYS(clipboardBrowserId << \"CTRL+F1\" << actionDialogId);\n    // Can't focus configuration checkboxes on OS X\n#ifdef Q_OS_MAC\n    KEYS(actionDialogId << \"BACKTAB\" << \"ENTER\" << clipboardBrowserId);\n#else\n    KEYS(actionDialogId << \"ENTER\" << clipboardBrowserId);\n#endif\n    WAIT_ON_OUTPUT(\"settings\" << \"test\", \"SHOULD_BE_SET\");\n}\n\nvoid Tests::actionDialogSelectionInputOutput()\n{\n    const auto script = R\"(\n        setCommands([{\n            name: 'test',\n            inMenu: true,\n            shortcuts: ['ctrl+f1'],\n            wait: true,\n            input: 'text/plain',\n            output: 'text/plain',\n            cmd: `\n                copyq settings test %1\n                copyq input\n            `\n        }])\n        )\";\n    RUN(script, \"\");\n\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab;\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"setCurrentTab\" << tab, \"\");\n    RUN(args << \"selectItems\" << \"0\" << \"2\", \"true\\n\");\n\n    KEYS(clipboardBrowserId << \"CTRL+F1\" << actionDialogId);\n    // Can't focus configuration checkboxes on OS X\n#ifdef Q_OS_MAC\n    KEYS(actionDialogId << \"BACKTAB\" << \"ENTER\" << clipboardBrowserId);\n#else\n    KEYS(actionDialogId << \"ENTER\" << clipboardBrowserId);\n#endif\n    WAIT_ON_OUTPUT(\"settings\" << \"test\", \"A\\nC\");\n    WAIT_ON_OUTPUT(args << \"read\" << \"0\", \"A\\nC\");\n}\n\nvoid Tests::exitConfirm()\n{\n    KEYS(clipboardBrowserId << \"CTRL+Q\" << confirmExitDialogId);\n    KEYS(confirmExitDialogId << \"ENTER\");\n    TEST( m_test->waitForServerToStop() );\n}\n\nvoid Tests::exitNoConfirm()\n{\n    RUN(\"config\" << \"confirm_exit\" << \"false\", \"false\\n\");\n    KEYS(clipboardBrowserId << \"CTRL+Q\");\n    TEST( m_test->waitForServerToStop() );\n}\n\nvoid Tests::exitStopCommands()\n{\n    RUN(\"config\" << \"confirm_exit\" << \"false\", \"false\\n\");\n    m_test->ignoreErrors(QRegularExpression(\"Exit code: 10\"));\n    RUN(\"action\" << \"copyq sleep 999999\", \"\");\n    KEYS(clipboardBrowserId << \"CTRL+Q\");\n    KEYS(runningCommandsExitDialogId);\n    // Ignore status here since the client will be interrupted\n    run(Args(\"plugins.itemtests.keys('ENTER')\"));\n    TEST( m_test->waitForServerToStop() );\n}\n\n\nvoid Tests::terminateActionRequestTerminate()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_BASH\");\n\n    // Action whose process writes a sentinel on SIGTERM, then exits cleanly.\n    // Use 'settings' to avoid shell-quoting issues with tab names.\n    // Use 'sleep &; wait' so bash's trap handler fires immediately on SIGTERM\n    // (a foreground sleep would block trap dispatch until sleep exits).\n    const auto cmd = R\"(\n        bash:\n        copyq() { \"$COPYQ\" \"$@\"; }\n        trap \"copyq settings term_test TERMINATED\" TERM\n        copyq settings term_test READY\n        sleep 999 & wait\n    )\";\n    m_test->ignoreErrors(QRegularExpression(\"Terminating action|Exit code|Failed to notify\"));\n    RUN(\"action\" << cmd << \"\", \"\");\n\n    // Wait for the action's process to be running.\n    WAIT_ON_OUTPUT(\"settings\" << \"term_test\", \"READY\");\n\n    // Open Process Manager, filter to our action, select it, Terminate.\n    KEYS(clipboardBrowserId << \"CTRL+SHIFT+Z\" << actionHandlerDialogId);\n    KEYS(actionHandlerFilterId << \":sleep\" << \"TAB\" << actionHandlerTableId);\n    KEYS(actionHandlerTableId << \"CTRL+A\");\n    KEYS(actionHandlerTableId << \"mouse|CLICK|terminateButton\");\n    KEYS(actionHandlerDialogId << \"ESCAPE\" << clipboardBrowserId);\n\n    // The SIGTERM handler fires, writing \"TERMINATED\".\n    WAIT_ON_OUTPUT(\"settings\" << \"term_test\", \"TERMINATED\");\n}\n\nvoid Tests::terminateActionRequestKill()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_BASH\");\n\n    // Action that ignores SIGTERM -- only SIGKILL can stop it.\n    const auto cmd = R\"(\n        bash:\n        copyq() { \"$COPYQ\" \"$@\"; }\n        trap \"\" TERM\n        copyq settings kill_test READY\n        sleep 999 & wait\n    )\";\n    // Expect warnings and non-zero exit from SIGKILL.\n    m_test->ignoreErrors(QRegularExpression(\n        \"Process crashed|Exit code|Terminating action|Killing action|Failed to notify\"));\n    RUN(\"action\" << cmd << \"\", \"\");\n    RUN(\"config\" << \"terminate_action_timeout_ms\" << \"100\", \"100\\n\");\n\n    // Wait for the action's process to be running.\n    WAIT_ON_OUTPUT(\"settings\" << \"kill_test\", \"READY\");\n\n    // Open Process Manager, filter to our action, select it and Terminate.\n    KEYS(clipboardBrowserId << \"CTRL+SHIFT+Z\" << actionHandlerDialogId);\n    KEYS(actionHandlerFilterId << \":sleep\" << \"TAB\" << actionHandlerTableId);\n\n    KEYS(actionHandlerTableId << \"CTRL+A\");\n    KEYS(actionHandlerTableId + QStringLiteral(\".*{Running}.*\"));\n\n    KEYS(actionHandlerTableId << \"mouse|CLICK|terminateButton\");\n    QTest::qWait(500);\n\n    KEYS(\"mouse|CLICK|tableView\");\n    KEYS(actionHandlerTableId << \"CTRL+A\");\n    KEYS(actionHandlerTableId + QStringLiteral(\".*{Error}.*{Error: Process crashed}\"));\n}\n"
  },
  {
    "path": "src/tests/tests_drag_n_drop.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include <QFile>\n#include <QRegularExpression>\n#include <QSettings>\n\n#include \"common/config.h\"\n\n#define DRAG(DRAG_PARENT, SOURCE, TARGET) do { \\\n    KEYS(\"mouse|PRESS|\" SOURCE); \\\n    KEYS(\"mouse|DRAG|\" SOURCE); \\\n    KEYS(\"isDraggingFrom|\" DRAG_PARENT); \\\n    KEYS(\"mouse|RELEASE|\" TARGET); \\\n} while(false)\n\n#define ITEM(TEXT) \"item|text=\" TEXT\n\n#define TAB(TEXT) \"tab_tree_item|text=\" TEXT\n\nvoid Tests::dragNDropItemOrder()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_DRAG_AND_DROP\");\n\n    RUN(\"config\" << \"show_simple_items\" << \"true\", \"true\\n\");\n\n    RUN(\"add\" << \"ITEM3\" << \"ITEM2\" << \"ITEM1\", \"\");\n    RUN(\"read(0,1,2,3)\", \"ITEM1\\nITEM2\\nITEM3\\n\");\n\n    DRAG(\"ClipboardBrowser\", ITEM(\"ITEM1\"), ITEM(\"ITEM1\"));\n    RUN(\"read(0,1,2,3)\", \"ITEM1\\nITEM2\\nITEM3\\n\");\n\n    DRAG(\"ClipboardBrowser\", ITEM(\"ITEM1\"), ITEM(\"ITEM2\"));\n    RUN(\"read(0,1,2,3)\", \"ITEM1\\nITEM2\\nITEM3\\n\");\n\n    DRAG(\"ClipboardBrowser\", ITEM(\"ITEM1\"), ITEM(\"ITEM3\"));\n    RUN(\"read(0,1,2,3)\", \"ITEM2\\nITEM1\\nITEM3\\n\");\n}\n\nvoid Tests::dragNDropItemToTabTree()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_DRAG_AND_DROP\");\n\n    RUN(\"config\" << \"tab_tree\" << \"true\", \"true\\n\");\n    RUN(\"config\" << \"show_simple_items\" << \"true\", \"true\\n\");\n    RUN(\"config('tabs', ['TAB1','TAB2'])\", \"TAB1\\nTAB2\\n\");\n\n    RUN(\"tab\" << \"TAB1\" << \"add\" << \"ITEM0\", \"\");\n    RUN(\"tab\" << \"TAB2\" << \"add\" << \"ITEM3\" << \"ITEM2\" << \"ITEM1\", \"\");\n    RUN(\"tab\" << \"TAB2\" << \"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    RUN(\"setCurrentTab('TAB2')\", \"\");\n\n    DRAG(\"ClipboardBrowser\", ITEM(\"ITEM2\"), TAB(\"TAB1\"));\n    RUN(\"tab\" << \"TAB1\" << \"read(0,1,2,3)\", \"ITEM2\\nITEM3\\nITEM0\\n\");\n    RUN(\"tab\" << \"TAB2\" << \"read(0,1,2,3)\", \"ITEM1\\n\\n\\n\");\n}\n\nvoid Tests::dragNDropTreeTab()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_DRAG_AND_DROP\");\n\n    RUN(\"config\" << \"tab_tree\" << \"true\", \"true\\n\");\n    RUN(\"config('tabs', ['TAB1','TAB2'])\", \"TAB1\\nTAB2\\n\");\n    WAIT_ON_OUTPUT(\"tab\", \"TAB1\\nTAB2\\nCLIPBOARD\\n\");\n\n    DRAG(\"tab_tree\", TAB(\"TAB2\"), TAB(\"TAB1\"));\n    RUN(\"tab\", \"TAB1\\nTAB1/TAB2\\nCLIPBOARD\\n\");\n}\n\nvoid Tests::dragNDropTreeTabNested()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_DRAG_AND_DROP\");\n\n    RUN(\"config\" << \"tab_tree\" << \"true\", \"true\\n\");\n    RUN(\"config('tabs', ['a/b/c/d','a/b/c'])\", \"a/b/c/d\\na/b/c\\n\");\n    WAIT_ON_OUTPUT(\"tab\", \"a/b/c/d\\na/b/c\\nCLIPBOARD\\n\");\n\n    DRAG(\"tab_tree\", TAB(\"c\"), TAB(\"a\"));\n    RUN(\"tab\", \"a/c\\na/c/d\\nCLIPBOARD\\n\");\n}\n\nvoid Tests::dragNDropTreeTabChildCollision()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_DRAG_AND_DROP\");\n\n    RUN(\"config\" << \"tab_tree\" << \"true\", \"true\\n\");\n\n    // Create tabs where dragging group 'a' under 'b' would make\n    // child 'a/x' collide with existing 'b/a/x'.\n    RUN(\"config('tabs', ['a/x','b/a/x'])\", \"a/x\\nb/a/x\\n\");\n    WAIT_ON_OUTPUT(\"tab\", \"a/x\\nb/a/x\\nCLIPBOARD\\n\");\n\n    // Add distinct data to each tab so we can verify nothing is lost.\n    RUN(\"tab\" << \"a/x\" << \"add\" << \"DATA_AX\", \"\");\n    RUN(\"tab\" << \"b/a/x\" << \"add\" << \"DATA_BAX\", \"\");\n\n    // Drag group 'a' onto 'b' — child 'a/x' would become 'b/a/x'\n    // which already exists, so the moved tab must be renamed to\n    // avoid collision (e.g. 'b/a (1)/x').\n    DRAG(\"tab_tree\", TAB(\"a\"), TAB(\"b\"));\n\n    // Both tabs' data must survive.\n    // The original 'b/a/x' must keep its data.\n    RUN(\"tab\" << \"b/a/x\" << \"read(0)\", \"DATA_BAX\");\n\n    // The moved tab was renamed to avoid collision;\n    // verify it exists under a unique name and still has its data.\n    QByteArray tabsOutput;\n    TEST( m_test->getClientOutput(Args() << \"tab\", &tabsOutput) );\n    const auto tabNames = QString::fromUtf8(tabsOutput).split('\\n');\n\n    // Find the renamed tab (not 'b/a/x', not 'CLIPBOARD', not empty).\n    bool foundMovedTab = false;\n    for (const auto &tabName : tabNames) {\n        if (tabName.isEmpty() || tabName == \"b/a/x\" || tabName == \"CLIPBOARD\")\n            continue;\n        // The renamed tab should be under 'b/' and contain the original data.\n        QVERIFY2(tabName.startsWith(\"b/\"),\n            qPrintable(\"Moved tab should be under 'b/' but is: \" + tabName));\n        RUN(\"tab\" << tabName << \"read(0)\", \"DATA_AX\");\n        foundMovedTab = true;\n    }\n    QVERIFY2(foundMovedTab, \"Moved tab 'a/x' should exist under a unique name after collision\");\n}\n\nvoid Tests::dragNDropTreeTabPartialRenameFailure()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_DRAG_AND_DROP\");\n\n    RUN(\"config\" << \"tab_tree\" << \"true\", \"true\\n\");\n\n    // Two child tabs under 'a' plus an unrelated tab under 'b'\n    // so group 'b' exists in the tree.\n    RUN(\"config('tabs', ['a/x','a/y','b/z'])\", \"a/x\\na/y\\nb/z\\n\");\n    WAIT_ON_OUTPUT(\"tab\", \"a/x\\na/y\\nb/z\\nCLIPBOARD\\n\");\n\n    // Add data to each tab.\n    RUN(\"tab\" << \"a/x\" << \"add\" << \"DATA_AX\", \"\");\n    RUN(\"tab\" << \"a/y\" << \"add\" << \"DATA_AY\", \"\");\n    RUN(\"tab\" << \"b/z\" << \"add\" << \"DATA_BZ\", \"\");\n\n    // Plant a blocker file at the destination path for 'b/a/y'.\n    // QFile::copy() will refuse to overwrite the existing file, making\n    // moveItems() fail for that one tab while 'a/x' -> 'b/a/x' succeeds.\n    const QString blockerPath = getConfigurationFilePath(\"_tab_\")\n        + QString::fromUtf8(QByteArray(\"b/a/y\").toBase64()).replace('/', '-')\n        + QStringLiteral(\".dat\");\n    QVERIFY(QFile(blockerPath).open(QIODevice::WriteOnly));\n\n    // The ERROR log from moveItems() and the rollback warning are expected.\n    m_test->ignoreErrors(QRegularExpression(\n        \"Failed to move.*Destination file exists|Rolling back tab renames\"));\n\n    // Drag group 'a' onto 'b'.\n    // No tree-level group collision (b has no child 'a'), so renameToUnique\n    // does NOT fire.  moveItems will fail for 'a/y' \\u2192 'b/a/y' because the\n    // destination .dat file already exists.\n    DRAG(\"tab_tree\", TAB(\"a\"), TAB(\"b\"));\n    RUN(\"tab\", \"a/x\\na/y\\nb/z\\nCLIPBOARD\\n\");\n\n    // With all-or-nothing rollback, the entire group move is reverted.\n    // Both 'a/x' and 'a/y' remain at their original paths with data intact.\n\n    // Remove the blocker file before restart.\n    QVERIFY(QFile::remove(blockerPath));\n\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n    RUN(\"show\", \"\");\n\n    // All tabs must be at their original names with data intact.\n    RUN(\"tab\" << \"a/x\" << \"read(0)\", \"DATA_AX\");\n    RUN(\"tab\" << \"a/y\" << \"read(0)\", \"DATA_AY\");\n    RUN(\"tab\" << \"b/z\" << \"read(0)\", \"DATA_BZ\");\n\n    RUN(\"tab\", \"a/x\\na/y\\nb/z\\nCLIPBOARD\\n\");\n    RUN(\"config('tabs')\", \"a/x\\na/y\\nb/z\\nCLIPBOARD\\n\");\n}\n\nvoid Tests::dragNDropTreeTabKeepsCollapsedState()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_DRAG_AND_DROP\");\n\n    RUN(\"config\" << \"tab_tree\" << \"true\", \"true\\n\");\n    RUN(\"config('tabs', ['a/b','a/c','x'])\", \"a/b\\na/c\\nx\\n\");\n    WAIT_ON_OUTPUT(\"tab\", \"a/b\\na/c\\nx\\nCLIPBOARD\\n\");\n\n    // Stop the server, inject collapsed state for group 'a', and restart.\n    const QString tabsIniPath = getConfigurationFilePath(\"_tabs.ini\");\n    TEST( m_test->stopServer() );\n    {\n        QSettings settings(tabsIniPath, QSettings::IniFormat);\n        settings.setValue(\"TabWidget/collapsed_tabs\", QStringList{\"a\"});\n        settings.sync();\n    }\n    TEST( m_test->startServer() );\n    RUN(\"show\", \"\");\n\n    // Drag tab 'x' onto group 'a' \\u2014 it becomes 'a/x'.\n    // Group 'a' was collapsed; it must stay collapsed after the move.\n    DRAG(\"tab_tree\", TAB(\"x\"), TAB(\"a\"));\n    RUN(\"tab\", \"a/b\\na/c\\na/x\\nCLIPBOARD\\n\");\n\n    // Verify collapsed state is preserved in the config file.\n    {\n        QSettings settings(tabsIniPath, QSettings::IniFormat);\n        const QStringList collapsed = settings.value(\"TabWidget/collapsed_tabs\").toStringList();\n        QVERIFY2(collapsed.contains(\"a\"),\n            qPrintable(\"Group 'a' should remain collapsed but collapsed_tabs = [\"\n                       + collapsed.join(\", \") + \"]\"));\n    }\n}\n"
  },
  {
    "path": "src/tests/tests_encryption.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n\n#include \"common/commandstatus.h\"\n\n#include <QRegularExpression>\n#include <QStandardPaths>\n\nvoid Tests::tabEncryption()\n{\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n\n    // Enable tab encryption - this should work even if the encryption support\n    // is not build into the app.\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    // Verify tab doesn't exist yet\n    QVERIFY( !hasTab(tab) );\n\n    // Add test data to the tab\n    RUN(args << \"size\", \"0\\n\");\n    RUN(args << \"add\" << \"test data 3\" << \"test data 2\" << \"test data 1\", \"\");\n    QVERIFY( hasTab(tab) );\n\n    // Verify data was added correctly\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"test data 1 test data 2 test data 3\");\n\n    // Verify tab reloads properly\n    RUN(\"unload\" << tab, tab + \"\\n\");\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"test data 1 test data 2 test data 3\");\n\n    // Restart server to verify encryption/decryption works\n    // The COPYQ_PASSWORD environment variable should be used automatically\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n    RUN(\"show\", \"\");\n    KEYS(clipboardBrowserId);\n\n    // Verify tab still exists\n    QVERIFY( hasTab(tab) );\n\n    // Verify data persisted and was decrypted correctly\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"test data 1 test data 2 test data 3\");\n\n#ifdef WITH_QCA_ENCRYPTION\n    // Password is needed when disabling encryption\n    RUN_MULTIPLE(\n        [&]{ KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\"); },\n        [&]{ RUN(\"config\" << \"encrypt_tabs\" << \"false\", \"false\\n\"); }\n    );\n    KEYS(clipboardBrowserId);\n#endif\n\n    // Verify that password is not needed after disabling encryption\n    m_test->setEnv(\"COPYQ_PASSWORD\", \"\");\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"test data 1 test data 2 test data 3\");\n}\n\nvoid Tests::tabEncryptionPasswordNew()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    m_test->setEnv(\"COPYQ_PASSWORD\", \"\");\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n    RUN(\"show\", \"\");\n    KEYS(clipboardBrowserId);\n\n    RUN_MULTIPLE(\n        [&]{\n            KEYS(\n                // Choose new password\n                passwordEntryNewId << \":TEST123\" << \"ENTER\"\n                // Retype the password\n                << passwordEntryRetypeId << \":TEST123\" << \"ENTER\"\n            );\n        },\n        [&]{ RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\"); }\n    );\n    KEYS(clipboardBrowserId);\n\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n\n    // Add test data to the tab\n    RUN(args << \"size\", \"0\\n\");\n    RUN(args << \"add\" << \"test data 3\" << \"test data 2\" << \"test data 1\", \"\");\n    QVERIFY( hasTab(tab) );\n\n    // Verify data was added correctly\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"test data 1 test data 2 test data 3\");\n\n    // Verify tab reloads properly\n    RUN(\"unload\" << tab, tab + \"\\n\");\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"test data 1 test data 2 test data 3\");\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n\nvoid Tests::tabEncryptionPasswordCurrent()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n    RUN(args << \"add\" << \"test data 3\" << \"test data 2\" << \"test data 1\", \"\");\n\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    m_test->setEnv(\"COPYQ_PASSWORD\", \":TEST\");\n    m_test->ignoreErrors(QRegularExpression(\n        \"Unwrap DEK: authentication failed\"\n        \"|Loaded password does not unlock wrapped key\"\n    ));\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n\n    KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\");\n\n    WAIT_ON_OUTPUT(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"test data 1 test data 2 test data 3\");\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n\nvoid Tests::tabEncryptionPasswordRetry()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    m_test->setEnv(\"COPYQ_PASSWORD\", \"\");\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n    RUN(\"show\", \"\");\n    KEYS(clipboardBrowserId);\n\n    RUN_MULTIPLE(\n        [&]{\n            KEYS(\n                // Choose new password - attempt 1\n                passwordEntryNewId << \":TEST123\" << \"ENTER\"\n                // Retype the password - attempt 1\n                << passwordEntryRetypeId << \":TEST1234\" << \"ENTER\"\n                // Choose new password - attempt 2\n                << passwordEntryNewId << \":TEST123\" << \"ENTER\"\n                // Retype the password - attempt 2\n                << passwordEntryRetypeId << \":TEST123\" << \"ENTER\"\n            );\n        },\n        [&]{ RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\"); }\n    );\n    KEYS(clipboardBrowserId);\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n\nvoid Tests::tabEncryptionPasswordRetryFail()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    m_test->setEnv(\"COPYQ_PASSWORD\", \"\");\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n    RUN(\"show\", \"\");\n    KEYS(clipboardBrowserId);\n\n    RUN_MULTIPLE(\n        [&]{\n            KEYS(\n                // Choose new password - attempt 1\n                passwordEntryNewId << \":TEST123\" << \"ENTER\"\n                // Retype the password - attempt 1\n                << passwordEntryRetypeId << \":TEST1234\" << \"ENTER\"\n\n                // Choose new password - attempt 2\n                << passwordEntryNewId << \"ENTER\"\n                // Empty password - attempt 2\n                << passwordMessageEmptyId << \"ENTER\"\n\n                // Choose new password - attempt 3\n                << passwordEntryNewId << \":TEST123\" << \"ENTER\"\n                // Retype the password - attempt 3\n                << passwordEntryRetypeId << \":TEST1234\" << \"ENTER\"\n\n                << passwordMessageFailedId << \"ENTER\"\n            );\n        },\n        [&]{ RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\"); }\n    );\n\n    // If the initial password was not provided, encryption should be disabled.\n    RUN(\"config\" << \"encrypt_tabs\", \"false\\n\");\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n\nvoid Tests::tabEncryptionPasswordAbortRetry()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n    RUN(\"show\", \"\");\n    KEYS(clipboardBrowserId);\n\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    TEST( m_test->stopServer() );\n    m_test->setEnv(\"COPYQ_PASSWORD\", \"\");\n    TEST( m_test->startServer() );\n\n    m_test->ignoreErrors(QRegularExpression(\"Tab encryption password required but not provided\"));\n    KEYS(passwordEntryCurrentId << \"ESC\");\n    KEYS(clipboardBrowserRefreshButtonId);\n\n    RUN_EXPECT_ERROR_WITH_STDERR(\"add('A')\", CommandException, \"Invalid tab\");\n\n    KEYS(clipboardBrowserRefreshButtonId << \"SPACE\");\n    KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\");\n    KEYS(clipboardBrowserId);\n\n    RUN(\"add('A')\", \"\");\n    RUN(\"read(0)\", \"A\");\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n\nvoid Tests::tabEncryptionLargeItems()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab;\n\n    const auto script = R\"(\n        write(0, [{\n            'text/plain': '1234567890'.repeat(10000),\n            'application/x-copyq-test-data': 'abcdefghijklmnopqrstuvwxyz'.repeat(10000),\n        }])\n        )\";\n    RUN(args << script, \"\");\n\n    RUN(args << \"read(0).left(20)\", \"12345678901234567890\");\n    RUN(args << \"read(0).length\", \"100000\\n\");\n    RUN(args << \"ItemSelection().selectAll().itemAtIndex(0)[mimeText].length\", \"100000\\n\");\n\n    RUN(\"unload\" << tab, tab + \"\\n\");\n    RUN(\"show\" << tab, \"\");\n\n    // Read data after reloading the tab\n    RUN(args << \"read(0).left(20)\", \"12345678901234567890\");\n    RUN(args << \"read(0).length\", \"100000\\n\");\n    RUN(args << \"ItemSelection().selectAll().itemAtIndex(0)[mimeText].length\", \"100000\\n\");\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n\nvoid Tests::tabEncryptionChangePassword()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab;\n    RUN(\"show\" << tab, \"\");\n\n    RUN(args << \"add\" << \"3\" << \"2\" << \"1\", \"\");\n    QVERIFY( hasTab(tab) );\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"1\\n2\\n3\\n\");\n\n    // Open preferences dialog.\n    KEYS(\"Ctrl+P\" << configurationDialogId);\n\n    KEYS(\"mouse|PRESS|pushButtonChangeEncryptionPassword\");\n    KEYS(\"mouse|RELEASE|pushButtonChangeEncryptionPassword\");\n    KEYS(\n        // Current password is always needed when changing\n        passwordEntryCurrentId << \":TEST123\" << \"ENTER\"\n\n        << passwordEntryNewId << \":TEST1234\" << \"ENTER\"\n        << passwordEntryRetypeId << \":TEST1234\" << \"ENTER\"\n        << passwordMessageChangeId << \"ENTER\"\n    );\n\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"1\\n2\\n3\\n\");\n\n    TEST( m_test->stopServer() );\n    m_test->setEnv(\"COPYQ_PASSWORD\", \"TEST1234\");\n    TEST( m_test->startServer() );\n\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"1\\n2\\n3\\n\");\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n"
  },
  {
    "path": "src/tests/tests_encryption_expire.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n\nvoid Tests::expireEncryptionPassword()\n{\n#ifdef WITH_QCA_ENCRYPTION\n    const QString tab1 = testTab(1);\n    const QString tab2 = testTab(2);\n    const Args args1 = Args(\"tab\") << tab1 << \"separator\" << \" \";\n    const Args args2 = Args(\"tab\") << tab2 << \"separator\" << \" \";\n\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    RUN(args1 << \"add\" << \"A1\", \"\");\n    RUN(args2 << \"add\" << \"B1\", \"\");\n\n    // Setting an expiration should not cause any expiration yet\n    RUN(\"config\" << \"expire_encrypted_tab_seconds\" << \"1\", \"1\\n\");\n    KEYS(clipboardBrowserId);\n    QTest::qWait(1500);\n    KEYS(clipboardBrowserId);\n\n    RUN(\"config\" << \"expire_encrypted_tab_seconds\" << \"2\", \"2\\n\");\n    const int waitToExpireMs = 2500;\n    KEYS(clipboardBrowserId);\n\n    TEST( m_test->stopServer() );\n    m_test->setEnv(\"COPYQ_PASSWORD\", \"\");\n    TEST( m_test->startServer() );\n\n    // Start expiration timer from manual password entry.\n    RUN_MULTIPLE(\n        [&]{ RUN(\"show\" << tab1, \"\"); },\n        [&]{ KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\"); }\n    );\n\n    RUN_MULTIPLE(\n        [&]{ KEYS(clipboardBrowserId); },\n        [&]{ RUN(\"selectedTab\", tab1 + \"\\n\"); },\n        [&]{ RUN(args1 << \"read\" << \"0\", \"A1\"); },\n        [&]{ RUN(args2 << \"read\" << \"0\", \"B1\"); }\n    );\n\n    RUN(\"show\" << tab2, \"\");\n    RUN(\"show\" << tab1, \"\");\n    RUN(\"show\" << tab2, \"\");\n\n    KEYS(clipboardBrowserId);\n    QTest::qWait(waitToExpireMs);\n    KEYS(clipboardBrowserId);\n\n    RUN_MULTIPLE(\n        [&]{ KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\"); },\n        [&]{ RUN(args1 << \"read\" << \"0\", \"A1\"); }\n    );\n    KEYS(clipboardBrowserId);\n    RUN(\"selectedTab\", tab2 + \"\\n\");\n\n    RUN(\"show\" << tab1, \"\");\n    RUN_MULTIPLE(\n        [&]{ RUN(\"selectedTab\", tab1 + \"\\n\"); },\n        [&]{ KEYS(clipboardBrowserId); },\n        [&]{ RUN(args1 << \"read\" << \"0\", \"A1\"); }\n    );\n\n    RUN(\"show\" << tab2, \"\");\n    RUN(args2 << \"read\" << \"0\", \"B1\");\n\n    // Expire again: active tab should stay unlocked.\n    KEYS(clipboardBrowserId);\n    QTest::qWait(waitToExpireMs);\n    KEYS(clipboardBrowserId);\n\n    RUN(\"show\" << tab2, \"\");\n    RUN(args2 << \"read\" << \"0\", \"B1\");\n\n    // Switching to the other expired tab should prompt again.\n    RUN_MULTIPLE(\n        [&]{ KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\"); },\n        [&]{ RUN(\"show\" << tab1, \"\"); }\n    );\n    RUN(args1 << \"read\" << \"0\", \"A1\");\n    KEYS(clipboardBrowserId);\n\n    // Avoid asking password for a new tab (if prompted recently)\n    const QString tab3 = testTab(3);\n    RUN(\"show\" << tab3, \"\");\n\n    KEYS(clipboardBrowserId);\n    QTest::qWait(waitToExpireMs);\n    KEYS(clipboardBrowserId);\n\n    // Read multiple expired tabs items, wait for password prompt once\n    RUN_MULTIPLE(\n        [&]{ RUN(args1 << \"read\" << \"0\", \"A1\"); },\n        [&]{ RUN(args2 << \"read\" << \"0\", \"B1\"); },\n        [&]{ QTest::qWait(200); KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    QTest::qWait(waitToExpireMs);\n    KEYS(clipboardBrowserId);\n\n    // Expired tabs should require password, even if the configuration changed\n    RUN(\"config\" << \"expire_encrypted_tab_seconds\" << \"0\", \"0\\n\");\n    RUN_MULTIPLE(\n        [&]{ KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\"); },\n        [&]{ RUN(\"show\" << tab1, \"\"); }\n    );\n    KEYS(clipboardBrowserId);\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n\nvoid Tests::expireEncryptionPasswordOnConfigChange()\n{\n    // Expired tabs should require password,\n    // even if the expiration was disabled afterwards\n#ifdef WITH_QCA_ENCRYPTION\n    const QString tab1 = testTab(1);\n    const Args args1{\"tab\", tab1};\n    RUN(args1 << \"add\" << \"A1\", \"\");\n\n    RUN(\"config\" << \"encrypt_tabs\" << \"true\", \"true\\n\");\n\n    // Setting an expiration should not cause any expiration yet\n    RUN(\"config\" << \"expire_encrypted_tab_seconds\" << \"1\", \"1\\n\");\n    KEYS(clipboardBrowserId);\n    QTest::qWait(1500);\n    KEYS(clipboardBrowserId);\n\n    RUN(\"config\" << \"expire_encrypted_tab_seconds\" << \"0\", \"0\\n\");\n    RUN_MULTIPLE(\n        [&]{ KEYS(passwordEntryCurrentId << \":TEST123\" << \"ENTER\"); },\n        [&]{ RUN(\"show\" << tab1, \"\"); }\n    );\n    KEYS(clipboardBrowserId);\n    RUN(args1 << \"read\" << \"0\", \"A1\");\n#else\n    SKIP(\"Encryption support not built-in\");\n#endif\n}\n"
  },
  {
    "path": "src/tests/tests_expire.cpp",
    "content": "#include \"test_utils.h\"\n#include \"tests.h\"\n\n#include \"common/settings.h\"\n\nvoid Tests::expireTabs()\n{\n    {\n        Settings settings;\n        settings.setValue(\"Options/tabs\", QStringList{\"temp1\", clipboardTabName});\n        settings.setValue(\"Options/tray_tab\", \"temp1\");\n        settings.beginWriteArray(\"Tabs\");\n        settings.setArrayIndex(0);\n        settings.setValue(\"name\", \"temp1\");\n        settings.setValue(\"icon\", \"x\");\n        settings.setValue(\"store_items\", false);\n        settings.setValue(\"encrypted_expire_seconds\", 7);\n        settings.endArray();\n    }\n\n    // Trigger configuration reload.\n    RUN(\"config('maxitems', 10)\", \"10\\n\");\n\n    RUN(\"tab\", \"temp1\\n\" + QString(clipboardTabName) + \"\\n\");\n\n    RUN(\"add\" << \"A\", \"\");\n\n    // Trigger configuration reload.\n    RUN(\"config('maxitems', 11)\", \"11\\n\");\n\n    #define VERIFY_TEMPORARY_TAB_EXIST(tabName) \\\n    do { \\\n        RUN(\"tab\", QStringLiteral(tabName) + \"\\n\" + QString(clipboardTabName) + \"\\n\"); \\\n        RUN(\"read(0)\", \"A\"); \\\n        RUN(\"size()\", \"1\\n\"); \\\n        Settings settings; \\\n        const QStringList expectedTabs{tabName, clipboardTabName}; \\\n        QCOMPARE(settings.value(\"Options/tabs\"), expectedTabs); \\\n        QCOMPARE(settings.value(\"Options/tray_tab\"), tabName); \\\n        settings.beginReadArray(\"Tabs\"); \\\n        settings.setArrayIndex(0); \\\n        QCOMPARE(settings.value(\"name\"), tabName); \\\n        QCOMPARE(settings.value(\"icon\"), \"x\"); \\\n        QCOMPARE(settings.value(\"store_items\").toBool(), false); \\\n        QCOMPARE(settings.value(\"encrypted_expire_seconds\").toInt(), 7); \\\n        settings.endArray(); \\\n    } while(false)\n\n    VERIFY_TEMPORARY_TAB_EXIST(\"temp1\");\n\n    RUN(\"renameTab('temp1', 'temp2')\", \"\");\n\n    VERIFY_TEMPORARY_TAB_EXIST(\"temp2\");\n\n    // Restart server.\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n\n    RUN(\"tab\", \"temp2\\n\" + QString(clipboardTabName) + \"\\n\");\n    RUN(\"size()\", \"0\\n\");\n}\n"
  },
  {
    "path": "src/tests/tests_import_export.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n\n#include \"common/temporaryfile.h\"\n\n#include <QRegularExpression>\n\nnamespace {\n\nconst QString exportFilePath(const QString &suffix = QStringLiteral(\"1\"))\n{\n    return QStringLiteral(\"%1/copyq-test-%2.cpq\")\n        .arg(qEnvironmentVariable(\"COPYQ_SETTINGS_PATH\"), suffix);\n}\n\n} // namespace\n\nvoid Tests::exportImport(int flags)\n{\n#ifdef Q_OS_MAC\n    if (flags & (ExportSettings | ExportCommands))\n        SKIP(\"Mnemonic for focusing shortcut button doesn't work on OS X\");\n#endif\n#ifndef WITH_QCA_ENCRYPTION\n    if (flags & ExportWithPassword)\n        SKIP(\"Encryption support not built-in\");\n#endif\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab;\n\n    if (flags & ExportTab) {\n        RUN(\"show\" << tab, \"\");\n\n        RUN(args << \"add\" << \"3\" << \"2\" << \"1\", \"\");\n        QVERIFY( hasTab(tab) );\n        RUN(args << \"size\", \"3\\n\");\n        RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"1\\n2\\n3\\n\");\n    }\n\n    RUN(\"setCommands([{name: 'test', cmd: 'copyq help'}])\", \"\");\n    RUN(\"commands()[0].name\", \"test\\n\");\n    RUN(\"commands()[0].cmd\", \"copyq help\\n\");\n    RUN(\"commands()[0].enable\", \"true\\n\");\n    RUN(\"commands().length\", \"1\\n\");\n\n    RUN(\"config('maxitems', 20)\", \"20\\n\");\n\n    // Export\n    KEYS(\"Ctrl+S\" << exportDialogId);\n    if (flags & ExportSettings)\n        KEYS(exportDialogId << \"ALT+N\");  // Enable exporting configuration\n    if (flags & ExportCommands)\n        KEYS(exportDialogId << \"ALT+M\");  // Enable exporting commands\n    KEYS(\"ENTER\");\n\n    // Export with password only if supported\n#ifdef WITH_QCA_ENCRYPTION\n    KEYS(passwordEntryExportId);\n    if (flags & ExportWithPassword) {\n        KEYS(\":TEST1234\" << \"ENTER\");\n        KEYS(passwordEntryRetypeId << \":TEST1234\");\n    }\n    KEYS(\"ENTER\");\n#endif\n\n    KEYS(fileNameEditId << \":\" + exportFilePath());\n    KEYS(\"ENTER\");\n    KEYS(clipboardBrowserId);\n    Q_ASSERT(QFile::exists(exportFilePath()));\n\n    RUN(\"config('maxitems', 10)\", \"10\\n\");\n\n    // Import\n    KEYS(\"Ctrl+Shift+I\" << fileNameEditId << \":\" + exportFilePath());\n    KEYS(\"ENTER\");\n\n    // Import with password only if supported\n#ifdef WITH_QCA_ENCRYPTION\n    if (flags & ExportWithPassword) {\n        KEYS(passwordEntryImportId << \":TEST1234\");\n        KEYS(\"ENTER\");\n    }\n#endif\n\n    KEYS(importDialogId << \"ENTER\");\n    KEYS(clipboardBrowserId);\n\n    if (flags & ExportTab) {\n        const auto tabCopy = QStringLiteral(\"%1 (1)\").arg(tab);\n        RUN(\"tab\", QLatin1String(clipboardTabName) + \"\\n\" + tab + \"\\n\" + tabCopy + \"\\n\");\n        const auto args1 = Args(\"tab\") << tabCopy;\n        RUN(args1 << \"size\", \"3\\n\");\n        RUN(args1 << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"1\\n2\\n3\\n\");\n    }\n\n    if (flags & ExportSettings)\n        RUN(\"config('maxitems')\", \"20\\n\");\n    else\n        RUN(\"config('maxitems')\", \"10\\n\");\n\n    RUN(\"commands()[0].name\", \"test\\n\");\n    RUN(\"commands()[0].cmd\", \"copyq help\\n\");\n    RUN(\"commands()[0].enable\", \"true\\n\");\n    if (flags & ExportCommands) {\n        RUN(\"commands()[1].name\", \"test\\n\");\n        RUN(\"commands()[1].cmd\", \"copyq help\\n\");\n        RUN(\"commands()[1].enable\", \"true\\n\");\n        RUN(\"commands().length\", \"2\\n\");\n    } else {\n        RUN(\"commands().length\", \"1\\n\");\n    }\n}\n\nvoid Tests::exportImportNoPasswordTab() { exportImport(ExportTab); }\nvoid Tests::exportImportNoPasswordSettingsOnly() { exportImport(ExportSettings); }\nvoid Tests::exportImportNoPasswordCommandsOnly() { exportImport(ExportCommands); }\nvoid Tests::exportImportPasswordTab() { exportImport(ExportWithPassword | ExportTab); }\nvoid Tests::exportImportPasswordSettingsOnly() { exportImport(ExportWithPassword | ExportSettings); }\nvoid Tests::exportImportPasswordCommandsOnly() { exportImport(ExportWithPassword | ExportCommands); }\n\nvoid Tests::exportImportErrors()\n{\n#ifdef Q_OS_WIN\n    const auto fileNotFound = QStringLiteral(\"The system cannot find the path specified.\");\n#else\n    const auto fileNotFound = QStringLiteral(\"No such file or directory\");\n#endif\n\n    // Import non-existent file\n    const auto invalidFile = QStringLiteral(\"/tmp/copyq-invalid/file.cpq\");\n    const auto openError = QStringLiteral(\n        R\"(Failed to open file for import: \"%1\" message: \"%2\")\"\n    ).arg(QRegularExpression::escape(invalidFile), fileNotFound);\n    m_test->ignoreErrors(QRegularExpression(openError));\n    const auto clientErrorTemplate = QStringLiteral(\"ScriptError: Failed to import file \\\"%1\\\"\");\n    const auto clientErrorInvalid = clientErrorTemplate.arg(invalidFile);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importData\" << invalidFile, 4, clientErrorInvalid);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importTab\" << invalidFile, 4, clientErrorInvalid);\n    QVERIFY2( dropLogsToFileCountAndSize(0, 0), \"Failed to remove log files\" );\n\n    // Export to non-existent directory\n    const auto exportError = QStringLiteral(\n        R\"(Failed to open file for export( \\(v2\\))?: \"%1\" message: \"%2\")\"\n    ).arg(QRegularExpression::escape(invalidFile), fileNotFound);\n    m_test->ignoreErrors(QRegularExpression(exportError));\n    const auto clientErrorExport =\n        QStringLiteral(\"ScriptError: Failed to export file \\\"%1\\\"\").arg(invalidFile);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"exportData\" << invalidFile, 4, clientErrorExport);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"exportTab\" << invalidFile, 4, clientErrorExport);\n    QVERIFY2( dropLogsToFileCountAndSize(0, 0), \"Failed to remove log files\" );\n\n    // Import invalid file\n    QFile tmp(exportFilePath(QStringLiteral(\"invalid\")));\n    QVERIFY(tmp.open(QFile::WriteOnly));\n    tmp.write(\"TEST\");\n    tmp.close();\n    const auto path = tmp.fileName();\n\n    const auto headerError = QStringLiteral(\n        R\"(Failed to read file header for import - file: \"%1\" reason: 1)\"\n    ).arg(QRegularExpression::escape(path));\n    m_test->ignoreErrors(QRegularExpression(headerError));\n    const auto clientError = clientErrorTemplate.arg(path);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importData\" << path, 4, clientError);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importTab\" << path, 4, clientError);\n    QVERIFY2( dropLogsToFileCountAndSize(0, 0), \"Failed to remove log files\" );\n\n#ifndef Q_OS_WIN\n    // Import file without permissions\n    tmp.setPermissions(QFile::Permissions());\n    const auto permissionError = QStringLiteral(\n        R\"(Failed to open file for import: \"%1\" message: \"Permission denied\")\"\n    ).arg(QRegularExpression::escape(path));\n    m_test->ignoreErrors(QRegularExpression(permissionError));\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importData\" << path, 4, clientError);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importTab\" << path, 4, clientError);\n    QVERIFY2( dropLogsToFileCountAndSize(0, 0), \"Failed to remove log files\" );\n#endif\n\n    // Export incomplete file\n    const auto pathPartial = exportFilePath(QStringLiteral(\"Partial\"));\n    m_test->ignoreErrors({});\n    RUN(\"exportData\" << pathPartial, \"\");\n\n    QFile f(pathPartial);\n    QVERIFY2( f.resize(f.size() - 1), f.errorString().toUtf8() );\n    const auto importErrorV = QStringLiteral(R\"(Import \\(v%1\\) failed - file: \"%2\" reason: 1)\");\n    const auto importErrorV4 = importErrorV.arg(4).arg(QRegularExpression::escape(pathPartial));\n    m_test->ignoreErrors(QRegularExpression(importErrorV4));\n    const auto clientErrorPartial = clientErrorTemplate.arg(pathPartial);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importData\" << pathPartial, 4, clientErrorPartial);\n    QVERIFY2( dropLogsToFileCountAndSize(0, 0), \"Failed to remove log files\" );\n\n    QVERIFY(f.open(QFile::WriteOnly));\n    QDataStream in(&f);\n    in.setVersion(QDataStream::Qt_4_7);\n    in << QByteArray(\"CopyQ v3\");\n    f.close();\n    const auto importErrorV3 = importErrorV.arg(3).arg(QRegularExpression::escape(pathPartial));\n    m_test->ignoreErrors(QRegularExpression(importErrorV3));\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importData\" << pathPartial, 4, clientErrorPartial);\n    QVERIFY2( dropLogsToFileCountAndSize(0, 0), \"Failed to remove log files\" );\n\n    QVERIFY(f.open(QFile::WriteOnly));\n    in << QByteArray(\"CopyQ v4\");\n    f.close();\n    m_test->ignoreErrors(QRegularExpression(importErrorV4));\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importData\" << pathPartial, 4, clientErrorPartial);\n    QVERIFY2( dropLogsToFileCountAndSize(0, 0), \"Failed to remove log files\" );\n\n    QVERIFY(f.open(QFile::WriteOnly));\n    in << QByteArray(\"CopyQ v2\");\n    f.close();\n    const auto importErrorV2 = importErrorV.arg(2).arg(QRegularExpression::escape(pathPartial));\n    m_test->ignoreErrors(QRegularExpression(importErrorV2));\n    RUN_EXPECT_ERROR_WITH_STDERR(\"importData\" << pathPartial, 4, clientErrorPartial);\n}\n"
  },
  {
    "path": "src/tests/tests_items.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/mimetypes.h\"\n#include \"common/commandstatus.h\"\n\n#include <QKeySequence>\n#include <QRegularExpression>\n\nvoid Tests::configMaxitems()\n{\n    RUN(\"config\" << \"maxitems\" << \"3\", \"3\\n\");\n    RUN(\"add\" << \"A\" << \"B\" << \"C\", \"\");\n    RUN(\"add\" << \"D\", \"\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\" << \"2\", \"D C B\");\n    RUN(\"size\", \"3\\n\");\n\n    RUN(\"add\" << \"E\" << \"F\", \"\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\" << \"2\", \"F E D\");\n    RUN(\"size\", \"3\\n\");\n\n    RUN(\"config\" << \"maxitems\" << \"2\", \"2\\n\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\", \"F E\");\n    RUN(\"size\", \"2\\n\");\n\n    // Adding too many items fails.\n    m_test->ignoreErrors(\n        QRegularExpression(R\"(Cannot add new items\\. Tab \"CLIPBOARD\" reached the maximum number of items\\.)\") );\n    RUN_EXPECT_ERROR(\"add\" << \"1\" << \"2\" << \"3\", CommandException);\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\", \"F E\");\n    RUN(\"size\", \"2\\n\");\n\n    // Single item in tabs.\n    RUN(\"config\" << \"maxitems\" << \"1\", \"1\\n\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\", \"F\");\n    RUN(\"size\", \"1\\n\");\n\n    RUN(\"add\" << \"G\", \"\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\", \"G\");\n    RUN(\"size\", \"1\\n\");\n\n    RUN(\"write\" << \"1\" << \"text/plain\" << \"H\", \"\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\", \"H\");\n    RUN(\"size\", \"1\\n\");\n\n    // No items in tabs.\n    RUN(\"config\" << \"maxitems\" << \"0\", \"0\\n\");\n    RUN(\"size\", \"0\\n\");\n\n    RUN_EXPECT_ERROR(\"add\" << \"1\", CommandException);\n    RUN_EXPECT_ERROR(\"write\" << \"1\", CommandException);\n    RUN(\"size\", \"0\\n\");\n\n    // Invalid value.\n    RUN(\"config\" << \"maxitems\" << \"-99\", \"0\\n\");\n    RUN(\"size\", \"0\\n\");\n}\n\nvoid Tests::keysAndFocusing()\n{\n    RUN(\"disable\", \"\");\n    KEYS(clipboardBrowserId << \"CTRL+T\");\n    WAIT_ON_OUTPUT(\"currentWindowTitle\", appWindowTitle(\"New Tab\"));\n\n    KEYS(tabDialogLineEditId << \"ESC\");\n    WAIT_ON_OUTPUT(\"currentWindowTitle\", appWindowTitle(\"*Clipboard Storing Disabled*\"));\n\n    RUN(\"enable\", \"\");\n}\n\nvoid Tests::selectItems()\n{\n    const auto tab = QString(clipboardTabName);\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    KEYS(\"RIGHT\" << \"SHIFT+DOWN\" << \"SHIFT+DOWN\");\n    TEST_SELECTED(tab + \" 2 0 1 2\\n\");\n\n    KEYS(\"SHIFT+UP\");\n    TEST_SELECTED(tab + \" 1 0 1\\n\");\n\n    KEYS(\"END\");\n    TEST_SELECTED(tab + \" 2 2\\n\");\n\n    KEYS(\"SHIFT+UP\");\n    TEST_SELECTED(tab + \" 1 2 1\\n\");\n\n    KEYS(\"CTRL+A\");\n    TEST_SELECTED(tab + \" 1 0 1 2\\n\");\n\n    // CTRL+SPACE toggles current item selection\n    RUN(\"add\" << \"D\", \"\");\n    KEYS(\"PGUP\" << \"CTRL+SHIFT+DOWN\" << \"CTRL+SHIFT+DOWN\");\n    TEST_SELECTED(tab + \" 2 0\\n\");\n    KEYS(\"CTRL+SPACE\");\n    TEST_SELECTED(tab + \" 2 0 2\\n\");\n    KEYS(\"SHIFT+DOWN\");\n    TEST_SELECTED(tab + \" 3 0 2 3\\n\");\n    KEYS(\"CTRL+SPACE\");\n    TEST_SELECTED(tab + \" 3 0 2\\n\");\n}\n\nvoid Tests::moveItems()\n{\n    const auto tab = QString(clipboardTabName);\n    const auto args = Args() << \"separator\" << \" \";\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    // move item one down\n    KEYS(\"RIGHT\" << \"CTRL+DOWN\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"B A C\");\n    TEST_SELECTED(tab + \" 1 1\\n\");\n\n    // move items to top\n    KEYS(\"SHIFT+DOWN\" << \"CTRL+HOME\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"A C B\");\n    TEST_SELECTED(tab + \" 1 0 1\\n\");\n}\n\nvoid Tests::deleteItems()\n{\n    const auto tab = QString(clipboardTabName);\n    const auto args = Args() << \"separator\" << \",\";\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    // delete first item\n    KEYS(\"RIGHT\" << m_test->shortcutToRemove());\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"B,C,\");\n    TEST_SELECTED(tab + \" 0 0\\n\");\n\n    // select all and delete\n    KEYS(\"CTRL+A\" << m_test->shortcutToRemove());\n    RUN(args << \"size\", \"0\\n\");\n}\n\nvoid Tests::searchItems()\n{\n    RUN(\"add\" << \"a\" << \"b\" << \"c\", \"\");\n    KEYS(\":b\" << \"TAB\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 1 1\\n\");\n}\n\nvoid Tests::searchItemsAndSelect()\n{\n    RUN(\"add\" << \"xx1\" << \"a\" << \"xx2\" << \"c\" << \"xx3\" << \"d\", \"\");\n    KEYS(\":xx\" << filterEditId);\n    TEST_SELECTED(QString(clipboardTabName) + \" 1 1\\n\");\n\n    KEYS(filterEditId << \"DOWN\" << filterEditId);\n    TEST_SELECTED(QString(clipboardTabName) + \" 3 3\\n\");\n\n    KEYS(filterEditId << \"DOWN\" << filterEditId);\n    TEST_SELECTED(QString(clipboardTabName) + \" 5 5\\n\");\n\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId);\n}\n\nvoid Tests::searchItemsAndCopy()\n{\n    RUN(\"add\" << \"TEST_ITEM\", \"\");\n    KEYS(\":test\" << \"CTRL+C\" << filterEditId);\n    WAIT_FOR_CLIPBOARD(\"TEST_ITEM\");\n}\n\nvoid Tests::searchRowNumber()\n{\n    RUN(\"add\" << \"d2\" << \"c\" << \"b2\" << \"a\", \"\");\n\n    KEYS(\":2\");\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId);\n    TEST_SELECTED(QString(clipboardTabName) + \" 1 1\\n\");\n    KEYS(\"CTRL+A\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 1 1 3\\n\");\n\n    KEYS(\":0\");\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId << \"CTRL+A\");\n    TEST_SELECTED(QString(clipboardTabName) + \" _\\n\");\n\n    RUN(\"config\" << \"row_index_from_one\" << \"false\", \"false\\n\");\n    KEYS(\":2\");\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId);\n    TEST_SELECTED(QString(clipboardTabName) + \" 2 2\\n\");\n    KEYS(\"CTRL+A\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 2 1 2 3\\n\");\n\n    KEYS(\":0\");\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId << \"CTRL+A\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 0 0\\n\");\n\n    KEYS(\":5\");\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId << \"CTRL+A\");\n    TEST_SELECTED(QString(clipboardTabName) + \" _\\n\");\n\n    RUN(\"filter\" << \"-1\", \"\");\n    RUN(\"filter\", \"-1\\n\");\n    KEYS(clipboardBrowserId << \"CTRL+A\");\n    TEST_SELECTED(QString(clipboardTabName) + \" _\\n\");\n}\n\nvoid Tests::searchAccented()\n{\n    RUN(\"add\" << \"a\" << \"väčšina\" << \"a\", \"\");\n    RUN(\"filter\" << \"vacsina\", \"\");\n    WAIT_ON_OUTPUT(\"testSelected\", QByteArray(clipboardTabName) + \" 1 1\\n\");\n}\n\nvoid Tests::searchManyItems()\n{\n    RUN(\"config\"\n        << \"maxitems\" << \"100000\"\n        << \"row_index_from_one\" << \"false\",\n        \"maxitems=100000\\n\"\n        \"row_index_from_one=false\\n\"\n    );\n    RUN(\"add.apply(this, [...Array(100000).keys()].reverse())\", \"\");\n\n    RUN(\"filter\" << \"90001\", \"\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 90001 90001\\n\");\n\n    RUN(\"filter\" << \"9 8 7 6 5\", \"\");\n    WAIT_ON_OUTPUT(\"testSelected\", QString(clipboardTabName) + \" 56789 56789\\n\");\n\n    RUN(\"config\" << \"filter_regular_expression\" << \"true\", \"true\\n\");\n    RUN(\"filter\" << \".*99999\", \"\");\n    WAIT_ON_OUTPUT(\"testSelected\", QString(clipboardTabName) + \" 99999 99999\\n\");\n\n    KEYS(\":9\" << \":0002\" << filterEditId);\n    RUN(\"filter\", \"90002\\n\");\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId);\n    TEST_SELECTED(QString(clipboardTabName) + \" 90002 90002\\n\");\n\n    KEYS(\":9\" << \":999\" << filterEditId);\n    KEYS(filterEditId << \"TAB\" << clipboardBrowserId);\n    WAIT_ON_OUTPUT(\n        QStringLiteral(\n            \"plugins.itemtests.keys('%1', 'CTRL+A', '%1');\"\n            \"testSelected()\")\n        .arg(clipboardBrowserId),\n        QString(clipboardTabName) + \" 9999\"\n        \" 9999 19999 29999 39999 49999 59999 69999 79999 89999\"\n        \" 99990 99991 99992 99993 99994 99995 99996 99997 99998 99999\\n\"\n    );\n}\n\nvoid Tests::copyItems()\n{\n    const auto tab = QString(clipboardTabName);\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    // Select and copy all items.\n    KEYS(\"CTRL+A\" << keyNameFor(QKeySequence::Copy));\n\n    // This seems to be required on Windows.\n    WAIT_ON_OUTPUT(\"clipboard\", \"A\\nB\\nC\");\n\n    // Paste all items.\n    KEYS(keyNameFor(QKeySequence::Paste));\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\" << \"5\", \"A B C A B C\");\n    RUN(\"size\", \"6\\n\");\n}\n\nvoid Tests::selectAndCopyOrder()\n{\n    const auto tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n    RUN(args << \"add\" << \"D\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"setCurrentTab\" << tab, \"\");\n\n    KEYS(\"END\" << \"SHIFT+UP\" << \"SHIFT+UP\" << \"SHIFT+UP\");\n    TEST_SELECTED(tab + \" 0 3 2 1 0\\n\");\n\n    KEYS(keyNameFor(QKeySequence::Copy));\n    WAIT_ON_OUTPUT(\"clipboard\", \"D\\nC\\nB\\nA\");\n}\n\nvoid Tests::sortAndReverse()\n{\n    const auto tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n    RUN(args << \"add\" << \"D\" << \"A\" << \"C\" << \"B\", \"\");\n    RUN(\"setCurrentTab\" << tab, \"\");\n\n    KEYS(\"CTRL+A\");\n    TEST_SELECTED(tab + \" 0 0 1 2 3\\n\");\n\n    KEYS(\"CTRL+SHIFT+S\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"A B C D \");\n    TEST_SELECTED(tab + \" 1 0 1 2 3\\n\");\n    KEYS(keyNameFor(QKeySequence::Copy));\n    WAIT_ON_OUTPUT(\"clipboard\", \"A\\nB\\nC\\nD\");\n\n    KEYS(\"CTRL+SHIFT+R\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"D C B A \");\n    TEST_SELECTED(tab + \" 2 0 1 2 3\\n\");\n    KEYS(keyNameFor(QKeySequence::Copy));\n    WAIT_ON_OUTPUT(\"clipboard\", \"D\\nC\\nB\\nA\");\n\n    KEYS(\"CTRL+SHIFT+R\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"A B C D \");\n    TEST_SELECTED(tab + \" 1 0 1 2 3\\n\");\n}\n\nvoid Tests::editItems()\n{\n    RUN(\"config\" << \"edit_ctrl_return\" << \"true\", \"true\\n\");\n\n    RUN(\"add\" << \"Line 4\" << \"Line 1\", \"\");\n\n    KEYS(clipboardBrowserId << \"F2\"\n        << editorId << \"END\" << \"ENTER\" << \":Line 2\" << \"F2\");\n    RUN(\"read\" << \"0\", \"Line 1\\nLine 2\");\n\n    KEYS(clipboardBrowserId << \"DOWN\" << \"F2\"\n        << editorId << \"HOME\" << \":Line 3\" << \"ENTER\" << \"F2\");\n    RUN(\"read\" << \"1\", \"Line 3\\nLine 4\");\n    RUN(\"read\" << \"0\", \"Line 1\\nLine 2\");\n\n    // Edit multiple items\n    KEYS(clipboardBrowserId << \"SHIFT+UP\" << \"F2\"\n        << editorId << \"END\" << \"ENTER\" << \":Line 5\" << \"F2\");\n    RUN(\"read\" << \"0\", \"Line 3\\nLine 4\\nLine 1\\nLine 2\\nLine 5\");\n    RUN(\"read\" << \"1\", \"Line 1\\nLine 2\");\n    RUN(\"read\" << \"2\", \"Line 3\\nLine 4\");\n}\n\nvoid Tests::createNewItem()\n{\n    RUN(\"config\" << \"edit_ctrl_return\" << \"true\", \"true\\n\");\n\n    KEYS(\"CTRL+N\" << editorId << \":Line 1\" << \"ENTER\" << \":Line 2\" << \"F2\");\n    RUN(\"read\" << \"0\", \"Line 1\\nLine 2\");\n\n    KEYS(\"CTRL+N\" << editorId << \":Line 3\" << \"ENTER\" << \":Line 4\" << \"F2\");\n    RUN(\"read\" << \"0\", \"Line 3\\nLine 4\");\n}\n\nvoid Tests::editNotes()\n{\n    const auto script = R\"(\n        add(\n          {\n            [mimeText]: 'B',\n            // https://stackoverflow.com/a/13139830\n            [mimeIcon]: frombase64(\"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"),\n          },\n          {\n            [mimeText]: 'A',\n            [mimeIcon]: String.fromCharCode(0xf188),\n          }\n        )\n    )\";\n    RUN(script, \"\");\n\n    RUN(\"config\" << \"editor\" << \"\", \"\\n\");\n    KEYS(\"SHIFT+F2\" << \":A Note\" << \"F2\");\n    RUN(\"read\" << mimeText << \"0\" << mimeItemNotes << \"0\" << \"F2\", \"A\\nA Note\");\n    RUN(\"read\" << mimeText << \"1\" << mimeItemNotes << \"1\" << \"F2\", \"B\\n\");\n\n    KEYS(\"DOWN\");\n\n    KEYS(\"SHIFT+F2\" << \":B Note\" << \"F2\");\n    RUN(\"read\" << mimeText << \"1\" << mimeItemNotes << \"1\" << \"F2\", \"B\\nB Note\");\n    RUN(\"read\" << mimeText << \"0\" << mimeItemNotes << \"0\" << \"F2\", \"A\\nA Note\");\n}\n\nvoid Tests::editHtml()\n{\n    // Create new item with bold text\n    KEYS(\"CTRL+N\" << editorId << \":BOLD\"\n        << QKeySequence(QKeySequence::SelectAll).toString()\n        << QKeySequence(QKeySequence::Bold).toString()\n        << \"F2\" << clipboardBrowserId);\n\n    const auto readHtmlItem = [this](){\n        QByteArray out;\n        run(Args() << \"read(mimeHtml, 0)\", &out);\n        return QString::fromUtf8(out);\n    };\n\n    QRegularExpression re(\"font-weight: *[67]00[^>]*>BOLD</[^>]*>\");\n    QString html = readHtmlItem();\n    QVERIFY2( html.contains(re), html.toUtf8() );\n\n    // Append normal text\n    KEYS(\"F2\" << editorId << \"END\"\n        << QKeySequence(QKeySequence::Bold).toString()\n        << \":,NORMAL\" << \"F2\" << clipboardBrowserId);\n    html = readHtmlItem();\n    QVERIFY2( html.contains(re), html.toUtf8() );\n    re.setPattern( re.pattern() + \",NORMAL\" );\n    QVERIFY2( html.contains(re), html.toUtf8() );\n\n    // Append italic text\n    KEYS(\"F2\" << editorId << \"END\"\n        << QKeySequence(QKeySequence::Italic).toString()\n        << \":,ITALIC\" << \"F2\" << clipboardBrowserId);\n    html = readHtmlItem();\n    QVERIFY2( html.contains(re), html.toUtf8() );\n    re.setPattern( re.pattern() + \"<[^>]*font-style: *italic[^>]*>,ITALIC</[^>]*>\" );\n    QVERIFY2( html.contains(re), html.toUtf8() );\n\n    // Append underline text\n    KEYS(\"F2\" << editorId << \"END\"\n        << QKeySequence(QKeySequence::Underline).toString()\n        << \":,ULINE\" << \"F2\" << clipboardBrowserId);\n    html = readHtmlItem();\n    QVERIFY2( html.contains(re), html.toUtf8() );\n    re.setPattern( re.pattern() + \"<[^>]*text-decoration: *underline[^>]*>,ULINE</[^>]*>\" );\n    QVERIFY2( html.contains(re), html.toUtf8() );\n\n    // Append strike-through text\n    KEYS(\"F2\" << editorId << \"END\"\n        << \"mouse|CLICK|text=Strikethrough\"\n        << \":,XXX\" << \"F2\" << clipboardBrowserId);\n    html = readHtmlItem();\n    QVERIFY2( html.contains(re), html.toUtf8() );\n    re.setPattern( re.pattern() + \"<[^>]*text-decoration: *underline line-through[^>]*>,XXX</[^>]*>\" );\n    QVERIFY2( html.contains(re), html.toUtf8() );\n\n    // Erase style\n    KEYS(\"F2\" << editorId << \"END\"\n        << QKeySequence(QKeySequence::SelectAll).toString()\n        << \"mouse|CLICK|text=Erase Style\"\n        << \"F2\" << clipboardBrowserId);\n    RUN(\"read(0)\", \"BOLD,NORMAL,ITALIC,ULINE,XXX\");\n}\n"
  },
  {
    "path": "src/tests/tests_navigation.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n\nnamespace {\n\nconst QString navigate = QStringLiteral(R\"(\n    (function(key){\n        plugins.itemtests.keys(str(key), '%1');\n        print(testSelected());\n    })\n)\").arg(clipboardBrowserId);\n\n} // namespace\n\nvoid Tests::navigationTestInit()\n{\n    RUN(\"tab\" << \"tab1\" << \"add(1,2,3)\", \"\");\n    RUN(\"setCurrentTab('tab1')\", \"\");\n}\n\nvoid Tests::navigationTestDownUp(const QString &down, const QString &up)\n{\n    RUN(\"selectItems(0)\", \"true\\n\");\n    KEYS(clipboardBrowserId);\n\n    RUN(navigate << down, \"tab1 1 1\");\n    RUN(navigate << down, \"tab1 2 2\");\n    RUN(navigate << down, \"tab1 2 2\");\n\n    RUN(navigate << up, \"tab1 1 1\");\n    RUN(navigate << up, \"tab1 0 0\");\n    RUN(navigate << up, \"tab1 0 0\");\n\n    RUN(navigate << \"SHIFT+\" + down, \"tab1 1 0 1\");\n    RUN(navigate << \"SHIFT+\" + down, \"tab1 2 0 1 2\");\n    RUN(navigate << \"SHIFT+\" + up, \"tab1 1 0 1\");\n    RUN(navigate << \"SHIFT+\" + up, \"tab1 0 0\");\n}\n\nvoid Tests::navigationTestEndHome(const QString &end, const QString &home)\n{\n    RUN(\"selectItems(0)\", \"true\\n\");\n    KEYS(clipboardBrowserId);\n\n    RUN(navigate << end, \"tab1 2 2\");\n    RUN(navigate << end, \"tab1 2 2\");\n\n    RUN(navigate << home, \"tab1 0 0\");\n    RUN(navigate << home, \"tab1 0 0\");\n}\n\nvoid Tests::navigationTestEscapeEditor(const QString &esc, const QString &editor)\n{\n    KEYS(editor << editorId);\n    KEYS(esc << clipboardBrowserId);\n}\n\nvoid Tests::navigationTestEscapeSearch(const QString &esc, const QString &search)\n{\n    KEYS(search << filterEditId << \":test\");\n    RUN(\"filter\", \"test\\n\");\n    KEYS(esc << clipboardBrowserId);\n    RUN(\"filter\", \"\\n\");\n}\n\nvoid Tests::navigationDefault()\n{\n    RUN(\"config\" << \"navigation_style\", \"0\\n\");\n    navigationTestInit();\n    navigationTestDownUp(\"DOWN\", \"UP\");\n    navigationTestEndHome(\"END\", \"HOME\");\n    navigationTestEscapeSearch(\"ESC\", \"F3\");\n    navigationTestEscapeEditor(\"ESC\", \"F2\");\n}\n\nvoid Tests::navigationVi()\n{\n    RUN(\"config\" << \"navigation_style\" << \"1\", \"1\\n\");\n    navigationTestInit();\n    navigationTestDownUp(\"J\", \"K\");\n    navigationTestEndHome(\"SHIFT+G\", \"G\");\n    navigationTestEscapeSearch(\"CTRL+[\", \"/\");\n    navigationTestEscapeEditor(\"CTRL+[\", \"F2\");\n}\n\nvoid Tests::navigationEmacs()\n{\n    RUN(\"config\" << \"navigation_style\" << \"2\", \"2\\n\");\n    navigationTestInit();\n    navigationTestDownUp(\"CTRL+N\", \"CTRL+P\");\n    navigationTestEndHome(\"ALT+>\", \"ALT+<\");\n    navigationTestEscapeSearch(\"CTRL+G\", \"CTRL+F\");\n    navigationTestEscapeEditor(\"CTRL+G\", \"F2\");\n}\n"
  },
  {
    "path": "src/tests/tests_other.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/commandstatus.h\"\n#include \"common/mimetypes.h\"\n#include \"common/sleeptimer.h\"\n#include \"common/version.h\"\n\n#include <QProcess>\n\n#include <algorithm>\n\nnamespace {\n\nQString copyqUserAgent()\n{\n    return QStringLiteral(\"CopyQ/%1\").arg(versionString);\n}\n\nbool waitWhileFileExists(const QFile &file)\n{\n    SleepTimer t(2000);\n    while (file.exists() && t.sleep()) {}\n    return !file.exists();\n}\n\nQVariantMap secretData(const QByteArray &text)\n{\n#ifdef Q_OS_WIN\n    const QString format(\"application/x-qt-windows-mime;value=\\\"Clipboard Viewer Ignore\\\"\");\n    const QByteArray value(\"\");\n#elif defined(Q_OS_MACOS)\n    const QString format(\"application/x-nspasteboard-concealed-type\");\n    const QByteArray value(\"secret\");\n#elif defined(Q_OS_UNIX)\n    const QString format(\"x-kde-passwordManagerHint\");\n    const QByteArray value(\"secret\");\n#endif\n\n    return QVariantMap{\n        {format, value},\n        {mimeText, text},\n    };\n}\n\n} // namespace\n\n\nvoid Tests::pipingCommands()\n{\n    const auto tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \",\";\n\n    RUN(args << \"action\"\n        << \"copyq print HELLO | copyq print(str(input()).toLowerCase())\", \"\");\n    WAIT_ON_OUTPUT(args << \"read\" << \"0\" << \"1\", \"hello,\");\n\n    RUN(args << \"action\"\n        << \"copyq print TEST\"\n        \" | copyq 'print(str(input()) + 1)'\"\n        \" | copyq 'print(str(input()) + 2)'\"\n        \" | copyq 'print(str(input()) + 3)'\"\n        , \"\");\n    WAIT_ON_OUTPUT(args << \"read\" << \"0\" << \"1\", \"TEST123,hello\");\n}\n\nvoid Tests::copyPasteCommands()\n{\n    const QByteArray commands =\n            \"[Commands]\\n\"\n            \"1\\\\Name=Test 1\\n\"\n            \"2\\\\Name=Test 2\\n\"\n            \"size=2\";\n\n    KEYS(clipboardBrowserId << \"F6\");\n    TEST( m_test->setClipboard(commands) );\n    KEYS(commandDialogListId << keyNameFor(QKeySequence::Paste));\n\n    TEST( m_test->setClipboard(QByteArray()) );\n    KEYS(commandDialogListId << keyNameFor(QKeySequence::Copy));\n    WAIT_FOR_CLIPBOARD(commands);\n\n    KEYS(commandDialogListId << \"Enter\" << clipboardBrowserId);\n    RUN(\"commands().length\", \"2\\n\");\n}\n\nvoid Tests::toggleClipboardMonitoring()\n{\n    const QByteArray data1 = generateData();\n    TEST( m_test->setClipboard(data1) );\n    RUN(\"clipboard\", data1);\n    WAIT_ON_OUTPUT(\"read\" << \"0\", data1);\n\n    RUN(\"disable\", \"\");\n    RUN(\"monitoring\", \"false\\n\");\n    WAIT_ON_OUTPUT(\"isClipboardMonitorRunning\", \"false\\n\");\n\n    const QByteArray data2 = generateData();\n    TEST( m_test->setClipboard(data2) );\n    RUN(\"clipboard\", data2);\n    WAIT_ON_OUTPUT(\"read\" << \"0\", data1);\n\n    RUN(\"enable\", \"\");\n    RUN(\"monitoring\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"isClipboardMonitorRunning\", \"true\\n\");\n\n    const QByteArray data3 = generateData();\n    TEST( m_test->setClipboard(data3) );\n    RUN(\"clipboard\", data3);\n    WAIT_ON_OUTPUT(\"read\" << \"0\", data3);\n}\n\nvoid Tests::clipboardToItem()\n{\n    TEST( m_test->setClipboard(\"TEXT1\") );\n    RUN(\"clipboard\", \"TEXT1\");\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"TEXT1\");\n    RUN(\"read\" << \"?\" << \"0\", \"text/plain\\n\");\n\n    TEST( m_test->setClipboard(\"DATA1\", \"DATA\") );\n    WAIT_ON_OUTPUT(\"clipboard\" << \"DATA\", \"DATA1\");\n\n    // Unicode test.\n    const auto test = QString::fromUtf8(QByteArray(\"Zkouška s různými českými znaky!\"));\n    const auto bytes = test.toUtf8();\n    TEST( m_test->setClipboard(bytes) );\n    RUN(\"clipboard\", bytes);\n    WAIT_ON_OUTPUT(\"read\" << \"0\", bytes);\n}\n\nvoid Tests::itemToClipboard()\n{\n    RUN(\"add\" << \"TESTING2\" << \"TESTING1\", \"\");\n    RUN(\"read\" << \"0\" << \"1\", \"TESTING1\\nTESTING2\");\n\n    RUN(\"select\" << \"0\", \"\");\n\n    WAIT_FOR_CLIPBOARD(\"TESTING1\");\n    RUN(\"clipboard\", \"TESTING1\");\n\n    // select second item and move to top\n    RUN(\"config\" << \"move\" << \"true\", \"true\\n\");\n    RUN(\"select\" << \"1\", \"\");\n    RUN(\"read\" << \"0\" << \"1\", \"TESTING2\\nTESTING1\");\n\n    WAIT_FOR_CLIPBOARD(\"TESTING2\");\n    RUN(\"clipboard\", \"TESTING2\");\n\n    // select without moving\n    RUN(\"config\" << \"move\" << \"0\", \"false\\n\");\n    RUN(\"select\" << \"1\", \"\");\n    RUN(\"read\" << \"0\" << \"1\", \"TESTING2\\nTESTING1\");\n\n    WAIT_FOR_CLIPBOARD(\"TESTING1\");\n    RUN(\"clipboard\", \"TESTING1\");\n}\n\nvoid Tests::tabAdd()\n{\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n\n    QVERIFY( !hasTab(tab) );\n    RUN(args, \"\");\n    RUN(args << \"size\", \"0\\n\");\n    RUN(args << \"add\" << \"ghi\" << \"def\" << \"abc\", \"\");\n    QVERIFY( hasTab(tab) );\n\n    // Restart server.\n    TEST( m_test->stopServer() );\n    TEST( m_test->startServer() );\n\n    QVERIFY( hasTab(tab) );\n\n    RUN(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"abc def ghi\");\n}\n\nvoid Tests::tabRemove()\n{\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n\n    RUN(args << \"add\" << \"\", \"\");\n    QVERIFY( hasTab(tab) );\n    RUN(Args() << \"removetab\" << tab, \"\");\n    QVERIFY( !hasTab(tab) );\n\n    RUN_EXPECT_ERROR(\"removetab\" << tab, CommandException);\n}\n\nvoid Tests::tabIcon()\n{\n    const QString tab0 = testTab(1);\n    const QString tab = testTab(2);\n    const QString icon = \":/images/icon\";\n\n    RUN(\"tab\" << tab << \"add\" << \"\", \"\");\n    RUN(\"tabIcon\" << tab, \"\\n\");\n    RUN(\"tabicon\" << tab0, \"\\n\");\n    RUN(\"tabicon\" << tab << icon, \"\");\n    RUN(\"tabIcon\" << tab, icon + \"\\n\");\n    RUN(\"tabicon\" << tab0, \"\\n\");\n    RUN(\"tabIcon\" << tab << \"\", \"\");\n    RUN(\"tabicon\" << tab, \"\\n\");\n}\n\nvoid Tests::action()\n{\n    const Args args = Args(\"tab\") << testTab(1);\n    const Args argsAction = Args(args) << \"action\";\n    const QString action = QString::fromLatin1(\"copyq %1 %2\").arg(args.join(\" \"));\n\n    // action with size\n    RUN(argsAction << action.arg(\"size\") << \"\", \"\");\n    WAIT_ON_OUTPUT(args << \"size\", \"1\\n\");\n    RUN(args << \"read\" << \"0\", \"0\\n\");\n\n    // action with size\n    RUN(argsAction << action.arg(\"size\") << \"\", \"\");\n    WAIT_ON_OUTPUT(args << \"size\", \"2\\n\");\n    RUN(args << \"read\" << \"0\", \"1\\n\");\n\n    // action with eval print\n    RUN(argsAction << action.arg(\"eval 'print(\\\"A,B,C\\\")'\") << \"\", \"\");\n    WAIT_ON_OUTPUT(args << \"size\", \"3\\n\");\n    RUN(args << \"read\" << \"0\", \"A,B,C\");\n\n    // action with read and comma separator for new items\n    RUN(argsAction << action.arg(\"read 0\") << \",\", \"\");\n    WAIT_ON_OUTPUT(args << \"size\", \"6\\n\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"C\\nB\\nA\");\n}\n\nvoid Tests::renameTab()\n{\n    const QString tab1 = testTab(1);\n    const QString tab2 = testTab(2);\n\n    RUN(\"tab\" << tab1 << \"add\" << \"ghi\" << \"def\" << \"abc\", \"\");\n\n    RUN(\"renametab\" << tab1 << tab2, \"\");\n    RUN(\"tab\" << tab2 << \"size\", \"3\\n\");\n    RUN(\"tab\" << tab2 << \"read\" << \"0\" << \"1\" << \"2\", \"abc\\ndef\\nghi\");\n    QVERIFY( !hasTab(tab1) );\n\n    // Rename non-existing tab.\n    RUN_EXPECT_ERROR(\"renametab\" << tab1 << tab2, CommandException);\n\n    // Rename to same name.\n    RUN_EXPECT_ERROR(\"renametab\" << tab2 << tab2, CommandException);\n\n    // Rename to empty name.\n    RUN_EXPECT_ERROR(\"renametab\" << tab2 << \"\", CommandException);\n\n    // Rename to existing tab.\n    RUN_EXPECT_ERROR(\"renametab\" << tab2 << clipboardTabName, CommandException);\n\n    QVERIFY( !hasTab(tab1) );\n    QVERIFY( hasTab(tab2) );\n\n    RUN(\"renametab\" << tab2 << tab1, \"\");\n    RUN(\"tab\" << tab1 << \"read\" << \"0\" << \"1\" << \"2\", \"abc\\ndef\\nghi\");\n\n    QVERIFY( hasTab(tab1) );\n    QVERIFY( !hasTab(tab2) );\n}\n\nvoid Tests::renameClipboardTab()\n{\n    const QString newClipboardTabName = clipboardTabName + QStringLiteral(\"2\");\n    RUN(\"config\" << \"tray_tab\" << clipboardTabName, clipboardTabName + QStringLiteral(\"\\n\"));\n    const QString icon = \":/images/icon\";\n    RUN(\"tabicon\" << clipboardTabName << icon, \"\");\n\n    RUN(\"renametab\" << clipboardTabName << newClipboardTabName, \"\");\n    RUN(\"tab\", newClipboardTabName + \"\\n\");\n    RUN(\"config\" << \"clipboard_tab\", newClipboardTabName + QStringLiteral(\"\\n\"));\n    RUN(\"config\" << \"tray_tab\", newClipboardTabName + QStringLiteral(\"\\n\"));\n    RUN(\"tabicon\" << newClipboardTabName, icon + QStringLiteral(\"\\n\"));\n\n    TEST( m_test->setClipboard(\"test1\") );\n    WAIT_ON_OUTPUT(\"tab\" << newClipboardTabName << \"read\" << \"0\", \"test1\");\n    RUN(\"tab\", newClipboardTabName + \"\\n\");\n\n    WAIT_ON_OUTPUT(\"read\" << \"0\", \"test1\");\n    RUN(\"tab\", newClipboardTabName + \"\\n\");\n}\n\nvoid Tests::importExportTab()\n{\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab << \"separator\" << \" \";\n\n    RUN(args << \"add\" << \"ghi\" << \"def\" << \"abc\", \"\");\n\n    TemporaryFile tmp;\n    RUN(args << \"exporttab\" << tmp.fileName(), \"\");\n\n    RUN(\"removetab\" << tab, \"\");\n    QVERIFY( !hasTab(tab) );\n\n    RUN(args << \"importtab\" << tmp.fileName(), \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\", \"abc def ghi\");\n    RUN(args << \"size\", \"3\\n\");\n\n    // Export with relative path.\n    TemporaryFile tmp2;\n\n    // Change back to original working directory once finished.\n    struct CurrentDirectoryGuard {\n        CurrentDirectoryGuard() : oldDir(QDir::currentPath()) {}\n        ~CurrentDirectoryGuard() { QDir::setCurrent(oldDir); }\n        const QString oldDir;\n    } currentDirectoryGuard;\n\n    QDir::setCurrent( QDir::cleanPath(tmp2.fileName() + \"/..\") );\n\n    const QString fileName = QFileInfo( tmp2.fileName() ).fileName();\n\n    RUN(args << \"add\" << \"012\", \"\");\n    RUN(args << \"exporttab\" << fileName, \"\");\n\n    RUN(\"removetab\" << tab, \"\");\n    QVERIFY( !hasTab(tab) );\n\n    RUN(args << \"importtab\" << fileName, \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\", \"012 abc def ghi\");\n}\n\nvoid Tests::removeAllFoundItems()\n{\n    auto args = Args(\"add\");\n    for (int i = 0; i < 50; ++i) {\n        args << QString::fromLatin1(\"a%1\").arg(i);\n        args << QString::fromLatin1(\"b%1\").arg(i);\n    }\n\n    RUN(args, \"\");\n    RUN(\"size\", \"100\\n\");\n\n    RUN(\"filter\" << \"a\", \"\");\n    KEYS(\"CTRL+A\" << m_test->shortcutToRemove());\n\n    RUN(\"size\", \"50\\n\");\n    RUN(\"read\" << \"49\" << \"48\" << \"47\", \"b0\\nb1\\nb2\");\n    RUN(\"read\" << \"0\" << \"1\" << \"2\", \"b49\\nb48\\nb47\");\n}\n\nvoid Tests::nextPrevious()\n{\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab;\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"setCurrentTab\" << tab, \"\");\n\n    RUN(args << \"next\", \"\");\n    WAIT_FOR_CLIPBOARD(\"B\");\n\n    RUN(args << \"next\", \"\");\n    WAIT_FOR_CLIPBOARD(\"C\");\n\n    RUN(args << \"next\", \"\");\n    WAIT_FOR_CLIPBOARD(\"C\");\n\n    RUN(args << \"previous\", \"\");\n    WAIT_FOR_CLIPBOARD(\"B\");\n\n    RUN(args << \"previous\", \"\");\n    WAIT_FOR_CLIPBOARD(\"A\");\n\n    RUN(args << \"previous\", \"\");\n    WAIT_FOR_CLIPBOARD(\"A\");\n}\n\nvoid Tests::externalEditor()\n{\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab;\n    const QString editorTab = testTab(2);\n    const Args editorArgs = Args(\"tab\") << editorTab;\n    const Args editorFileNameArgs = Args(editorArgs) << \"read\" << \"0\";\n    const Args editorEndArgs = Args(editorArgs) << \"remove\" << \"0\";\n\n    // Set editor command which add file name to edit to special editor tab.\n    // The command finishes when the special tab is emptied by this test.\n    // File to edit is removed by application when the command finished.\n    const auto cmd = QString(\n        R\"(copyq tab \"%1\" eval \"add(arguments[1]); while(length()) sleep(100);\" --)\"\n    ).arg(editorTab) + \" %1\";\n    RUN(\"config\" << \"editor\" << cmd, cmd + \"\\n\");\n\n    // Set clipboard.\n    const QByteArray data1 = generateData();\n    TEST( m_test->setClipboard(data1) );\n    RUN(\"clipboard\", data1);\n\n#define EDIT(DATA1, DATA2) \\\n    do { \\\n        WAIT_ON_OUTPUT(editorArgs << \"size\", \"1\\n\"); \\\n        QByteArray out; \\\n        QByteArray err; \\\n        run(editorFileNameArgs, &out, &err); \\\n        QVERIFY2( testStderr(err), err ); \\\n        QFile file(out); \\\n        QVERIFY( file.exists() ); \\\n        QVERIFY( file.open(QIODevice::ReadWrite) ); \\\n        QVERIFY( file.readAll() == (DATA1) ); \\\n        file.write(DATA2); \\\n        file.close(); \\\n        RUN(editorEndArgs, \"\"); \\\n        waitWhileFileExists(file); \\\n    } while(false)\n\n    // Edit clipboard.\n    RUN(\"edit\" << \"-1\", \"\");\n    const QByteArray data2 = generateData();\n    EDIT(data1, data2);\n\n    // Check if clipboard changed.\n    WAIT_ON_OUTPUT(\"read\" << \"0\", data1 + data2);\n    WAIT_FOR_CLIPBOARD(data1 + data2);\n\n    // Edit existing item.\n    const QString text =\n            \"Some text to edit,\\n\"\n            \"with second line!\\n\"\n            + generateData();\n    RUN(args << \"add\" << text, \"\");\n\n    // Modify first item.\n    RUN(args << \"edit\" << \"0\", \"\");\n    const QByteArray data3 = generateData();\n    EDIT(text.toUtf8(), data3);\n\n    // Check first item.\n    WAIT_ON_OUTPUT(args << \"read\" << \"0\", text.toUtf8() + data3);\n\n    // Edit new item.\n    RUN(args << \"edit\", \"\");\n    const QByteArray data4 = generateData();\n    EDIT(QByteArray(), data4);\n\n    // Check first item.\n    WAIT_ON_OUTPUT(args << \"read\" << \"0\", data4);\n\n#undef EDIT\n}\n\nvoid Tests::nextPreviousTab()\n{\n    const auto tab1 = testTab(1);\n    const auto tab2 = testTab(2);\n    const auto setTabsCommand =\n        QStringLiteral(\"config('tabs', ['%1','%2'])\").arg(tab1, tab2);\n    RUN(setTabsCommand, tab1 + \"\\n\" + tab2 + \"\\n\");\n\n    using KeyPair = QPair<QString, QString>;\n    const QList<KeyPair> keyPairs = QList<KeyPair>()\n            << KeyPair(keyNameFor(QKeySequence::NextChild), keyNameFor(QKeySequence::PreviousChild))\n            << KeyPair(\"RIGHT\", \"LEFT\");\n\n    for (const auto &keyPair : keyPairs) {\n        for (const auto &optionValue : {\"false\", \"true\"}) {\n            RUN(\"config\" << \"tab_tree\" << optionValue, QString(optionValue) + \"\\n\");\n\n            KEYS(keyPair.first);\n            TEST_SELECTED(tab1 + \"\\n\");\n            KEYS(keyPair.first);\n            TEST_SELECTED(tab2 + \"\\n\");\n            KEYS(keyPair.first);\n\n            KEYS(keyPair.second);\n            TEST_SELECTED(tab2 + \"\\n\");\n            KEYS(keyPair.second);\n            TEST_SELECTED(tab1 + \"\\n\");\n            KEYS(keyPair.second);\n        }\n    }\n}\n\nvoid Tests::itemPreview()\n{\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add\" << \"def\" << \"abc\", \"\");\n    RUN(\"setCurrentTab\" << tab1, \"\");\n\n    RUN(\"preview\", \"false\\n\");\n    KEYS(clipboardBrowserId << \"F7\");\n    RUN(\"preview\", \"true\\n\");\n\n    KEYS(clipboardBrowserId << \"TAB\" << itemPreviewId);\n    KEYS(itemPreviewId << \"HOME\");\n    KEYS(itemPreviewId << \"RIGHT\");\n    KEYS(itemPreviewId << \"SHIFT+RIGHT\");\n    KEYS(itemPreviewId << keyNameFor(QKeySequence::Copy));\n    WAIT_FOR_CLIPBOARD(\"b\");\n\n    KEYS(itemPreviewId << \"F7\" << clipboardBrowserId);\n\n    RUN(\"preview\" << \"true\", \"false\\n\");\n    RUN(\"preview\" << \"false\", \"true\\n\");\n    RUN(\"preview\" << \"1\", \"false\\n\");\n    RUN(\"preview\" << \"0\", \"true\\n\");\n    RUN(\"preview(true)\", \"false\\n\");\n    RUN(\"preview(false)\", \"true\\n\");\n    RUN(\"preview\", \"false\\n\");\n}\n\nvoid Tests::openAndSavePreferences()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Can't focus configuration checkboxes on OS X\");\n#endif\n\n    RUN(\"config\" << \"check_clipboard\" << \"false\", \"false\\n\");\n\n    // Open preferences dialog.\n    KEYS(\"Ctrl+P\" << configurationDialogId);\n\n    // Focus and set wrap text option.\n    // This behavior could differ on some systems and in other languages.\n    KEYS(configurationDialogId << \"ALT+1\");\n    KEYS(configurationDialogId << \"ENTER\" << clipboardBrowserId);\n    WAIT_ON_OUTPUT(\"config\" << \"check_clipboard\", \"true\\n\");\n}\n\nvoid Tests::pasteFromMainWindow()\n{\n    RUN(\"config\"\n        << \"activate_closes\" << \"true\"\n        << \"activate_focuses\" << \"true\"\n        << \"activate_pastes\" << \"true\"\n        ,\n        \"activate_closes=true\\n\"\n        \"activate_focuses=true\\n\"\n        \"activate_pastes=true\\n\"\n        );\n\n    RUN(\"add\" << \"TEST\", \"\");\n    RUN(\"hide\", \"\");\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('text')\", \"TEST\\n\"); },\n        [&]{\n            KEYS(\"focus::QLineEdit<.*:QDialog\");\n\n            QTest::qWait(250);\n            RUN(\"show\", \"\");\n            QTest::qWait(250);\n            KEYS(clipboardBrowserId << \"ENTER\");\n\n            WAIT_FOR_CLIPBOARD(\"TEST\");\n            KEYS(\"focus::QLineEdit'TEST'<.*:QDialog\" << \"ENTER\");\n        }\n    );\n}\n\nvoid Tests::pasteNext()\n{\n    const auto tab1 = testTab(1);\n    RUN(\"setCurrentTab\" << tab1, \"\");\n    KEYS(clipboardBrowserId << \"CTRL+N\" << editorId << \":NEW \");\n\n    const auto tab2 = testTab(2);\n    RUN(\"tab\" << tab2 << \"add\" << \"test3\" << \"test2\" << \"test1\", \"\");\n    RUN(\"tab\" << tab2 << \"next(); paste(); next()\", \"\");\n    waitFor(250);\n    KEYS(editorId);\n    WAIT_FOR_CLIPBOARD(\"test3\");\n    KEYS(editorId << \"F2\");\n    RUN(\"tab\" << tab1 << \"read\" << \"0\", \"NEW test2\");\n}\n\nvoid Tests::configAutostart()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_NO_AUTOSTART\");\n    RUN(\"config\" << \"autostart\" << \"true\", \"true\\n\");\n    RUN(\"config\" << \"autostart\", \"true\\n\");\n    RUN(\"config\" << \"autostart\" << \"false\", \"false\\n\");\n    RUN(\"config\" << \"autostart\", \"false\\n\");\n}\n\nvoid Tests::envVariablePaths()\n{\n    {\n        const auto path = QDir::home().absoluteFilePath(\"copyq-settings\");\n        const auto environment = QStringList(\"COPYQ_SETTINGS_PATH=\" + path);\n\n        QByteArray out;\n        QByteArray err;\n        run(Args() << \"info\" << \"config\", &out, &err, QByteArray(), environment);\n        QVERIFY2( testStderr(err), err );\n\n        const auto expectedOut = path.toUtf8();\n        QCOMPARE( out.left(expectedOut.size()), expectedOut );\n    }\n\n    {\n        const auto path = QDir::home().absoluteFilePath(\"copyq-data\");\n        const auto environment = QStringList(\"COPYQ_ITEM_DATA_PATH=\" + path);\n\n        QByteArray out;\n        QByteArray err;\n        run(Args() << \"info\" << \"data\", &out, &err, QByteArray(), environment);\n        QVERIFY2( testStderr(err), err );\n\n        const auto expectedOut = path.toUtf8();\n        QCOMPARE( out.left(expectedOut.size()), expectedOut );\n    }\n}\n\nvoid Tests::configTabs()\n{\n    const QString sep = QStringLiteral(\"\\n\");\n    RUN(\"config\" << \"tabs\", clipboardTabName + sep);\n\n    const QString tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add\" << \"test\", \"\");\n    RUN(\"config\" << \"tabs\", clipboardTabName + sep + tab1 + sep);\n\n    const QString tab2 = testTab(2);\n    RUN(QString(\"config('tabs', ['%1', '%2'])\").arg(clipboardTabName, tab2), clipboardTabName + sep + tab2 + sep);\n    RUN(\"config\" << \"tabs\", clipboardTabName + sep + tab2 + sep + tab1 + sep);\n    RUN(\"tab\", clipboardTabName + sep + tab2 + sep + tab1 + sep);\n\n    RUN(QString(\"config('tabs', ['%1', '%2'])\").arg(tab1, tab2), tab1 + sep + tab2 + sep);\n    RUN(\"config\" << \"tabs\", tab1 + sep + tab2 + sep + clipboardTabName + sep);\n    RUN(\"tab\", tab1 + sep + tab2 + sep + clipboardTabName + sep);\n}\n\nvoid Tests::selectedItems()\n{\n    const auto tab1 = testTab(1);\n    const Args args = Args(\"tab\") << tab1;\n\n    RUN(\"selectedTab\", \"CLIPBOARD\\n\");\n    RUN(\"selectedItems\", \"\");\n\n    RUN(args << \"add\" << \"D\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(args << \"setCurrentTab\" << tab1 << \"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    RUN(\"selectedTab\", tab1 + \"\\n\");\n    RUN(args << \"selectedItems\", \"1\\n2\\n\");\n    RUN(args << \"currentItem\", \"2\\n\");\n\n    const auto print = R\"(\n        tab(selectedTab());\n        print([selectedTab(), \"c:\" + currentItem(), \"s:\" + selectedItems()]);\n        print(\"\\\\n\")\n    )\";\n\n    // Selection stays consistent when moving items\n    RUN(print << \"move(0)\" << print, tab1 + \",c:2,s:1,2\\n\" + tab1 + \",c:1,s:0,1\\n\");\n    RUN(print, tab1 + \",c:1,s:0,1\\n\");\n\n    RUN(print << \"plugins.itemtests.keys('HOME', 'CTRL+DOWN')\" << print, tab1 + \",c:1,s:0,1\\n\" + tab1 + \",c:0,s:1,0\\n\");\n    RUN(print, tab1 + \",c:1,s:1\\n\");\n\n    // Selection stays consistent when removing items\n    RUN(args << \"setCurrentTab\" << tab1 << \"selectItems\" << \"1\" << \"2\" << \"3\", \"true\\n\");\n    RUN(print << \"remove(2)\" << print, tab1 + \",c:3,s:1,2,3\\n\" + tab1 + \",c:2,s:1,-1,2\\n\");\n    RUN(print, tab1 + \",c:2,s:1,2\\n\");\n\n    // Renaming tab invalidates selection and all items because the tab\n    // underlying data needs to be loaded again using plugins.\n    const QString tab2 = testTab(2);\n    const auto rename = QString(\"renameTab('%1', '%2')\").arg(tab1, tab2);\n    RUN(print << rename << print, tab1 + \",c:2,s:1,2\\n\" + tab1 + \",c:-1,s:\\n\");\n\n    RUN(print, tab2 + \",c:0,s:0\\n\");\n}\n\nvoid Tests::synchronizeInternalCommands()\n{\n    // Keep internal commands synced with the latest version\n    // but allow user to change some attributes.\n    const auto script = R\"(\n        setCommands([\n            {\n                internalId: 'copyq_global_toggle',\n                enable: false,\n                icon: 'icon.png',\n                shortcuts: ['Ctrl+F1'],\n                globalShortcuts: ['Ctrl+F2'],\n                name: 'Old name',\n                cmd: 'Old command',\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    RUN(\"commands()[0].internalId\", \"copyq_global_toggle\\n\");\n    RUN(\"commands()[0].enable\", \"false\\n\");\n    RUN(\"commands()[0].icon\", \"icon.png\\n\");\n    RUN(\"commands()[0].shortcuts\", \"Ctrl+F1\\n\");\n    RUN(\"commands()[0].globalShortcuts\", \"Ctrl+F2\\n\");\n    RUN(\"commands()[0].name\", \"Show/hide main window\\n\");\n    RUN(\"commands()[0].cmd\", \"copyq: toggle()\\n\");\n}\n\nvoid Tests::utilityCommands()\n{\n    // queryKeyboardModifiers\n    RUN(\"queryKeyboardModifiers()\", \"\");\n\n    // pointerPosition\n    QCursor::setPos(1, 2);\n    RUN(\"pointerPosition\", \"1\\n2\\n\");\n    QCursor::setPos(2, 3);\n    RUN(\"pointerPosition\", \"2\\n3\\n\");\n\n    // setPointerPosition\n    RUN(\"setPointerPosition(1,2)\", \"\");\n    QCOMPARE(QPoint(1, 2), QCursor::pos());\n    RUN(\"setPointerPosition(2,3)\", \"\");\n    QCOMPARE(QPoint(2, 3), QCursor::pos());\n}\n\nvoid Tests::setTabName()\n{\n    const auto script = R\"(\n        tab('1')\n        add(1)\n        tab1Size = size()\n\n        tab('2')\n        tab2Size = size()\n\n        print(tab1Size + ',' + tab2Size)\n        )\";\n    RUN(script, \"1,0\");\n}\n\nvoid Tests::abortInputReader()\n{\n    QProcess p;\n    p.start(\n        m_test->executable(),\n        {\"afterMilliseconds(250, abort); input(); print('DONE'); 'DONE'\"}\n    );\n    QVERIFY2( p.waitForStarted(10000), \"Process failed to start\" );\n    QVERIFY2( p.waitForFinished(5000), \"Process failed to finish\" );\n    QCOMPARE( p.readAllStandardOutput(), \"\" );\n}\n\nvoid Tests::changeAlwaysOnTop()\n{\n    // The window should be still visible and focused after changing always-on-top flag.\n    RUN(\"visible\", \"true\\n\");\n    RUN(\"focused\", \"true\\n\");\n    RUN(\"config\" << \"always_on_top\", \"false\\n\");\n\n    RUN(\"config\" << \"always_on_top\" << \"true\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n    // There is a problem activating the window again after\n    // changing the always-on-top flag on macOS with Qt 6.\n#if !defined(Q_OS_MAC) || QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    WAIT_ON_OUTPUT(\"focused\", \"true\\n\");\n#endif\n\n    RUN(\"config\" << \"always_on_top\" << \"false\", \"false\\n\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n#if !defined(Q_OS_MAC) || QT_VERSION < QT_VERSION_CHECK(6,0,0)\n    WAIT_ON_OUTPUT(\"focused\", \"true\\n\");\n#endif\n\n    RUN(\"hide\", \"\");\n    RUN(\"visible\", \"false\\n\");\n    RUN(\"focused\", \"false\\n\");\n\n    RUN(\"config\" << \"always_on_top\" << \"true\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"visible\", \"false\\n\");\n    WAIT_ON_OUTPUT(\"focused\", \"false\\n\");\n\n    RUN(\"config\" << \"always_on_top\" << \"false\", \"false\\n\");\n    WAIT_ON_OUTPUT(\"visible\", \"false\\n\");\n    WAIT_ON_OUTPUT(\"focused\", \"false\\n\");\n}\n\nvoid Tests::networkTests()\n{\n    // networkHeaders (no network needed)\n    RUN(\"print(NetworkRequest().headers['User-Agent'])\", copyqUserAgent());\n    RUN(\"r = NetworkRequest(); r.headers['X'] = 'Y'; r.headers['X']\", \"Y\\n\");\n\n    // networkGetPostAsync (no network needed)\n    RUN(\"r = networkGetAsync('copyq-test://example.com'); print([r.finished,r.error,r.finished])\",\n        \"false,Protocol \\\"copyq-test\\\" is unknown,true\");\n    RUN(\"r = networkPostAsync('copyq-test://example.com'); print([r.finished,r.error,r.finished])\",\n        \"false,Protocol \\\"copyq-test\\\" is unknown,true\");\n\n    if (qgetenv(\"COPYQ_TESTS_NO_NETWORK\") == \"1\")\n        return;\n\n    // networkGet\n    RUN(\"r = networkGet('https://httpcan.org'); r.status\", \"200\\n\");\n\n    // networkPost\n    {\n        const auto script = R\"(\n            r = NetworkRequest();\n            r.headers['Content-Type'] = 'text/plain';\n            s = r.request('POST', 'https://httpcan.org/post?hello=1', 'Hello');\n            json = s.data;\n            try {\n                data = JSON.parse(str(json));\n                userAgent = data.headers['user-agent'].replace(/\\\\/.*/, '/xyz');\n                [data.data, JSON.stringify(data.args), userAgent, s.status];\n            } catch (e) {\n                [`Error parsing JSON response: ${e}\\n`, json, s.status];\n            }\n        )\";\n        RUN(script, \"Hello\\n{\\\"hello\\\":\\\"1\\\"}\\nCopyQ/xyz\\n200\\n\");\n    }\n\n    // networkRedirects\n    RUN(\"r = networkGet('https://httpcan.org/redirect-to?url=https://httpcan.org'); r.status\", \"302\\n\");\n    {\n        const auto script = R\"(\n            r = NetworkRequest();\n            r.maxRedirects = 1;\n            s = r.request('GET', 'https://httpcan.org');\n            [s.status, s.url]\n        )\";\n        RUN(script, \"200\\nhttps://httpcan.org\\n\");\n    }\n}\n\nvoid Tests::pluginNotInstalled()\n{\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"plugins.bad_plugin\", CommandException,\n        \"Plugin \\\"bad_plugin\\\" is not installed\"\n    );\n}\n\nvoid Tests::startServerAndRunCommand()\n{\n    RUN(\"--start-server\" << \"tab\" << testTab(1) << \"write('TEST');read(0)\", \"TEST\");\n\n    TEST( m_test->stopServer() );\n\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n\n    QCOMPARE( run(Args(\"--start-server\") << \"tab\" << testTab(1) << \"read\" << \"0\", &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QCOMPARE(stdoutActual, \"TEST\");\n\n    QCOMPARE( run(Args() << \"tab\" << testTab(1) << \"read\" << \"0\", &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QCOMPARE(stdoutActual, \"TEST\");\n\n    // The sleep() call ensures that the server finishes and terminates the\n    // client connection.\n    QCOMPARE( run(Args(\"--start-server\") << \"exit();sleep(10000)\", &stdoutActual, &stderrActual), 0 );\n    QCOMPARE(stdoutActual, \"\");\n    QVERIFY2( stderrActual.contains(\"Terminating server.\\n\"), stderrActual );\n\n    // Try to start new client.\n    SleepTimer t(10000);\n    while ( run(Args(\"exit();sleep(10000)\")) == 0 && t.sleep() ) {}\n}\n\nvoid Tests::avoidStoringPasswords()\n{\n    TEST( m_test->setClipboard(secretData(\"secret\")) );\n    WAIT_ON_OUTPUT(\"clipboard\", \"secret\");\n    RUN(\"read\" << \"0\" << \"1\" << \"2\", \"\\n\\n\");\n    RUN(\"count\", \"0\\n\");\n\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Paste));\n    WAIT_ON_OUTPUT(\"count\", \"1\\n\");\n    RUN(\"read\" << \"0\" << \"1\" << \"2\", \"secret\\n\\n\");\n}\n\nvoid Tests::scriptsForPasswords()\n{\n    const auto script = R\"(\n        setCommands([{\n            isScript: true,\n            cmd: `global.onSecretClipboardChanged = function() {\n                add(\"SECRET\");\n            }`\n        }])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n    TEST( m_test->setClipboard(secretData(\"secret\")) );\n    WAIT_ON_OUTPUT(\"read\" << \"0\" << \"1\" << \"2\", \"SECRET\\n\\n\");\n    RUN(\"count\", \"1\\n\");\n}\n\nvoid Tests::currentClipboardOwner()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'global.currentClipboardOwner = function() { return settings(\"clipboard_owner\"); }'\n            },\n            {\n                automatic: true,\n                input: mimeWindowTitle,\n                cmd: 'copyq: setData(\"application/x-copyq-owner-test\", input())',\n            },\n            {\n                automatic: true,\n                wndre: '.*IGNORE',\n                cmd: 'copyq ignore; copyq add IGNORED',\n            },\n        ])\n        )\";\n    RUN(\"settings\" << \"clipboard_owner\" << \"TEST1\", \"\");\n    RUN(script, \"\");\n\n    TEST( m_test->setClipboard(\"test1\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"test1\");\n    RUN(\"read('application/x-copyq-owner-test', 0)\", \"TEST1\");\n\n    RUN(\"settings\" << \"clipboard_owner\" << \"TEST2\", \"\");\n    RUN(\"config\" << \"update_clipboard_owner_delay_ms\" << \"10000\", \"10000\\n\");\n    TEST( m_test->setClipboard(\"test2\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"test2\");\n    RUN(\"read('application/x-copyq-owner-test', 0)\", \"TEST2\");\n\n    RUN(\"settings\" << \"clipboard_owner\" << \"TEST3\", \"\");\n    TEST( m_test->setClipboard(\"test3\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"test3\");\n    RUN(\"read('application/x-copyq-owner-test', 0)\", \"TEST2\");\n\n    RUN(\"settings\" << \"clipboard_owner\" << \"TEST4_IGNORE\", \"\");\n    RUN(\"config\" << \"update_clipboard_owner_delay_ms\" << \"0\", \"0\\n\");\n    TEST( m_test->setClipboard(\"test4\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"IGNORED\");\n\n    RUN(\"settings\" << \"clipboard_owner\" << \"TEST5\", \"\");\n    TEST( m_test->setClipboard(\"test5\") );\n    WAIT_ON_OUTPUT(\"read(0)\", \"test5\");\n    RUN(\"read('application/x-copyq-owner-test', 0)\", \"TEST5\");\n}\n\nvoid Tests::saveLargeItem()\n{\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab;\n\n    const auto script = R\"(\n        write(0, [{\n            'text/plain': '1234567890'.repeat(10000),\n            'application/x-copyq-test-data': 'abcdefghijklmnopqrstuvwxyz'.repeat(10000),\n        }])\n        )\";\n    RUN(args << script, \"\");\n\n    for (int i = 0; i < 2; ++i) {\n        RUN(args << \"read(0).left(20)\", \"12345678901234567890\");\n        RUN(args << \"read(0).length\", \"100000\\n\");\n        RUN(args << \"getItem(0)[mimeText].length\", \"100000\\n\");\n        RUN(args << \"getItem(0)[mimeText].left(20)\", \"12345678901234567890\");\n        RUN(args << \"getItem(0)['application/x-copyq-test-data'].left(26)\", \"abcdefghijklmnopqrstuvwxyz\");\n        RUN(args << \"getItem(0)['application/x-copyq-test-data'].length\", \"260000\\n\");\n        RUN(args << \"ItemSelection().selectAll().itemAtIndex(0)[mimeText].length\", \"100000\\n\");\n        RUN(\"unload\" << tab, tab + \"\\n\");\n    }\n\n    RUN(\"show\" << tab, \"\");\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Copy));\n    WAIT_ON_OUTPUT(\"clipboard().left(20)\", \"12345678901234567890\");\n    RUN(\"clipboard('application/x-copyq-test-data').left(26)\", \"abcdefghijklmnopqrstuvwxyz\");\n    RUN(\"clipboard('application/x-copyq-test-data').length\", \"260000\\n\");\n\n    const auto tab2 = testTab(2);\n    const auto args2 = Args(\"tab\") << tab2;\n    RUN(\"show\" << tab2, \"\");\n    waitFor(250);\n    KEYS(clipboardBrowserId << keyNameFor(QKeySequence::Paste));\n    RUN(args2 << \"read(0).left(20)\", \"12345678901234567890\");\n    RUN(args2 << \"read(0).length\", \"100000\\n\");\n    RUN(args << \"getItem(0)['application/x-copyq-test-data'].left(26)\", \"abcdefghijklmnopqrstuvwxyz\");\n    RUN(args << \"getItem(0)['application/x-copyq-test-data'].length\", \"260000\\n\");\n}\n\nvoid Tests::clipboardUriList()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'global.clipboardFormatsToSave = function() { return [mimeUriList] }'\n            },\n        ])\n        )\";\n\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"commands().length\", \"1\\n\");\n\n    const QByteArray uri = \"https://test1.example.com\";\n    TEST( m_test->setClipboard(uri, mimeUriList) );\n    WAIT_ON_OUTPUT(\"clipboard(mimeUriList)\", uri);\n}\n\nvoid Tests::singleClipboardProvider()\n{\n    // Start multiple provider processes. The server should stop all but\n    // the last one that registers.\n    std::array<QProcess, 3> providers;\n    const QStringList args{\"--clipboard-access\", \"provideClipboard\"};\n    for (auto &p : providers)\n        QVERIFY2(m_test->startClient(&p, args), \"Failed to start provider\");\n\n    // Wait until all but one have exited.\n    const auto isRunning = [](const QProcess &p) {\n        return p.state() != QProcess::NotRunning;\n    };\n    QVERIFY(QTest::qWaitFor(\n        [&]() { return 1 == std::count_if(std::begin(providers), std::end(providers), isRunning); },\n        10000));\n\n    // Take clipboard ownership so the surviving provider detects the\n    // change and exits on its own (tests the self-termination path).\n    RUN(\"copy\" << \"TEST\", \"true\\n\");\n    for (auto &p : providers) {\n        if (p.state() != QProcess::NotRunning) {\n            QVERIFY2(p.waitForFinished(10000),\n                \"Provider did not exit after clipboard ownership change\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/tests/tests_playsound.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/commandstatus.h\"\n\n#include <QDataStream>\n#include <QTemporaryFile>\n\nnamespace {\n\n/// Build a minimal valid WAV file containing silence.\n/// PCM 8-bit mono at 100 Hz; \\a durationMs in milliseconds.\n/// Produces a tiny file (~100 bytes/s) for testing playback paths.\nQByteArray makeSilentWav(int durationMs)\n{\n    const int sampleRate = 100;\n    const int bitsPerSample = 8;\n    const int numChannels = 1;\n    const int bytesPerSample = bitsPerSample / 8;\n    const int numSamples = sampleRate * durationMs / 1000;\n    const int dataSize = numSamples * numChannels * bytesPerSample;\n\n    QByteArray wav;\n    QDataStream s(&wav, QIODevice::WriteOnly);\n    s.setByteOrder(QDataStream::LittleEndian);\n\n    // RIFF header\n    s.writeRawData(\"RIFF\", 4);\n    s << quint32(36 + dataSize); // file size - 8\n    s.writeRawData(\"WAVE\", 4);\n\n    // fmt sub-chunk\n    s.writeRawData(\"fmt \", 4);\n    s << quint32(16);            // sub-chunk size (PCM)\n    s << quint16(1);             // audio format (PCM)\n    s << quint16(numChannels);\n    s << quint32(sampleRate);\n    s << quint32(sampleRate * numChannels * bytesPerSample); // byte rate\n    s << quint16(numChannels * bytesPerSample);              // block align\n    s << quint16(bitsPerSample);\n\n    // data sub-chunk — 8-bit PCM silence is 0x80 (midpoint), not 0x00\n    s.writeRawData(\"data\", 4);\n    s << quint32(dataSize);\n    wav.append(QByteArray(dataSize, '\\x80'));\n\n    return wav;\n}\n\n/// Write a silent WAV to a QTemporaryFile; returns false on I/O error.\nbool writeSilentWav(QTemporaryFile &tmp, int durationMs)\n{\n    if (!tmp.open())\n        return false;\n    const QByteArray wav = makeSilentWav(durationMs);\n    if (tmp.write(wav) != wav.size())\n        return false;\n    if (!tmp.flush())\n        return false;\n    tmp.close();\n    return true;\n}\n\n} // namespace\n\nvoid Tests::commandPlaySound()\n{\n    // Object argument with missing file property\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"playSound({})\",\n        CommandException, \"ScriptError: playSound: object argument requires a 'file' string property\");\n\n    // Object argument with non-string file property\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"playSound({file: 123})\",\n        CommandException, \"ScriptError: playSound: object argument requires a 'file' string property\");\n\n    // Object argument with non-number volume\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"playSound({file: '/no/such/file.wav', volume: 'loud'})\",\n        CommandException, \"ScriptError: playSound: 'volume' must be a number\");\n\n#ifndef WITH_AUDIO\n    SKIP(\"Audio playback not compiled in (WITH_AUDIO is off)\");\n#endif\n\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_AUDIO\");\n\n    // Missing argument — empty path reaches the server which reports file-not-found\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"playSound\", CommandException, \"ScriptError: File not found:\");\n\n    // File does not exist (string argument)\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"playSound\" << \"/no/such/file.wav\", CommandException, \"ScriptError: File not found:\");\n\n    // Object argument with nonexistent file\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"playSound({file: '/no/such/file.wav', volume: 50})\",\n        CommandException, \"ScriptError: File not found:\");\n\n    // Existing file: playSound delegates to the server which starts\n    // playback asynchronously.\n    {\n        QTemporaryFile tmp;\n        QVERIFY(writeSilentWav(tmp, 500));\n\n        // String argument (default volume)\n        RUN(\"playSound\" << tmp.fileName(), \"\");\n\n        // Object argument with explicit volume\n        RUN(\"eval\" << QStringLiteral(\"playSound({file: '%1', volume: 50})\").arg(tmp.fileName()), \"\");\n\n        // Object argument without volume (default 100%)\n        RUN(\"eval\" << QStringLiteral(\"playSound({file: '%1'})\").arg(tmp.fileName()), \"\");\n    }\n}\n"
  },
  {
    "path": "src/tests/tests_script_commands.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n\n#include \"common/commandstatus.h\"\n#include \"common/mimetypes.h\"\n#include \"common/sleeptimer.h\"\n\n#include <QRegularExpression>\n\nvoid Tests::scriptCommandLoaded()\n{\n    const auto script = R\"(\n        setCommands([{\n            isScript: true,\n            cmd: 'add(\"LOADED\")'\n        }])\n        )\";\n    RUN(script, \"\");\n    RUN(\"read(0)\", \"LOADED\");\n}\n\nvoid Tests::scriptCommandAddFunction()\n{\n    const auto script = R\"(\n        setCommands([{\n            isScript: true,\n            cmd: 'global.test = function() { return \"TEST\"; }'\n        }])\n        )\";\n    RUN(script, \"\");\n    RUN(\"test\", \"TEST\\n\");\n}\n\nvoid Tests::scriptCommandOverrideFunction()\n{\n    const auto script = R\"(\n        setCommands([{\n            isScript: true,\n            cmd: 'popup = function(msg) { return msg; }'\n        }])\n        )\";\n    RUN(script, \"\");\n    RUN(\"popup\" << \"test\" << \"xxx\", \"test\");\n}\n\nvoid Tests::scriptCommandEnhanceFunction()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'var popup_ = popup; global.popup = function(msg) { popup_(msg); return msg + 1; }'\n            },\n            {\n                isScript: true,\n                cmd: 'var popup_ = popup; global.popup = function(msg) { return popup_(msg) + msg + 2; }'\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    RUN(\"popup\" << \"test\", \"test1test2\\n\");\n}\n\nvoid Tests::scriptCommandEndingWithComment()\n{\n    /*\n    With Qml scripts in Qt 5, it's not possible to execute script in new context,\n    only in the global one.\n\n    Workaround is to wrap the script properly in a new function:\n\n        function() {\n            %1\n        }()\n\n    (Unfortunately, it's still possible to escape the new context with a script injection.)\n    */\n\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'global.popup = function(msg) { return msg + 1; } // TEST'\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    RUN(\"popup\" << \"test\", \"test1\\n\");\n}\n\nvoid Tests::scriptCommandWithError()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                name: 'bad_script',\n                cmd: 'if (env(\"COPYQ_TEST_THROW\") == \"1\") throw Error(\"BAD SCRIPT\")'\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    m_test->setEnv(\"COPYQ_TEST_THROW\", \"1\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"\", CommandError,\n        \"ScriptError: BAD SCRIPT\\n\"\n        \"\\n\"\n        \"--- backtrace ---\\n\"\n    );\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"\", CommandError,\n        \"\\neval:source@<bad_script>\\n\"\n        \"--- end backtrace ---\\n\"\n    );\n}\n\nvoid Tests::scriptPaste()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'global.paste = function() { add(\"PASTE\") }'\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    RUN(\"add(1)\", \"\");\n    KEYS(clipboardBrowserId << \"ENTER\");\n    WAIT_ON_OUTPUT(\"read(0)\", \"PASTE\");\n}\n\nvoid Tests::scriptOnTabSelected()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'global.onTabSelected = function() { add(selectedTab()) }'\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n\n    const auto tab1 = testTab(1);\n    const auto tab2 = testTab(2);\n    RUN(\"show\" << tab1, \"\");\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"read(0)\", tab1);\n    RUN(\"show\" << tab2, \"\");\n    WAIT_ON_OUTPUT(\"tab\" << tab2 << \"read(0)\", tab2);\n}\n\nvoid Tests::scriptOnItemsRemoved()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: `\n                  global.onItemsRemoved = function() {\n                    items = ItemSelection().current().items();\n                    tab(tab()[0]);\n                    add(\"R0:\" + str(items[0][mimeText]));\n                    add(\"R1:\" + str(items[1][mimeText]));\n                  }\n                `\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add(3,2,1,0)\", \"\");\n    RUN(\"tab\" << tab1 << \"remove(1,2)\", \"\");\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read(0,1,2,)\", \"R1:2,R0:1,\");\n\n    // Cancel item removal\n    const auto script2 = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: \"global.onItemsRemoved = global.fail\",\n            },\n        ])\n        )\";\n    RUN(script2, \"\");\n    const auto tab2 = testTab(2);\n    RUN(\"tab\" << tab2 << \"add(3,2,1,0)\", \"\");\n    RUN(\"tab\" << tab2 << \"remove(1,2)\", \"\");\n    RUN(\"tab\" << tab2 << \"separator\" << \",\" << \"read(0,1,2,3,4)\", \"0,1,2,3,\");\n\n    // Avoid crash if the tab itself is removed while removing items\n    const auto script3 = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: `\n                  global.onItemsRemoved = function() {\n                    removeTab(selectedTab())\n                  }\n                `\n            },\n        ])\n        )\";\n    RUN(script3, \"\");\n    const auto tab3 = testTab(3);\n    RUN(\"tab\" << tab3 << \"add(3,2,1,0)\", \"\");\n    RUN(\"tab\" << tab3 << \"remove(1,2)\", \"\");\n    RUN(\"tab\" << tab3 << \"separator\" << \",\" << \"read(0,1,2,3,4)\", \",,,,\");\n}\n\nvoid Tests::scriptOnItemsAdded()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: `\n                  global.onItemsAdded = function() {\n                    sel = ItemSelection().current();\n                    items = sel.items();\n                    for (i = 0; i < items.length; ++i)\n                        items[i][mimeText] = \"A:\" + str(items[i][mimeText])\n                    sel.setItems(items);\n                  }\n                `\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add(1,0)\", \"\");\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"separator\" << \",\" << \"read(0,1,2)\", \"A:0,A:1,\");\n}\n\nvoid Tests::scriptOnItemsChanged()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: `\n                  global.onItemsChanged = function() {\n                    if (selectedTab() == tab()[0]) abort();\n                    items = ItemSelection().current().items();\n                    tab(tab()[0]);\n                    add(\"C:\" + str(items[0][mimeText]));\n                  }\n                `\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add(0)\", \"\");\n    RUN(\"tab\" << tab1 << \"change(0, mimeText, 'A')\", \"\");\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read(0,1,2)\", \"C:A,,\");\n    RUN(\"tab\" << tab1 << \"change(0, mimeText, 'B')\", \"\");\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read(0,1,2)\", \"C:B,C:A,\");\n}\n\nvoid Tests::scriptOnItemsLoaded()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: `\n                  global.onItemsLoaded = function() {\n                    if (selectedTab() == tab()[0]) abort();\n                    tab(tab()[0]);\n                    add(selectedTab());\n                  }\n                `\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n\n    const auto tab1 = testTab(1);\n    RUN(\"show\" << tab1, \"\");\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read(0,1,2)\", tab1 + \",,\");\n\n    const auto tab2 = testTab(2);\n    RUN(\"show\" << tab2, \"\");\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read(0,1,2)\", tab2 + \",\" + tab1 + \",\");\n}\n\nvoid Tests::scriptEventMaxRecursion()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: `global.onItemsRemoved = function() {\n                    const toRemove = str(selectedItemData(0)[mimeText]);\n                    const newItem = (toRemove == \"X\") ? \"A\" : (\"WRONG:\" + toRemove);\n                    add(newItem);\n                    remove(size()-1);\n                }`\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    m_test->ignoreErrors(QRegularExpression(\"Event handler maximum recursion reached\"));\n    RUN(\"add('X'); remove(0)\", \"\");\n    WAIT_ON_OUTPUT(\"separator\" << \",\" << \"read(0,1,2,3,4,5,6,7,8,9,10)\", \"A,A,A,A,A,A,A,A,A,A,\");\n    waitFor(100);\n    RUN(\"separator\" << \",\" << \"read(0,1,2,3,4,5,6,7,8,9,10)\", \"A,A,A,A,A,A,A,A,A,A,\");\n}\n\nvoid Tests::scriptSlowCollectOverrides()\n{\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'global.onTabSelected = function() { add(selectedTab()) }'\n            },\n            {\n                isScript: true,\n                cmd: `\n                  var collectOverrides_ = global.collectOverrides;\n                  global.collectOverrides = function() { sleep(1000); collectOverrides_() }\n                `\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n\n    const auto tab1 = testTab(1);\n    RUN(\"show\" << tab1, \"\");\n    WAIT_ON_OUTPUT(\"tab\" << tab1 << \"read(0)\", tab1);\n}\n\nvoid Tests::displayCommand()\n{\n    const auto testMime = COPYQ_MIME_PREFIX \"test\";\n    const auto script = QString(R\"(\n        setCommands([{\n            display: true,\n            input: '%1',\n            cmd: 'copyq:'\n               + 'text = str(data(mimeText));'\n               + 'currentTab = str(data(mimeCurrentTab));'\n               + 'add(currentTab + \"/\" + text);'\n        }])\n        )\").arg(testMime);\n\n    RUN(script, \"\");\n\n    RUN(\"write\" << \"0\" << testMime << \"\" << mimeText << \"a\", \"\");\n    WAIT_ON_OUTPUT(\n                \"read(0,1,2)\",\n                QString::fromLatin1(\"%1/a\\na\\n\")\n                .arg(clipboardTabName)\n                .toUtf8() );\n\n    RUN(\"write\" << \"0\" << testMime << \"\" << mimeText << \"b\", \"\");\n    WAIT_ON_OUTPUT(\n                \"read(0,1,2,3,4)\",\n                QString::fromLatin1(\"%1/b\\nb\\n%1/a\\na\\n\")\n                .arg(clipboardTabName)\n                .toUtf8() );\n}\n\nvoid Tests::displayCommandForMenu()\n{\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab << \"separator\" << \",\";\n    const auto script = QString(R\"(\n        setCommands([{\n            display: true,\n            cmd: 'copyq:'\n               + 'currentTab = str(data(mimeCurrentTab));'\n               + 'inMenu = str(data(mimeDisplayItemInMenu));'\n               + 'if (inMenu != \"1\" || currentTab != \"%1\") abort();'\n               + 'text = str(data(mimeText));'\n               + 'setData(mimeText, \"display:\" + text);'\n               + 'setData(mimeIcon, String.fromCharCode(0xF328));'\n               + 'setData(\"application/x-copyq-item-tag\", \"TAG\");'\n               + 'tab(tab()[0]);'\n               + 'old = str(read(0));'\n               + 'add(old + \"|\" + text);'\n        }])\n        )\").arg(tab);\n\n    RUN(\"config\" << \"tray_tab\" << tab, tab + \"\\n\");\n    RUN(\"config\" << \"tray_tab_is_current\" << \"false\", \"false\\n\");\n    RUN(script, \"\");\n\n    RUN(args << \"add(1,2,3,4,5)\", \"\");\n    RUN(\"menu\", \"\");\n    WAIT_ON_OUTPUT(\"read(0)\", \"|5|4|3|2|1\");\n}\n"
  },
  {
    "path": "src/tests/tests_scripts.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/mimetypes.h\"\n#include \"common/commandstatus.h\"\n\n#include <QElapsedTimer>\n#include <QRegularExpression>\n#include <QTemporaryFile>\n\nvoid Tests::commandExit()\n{\n    RUN(\"exit\", \"\");\n\n    TEST( m_test->waitForServerToStop() );\n\n    QCOMPARE( run(Args(\"exit\")), 1 );\n}\n\nvoid Tests::commandEval()\n{\n    RUN(\"eval\" << \"\", \"\");\n    RUN(\"eval\" << \"1\", \"1\\n\");\n    RUN(\"eval\" << \"[1,2,3]\", \"1\\n2\\n3\\n\");\n    RUN(\"eval\" << \"'123'\", \"123\\n\");\n    RUN(\"eval\" << \"'123'\", \"123\\n\");\n\n    RUN(\"-e\" << \"\", \"\");\n    RUN(\"-e\" << \"1\", \"1\\n\");\n}\n\nvoid Tests::commandEvalThrows()\n{\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"throw Error('Some exception')\", CommandException,\n        \"ScriptError: Some exception\\n\"\n        \"\\n\"\n        \"--- backtrace ---\\n\"\n    );\n\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"throw 'Some exception'\", CommandException,\n        \"ScriptError: Some exception\\n\"\n    );\n\n    RUN_EXPECT_ERROR(\"eval('throw Error(1)')\", CommandException);\n    RUN_EXPECT_ERROR(\"eval('throw 1')\", CommandException);\n    RUN_EXPECT_ERROR(\"eval\" << \"throw Error(1)\", CommandException);\n    RUN_EXPECT_ERROR(\"eval\" << \"throw 1\", CommandException);\n}\n\nvoid Tests::commandEvalSyntaxError()\n{\n    RUN_EXPECT_ERROR_WITH_STDERR(\"eval\" << \"(\", CommandException, \"SyntaxError\");\n}\n\nvoid Tests::commandEvalArguments()\n{\n    RUN(\"eval\" << \"str(arguments[1]) + ', ' + str(arguments[2])\" << \"Test 1\" << \"Test 2\",\n        \"Test 1, Test 2\\n\");\n}\n\nvoid Tests::commandEvalEndingWithComment()\n{\n    /*\n    With Qml scripts in Qt 5, it's not possible to get uncaught exceptions\n    from `QJSEngine::evaluate()`.\n\n    Workaround is to wrap the script properly in an try/catch block:\n\n        try {\n            %1\n        } catch(e) {\n            _store_exception_internally(e);\n            throw e;\n        }\n\n    (Unfortunately, it's still possible to escape the function with a script injection.)\n    */\n    RUN(\"eval\" << \"1 // TEST\", \"1\\n\");\n}\n\nvoid Tests::commandPrint()\n{\n    RUN(\"print\" << \"1\", \"1\");\n    RUN(\"print\" << \"TEST\", \"TEST\");\n}\n\nvoid Tests::commandAbort()\n{\n    RUN(\"abort(); 1\", \"\");\n    RUN(\"eval\" << \"abort(); 1\", \"\");\n    RUN(\"eval\" << \"eval('abort(); print(1)'); 2\", \"\");\n    RUN(\"eval\" << \"execute('copyq', 'eval', '--', 'abort(); print(1)'); 2\", \"2\\n\");\n}\n\nvoid Tests::commandFail()\n{\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"fail\"), &stdoutActual, &stderrActual), 10 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QCOMPARE( stdoutActual, QByteArray() );\n}\n\nvoid Tests::commandSource()\n{\n    const auto script =\n            R\"(\n            test = function() { return \" TEST\" }\n            print(\"SOURCED\")\n            )\";\n\n    QTemporaryFile scriptFile;\n    QVERIFY(scriptFile.open());\n    scriptFile.write(script);\n    scriptFile.close();\n    const auto scriptFileName = scriptFile.fileName();\n\n    RUN(\"source\" << scriptFileName, \"SOURCED\");\n    RUN(\"source\" << scriptFileName << \"test()\", \"SOURCED TEST\\n\");\n}\n\nvoid Tests::commandVisible()\n{\n    RUN(\"visible\", \"true\\n\");\n}\n\nvoid Tests::commandToggle()\n{\n    RUN(\"visible\", \"true\\n\");\n    RUN(\"toggle\", \"false\\n\");\n    WAIT_ON_OUTPUT(\"visible\", \"false\\n\");\n\n    RUN(\"toggle\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n}\n\nvoid Tests::commandShowHide()\n{\n    RUN(\"visible\", \"true\\n\");\n    RUN(\"hide\", \"\");\n    WAIT_ON_OUTPUT(\"visible\", \"false\\n\");\n\n    RUN(\"show\", \"\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n}\n\n\nvoid Tests::commandShowHideRapid()\n{\n    // Verify the main window can be hidden and reshown reliably in\n    // rapid succession.  Regression test for #3445: deferred platform\n    // raise in raiseWindow() could prevent the window from appearing.\n    for (int i = 0; i < 3; ++i) {\n        RUN(\"visible\", \"true\\n\");\n        RUN(\"hide\", \"\");\n        WAIT_ON_OUTPUT(\"visible\", \"false\\n\");\n\n        RUN(\"show\", \"\");\n        WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n    }\n}\nvoid Tests::commandShowAt()\n{\n    RUN(\"visible\", \"true\\n\");\n    RUN(\"hide\", \"\");\n    WAIT_ON_OUTPUT(\"visible\", \"false\\n\");\n\n    RUN(\"showAt\", \"\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n}\n\nvoid Tests::commandFocused()\n{\n    RUN(\"focused\", \"true\\n\");\n    RUN(\"hide\", \"\");\n    RUN(\"focused\", \"false\\n\");\n}\n\nvoid Tests::commandsUnicode()\n{\n    const auto text = QString::fromUtf8(QByteArray(\"Zkouška s různými českými znaky!\"));\n    RUN_WITH_INPUT(\"eval\" << \"input()\", text, text);\n    RUN_WITH_INPUT(\"eval\" << \"str(input())\", text, text + \"\\n\");\n\n    RUN_WITH_INPUT(\"eval\" << \"fromUnicode(str(input()), 'utf8')\", text, text);\n    RUN_WITH_INPUT(\"eval\" << \"toUnicode(fromUnicode(str(input()), 'utf16'), 'utf16')\", text, text + \"\\n\");\n    RUN_WITH_INPUT(\"eval\" << \"toUnicode(fromUnicode(str(input()), 'utf32le'), 'utf32le')\", text, text + \"\\n\");\n    RUN_WITH_INPUT(\"eval\" << \"toUnicode( fromUnicode(str(input()), 'utf16le') )\", text, text + \"\\n\");\n}\n\nvoid Tests::commandsAddRead()\n{\n    RUN(\"add\" << \"A\", \"\");\n    RUN(\"read\" << \"0\", \"A\");\n\n    RUN(\"add\" << \"B\", \"\");\n    RUN(\"read\" << \"0\", \"B\");\n    RUN(\"read\" << \"1\", \"A\");\n\n    RUN(\"add\" << \"C\" << \"D\", \"\");\n    RUN(\"read\" << \"0\", \"D\");\n    RUN(\"read\" << \"1\", \"C\");\n    RUN(\"read\" << \"2\", \"B\");\n    RUN(\"read\" << \"3\", \"A\");\n}\n\nvoid Tests::commandsWriteRead()\n{\n    const QByteArray input(\"\\x00\\x01\\x02\\x03\\x04\", 5);\n    const auto arg1 = QString::fromLatin1(\"\\x01\\x02\\x03\\x04\");\n    const auto arg2 = QString::fromLatin1(\"\\x7f\\x6f\\x5f\\x4f\");\n    TEST( m_test->runClient(\n              Args() << \"write\"\n              << COPYQ_MIME_PREFIX \"test1\" << arg1\n              << COPYQ_MIME_PREFIX \"test2\" << \"-\"\n              << COPYQ_MIME_PREFIX \"test3\" << arg2, \"\",\n              input) );\n    RUN(\"read\" << COPYQ_MIME_PREFIX \"test1\" << \"0\", arg1.toLatin1());\n    RUN(\"read\" << COPYQ_MIME_PREFIX \"test2\" << \"0\", input);\n    RUN(\"read\" << COPYQ_MIME_PREFIX \"test3\" << \"0\", arg2.toLatin1());\n\n    RUN(\"write(1, {'text/plain': 'A'}, {'text/plain': 'B'})\", \"\");\n    RUN(\"read(mimeText, 0, 1, 2, 3)\", \"\\nB\\nA\\n\");\n\n    RUN(\"write(0, [{'text/plain': 'C'}, {'text/plain': 'D'}])\", \"\");\n    RUN(\"read(mimeText, 0, 1, 2, 3)\", \"D\\nC\\n\\nB\");\n\n    RUN(\"write(0, ['E', 'F'])\", \"\");\n    RUN(\"read(mimeText, 0, 1, 2, 3)\", \"F\\nE\\nD\\nC\");\n\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"write(0, [{}], [{}])\",\n        CommandException, \"Unexpected multiple item list arguments\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"write(0)\",\n        CommandException, \"Expected item arguments\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"write(0, '1', '2', '3')\",\n        CommandException, \"Unexpected uneven number of mimeType/data arguments\");\n}\n\nvoid Tests::commandsReadUtf8ByDefault()\n{\n    RUN(\"add({[mimeText]: 'A', [mimeTextUtf8]: 'B'})\", \"\");\n    RUN(\"read(mimeText, 0)\", \"A\");\n    RUN(\"read(0)\", \"B\");\n}\n\nvoid Tests::commandChange()\n{\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"change\" << \"1\" << \"text/plain\" << \"b\", \"\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\" << \"2\", \"A b C\");\n\n    RUN(\"change\" << \"1\" << \"text/plain\" << \"B\" << \"text/html\" << \"<b>B</b>\", \"\");\n    RUN(\"read\" << \"text/html\" << \"1\", \"<b>B</b>\");\n    RUN(\"separator\" << \" \" << \"read\" << \"0\" << \"1\" << \"2\", \"A B C\");\n\n    RUN(\"change(1, 'text/html', undefined)\", \"\");\n    RUN(\"read\" << \"?\" << \"1\", \"text/plain\\n\");\n}\n\nvoid Tests::commandSetCurrentTab()\n{\n    const auto tab = testTab(1);\n    RUN(\"setCurrentTab\" << tab, \"\");\n    TEST_SELECTED(tab + \"\\n\");\n}\n\nvoid Tests::commandConfig()\n{\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"config\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY( !stdoutActual.isEmpty() );\n\n    // invalid option\n    RUN_EXPECT_ERROR_WITH_STDERR(\"config\" << \"xxx\", CommandException, \"xxx\");\n\n    QCOMPARE( run(Args(\"config\") << \"tab_tree\", &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY2( stdoutActual == \"true\\n\" || stdoutActual == \"false\\n\", stdoutActual);\n\n    RUN(\"config\" << \"tab_tree\" << \"true\", \"true\\n\");\n    RUN(\"config\" << \"tab_tree\", \"true\\n\");\n\n    RUN(\"config\" << \"tab_tree\" << \"false\", \"false\\n\");\n    RUN(\"config\" << \"tab_tree\", \"false\\n\");\n\n    RUN(\"config\" << \"tab_tree\" << \"1\", \"true\\n\");\n    RUN(\"config\" << \"tab_tree\", \"true\\n\");\n\n    RUN(\"config\" << \"tab_tree\" << \"0\", \"false\\n\");\n    RUN(\"config\" << \"tab_tree\", \"false\\n\");\n\n    // Set multiple options.\n    RUN(\"config\" << \"tab_tree\" << \"0\" << \"text_wrap\" << \"1\",\n        \"tab_tree=false\\n\"\n        \"text_wrap=true\\n\");\n\n    // Don't set any options if there is an invalid one.\n    RUN_EXPECT_ERROR_WITH_STDERR(\"config\" << \"tab_tree\" << \"1\" << \"xxx\" << \"0\", CommandException, \"xxx\");\n    RUN(\"config\" << \"tab_tree\", \"false\\n\");\n}\n\nvoid Tests::commandToggleConfig()\n{\n    RUN(\"toggleConfig\" << \"check_clipboard\", \"false\\n\");\n    RUN(\"config\" << \"check_clipboard\", \"false\\n\");\n    RUN(\"toggleConfig\" << \"check_clipboard\", \"true\\n\");\n    RUN(\"config\" << \"check_clipboard\", \"true\\n\");\n\n    RUN_EXPECT_ERROR(\"toggleConfig\", CommandException);\n    RUN_EXPECT_ERROR_WITH_STDERR(\"toggleConfig\" << \"xxx\", CommandException, \"xxx\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\"toggleConfig\" << \"clipboard_tab\", CommandException, \"clipboard_tab\");\n}\n\nvoid Tests::commandDialog()\n{\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('text')\", \"TEST\\n\"); },\n        [&]{ KEYS(\"focus::QLineEdit<:QDialog\" << \":TEST\" << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('text') === undefined\", \"true\\n\"); },\n        [&]{ KEYS(\"focus::QLineEdit<:QDialog\" << \"ESCAPE\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('.defaultChoice', 2, 'list', [1, 2, 3])\", \"2\\n\"); },\n        [&]{ KEYS(\"focus::QComboBox<:QDialog\" << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('.defaultChoice', '', 'list', [1, 2, 3])\", \"\\n\"); },\n        [&]{ KEYS(\"focus::QComboBox<:QDialog\" << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('list', [0, 1, 2])\", \"0\\n\"); },\n        [&]{ KEYS(\"focus::QComboBox<:QDialog\" << \"ENTER\"); }\n    );\n\n    // Can't focus configuration checkboxes on OS X\n#ifndef Q_OS_MAC\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('boolean', true) === true\", \"true\\n\"); },\n        [&]{ KEYS(\"focus::QCheckBox<:QDialog\" << \"ENTER\"); }\n    );\n#endif\n\n    // Verify that special argument \".title\" changes dialog's object name\n    // so that geometry can be stored.\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('.title', 'test', 'text')\", \"\"); },\n        [&]{ KEYS(\"focus::QLineEdit<dialog_test:QDialog\" << \"ESCAPE\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    const QByteArray script = R\"(\n        dialog(\n            '.width', 100,\n            '.height', 100,\n            '.x', 10,\n            '.y', 10,\n            '.style', 'background: red',\n            '.icon', '',\n            '.label', 'TEST',\n            'text', 'DEFAULT',\n        )\n    )\";\n    RUN_MULTIPLE(\n        [&]{ RUN(script, \"DEFAULT\\n\"); },\n        [&]{ KEYS(\"focus::QLineEdit<:QDialog\" << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"dialog('.title', 'Remove Items', '.label', 'Remove all items?') === true\", \"true\\n\"); },\n        [&]{ KEYS(\"focus::QPushButton<dialog_Remove Items:QDialog\" << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    const QByteArray script2 = R\"(\n        dialog(\n            '.modal', true,\n            '.onTop', true,\n            'text', 'DEFAULT',\n        )\n    )\";\n    RUN_MULTIPLE(\n        [&]{ RUN(script2, \"DEFAULT\\n\"); },\n        [&]{ KEYS(\"focus::QLineEdit<:QDialog\" << \"ENTER\"); }\n    );\n}\n\nvoid Tests::commandDialogCloseOnDisconnect()\n{\n    RUN(\"afterMilliseconds(0, abort); dialog()\", \"\");\n}\n\nvoid Tests::commandMenuItems()\n{\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"menuItems('a', 'b', 'c')\", \"a\\n\"); },\n        [&]{ KEYS(customMenuId << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"menuItems([{'text/plain': 'a'}, {'text/plain': 'b'}])\", \"0\\n\"); },\n        [&]{ KEYS(customMenuId << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"menuItems('a', 'b', 'c')\", \"\\n\"); },\n        [&]{ KEYS(customMenuId << \"ESCAPE\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"menuItems([{'text/plain': 'a'}, {'text/plain': 'b'}])\", \"-1\\n\"); },\n        [&]{ KEYS(customMenuId << \"ESCAPE\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"menuItems('a', 'b', 'c')\", \"b\\n\"); },\n        [&]{ KEYS(customMenuId << \":b\" << \"ENTER\"); }\n    );\n\n    KEYS(clipboardBrowserId);\n    RUN_MULTIPLE(\n        [&]{ RUN(\"menuItems([{'text/plain': 'a'}, {'text/plain': 'b'}])\", \"1\\n\"); },\n        [&]{ KEYS(customMenuId << \":b\" << \"ENTER\"); }\n    );\n\n    RUN(\"afterMilliseconds(0, abort); menuItems('a', 'b', 'c')\", \"\");\n}\n\nvoid Tests::commandsPackUnpack()\n{\n    QMap<QLatin1String, QByteArray> data;\n    data[mimeText] = \"plain text\";\n    data[mimeHtml] = \"<b>HTML text</b>\";\n    data[QLatin1String(COPYQ_MIME_PREFIX \"test1\")] = \"test1 data\";\n    data[QLatin1String(COPYQ_MIME_PREFIX \"test2\")] = \"test2 data\";\n\n    auto args = Args() << \"write\";\n    for (const auto &mime : data.keys())\n        args << mime << data[mime];\n    RUN(args, \"\");\n\n    const QByteArray script1 =\n            \"var data = read('\" + toByteArray(mimeItems) + \"', 0); var item = unpack(data);\";\n\n    // Unpack item read from list.\n    for (const auto &mime : data.keys()) {\n        RUN(\"eval\"\n            << script1 + \"var mime = '\" + mime + \"'; print(mime + ':' + str(item[mime]))\",\n            mime + ':' + data[mime]);\n    }\n\n    // Test pack and unpack consistency.\n    const QByteArray script2 = \"data = pack(item); item = unpack(data);\";\n    for (const auto &mime : data.keys()) {\n        RUN(\"eval\"\n            << script1 + script2 + \"var mime = '\" + mime + \"'; print(mime + ':' + str(item[mime]))\",\n            mime + ':' + data[mime]);\n    }\n}\n\nvoid Tests::commandsBase64()\n{\n    const QByteArray data = \"0123456789\\001\\002\\003\\004\\005\\006\\007abcdefghijklmnopqrstuvwxyz!\";\n    const QByteArray base64 = data.toBase64();\n\n    TEST( m_test->runClient(Args() << \"eval\" << \"print(input())\", data, data) );\n    TEST( m_test->runClient(Args() << \"eval\" << \"print(tobase64(input()))\", base64, data) );\n\n    // Line break is added only if return value is string;\n    // tobase64() returns string, frombase64() returns byte array.\n    RUN(\"tobase64\" << data, base64 + '\\n');\n    RUN(\"frombase64\" << base64, data);\n\n    TEST( m_test->runClient(Args() << \"eval\" << \"print(frombase64(tobase64(input())))\", data, data) );\n\n    // Test Base64 encoding and decoding consistency.\n    TEST( m_test->runClient(\n              Args() << \"eval\"\n              << \"var base64 = tobase64(input()); if (str(input()) === str(frombase64(base64))) print('OK')\",\n              \"OK\", data) );\n}\n\nvoid Tests::commandsGetSetItem()\n{\n    QMap<QByteArray, QByteArray> data;\n    data[\"text/plain\"] = \"plain text\";\n    data[\"text/html\"] = \"<b>HTML text</b>\";\n    data[COPYQ_MIME_PREFIX \"test1\"] = \"test1 data\";\n    data[COPYQ_MIME_PREFIX \"test2\"] = \"test2 data\";\n\n    const QString tab = testTab(1);\n    const Args args = Args(\"tab\") << tab;\n\n    Args args2 = args;\n    args2 << \"write\";\n    for (const auto &mime : data.keys())\n        args2 << mime << data[mime];\n    RUN(args2, \"\");\n\n    // Get item from list.\n    for (const auto &mime : data.keys()) {\n        RUN(args << \"eval\"\n            << \"var mime = '\" + mime + \"'; print(mime + ':' + str(getitem(0)[mime]))\",\n            mime + ':' + data[mime]);\n    }\n\n    // Set item.\n    RUN(args << \"eval\"\n        << \"setitem(1, { 'text/plain': 'plain text 2', 'text/html': '<b>HTML text 2</b>' })\",\n        \"\");\n\n    RUN(args << \"eval\" << \"print(getitem(1)['text/plain'])\", \"plain text 2\");\n    RUN(args << \"eval\" << \"print(getitem(1)['text/html'])\", \"<b>HTML text 2</b>\");\n}\n\nvoid Tests::commandsChecksums()\n{\n    RUN(\"eval\" <<\n        \"[md5sum('TEST'), sha1sum('TEST'),\"\n        \" sha256sum('TEST'), sha512sum('TEST')]\"\n        ,\n        \"033bd94b1168d7e4f0d644c3c95e35bf\\n\"\n        \"984816fd329622876e14907634264e6f332e9fb3\\n\"\n        \"94ee059335e587e501cc4bf90613e0814f00a7b08bc7c648fd865a2af6a22cc2\\n\"\n        \"7bfa95a688924c47c7d22381f20cc926f524beacb13f84e203d4bd8cb6ba2fce81c57a5f059bf3d509926487bde925b3bcee0635e4f7baeba054e5dba696b2bf\\n\"\n    );\n}\n\nvoid Tests::commandEscapeHTML()\n{\n    RUN(\"escapeHTML\" << \"&\\n<\\n>\", \"&amp;<br />&lt;<br />&gt;\\n\");\n}\n\nvoid Tests::commandExecute()\n{\n    const QByteArray script =\n            \"function test(c, expected_stdout, expected_exit_code) {\"\n            \"    if (str(c.stdout) !== expected_stdout) print('Unexpected stdout: \\\"' + str(c.stdout) + '\\\"');\"\n            \"    if (c.exit_code !== expected_exit_code) print('Unexpected exit_code: ' + str(c.exit_code));\"\n            \"}\";\n\n    RUN(\"eval\" << script +\n        \"c = execute('copyq', 'write', 'text/plain', 'plain text', 'text/html', '<b>test HTML</b>');\"\n        \"test(c, '', 0);\"\n        , \"\");\n\n    RUN(\"eval\" << script +\n        \"c = execute('copyq', 'read', 'text/plain', 0);\"\n        \"test(c, 'plain text', 0);\"\n        , \"\");\n\n    RUN(\"eval\" << script +\n        \"c = execute('copyq', 'read', 'text/html', 0);\"\n        \"test(c, '<b>test HTML</b>', 0);\"\n        , \"\");\n\n    RUN(\"eval\" << script +\n        \"c = execute('copyq', 'read', 0, function(lines) { print(lines); });\"\n        \"test(c, 'plain text', 0);\"\n        , \"plain text\");\n}\n\nvoid Tests::commandSettings()\n{\n    RUN(\"config\" << \"clipboard_tab\" << \"TEST\", \"TEST\\n\");\n\n    RUN(\"settings\" << \"test_variable\", \"\");\n    RUN(\"settings\" << \"test_variable\" << \"TEST VALUE\", \"\");\n    RUN(\"settings\" << \"test_variable\", \"TEST VALUE\");\n    RUN(\"settings\" << \"test_variable\" << \"TEST VALUE 2\", \"\");\n    RUN(\"settings\" << \"test_variable\", \"TEST VALUE 2\");\n\n    RUN(\"config\" << \"clipboard_tab\", \"TEST\\n\");\n}\n\nvoid Tests::commandsEnvSetEnv()\n{\n    RUN(\"eval\" <<\n        \"\\n var name = 'COPYQ_ENV_TEST'\"\n        \"\\n if (setEnv(name, 'OK'))\"\n        \"\\n   print(env(name))\"\n        \"\\n else\"\n        \"\\n   print('FAILED')\"\n        , \"OK\"\n        );\n}\n\nvoid Tests::commandSleep()\n{\n    RUN_MULTIPLE(\n        [&]{\n            QElapsedTimer t;\n            t.start();\n            RUN(\"sleep\" << \"200\", \"\");\n            const auto afterElapsed200Ms = t.elapsed();\n            QVERIFY(afterElapsed200Ms > 200);\n        },\n        [&]{\n            QElapsedTimer t;\n            t.start();\n            RUN(\"sleep\" << \"50\", \"\");\n            const auto afterElapsed50Ms = t.elapsed();\n            QVERIFY(afterElapsed50Ms > 50);\n        }\n    );\n}\n\nvoid Tests::commandsData()\n{\n    RUN(\"eval\" << \"setData('x', 'X'); data('x')\", \"X\");\n    RUN(\"eval\" << \"setData('x', 'X'); setData('y', 'Y'); str(data('x')) + str(data('y'))\", \"XY\\n\");\n\n    RUN(\"dataFormats\", \"\");\n    RUN(\"eval\" << \"setData('x'); dataFormats()\", \"x\\n\");\n    RUN(\"eval\" << \"setData('x'); setData('y'); dataFormats()\", \"x\\ny\\n\");\n\n    RUN(\"eval\" << \"setData('x'); setData('y'); removeData('x'); dataFormats()\", \"y\\n\");\n    RUN(\"eval\" << \"setData('x'); setData('y'); removeData('y'); dataFormats()\", \"x\\n\");\n}\n\nvoid Tests::commandCurrentWindowTitle()\n{\n    RUN(\"disable\", \"\");\n    WAIT_ON_OUTPUT(\"currentWindowTitle\", appWindowTitle(\"*Clipboard Storing Disabled*\"));\n    RUN(\"enable\", \"\");\n}\n\nvoid Tests::commandCopy()\n{\n    RUN(\"copy\" << \"A\", \"true\\n\");\n    WAIT_FOR_CLIPBOARD(\"A\");\n\n    RUN(\"copy\" << \"DATA\" << \"B\", \"true\\n\");\n    WAIT_FOR_CLIPBOARD2(\"B\", \"DATA\");\n\n    // Test copying UTF-8 text.\n    // On macOS, text/plain and text/plain;charset=utf-8 map to the same UTI\n    // (public.utf8-plain-text), so setting both with different values causes\n    // the pasteboard to return the wrong one. Only set mimeTextUtf8 on macOS.\n#ifdef Q_OS_MAC\n    RUN(\"--\" << \"copy({[mimeTextUtf8]: '\\u2705'})\", \"true\\n\");\n#else\n    RUN(\"--\" << \"copy({[mimeText]: '\\\\\\\\u2705', [mimeTextUtf8]: '\\u2705'})\", \"true\\n\");\n#endif\n    WAIT_FOR_CLIPBOARD2(\"\\u2705\", mimeTextUtf8);\n\n    RUN( Args() << \"copy\"\n         << \"DATA3\" << \"C\"\n         << \"DATA4\" << \"D\"\n         , \"true\\n\" );\n    WAIT_FOR_CLIPBOARD2(\"C\", \"DATA3\");\n\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_MULTIPLE_CLIPBOARD_FORMATS\");\n    WAIT_FOR_CLIPBOARD2(\"D\", \"DATA4\");\n\n    RUN( \"copy({'DATA1': 1, 'DATA2': 2})\", \"true\\n\" );\n    WAIT_FOR_CLIPBOARD2(\"1\", \"DATA1\");\n    WAIT_FOR_CLIPBOARD2(\"2\", \"DATA2\");\n\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"copy({}, {})\",\n        CommandException, \"Expected single item\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"copy([{}, {}])\",\n        CommandException, \"Expected single item\");\n}\n\nvoid Tests::commandClipboard()\n{\n    TEST( m_test->setClipboard(\"A\") );\n    WAIT_FOR_CLIPBOARD(\"A\");\n\n    TEST( m_test->setClipboard(\"B\", \"DATA\") );\n    WAIT_FOR_CLIPBOARD2(\"B\", \"DATA\");\n    RUN(\"clipboard\" << \"DATA\", \"B\");\n}\n\nvoid Tests::commandHasClipboardFormat()\n{\n    TEST( m_test->setClipboard(\"B\", \"DATA\") );\n    WAIT_FOR_CLIPBOARD2(\"B\", \"DATA\");\n    WAIT_ON_OUTPUT(\"hasClipboardFormat('DATA')\", \"true\\n\");\n    RUN(\"hasClipboardFormat('text/plain')\", \"false\\n\");\n\n    TEST( m_test->setClipboard(\"A\") );\n    WAIT_ON_OUTPUT(\"hasClipboardFormat('text/plain')\", \"true\\n\");\n}\n\nvoid Tests::commandEdit()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_COMMAND_EDIT\");\n\n    RUN(\"config\" << \"editor\" << \"\", \"\\n\");\n\n    // Edit clipboard and new item.\n    TEST( m_test->setClipboard(\"TEST\") );\n    RUN(\"edit\" << \"-1\", \"\");\n    KEYS(\"END\" << \":LINE 1\" << \"F2\");\n    RUN(\"read\" << \"0\", \"TESTLINE 1\");\n    WAIT_FOR_CLIPBOARD(\"TESTLINE 1\");\n\n    // Edit existing item.\n    RUN(\"edit\" << \"0\", \"\");\n    KEYS(\"END\" << \"ENTER\" << \":LINE 2\" << \"F2\");\n    RUN(\"read\" << \"0\", \"TESTLINE 1\\nLINE 2\");\n    WAIT_FOR_CLIPBOARD(\"TESTLINE 1\");\n\n    // Edit clipboard (ignore existing data) and new item.\n    RUN(\"edit\", \"\");\n    KEYS(\"END\" << \":LINE 1\" << \"F2\");\n    RUN(\"read\" << \"0\", \"LINE 1\");\n    WAIT_FOR_CLIPBOARD(\"LINE 1\");\n}\n\nvoid Tests::commandEditItem()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_COMMAND_EDIT\");\n\n    RUN(\"config\" << \"editor\" << \"\", \"\\n\");\n\n    // Edit clipboard and new item.\n    TEST( m_test->setClipboard(\"<!--StartFragment-->TEST<!--EndFragment-->\", mimeHtml) );\n    RUN(\"editItem\" << \"-1\" << mimeHtml, \"\");\n    KEYS(\"END\" << \":LINE 1\" << \"F2\");\n    const auto expected = QByteArrayLiteral(\"TESTLINE 1\");\n#ifdef Q_OS_WIN\n    const auto expectedClipboard = QByteArrayLiteral(\"<!--StartFragment-->TESTLINE 1<!--EndFragment-->\");\n#else\n    const auto expectedClipboard = expected;\n#endif\n    RUN(\"read\" << mimeHtml << \"0\", expected);\n    RUN(\"read\" << \"0\", \"\");\n    WAIT_FOR_CLIPBOARD2(expectedClipboard, mimeHtml);\n    WAIT_FOR_CLIPBOARD(\"\");\n\n    // Edit existing item.\n    RUN(\"editItem\" << \"0\" << mimeHtml, \"\");\n    KEYS(\"END\" << \"ENTER\" << \":LINE 2\" << \"F2\");\n    RUN(\"read\" << mimeHtml << \"0\", expected + \"\\nLINE 2\");\n    RUN(\"read\" << \"0\", \"\");\n    WAIT_FOR_CLIPBOARD2(expectedClipboard, mimeHtml);\n    WAIT_FOR_CLIPBOARD(\"\");\n\n    // Edit clipboard (ignore existing data) and new item.\n    RUN(\"editItem\" << \"-1\" << mimeHtml << \"TEST\", \"\");\n    KEYS(\"END\" << \":LINE 1\" << \"F2\");\n    RUN(\"read\" << mimeHtml << \"0\", \"TESTLINE 1\");\n    RUN(\"read\" << \"0\", \"\");\n    WAIT_FOR_CLIPBOARD2(expectedClipboard, mimeHtml);\n    WAIT_FOR_CLIPBOARD(\"\");\n}\n\nvoid Tests::commandGetSetCurrentPath()\n{\n    RUN(\"currentPath\", QDir::currentPath() + \"\\n\");\n\n    const auto newPath = QDir::homePath().toUtf8();\n\n    TEST( m_test->runClient(\n              Args(\"eval\") << \"currentPath(input()); print(currentPath())\",\n              newPath, newPath) );\n\n    TEST( m_test->runClient(\n              Args(\"eval\") << \"currentPath(input()); print(Dir().absolutePath())\",\n              newPath, newPath) );\n}\n\nvoid Tests::commandSelectItems()\n{\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    RUN(\"selectItems\" << \"1\", \"true\\n\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 1 1\\n\");\n\n    RUN(\"selectItems\" << \"0\" << \"2\", \"true\\n\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 2 0 2\\n\");\n\n    RUN(\"selectItems\" << \"2\" << \"0\", \"true\\n\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 0 2 0\\n\");\n\n    const auto tab = testTab(1);\n    const auto args = Args(\"tab\") << tab;\n    RUN(args << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(args << \"selectItems\" << \"1\" << \"2\", \"true\\n\");\n    TEST_SELECTED(QString(clipboardTabName) + \" 0 2 0\\n\");\n    RUN(\"setCurrentTab\" << tab, \"\");\n    TEST_SELECTED(tab + \" 2 1 2\\n\");\n}\n\nvoid Tests::commandsExportImport()\n{\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    const auto tab2 = testTab(2);\n    RUN(\"tab\" << tab2 << \"add\" << \"3\" << \"2\", \"\");\n\n    RUN(\"config\" << \"maxitems\" << \"3\", \"3\\n\");\n    RUN(\"config\" << \"editor\" << \"EDITOR1 %1\", \"EDITOR1 %1\\n\");\n\n    TemporaryFile tmp;\n    const auto fileName = tmp.fileName();\n\n    RUN(\"exportData\" << fileName, \"\");\n\n    RUN(\"config\" << \"maxitems\" << \"1\", \"1\\n\");\n    RUN(\"config\" << \"editor\" << \"EDITOR2 %1\", \"EDITOR2 %1\\n\");\n    RUN(\"removetab\" << tab1, \"\");\n    RUN(\"tab\" << tab2 << \"add\" << \"1\", \"\");\n\n    RUN(\"importData\" << fileName, \"\");\n\n    RUN(\"config\" << \"maxitems\", \"3\\n\");\n    RUN(\"config\" << \"editor\", \"EDITOR1 %1\\n\");\n\n    const auto suffix = \" (1)\";\n    RUN(\"tab\",\n        QString(clipboardTabName) + \"\\n\"\n        + tab2 + \"\\n\"\n        + clipboardTabName + suffix + \"\\n\"\n        + tab1 + \"\\n\"\n        + tab2 + suffix + \"\\n\");\n\n    RUN(\"tab\" << tab1 << \"read\" << \"0\" << \"1\" << \"2\", \"A\\nB\\nC\");\n    RUN(\"tab\" << tab2 + suffix << \"read\" << \"0\" << \"1\", \"2\\n3\");\n    RUN(\"tab\" << tab2 << \"read\" << \"0\", \"1\");\n}\n\nvoid Tests::commandsGetSetCommands()\n{\n    RUN(\"commands().length\", \"0\\n\");\n\n    RUN(\"setCommands([{name: 'test', cmd: 'copyq help'}])\", \"\");\n    RUN(\"commands().length\", \"1\\n\");\n    RUN(\"commands()[0].name\", \"test\\n\");\n    RUN(\"commands()[0].cmd\", \"copyq help\\n\");\n    RUN(\"commands()[0].enable\", \"true\\n\");\n\n    RUN(\"setCommands(commands())\", \"\");\n    RUN(\"commands().length\", \"1\\n\");\n    RUN(\"commands()[0].name\", \"test\\n\");\n    RUN(\"commands()[0].enable\", \"true\\n\");\n}\n\nvoid Tests::commandsImportExportCommands()\n{\n   const QString commands =\n           R\"('\n           [Commands]\n           1\\Name=Test 1\n           2\\Name=Test 2\n           size=2\n           ')\";\n   RUN(\"eval\" << \"importCommands(arguments[1]).length\" << \"--\" << commands, \"2\\n\");\n   RUN(\"eval\" << \"importCommands(arguments[1])[0].name\" << \"--\" << commands, \"Test 1\\n\");\n   RUN(\"eval\" << \"importCommands(arguments[1])[1].name\" << \"--\" << commands, \"Test 2\\n\");\n\n   RUN(\"importCommands(exportCommands([{},{}])).length\", \"2\\n\");\n   RUN(\"importCommands(exportCommands([{},{name: 'Test 2'}]))[1].name\", \"Test 2\\n\");\n}\n\nvoid Tests::commandsImportExportCommandsFixIndentation()\n{\n    {\n        const QString commands =\n                \"[Command]\\n\"\n                \"Command=\\\"\\n    1\\n    2\\n    3\\\"\";\n        RUN(\"eval\" << \"importCommands(arguments[1])[0].cmd\" << \"--\" << commands, \"1\\n2\\n3\\n\");\n    }\n\n    {\n        const QString commands =\n                \"[Command]\\n\"\n                \"Command=\\\"\\r\\n    1\\r\\n    2\\r\\n    3\\\"\";\n        RUN(\"eval\" << \"importCommands(arguments[1])[0].cmd\" << \"--\" << commands, \"1\\n2\\n3\\n\");\n    }\n}\n\nvoid Tests::commandsAddCommandsRegExp()\n{\n    const QString commands =\n            \"[Command]\\n\"\n            \"Match=^(https?|ftps?)://\\\\\\\\$\\n\";\n\n    // Ensure there is a basic RegExp support.\n    RUN(\"/test/\", \"/test/\\n\");\n    RUN(\"/test/.source\", \"test\\n\");\n\n    RUN(\"eval\" << \"exportCommands(importCommands(arguments[1]))\" << \"--\" << commands, commands);\n    RUN(\"eval\" << \"Object.prototype.toString.call(importCommands(arguments[1])[0].re)\" << \"--\" << commands, \"[object RegExp]\\n\");\n    RUN(\"eval\" << \"Object.prototype.toString.call(importCommands(arguments[1])[0].wndre)\" << \"--\" << commands, \"[object RegExp]\\n\");\n    RUN(\"eval\" << \"importCommands(arguments[1])[0].re\" << \"--\" << commands, \"/^(https?|ftps?):\\\\/\\\\/\\\\$/\\n\");\n    RUN(\"eval\" << \"importCommands(arguments[1])[0].wndre\" << \"--\" << commands, \"/(?:)/\\n\");\n\n    RUN(\"eval\" << \"addCommands(importCommands(arguments[1]))\" << \"--\" << commands, \"\");\n    KEYS(commandDialogListId << \"Enter\" << clipboardBrowserId);\n\n    RUN(\"exportCommands(commands())\", commands);\n    RUN(\"commands()[0].name\", \"\\n\");\n    RUN(\"commands()[0].re\", \"/^(https?|ftps?):\\\\/\\\\/\\\\$/\\n\");\n    RUN(\"commands()[0].wndre\", \"/(?:)/\\n\");\n}\n\nvoid Tests::commandScreenshot()\n{\n    RUN(\"screenshot().size() > 0\", \"true\\n\");\n}\n\nvoid Tests::commandNotification()\n{\n    const auto script = R\"(\n        notification(\n            '.title', 'title',\n            '.message', 'message',\n            '.time', 1000,\n            '.id', 'test',\n            '.icon', 'copyq',\n            '.button', 'OK', '', '',\n            '.button', 'CANCEL', '', '',\n            '.urgency', 'critical',\n            '.persistent', true,\n        )\n        )\";\n    RUN(script, \"\");\n\n    RUN_EXPECT_ERROR_WITH_STDERR(\n                \"notification('.message', 'message', 'BAD')\", CommandException, \"Unknown argument: BAD\");\n}\n\nvoid Tests::commandNotificationUrgency()\n{\n    RUN(\"notification('.urgency', 'low')\", \"\");\n    RUN(\"notification('.urgency', 'normal')\", \"\");\n    RUN(\"notification('.urgency', 'high')\", \"\");\n    RUN(\"notification('.urgency', 'critical')\", \"\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"notification('.urgency', 'unknown')\",\n        CommandException,\n        \"Unknown value for '.urgency' notification field: unknown\");\n}\n\nvoid Tests::commandNotificationPersistent()\n{\n    RUN(\"notification('.persistent', true)\", \"\");\n    RUN(\"notification('.persistent', false)\", \"\");\n    RUN(\"notification('.persistent', 1)\", \"\");\n    RUN(\"notification('.persistent', 0)\", \"\");\n    RUN(\"notification('.persistent', 'true')\", \"\");\n    RUN(\"notification('.persistent', 'false')\", \"\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"notification('.persistent', 'unknown')\",\n        CommandException,\n        \"Unknown value for '.persistent' notification field: unknown\");\n}\n\nvoid Tests::commandIcon()\n{\n    RUN(\"iconColor\", QByteArray(defaultSessionColor) + \"\\n\");\n\n    RUN(\"iconColor\" << \"red\", \"\");\n    RUN(\"iconColor\", \"#ff0000\\n\");\n\n    RUN_EXPECT_ERROR(\"iconColor\" << \"BAD_COLOR_NAME\", CommandException);\n    RUN(\"iconColor\", \"#ff0000\\n\");\n\n    RUN(\"iconColor\" << \"\", \"\");\n    RUN(\"iconColor\", QByteArray(defaultSessionColor) + \"\\n\");\n\n    RUN(\"iconColor\" << defaultSessionColor, \"\");\n    RUN(\"iconColor\", QByteArray(defaultSessionColor) + \"\\n\");\n}\n\nvoid Tests::commandIconTag()\n{\n    RUN(\"iconTag\", \"\\n\");\n\n    RUN(\"iconTag\" << \"TEST\", \"\");\n    RUN(\"iconTag\", \"TEST\\n\");\n\n    RUN(\"iconTag\" << \"\", \"\");\n    RUN(\"iconTag\", \"\\n\");\n}\n\nvoid Tests::commandIconTagColor()\n{\n    RUN(\"iconTagColor\", QByteArray(defaultTagColor) + \"\\n\");\n\n    RUN(\"iconTagColor\" << \"red\", \"\");\n    RUN(\"iconTagColor\", \"#ff0000\\n\");\n\n    RUN_EXPECT_ERROR(\"iconTagColor\" << \"BAD_COLOR_NAME\", CommandException);\n    RUN(\"iconTagColor\", \"#ff0000\\n\");\n\n    RUN(\"iconTagColor\" << defaultTagColor, \"\");\n    RUN(\"iconTagColor\", QByteArray(defaultTagColor) + \"\\n\");\n}\n\nvoid Tests::commandLoadTheme()\n{\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"loadTheme\" << \"a non-existent file\", CommandException, \"ScriptError: Failed to read theme\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"loadTheme\" << \".\", CommandException, \"ScriptError: Failed to read theme\");\n\n    {\n        QTemporaryFile tmp;\n        QVERIFY(tmp.open());\n        tmp.write(\"INVALID INI FILE\");\n        tmp.close();\n        RUN_EXPECT_ERROR_WITH_STDERR(\n            \"loadTheme\" << tmp.fileName(), CommandException, \"ScriptError: Failed to parse theme\");\n    }\n\n    {\n        QTemporaryFile tmp;\n        QVERIFY(tmp.open());\n        tmp.write(\"[General]\");\n        tmp.close();\n        RUN(\"loadTheme\" << tmp.fileName(), \"\");\n    }\n\n    // Verify default stylesheets - if there is a syntax error,\n    // application prints a warning which should be captured by tests.\n    {\n        QTemporaryFile tmp;\n        QVERIFY(tmp.open());\n        tmp.write(\"[General]\\nstyle_main_window=true\");\n        tmp.close();\n        RUN(\"loadTheme\" << tmp.fileName(), \"\");\n    }\n}\n\nvoid Tests::commandDateString()\n{\n    const auto dateFormat = \"TEST:yyyy-MM-dd\";\n    const auto dateTime = QDateTime::currentDateTime();\n    const auto today = dateTime.toString(dateFormat);\n    RUN(\"dateString\" << dateFormat, today + \"\\n\");\n}\n\nvoid Tests::commandAfterMilliseconds()\n{\n    const QString script = \"afterMilliseconds(100, function(){ print('TEST'); abort(); });\";\n    RUN(script, \"\");\n    RUN(script + \"sleep(1)\", \"\");\n    RUN(script + \"sleep(200)\", \"TEST\");\n}\n\nvoid Tests::commandAsync()\n{\n    RUN(\"afterMilliseconds(0, function() { print(currentItem()); abort(); }); dialog()\", \"-1\");\n}\n\nvoid Tests::commandFilter()\n{\n    RUN(\"filter\", \"\\n\");\n    RUN(\"filter\" << \"test\", \"\");\n    RUN(\"filter\", \"test\\n\");\n    RUN(\"filter\" << \"another\", \"\");\n    RUN(\"filter\", \"another\\n\");\n    RUN(\"filter\" << \"\", \"\");\n    RUN(\"filter\", \"\\n\");\n\n    // Empty filter() after ESC.\n    RUN(\"filter\" << \"test\", \"\");\n    RUN(\"filter\", \"test\\n\");\n    KEYS(\"ESC\");\n    RUN(\"filter\", \"\\n\");\n}\n\nvoid Tests::commandMimeTypes()\n{\n    RUN(\"eval\" <<\n        \"[mimeText, mimeHtml, mimeUriList, mimeWindowTitle,\"\n        \" mimeItems, mimeItemNotes, mimeOwner, mimeClipboardMode,\"\n        \" mimeCurrentTab, mimeSelectedItems, mimeCurrentItem,\"\n        \" mimeHidden, mimeShortcut, mimeColor, mimeOutputTab]\"\n        ,\n        QByteArray(mimeText.data()) + \"\\n\"\n        + mimeHtml + \"\\n\"\n        + mimeUriList + \"\\n\"\n        + mimeWindowTitle + \"\\n\"\n        + mimeItems + \"\\n\"\n        + mimeItemNotes + \"\\n\"\n        + mimeOwner + \"\\n\"\n        + mimeClipboardMode + \"\\n\"\n        + mimeCurrentTab + \"\\n\"\n        + mimeSelectedItems + \"\\n\"\n        + mimeCurrentItem + \"\\n\"\n        + mimeHidden + \"\\n\"\n        + mimeShortcut + \"\\n\"\n        + mimeColor + \"\\n\"\n        + mimeOutputTab + \"\\n\"\n    );\n}\n\nvoid Tests::commandUnload()\n{\n    // Failure if tab is visible.\n    RUN(\"unload\", \"\");\n\n    const auto tab = testTab(1);\n\n    // Success if tab doesn't exist.\n    RUN(\"unload\" << tab, tab + \"\\n\");\n\n    RUN(\"tab\" << tab << \"add\" << \"A\", \"\");\n    // Success if tab is not visible and editor is not open.\n    RUN(\"unload\" << tab, tab + \"\\n\");\n\n    RUN(\"tab\" << tab << \"add\" << \"B\", \"\");\n    RUN(\"unload\", tab + \"\\n\");\n    // Success if tab is not loaded.\n    RUN(\"unload\", tab + \"\\n\");\n\n    // Success if tab does not exist.\n    RUN(\"unload\" << \"missing-tab\", \"missing-tab\\n\");\n}\n\nvoid Tests::commandForceUnload()\n{\n    RUN(\"forceUnload\", \"\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\"add\" << \"A\", CommandException, \"ScriptError: Invalid tab\");\n\n    KEYS(clipboardBrowserRefreshButtonId << \"Space\");\n    RUN(\"add\" << \"A\", \"\");\n\n    const auto tab = testTab(1);\n    RUN(\"tab\" << tab << \"add\" << \"A\", \"\");\n\n    RUN(\"forceUnload\" << tab, \"\");\n\n    RUN(\"setCurrentTab\" << tab, \"\");\n    RUN_EXPECT_ERROR_WITH_STDERR(\n        \"tab\" << tab << \"add\" << \"B\", CommandException, \"ScriptError: Invalid tab\");\n\n    KEYS(clipboardBrowserRefreshButtonId << \"Space\");\n    RUN(\"add\" << \"B\", \"\");\n}\n\nvoid Tests::commandServerLogAndLogs()\n{\n    const QByteArray data1 = generateData();\n    QRegularExpression re(\"\\\\[[^]]+\\\\] Note <Server-[0-9]+>: \" + QRegularExpression::escape(data1));\n\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n\n    QCOMPARE( run(Args(\"logs\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY( !stdoutActual.isEmpty() );\n    QVERIFY( !QString::fromUtf8(stdoutActual).contains(re) );\n\n    RUN(\"serverLog\" << data1, \"\");\n\n    QCOMPARE( run(Args(\"logs\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY( !stdoutActual.isEmpty() );\n    QVERIFY2( QString::fromUtf8(stdoutActual).contains(re), stdoutActual );\n}\n\nvoid Tests::commandStats()\n{\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"stats\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    QVERIFY( !stdoutActual.isEmpty() );\n    const auto stats = stdoutActual.split('\\n');\n    QVERIFY2( stats.value(0).startsWith(\"TOTAL: \"), stdoutActual);\n    QVERIFY2( stats.contains(\"QApplication: 1\"), stdoutActual);\n    QVERIFY2( stats.contains(\"MainWindow: 1\"), stdoutActual);\n    QVERIFY2( stats.contains(\"tabWidget: 1\"), stdoutActual);\n    QVERIFY2( stats.contains(\"searchBar: 1\"), stdoutActual);\n    QVERIFY2( stats.contains(\"/MainWindow/centralWidget/tabWidget: 1\"), stdoutActual);\n    QVERIFY2( stats.contains(\"/MainWindow/centralWidget/searchBar: 1\"), stdoutActual);\n    QVERIFY2( stats.contains(\"/MainWindow/centralWidget/tabWidget/QStackedWidget/ClipboardBrowserPlaceholder/ClipboardBrowser: 1\"), stdoutActual);\n    QVERIFY2( stats.contains(\"/MainWindow/centralWidget/tabWidget/QStackedWidget/ClipboardBrowserPlaceholder: 1\"), stdoutActual);\n\n    // Verify model stats\n    RUN(\"add\" << \"test_item\", \"\");\n    QCOMPARE( run(Args(\"stats\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    const auto stats2 = stdoutActual.split('\\n');\n    bool hasModelWithDataSize = false;\n    for (const auto &line : stats2) {\n        if (line.startsWith(\"MODEL \")) {\n            QVERIFY2(line.contains(\"rows=\"), line);\n            if (line.contains(\"dataSize=\")) {\n                hasModelWithDataSize = true;\n                // Verify human-readable suffix is present\n                QVERIFY2(line.contains(\" B)\") || line.contains(\" KiB)\") || line.contains(\" MiB)\"), line);\n            }\n        }\n    }\n    QVERIFY2(hasModelWithDataSize, stdoutActual);\n\n    // Verify data directory size\n    bool hasDataDir = false;\n    for (const auto &line : stats2) {\n        if (line.startsWith(\"DATA_DIR \")) {\n            hasDataDir = true;\n            QVERIFY2(line.contains(\"size=\"), line);\n        }\n    }\n    QVERIFY2(hasDataDir, stdoutActual);\n\n    // Verify new stat lines\n    bool hasTabs = false;\n    bool hasCommands = false;\n    bool hasLogFiles = false;\n    for (const auto &line : stats2) {\n        if (line.startsWith(\"TABS: \")) {\n            hasTabs = true;\n            QVERIFY2(line.contains(\"total=\"), line);\n            QVERIFY2(line.contains(\"loaded=\"), line);\n        }\n        if (line.startsWith(\"COMMANDS: \")) {\n            hasCommands = true;\n            QVERIFY2(line.contains(\"automatic=\"), line);\n            QVERIFY2(line.contains(\"script=\"), line);\n        }\n        if (line.startsWith(\"LOG_FILES: \")) {\n            hasLogFiles = true;\n            QVERIFY2(line.contains(\"count=\"), line);\n            QVERIFY2(line.contains(\"size=\"), line);\n        }\n    }\n    QVERIFY2(hasTabs, stdoutActual);\n    QVERIFY2(hasCommands, stdoutActual);\n    QVERIFY2(hasLogFiles, stdoutActual);\n}\n\nvoid Tests::statsQObjectLeak()\n{\n    // Set up items and commands that produce QObjects on selection change:\n    // - inMenu commands trigger context menu rebuilds (updateContextMenu)\n    // - display command triggers runDisplayCommands() on item widget creation\n    // - matchCmd triggers runMenuCommandFilters() on selection change\n    RUN(\"add\" << \"B\" << \"A\", \"\");\n    const auto script = R\"(\n        setCommands([\n            {name: 'cmd1', inMenu: true, shortcuts: ['Ctrl+F1'], cmd: 'copyq add cmd1'},\n            {name: 'cmd2', inMenu: true, globalShortcuts: ['Ctrl+F2'], cmd: 'copyq add cmd2'},\n            {name: 'cmd3', inMenu: true, matchCmd: 'copyq: true', cmd: 'copyq add cmd3'},\n            {name: 'cmd4', display: true, cmd: 'copyq: setData(mimeHtml, data(mimeText))'},\n        ])\n        )\";\n    RUN(script, \"\");\n\n    // Open item preview.\n    KEYS(clipboardBrowserId << \"F7\");\n    RUN(\"preview\", \"true\\n\");\n\n    // Exercise the UI: select items back and forth to trigger menu rebuilds.\n    auto exerciseUI = [&]{\n        RUN(\"selectItems(0)\", \"true\\n\");\n        RUN(\"selectItems(1)\", \"true\\n\");\n        RUN(\"selectItems(0)\", \"true\\n\");\n        RUN(\"selectItems(1)\", \"true\\n\");\n    };\n\n    // Warm up: first pass may allocate lazy-init objects.\n    exerciseUI();\n\n    // Capture baseline QObject count.\n    QByteArray stdoutActual;\n    QByteArray stderrActual;\n    QCOMPARE( run(Args(\"stats\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    const auto baseline = stdoutActual.split('\\n').value(0);\n    QVERIFY2( baseline.startsWith(\"TOTAL: \"), baseline );\n    const int baselineTotal = baseline.mid(7).trimmed().toInt();\n    QVERIFY(baselineTotal > 0);\n\n    // Exercise the same UI interactions again.\n    exerciseUI();\n\n    // Capture QObject count after second pass.\n    QCOMPARE( run(Args(\"stats\"), &stdoutActual, &stderrActual), 0 );\n    QVERIFY2( testStderr(stderrActual), stderrActual );\n    const auto after = stdoutActual.split('\\n').value(0);\n    QVERIFY2( after.startsWith(\"TOTAL: \"), after );\n    const int afterTotal = after.mid(7).trimmed().toInt();\n\n    QVERIFY2(\n        afterTotal <= baselineTotal,\n        QStringLiteral(\"QObject count grew from %1 to %2 — possible leak\")\n            .arg(baselineTotal).arg(afterTotal).toUtf8()\n    );\n}\n\nvoid Tests::chainingCommands()\n{\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add\" << \"C\" << \"B\" << \"A\", \"\");\n    RUN(\"tab\" << tab1 << \"separator\" << \" \" << \"read\" << \"0\" << \"1\" << \"2\", \"A B C\");\n    RUN(\"tab\" << tab1 << \"separator\" << \"\\\\t\" << \"showAt\" << \"read\" << \"0\" << \"1\" << \"2\", \"A\\tB\\tC\");\n\n    // Chain functions without arguments.\n    RUN(\"enable\" << \"disable\" << \"monitoring\", \"false\\n\");\n    RUN(\"if (!monitoring()) enable\" << \"monitoring\", \"true\\n\");\n\n    // Don't treat arguments after \"eval\" as functions.\n    RUN(\"eval\" << \"arguments[1]\" << \"TEST\", \"TEST\");\n    RUN(\"eval\" << \"arguments[1]\" << \"--\" << \"TEST\", \"TEST\");\n}\n\nvoid Tests::insertRemoveItems()\n{\n    const Args args = Args(\"tab\") << testTab(1) << \"separator\" << \",\";\n\n    RUN(args << \"add\" << \"ghi\" << \"abc\", \"\");\n    RUN(args << \"insert\" << \"1\" << \"def\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"abc,def,ghi,,\");\n\n    RUN(args << \"insert\" << \"0\" << \"012\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"012,abc,def,ghi,\");\n\n    RUN(args << \"remove\" << \"0\" << \"2\", \"\");\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"abc,ghi,,,\");\n\n    QByteArray in(\"ABC\");\n    QCOMPARE( run(Args(args) << \"insert\" << \"1\" << \"-\", nullptr, nullptr, in), 0);\n    RUN(args << \"read\" << \"0\" << \"1\" << \"2\" << \"3\" << \"4\", \"abc,ABC,ghi,,\");\n}\n\nvoid Tests::handleUnexpectedTypes()\n{\n    RUN(\"add(version)\", \"\");\n    RUN(\"add([version])\", \"\");\n    RUN(\"add({version: version})\", \"\");\n}\n"
  },
  {
    "path": "src/tests/tests_slow_clipboard.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/log.h\"\n#include \"common/sleeptimer.h\"\n#include \"platform/platformclipboard.h\"\n#include \"platform/platformnativeinterface.h\"\n\n#include <QMimeData>\n\nnamespace {\n\nclass SlowMimeData final : public QMimeData {\npublic:\n    explicit SlowMimeData(const QByteArray &data, int delayMs)\n        : m_data(data)\n        , m_delayMs(delayMs)\n    {}\n\n    bool hasFormat(const QString &mimeType) const override\n    {\n        return formats().contains(mimeType);\n    }\n\n    QStringList formats() const override\n    {\n        return {\"a/a\", \"b/b\", \"c/c\"};\n    }\n\nprotected:\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    QVariant retrieveData(const QString &mimeType, QMetaType) const override\n#else\n    QVariant retrieveData(const QString &mimeType, QVariant::Type) const override\n#endif\n    {\n        if (formats().contains(mimeType)) {\n            waitFor(m_delayMs);\n            return m_data;\n        }\n        return {};\n    }\nprivate:\n    QByteArray m_data;\n    int m_delayMs;\n};\n\n} // namespace\n\nvoid Tests::slowClipboard()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_SLOW_CLIPBOARD\");\n\n    const auto script = R\"(\n        setCommands([\n            {\n                isScript: true,\n                cmd: 'global.clipboardFormatsToSave = function() { return [\"a/a\", \"b/b\", \"c/c\"] }'\n            },\n        ])\n        )\";\n    RUN(script, \"\");\n    WAIT_ON_OUTPUT(\"clipboardFormatsToSave\", \"a/a\\nb/b\\nc/c\\n\");\n\n    TEST( m_test->setClipboard(\"A\", \"a/a\") );\n    WAIT_ON_OUTPUT(\"clipboard\" << \"a/a\", \"A\");\n\n    auto clipboard = platformNativeInterface()->clipboard();\n    for (int i = 0; i < 3; ++i) {\n        QMimeData *data = new SlowMimeData(QByteArray::number(i), i == 2 ? 100 : 1000);\n        clipboard->setRawData(ClipboardMode::Clipboard, data);\n        waitFor(50);\n    }\n    WAIT_ON_OUTPUT(\"read('a/a', 0, 1, 2, 3)\", \"2\\nA\\n\\n\");\n    RUN(\"read('b/b', 0)\", \"2\");\n    RUN(\"read('c/c', 0)\", \"2\");\n    RUN(\"read('?', 0)\", \"a/a\\nb/b\\nc/c\\n\");\n\n    QMimeData *data = new SlowMimeData(\"X\", 1500);\n    clipboard->setRawData(ClipboardMode::Clipboard, data);\n    waitFor(2000);\n    const auto expectedLog = R\"(^.*<cmd/monitorClipboard-\\d+>: Aborting clipboard cloning: Data access took too long$)\";\n    QTRY_COMPARE( count(splitLines(readLogFile(maxReadLogSize)), expectedLog), 1 );\n\n    TEST( m_test->setClipboard(\"B\", \"a/a\") );\n    WAIT_ON_OUTPUT(\"clipboard\" << \"a/a\", \"B\");\n    RUN(\"read('a/a', 0, 1, 2, 3)\", \"B\\n2\\nA\\n\");\n}\n"
  },
  {
    "path": "src/tests/tests_tray.cpp",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n\n#include \"test_utils.h\"\n#include \"tests.h\"\n#include \"tests_common.h\"\n\n#include \"common/sleeptimer.h\"\n\n// WORKAROUND: Checking clipboard right after closing menu gets stuck on OS X.\n#define ACTIVATE_MENU_ITEM(MENU_ID, WIDGET_ID, CONTENT) \\\n    KEYS(MENU_ID << \"ENTER\"); \\\n    KEYS(WIDGET_ID); \\\n    WAIT_FOR_CLIPBOARD(CONTENT)\n\nvoid Tests::tray()\n{\n    RUN(\"add\" << \"A\", \"\");\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"A\");\n}\n\nvoid Tests::menu()\n{\n    const auto tab = testTab(1);\n\n    RUN(\"tab\" << tab << \"add\" << \"D\" << \"C\" << \"B\" << \"A\", \"\");\n\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\" << tab, \"\");\n    ACTIVATE_MENU_ITEM(menuId, clipboardBrowserId, \"A\");\n\n    // Show menu with 2 items from the tab and select last one.\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\" << tab << \"2\", \"\");\n    KEYS(menuId << \"END\");\n    ACTIVATE_MENU_ITEM(menuId, clipboardBrowserId, \"B\");\n\n#ifdef Q_OS_MAC\n    SKIP(\"Number keys don't seem to work in the tray menu on macOS.\");\n#endif\n\n    // Select item by row number.\n    RUN(\"tab\" << tab << \"add(3,2,1,0)\", \"\");\n    RUN(\"menu\" << tab, \"\");\n    KEYS(menuId << \"3\" << clipboardBrowserId);\n    WAIT_FOR_CLIPBOARD(\"2\");\n\n    // Select item by index.\n    RUN(\"config\" << \"row_index_from_one\" << \"false\", \"false\\n\");\n    RUN(\"tab\" << tab << \"add(3,2,1,0)\", \"\");\n    RUN(\"menu\" << tab, \"\");\n    KEYS(menuId << \"3\" << clipboardBrowserId);\n    WAIT_FOR_CLIPBOARD(\"3\");\n}\n\nvoid Tests::traySearch()\n{\n    RUN(\"add\" << \"C\" << \"B\" << \"A\", \"\");\n\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    KEYS(trayMenuId << \"B\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"B\");\n}\n\nvoid Tests::trayPaste()\n{\n    RUN(\"config\" << \"tray_tab_is_current\" << \"false\", \"false\\n\");\n\n    const auto tab1 = testTab(1);\n    RUN(\"setCurrentTab\" << tab1, \"\");\n    KEYS(clipboardBrowserId << \"CTRL+N\" << editorId << \":NEW \");\n\n    RUN(\"add\" << \"TEST\", \"\");\n    KEYS(editorId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, editorId, \"TEST\");\n    waitFor(waitMsPasteClipboard);\n\n    KEYS(editorId << \"F2\");\n    RUN(\"tab\" << tab1 << \"read\" << \"0\", \"NEW TEST\");\n\n    KEYS(clipboardBrowserId << \"CTRL+N\" << editorId << \":NEW \");\n\n    RUN(\"config\" << \"tray_item_paste\" << \"false\", \"false\\n\");\n    RUN(\"add\" << \"TEST2\", \"\");\n    KEYS(editorId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, editorId, \"TEST2\");\n\n    KEYS(editorId << \"F2\");\n    RUN(\"tab\" << tab1 << \"read\" << \"0\", \"NEW \");\n}\n\nvoid Tests::trayShowHideAction()\n{\n#ifdef Q_OS_MAC\n    SKIP(\"Tests seem unable to trigger Show/Hide from tray on macOS\");\n#endif\n\n    // Test Show/Hide action from tray menu:\n    // The main window should be hide even if unfocused.\n    RUN(\"visible\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"focused\", \"true\\n\");\n\n    // Unfocus the main window by focusing a dialog\n    RUN(\"action('copyq:dialog()')\", \"\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"focused\", \"false\\n\");\n\n    // Trigger &Show/Hide\n    RUN(\"menu\", \"\");\n    KEYS(trayMenuId << \"S\");\n    WAIT_ON_OUTPUT(\"visible\", \"false\\n\");\n    WAIT_ON_OUTPUT(\"focused\", \"false\\n\");\n\n    RUN(\"menu\", \"\");\n    KEYS(trayMenuId << \"S\");\n    WAIT_ON_OUTPUT(\"visible\", \"true\\n\");\n    WAIT_ON_OUTPUT(\"focused\", \"true\\n\");\n}\n\nvoid Tests::configTrayTab()\n{\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add\" << \"A\", \"\");\n\n    const auto tab2 = testTab(2);\n    RUN(\"tab\" << tab2 << \"add\" << \"B\", \"\");\n\n    RUN(\"config\" << \"tray_tab_is_current\" << \"false\", \"false\\n\");\n\n    RUN(\"config\" << \"tray_item_paste\" << \"false\", \"false\\n\");\n\n    RUN(\"config\" << \"tray_tab\" << tab1, tab1 + \"\\n\");\n\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"A\");\n\n    RUN(\"config\" << \"tray_tab\" << tab2, tab2 + \"\\n\");\n\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"B\");\n}\n\nvoid Tests::configMove()\n{\n    SKIP_ON_ENV(\"COPYQ_TESTS_SKIP_CONFIG_MOVE\");\n\n    RUN(\"add\" << \"B\" << \"A\", \"\");\n\n    RUN(\"config\" << \"tray_item_paste\" << \"false\", \"false\\n\");\n\n    RUN(\"config\" << \"move\" << \"true\", \"true\\n\");\n\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    KEYS(trayMenuId << \"DOWN\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"B\");\n    RUN(\"read\" << \"0\" << \"1\", \"B\\nA\");\n\n    RUN(\"config\" << \"move\" << \"false\", \"false\\n\");\n\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    KEYS(trayMenuId << \"DOWN\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"A\");\n    RUN(\"read\" << \"0\" << \"1\", \"B\\nA\");\n}\n\nvoid Tests::configTrayTabIsCurrent()\n{\n    const auto tab1 = testTab(1);\n    RUN(\"tab\" << tab1 << \"add\" << \"A\", \"\");\n\n    const auto tab2 = testTab(2);\n    RUN(\"tab\" << tab2 << \"add\" << \"B\", \"\");\n\n    RUN(\"config\" << \"tray_tab_is_current\" << \"true\", \"true\\n\");\n\n    RUN(\"setCurrentTab\" << tab1, \"\");\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"A\");\n\n    RUN(\"setCurrentTab\" << tab2, \"\");\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"B\");\n}\n\nvoid Tests::trayMenuToggleRapid()\n{\n    RUN(\"add\" << \"X\" << \"Y\" << \"Z\", \"\");\n\n    // Verify the menu can be opened, closed, and reopened reliably.\n    // Regression test for #3445: on macOS, the first shortcut press\n    // failed to show the menu due to deferred focus-stealing.\n    for (int i = 0; i < 3; ++i) {\n        KEYS(clipboardBrowserId);\n        RUN(\"menu\", \"\");\n        KEYS(trayMenuId << \"ESCAPE\");\n    }\n\n    // Final open + activate to confirm the menu is functional.\n    KEYS(clipboardBrowserId);\n    RUN(\"menu\", \"\");\n    ACTIVATE_MENU_ITEM(trayMenuId, clipboardBrowserId, \"Z\");\n}\n"
  },
  {
    "path": "src/ui/aboutdialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>AboutDialog</class>\n <widget class=\"QDialog\" name=\"AboutDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>514</width>\n    <height>694</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>About</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"spacing\">\n    <number>0</number>\n   </property>\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=\"QTextBrowser\" name=\"textBrowser\">\n     <property name=\"undoRedoEnabled\">\n      <bool>false</bool>\n     </property>\n     <property name=\"readOnly\">\n      <bool>true</bool>\n     </property>\n     <property name=\"acceptRichText\">\n      <bool>false</bool>\n     </property>\n     <property name=\"textInteractionFlags\">\n      <set>Qt::TextBrowserInteraction</set>\n     </property>\n     <property name=\"openExternalLinks\">\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::Close</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources>\n  <include location=\"../copyq.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>AboutDialog</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>AboutDialog</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/actiondialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ActionDialog</class>\n <widget class=\"QDialog\" name=\"ActionDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>356</width>\n    <height>353</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Action Dialog</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QComboBox\" name=\"comboBoxCommands\">\n     <property name=\"insertPolicy\">\n      <enum>QComboBox::NoInsert</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label_2\">\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>Co&amp;mmand:</string>\n     </property>\n     <property name=\"buddy\">\n      <cstring>commandEdit</cstring>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"CommandEdit\" name=\"commandEdit\" native=\"true\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::WheelFocus</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout_3\">\n     <property name=\"verticalSpacing\">\n      <number>0</number>\n     </property>\n     <property name=\"bottomMargin\">\n      <number>0</number>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Standard &amp;input:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>comboBoxInputFormat</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Store standard o&amp;utput:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>comboBoxOutputFormat</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"comboBoxInputFormat\">\n       <property name=\"toolTip\">\n        <string>Send data of given media type to standard input of command (leave empty to turn off)</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"comboBoxOutputFormat\">\n       <property name=\"toolTip\">\n        <string>Create items from standard output of the program (leave empty to turn off)</string>\n       </property>\n       <property name=\"editable\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"0\" colspan=\"2\">\n      <widget class=\"QPlainTextEdit\" name=\"inputText\">\n       <property name=\"tabChangesFocus\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item row=\"3\" column=\"0\">\n      <widget class=\"QLabel\" name=\"separatorLabel\">\n       <property name=\"text\">\n        <string>&amp;Separator for new items:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>separatorEdit</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"3\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"separatorEdit\">\n       <property name=\"toolTip\">\n        <string>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</string>\n       </property>\n       <property name=\"text\">\n        <string>\\n</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"4\" column=\"0\">\n      <widget class=\"QLabel\" name=\"labelOutputTab\">\n       <property name=\"text\">\n        <string>Output &amp;tab:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>comboBoxOutputTab</cstring>\n       </property>\n      </widget>\n     </item>\n     <item row=\"4\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"comboBoxOutputTab\">\n       <property name=\"toolTip\">\n        <string>Save items in tab with given name (leave empty to save in the current tab)</string>\n       </property>\n       <property name=\"editable\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\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::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>CommandEdit</class>\n   <extends>QWidget</extends>\n   <header>gui/commandedit.h</header>\n   <container>1</container>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>comboBoxCommands</tabstop>\n  <tabstop>commandEdit</tabstop>\n  <tabstop>comboBoxInputFormat</tabstop>\n  <tabstop>inputText</tabstop>\n  <tabstop>comboBoxOutputFormat</tabstop>\n  <tabstop>separatorEdit</tabstop>\n  <tabstop>comboBoxOutputTab</tabstop>\n  <tabstop>buttonBox</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ActionDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>275</x>\n     <y>349</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>ActionDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>275</x>\n     <y>364</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>updateMinimalGeometry()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "src/ui/actionhandlerdialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ActionHandlerDialog</class>\n <widget class=\"QDialog\" name=\"ActionHandlerDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Process Manager</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLineEdit\" name=\"filterLineEdit\">\n       <property name=\"placeholderText\">\n        <string>Filter</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"terminateButton\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"text\">\n        <string>&amp;Terminate Selected</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QTableView\" name=\"tableView\">\n     <property name=\"alternatingRowColors\">\n      <bool>true</bool>\n     </property>\n     <property name=\"sortingEnabled\">\n      <bool>true</bool>\n     </property>\n     <attribute name=\"horizontalHeaderStretchLastSection\">\n      <bool>true</bool>\n     </attribute>\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::Close</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>ActionHandlerDialog</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>ActionHandlerDialog</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/addcommanddialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>AddCommandDialog</class>\n <widget class=\"QDialog\" name=\"AddCommandDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>388</width>\n    <height>288</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Add Commands</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLineEdit\" name=\"lineEditFilter\"/>\n   </item>\n   <item>\n    <widget class=\"QListView\" name=\"listViewCommands\">\n     <property name=\"selectionMode\">\n      <enum>QAbstractItemView::ExtendedSelection</enum>\n     </property>\n     <property name=\"isWrapping\" stdset=\"0\">\n      <bool>true</bool>\n     </property>\n     <property name=\"resizeMode\">\n      <enum>QListView::Adjust</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\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>AddCommandDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>20</x>\n     <y>20</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>20</x>\n     <y>20</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>AddCommandDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>20</x>\n     <y>20</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>20</x>\n     <y>20</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "src/ui/clipboarddialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ClipboardDialog</class>\n <widget class=\"QDialog\" name=\"ClipboardDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\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=\"windowTitle\">\n   <string>Clipboard Content</string>\n  </property>\n  <layout class=\"QGridLayout\" name=\"gridLayout\">\n   <item row=\"2\" column=\"0\">\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Close</set>\n     </property>\n    </widget>\n   </item>\n   <item row=\"0\" column=\"0\">\n    <widget class=\"QSplitter\" name=\"horizontalLayout\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"opaqueResize\">\n      <bool>true</bool>\n     </property>\n     <property name=\"childrenCollapsible\">\n      <bool>true</bool>\n     </property>\n     <widget class=\"QGroupBox\" name=\"group1\">\n      <property name=\"flat\">\n       <bool>true</bool>\n      </property>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_1\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\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=\"QLabel\" name=\"label\">\n         <property name=\"text\">\n          <string>&amp;Formats:</string>\n         </property>\n         <property name=\"buddy\">\n          <cstring>listWidgetFormats</cstring>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QListWidget\" name=\"listWidgetFormats\">\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::ActionsContextMenu</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QGroupBox\" name=\"group2\">\n      <property name=\"flat\">\n       <bool>true</bool>\n      </property>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\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=\"QLabel\" name=\"labelContent\">\n         <property name=\"text\">\n          <string>C&amp;ontent:</string>\n         </property>\n         <property name=\"buddy\">\n          <cstring>textEdit</cstring>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPlainTextEdit\" name=\"textEdit\">\n         <property name=\"documentTitle\">\n          <string notr=\"true\"/>\n         </property>\n         <property name=\"undoRedoEnabled\">\n          <bool>false</bool>\n         </property>\n         <property name=\"lineWrapMode\">\n          <enum>QPlainTextEdit::NoWrap</enum>\n         </property>\n         <property name=\"readOnly\">\n          <bool>true</bool>\n         </property>\n         <property name=\"plainText\">\n          <string notr=\"true\"/>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QScrollArea\" name=\"scrollAreaImage\">\n         <property name=\"widgetResizable\">\n          <bool>true</bool>\n         </property>\n         <widget class=\"QWidget\" name=\"scrollAreaWidgetContents\">\n          <property name=\"geometry\">\n           <rect>\n            <x>0</x>\n            <y>0</y>\n            <width>77</width>\n            <height>68</height>\n           </rect>\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=\"QLabel\" name=\"labelImage\">\n             <property name=\"text\">\n              <string/>\n             </property>\n             <property name=\"textFormat\">\n              <enum>Qt::PlainText</enum>\n             </property>\n             <property name=\"alignment\">\n              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n             </property>\n             <property name=\"textInteractionFlags\">\n              <set>Qt::TextSelectableByMouse</set>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"labelProperties\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string/>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n  <action name=\"actionRemove_Format\">\n   <property name=\"text\">\n    <string>Remove Format</string>\n   </property>\n  </action>\n </widget>\n <tabstops>\n  <tabstop>listWidgetFormats</tabstop>\n  <tabstop>buttonBox</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ClipboardDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>257</x>\n     <y>290</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>ClipboardDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>325</x>\n     <y>290</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/commanddialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CommandDialog</class>\n <widget class=\"QDialog\" name=\"CommandDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>634</width>\n    <height>474</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Commands</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"label_11\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"text\">\n      <string>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"ItemOrderList\" name=\"itemOrderListCommands\" native=\"true\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n       <horstretch>0</horstretch>\n       <verstretch>1</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"focusPolicy\">\n      <enum>Qt::WheelFocus</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>&amp;Find:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>lineEditFilterCommands</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"lineEditFilterCommands\"/>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"pushButtonLoadCommands\">\n       <property name=\"text\">\n        <string>&amp;Load Commands…</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"pushButtonSaveCommands\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"text\">\n        <string>Sa&amp;ve Selected…</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"pushButtonCopyCommands\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"text\">\n        <string>Copy Selected</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"pushButtonPasteCommands\">\n       <property name=\"text\">\n        <string>Paste Commands</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\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::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>ItemOrderList</class>\n   <extends>QWidget</extends>\n   <header>gui/itemorderlist.h</header>\n   <container>1</container>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>CommandDialog</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>CommandDialog</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/commandedit.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CommandEdit</class>\n <widget class=\"QWidget\" name=\"CommandEdit\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>396</width>\n    <height>296</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"MinimumExpanding\">\n    <horstretch>1</horstretch>\n    <verstretch>1</verstretch>\n   </sizepolicy>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"spacing\">\n    <number>0</number>\n   </property>\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=\"QPlainTextEdit\" name=\"plainTextEditCommand\">\n     <property name=\"tabChangesFocus\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"CommandHelpButton\" name=\"helpButton\" native=\"true\"/>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"labelErrors\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>CommandHelpButton</class>\n   <extends>QWidget</extends>\n   <header>gui/commandhelpbutton.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/commandwidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CommandWidget</class>\n <widget class=\"QWidget\" name=\"CommandWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>453</width>\n    <height>655</height>\n   </rect>\n  </property>\n  <property name=\"focusPolicy\">\n   <enum>Qt::WheelFocus</enum>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <property name=\"spacing\">\n    <number>4</number>\n   </property>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_3\">\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>&amp;Name:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>lineEditName</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"lineEditName\">\n       <property name=\"toolTip\">\n        <string>Command name shown in menu</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"IconSelectButton\" name=\"buttonIcon\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QWidget\" name=\"widgetCommandType\" native=\"true\">\n     <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n      <item>\n       <widget class=\"QLabel\" name=\"label_2\">\n        <property name=\"text\">\n         <string>Type:</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QToolButton\" name=\"toolButtonAutomatic\">\n        <property name=\"toolTip\">\n         <string>Run the command automatically if clipboard has new content</string>\n        </property>\n        <property name=\"text\">\n         <string extracomment=\"Type of command; triggered by whenever clipboard changes\">Auto&amp;matic</string>\n        </property>\n        <property name=\"checkable\">\n         <bool>true</bool>\n        </property>\n        <property name=\"toolButtonStyle\">\n         <enum>Qt::ToolButtonTextBesideIcon</enum>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QToolButton\" name=\"toolButtonInMenu\">\n        <property name=\"toolTip\">\n         <string>Show command in context menu of matching items</string>\n        </property>\n        <property name=\"text\">\n         <string extracomment=\"Type of command; triggered by a custom application shortcut\">In M&amp;enu</string>\n        </property>\n        <property name=\"checkable\">\n         <bool>true</bool>\n        </property>\n        <property name=\"toolButtonStyle\">\n         <enum>Qt::ToolButtonTextBesideIcon</enum>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QToolButton\" name=\"toolButtonGlobalShortcut\">\n        <property name=\"text\">\n         <string extracomment=\"Type of command; triggered by a custom global/system shortcut\">Global Shortcut</string>\n        </property>\n        <property name=\"checkable\">\n         <bool>true</bool>\n        </property>\n        <property name=\"toolButtonStyle\">\n         <enum>Qt::ToolButtonTextBesideIcon</enum>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QToolButton\" name=\"toolButtonIsScript\">\n        <property name=\"text\">\n         <string extracomment=\"Type of command; allows to extend scripting capabilities\">Script</string>\n        </property>\n        <property name=\"checkable\">\n         <bool>true</bool>\n        </property>\n        <property name=\"toolButtonStyle\">\n         <enum>Qt::ToolButtonTextBesideIcon</enum>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QToolButton\" name=\"toolButtonDisplay\">\n        <property name=\"text\">\n         <string extracomment=\"Type of command; allows change how items are displayed\">Display</string>\n        </property>\n        <property name=\"checkable\">\n         <bool>true</bool>\n        </property>\n        <property name=\"toolButtonStyle\">\n         <enum>Qt::ToolButtonTextBesideIcon</enum>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <spacer name=\"horizontalSpacer_4\">\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     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QWidget\" name=\"widgetMenuShortcut\" native=\"true\">\n     <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n      <item>\n       <widget class=\"QLabel\" name=\"labelShortcut\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"text\">\n         <string>&amp;Shortcut:</string>\n        </property>\n        <property name=\"buddy\">\n         <cstring>shortcutButton</cstring>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"ShortcutButton\" name=\"shortcutButton\" native=\"true\">\n        <property name=\"focusPolicy\">\n         <enum>Qt::WheelFocus</enum>\n        </property>\n       </widget>\n      </item>\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     </layout>\n     <zorder>shortcutButton</zorder>\n     <zorder>labelShortcut</zorder>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QWidget\" name=\"widgetGlobalShortcut\" native=\"true\">\n     <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n      <item>\n       <widget class=\"QLabel\" name=\"label\">\n        <property name=\"text\">\n         <string>&amp;Global Shortcut:</string>\n        </property>\n        <property name=\"buddy\">\n         <cstring>shortcutButtonGlobalShortcut</cstring>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"ShortcutButton\" name=\"shortcutButtonGlobalShortcut\" native=\"true\">\n        <property name=\"focusPolicy\">\n         <enum>Qt::WheelFocus</enum>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <spacer name=\"horizontalSpacer_2\">\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     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n       <horstretch>0</horstretch>\n       <verstretch>1</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <property name=\"tabBarAutoHide\">\n      <bool>true</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"tab\">\n      <attribute name=\"title\">\n       <string>Comman&amp;d</string>\n      </attribute>\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       <item>\n        <widget class=\"CommandEdit\" name=\"commandEdit\" native=\"true\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>1</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::WheelFocus</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tabAdvanced\">\n      <attribute name=\"title\">\n       <string>&amp;Advanced</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\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=\"QScrollArea\" name=\"scrollArea\">\n         <property name=\"widgetResizable\">\n          <bool>true</bool>\n         </property>\n         <widget class=\"QWidget\" name=\"scrollAreaWidgetContents\">\n          <property name=\"geometry\">\n           <rect>\n            <x>0</x>\n            <y>0</y>\n            <width>437</width>\n            <height>412</height>\n           </rect>\n          </property>\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n           <item>\n            <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n             <item alignment=\"Qt::AlignTop\">\n              <widget class=\"QGroupBox\" name=\"groupBoxMatchItems\">\n               <property name=\"sizePolicy\">\n                <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n                 <horstretch>1</horstretch>\n                 <verstretch>0</verstretch>\n                </sizepolicy>\n               </property>\n               <property name=\"title\">\n                <string>Match Items</string>\n               </property>\n               <layout class=\"QFormLayout\" name=\"formLayout_2\">\n                <property name=\"horizontalSpacing\">\n                 <number>2</number>\n                </property>\n                <property name=\"verticalSpacing\">\n                 <number>2</number>\n                </property>\n                <property name=\"leftMargin\">\n                 <number>4</number>\n                </property>\n                <property name=\"topMargin\">\n                 <number>4</number>\n                </property>\n                <property name=\"rightMargin\">\n                 <number>4</number>\n                </property>\n                <property name=\"bottomMargin\">\n                 <number>4</number>\n                </property>\n                <item row=\"0\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"label_4\">\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>&amp;Content:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>lineEditMatch</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"0\" column=\"1\">\n                 <widget class=\"QLineEdit\" name=\"lineEditMatch\">\n                  <property name=\"toolTip\">\n                   <string>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</string>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"1\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"labelWindow\">\n                  <property name=\"text\">\n                   <string>&amp;Window:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>lineEditWindow</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"1\" column=\"1\">\n                 <widget class=\"QLineEdit\" name=\"lineEditWindow\">\n                  <property name=\"toolTip\">\n                   <string>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</string>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"2\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"label_7\">\n                  <property name=\"text\">\n                   <string>For&amp;mat:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>comboBoxInputFormat</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"2\" column=\"1\">\n                 <widget class=\"QComboBox\" name=\"comboBoxInputFormat\">\n                  <property name=\"sizePolicy\">\n                   <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Fixed\">\n                    <horstretch>0</horstretch>\n                    <verstretch>0</verstretch>\n                   </sizepolicy>\n                  </property>\n                  <property name=\"toolTip\">\n                   <string>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</string>\n                  </property>\n                  <property name=\"editable\">\n                   <bool>true</bool>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"3\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"label_9\">\n                  <property name=\"text\">\n                   <string>&amp;Filter:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>lineEditMatchCmd</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"3\" column=\"1\">\n                 <widget class=\"CommandEdit\" name=\"lineEditMatchCmd\" native=\"true\">\n                  <property name=\"sizePolicy\">\n                   <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n                    <horstretch>0</horstretch>\n                    <verstretch>1</verstretch>\n                   </sizepolicy>\n                  </property>\n                  <property name=\"focusPolicy\">\n                   <enum>Qt::WheelFocus</enum>\n                  </property>\n                  <property name=\"toolTip\">\n                   <string>Skips the command if the filter command fails with non-zero exit code.</string>\n                  </property>\n                 </widget>\n                </item>\n               </layout>\n              </widget>\n             </item>\n            </layout>\n           </item>\n           <item>\n            <widget class=\"QGroupBox\" name=\"groupBoxAction\">\n             <property name=\"title\">\n              <string>Action</string>\n             </property>\n             <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n              <property name=\"leftMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"topMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"rightMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"bottomMargin\">\n               <number>4</number>\n              </property>\n              <item>\n               <layout class=\"QFormLayout\" name=\"formLayout_4\">\n                <property name=\"fieldGrowthPolicy\">\n                 <enum>QFormLayout::AllNonFixedFieldsGrow</enum>\n                </property>\n                <item row=\"0\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"label_6\">\n                  <property name=\"text\">\n                   <string>Cop&amp;y to tab:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>comboBoxCopyToTab</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"0\" column=\"1\">\n                 <widget class=\"QComboBox\" name=\"comboBoxCopyToTab\">\n                  <property name=\"toolTip\">\n                   <string>Name of tab to copy new items into (leave empty not to copy)</string>\n                  </property>\n                  <property name=\"editable\">\n                   <bool>true</bool>\n                  </property>\n                 </widget>\n                </item>\n               </layout>\n              </item>\n              <item>\n               <widget class=\"QCheckBox\" name=\"checkBoxIgnore\">\n                <property name=\"toolTip\">\n                 <string>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</string>\n                </property>\n                <property name=\"text\">\n                 <string>&amp;Remove Item</string>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QGroupBox\" name=\"groupBoxInMenu\">\n             <property name=\"title\">\n              <string>Menu Action</string>\n             </property>\n             <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n              <property name=\"spacing\">\n               <number>2</number>\n              </property>\n              <property name=\"leftMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"topMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"rightMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"bottomMargin\">\n               <number>4</number>\n              </property>\n              <item>\n               <widget class=\"QCheckBox\" name=\"checkBoxHideWindow\">\n                <property name=\"toolTip\">\n                 <string>Hide window after command is activated from context menu of an item</string>\n                </property>\n                <property name=\"text\">\n                 <string>&amp;Hide main window after activation</string>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QGroupBox\" name=\"groupBoxCommandOptions\">\n             <property name=\"title\">\n              <string>Command options</string>\n             </property>\n             <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n              <property name=\"spacing\">\n               <number>2</number>\n              </property>\n              <property name=\"leftMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"topMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"rightMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"bottomMargin\">\n               <number>4</number>\n              </property>\n              <item>\n               <layout class=\"QFormLayout\" name=\"formLayout\">\n                <property name=\"fieldGrowthPolicy\">\n                 <enum>QFormLayout::AllNonFixedFieldsGrow</enum>\n                </property>\n                <property name=\"verticalSpacing\">\n                 <number>2</number>\n                </property>\n                <item row=\"1\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"label_8\">\n                  <property name=\"text\">\n                   <string>O&amp;utput:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>comboBoxOutputFormat</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"1\" column=\"1\">\n                 <widget class=\"QComboBox\" name=\"comboBoxOutputFormat\">\n                  <property name=\"toolTip\">\n                   <string>Create items from standard output of the program (leave empty to disable)</string>\n                  </property>\n                  <property name=\"editable\">\n                   <bool>true</bool>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"2\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"separatorLabel\">\n                  <property name=\"text\">\n                   <string>&amp;Separator:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>lineEditSeparator</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"2\" column=\"1\">\n                 <widget class=\"QLineEdit\" name=\"lineEditSeparator\">\n                  <property name=\"toolTip\">\n                   <string>Separator to match for splitting the output to multiple items</string>\n                  </property>\n                  <property name=\"text\">\n                   <string>\\n</string>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"3\" column=\"0\">\n                 <widget class=\"QLabel\" name=\"labelOutputTab\">\n                  <property name=\"text\">\n                   <string>Output &amp;tab:</string>\n                  </property>\n                  <property name=\"buddy\">\n                   <cstring>comboBoxOutputTab</cstring>\n                  </property>\n                 </widget>\n                </item>\n                <item row=\"3\" column=\"1\">\n                 <widget class=\"QComboBox\" name=\"comboBoxOutputTab\">\n                  <property name=\"toolTip\">\n                   <string>Save items in tab with given name (leave empty to save in first tab)</string>\n                  </property>\n                  <property name=\"editable\">\n                   <bool>true</bool>\n                  </property>\n                 </widget>\n                </item>\n               </layout>\n              </item>\n              <item>\n               <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n                <property name=\"spacing\">\n                 <number>16</number>\n                </property>\n                <item>\n                 <widget class=\"QCheckBox\" name=\"checkBoxWait\">\n                  <property name=\"toolTip\">\n                   <string>Show action dialog before executing the command</string>\n                  </property>\n                  <property name=\"text\">\n                   <string>&amp;Wait</string>\n                  </property>\n                 </widget>\n                </item>\n                <item>\n                 <widget class=\"QCheckBox\" name=\"checkBoxTransform\">\n                  <property name=\"toolTip\">\n                   <string>Change item, don't create any new items</string>\n                  </property>\n                  <property name=\"text\">\n                   <string>Tr&amp;ansform</string>\n                  </property>\n                 </widget>\n                </item>\n               </layout>\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>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"labelDescription\">\n     <property name=\"text\">\n      <string/>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\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>0</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QWidget\" name=\"widget\" native=\"true\">\n     <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n      <item>\n       <spacer name=\"horizontalSpacer_3\">\n        <property name=\"orientation\">\n         <enum>Qt::Horizontal</enum>\n        </property>\n        <property name=\"sizeHint\" stdset=\"0\">\n         <size>\n          <width>134</width>\n          <height>20</height>\n         </size>\n        </property>\n       </spacer>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxShowAdvanced\">\n        <property name=\"text\">\n         <string>Show Advanced</string>\n        </property>\n        <property name=\"checked\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>CommandEdit</class>\n   <extends>QWidget</extends>\n   <header>gui/commandedit.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>IconSelectButton</class>\n   <extends>QToolButton</extends>\n   <header>gui/iconselectbutton.h</header>\n  </customwidget>\n  <customwidget>\n   <class>ShortcutButton</class>\n   <extends>QWidget</extends>\n   <header>gui/shortcutbutton.h</header>\n   <container>1</container>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>lineEditName</tabstop>\n  <tabstop>buttonIcon</tabstop>\n  <tabstop>toolButtonAutomatic</tabstop>\n  <tabstop>toolButtonInMenu</tabstop>\n  <tabstop>toolButtonGlobalShortcut</tabstop>\n  <tabstop>toolButtonIsScript</tabstop>\n  <tabstop>toolButtonDisplay</tabstop>\n  <tabstop>shortcutButton</tabstop>\n  <tabstop>shortcutButtonGlobalShortcut</tabstop>\n  <tabstop>tabWidget</tabstop>\n  <tabstop>lineEditMatch</tabstop>\n  <tabstop>lineEditWindow</tabstop>\n  <tabstop>comboBoxInputFormat</tabstop>\n  <tabstop>lineEditMatchCmd</tabstop>\n  <tabstop>comboBoxCopyToTab</tabstop>\n  <tabstop>checkBoxIgnore</tabstop>\n  <tabstop>checkBoxHideWindow</tabstop>\n  <tabstop>comboBoxOutputFormat</tabstop>\n  <tabstop>lineEditSeparator</tabstop>\n  <tabstop>comboBoxOutputTab</tabstop>\n  <tabstop>checkBoxWait</tabstop>\n  <tabstop>checkBoxTransform</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/configtabappearance.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ConfigTabAppearance</class>\n <widget class=\"QWidget\" name=\"ConfigTabAppearance\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>468</width>\n    <height>500</height>\n   </rect>\n  </property>\n  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_10\" stretch=\"0,1\">\n   <item>\n    <widget class=\"QScrollArea\" name=\"scrollAreaTheme\">\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=\"focusPolicy\">\n      <enum>Qt::NoFocus</enum>\n     </property>\n     <property name=\"frameShape\">\n      <enum>QFrame::NoFrame</enum>\n     </property>\n     <property name=\"widgetResizable\">\n      <bool>true</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"scrollAreaThemeContents\">\n      <property name=\"geometry\">\n       <rect>\n        <x>0</x>\n        <y>0</y>\n        <width>271</width>\n        <height>492</height>\n       </rect>\n      </property>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_9\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"gridLayout_6\">\n         <property name=\"spacing\">\n          <number>2</number>\n         </property>\n         <item row=\"9\" column=\"0\">\n          <spacer name=\"verticalSpacer_3\">\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         <item row=\"0\" column=\"1\">\n          <widget class=\"QLabel\" name=\"label_8\">\n           <property name=\"text\">\n            <string>Background</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_38\">\n           <property name=\"text\">\n            <string>Tooltips</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorNotesBg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"3\">\n          <widget class=\"QPushButton\" name=\"pushButtonEditorFont\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorEditorBg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"3\">\n          <widget class=\"QPushButton\" name=\"pushButtonFoundFont\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_35\">\n           <property name=\"text\">\n            <string>Found</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_34\">\n           <property name=\"text\">\n            <string>Selected</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorNotesFg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorFg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorSelBg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorAltBg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorEditorFg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"3\">\n          <widget class=\"QPushButton\" name=\"pushButtonFont\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorSelFg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"3\">\n          <widget class=\"QPushButton\" name=\"pushButtonNotesFont\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"7\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_39\">\n           <property name=\"text\">\n            <string>Number</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_33\">\n           <property name=\"text\">\n            <string>Normal</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_36\">\n           <property name=\"text\">\n            <string>Editor</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"3\">\n          <widget class=\"QLabel\" name=\"label_13\">\n           <property name=\"text\">\n            <string>Font</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorFoundBg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"7\" column=\"3\">\n          <widget class=\"QPushButton\" name=\"pushButtonNumberFont\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorFoundFg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_37\">\n           <property name=\"text\">\n            <string>Alternate</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"2\">\n          <widget class=\"QLabel\" name=\"label_12\">\n           <property name=\"text\">\n            <string>Foreground</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorBg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"7\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorNumberFg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"8\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label\">\n           <property name=\"text\">\n            <string>Notification</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"8\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorNotificationBg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"8\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonColorNotificationFg\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"8\" column=\"3\">\n          <widget class=\"QPushButton\" name=\"pushButtonNotificationFont\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QGridLayout\" name=\"gridLayout_7\">\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QCheckBox\" name=\"checkBoxShowNumber\">\n           <property name=\"text\">\n            <string>Show &amp;Number</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"QCheckBox\" name=\"checkBoxScrollbars\">\n           <property name=\"toolTip\">\n            <string>Show scrollbars</string>\n           </property>\n           <property name=\"text\">\n            <string>S&amp;crollbars</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QCheckBox\" name=\"checkBoxSystemIcons\">\n           <property name=\"toolTip\">\n            <string>Use icons from desktop environment whenever possible</string>\n           </property>\n           <property name=\"text\">\n            <string>S&amp;ystem Icons</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"QCheckBox\" name=\"checkBoxAntialias\">\n           <property name=\"text\">\n            <string>&amp;Antialias</string>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"checkBoxStyleMainWindow\">\n         <property name=\"text\">\n          <string>S&amp;et colors for tabs, tool bar and menus</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_5\">\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       <item>\n        <layout class=\"QGridLayout\" name=\"gridLayout_5\">\n         <item row=\"4\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonResetTheme\">\n           <property name=\"text\">\n            <string>&amp;Reset Theme</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"QLabel\" name=\"label_14\">\n           <property name=\"text\">\n            <string>Theme:</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"pushButtonLoadTheme\">\n           <property name=\"text\">\n            <string>&amp;Load Theme</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonSaveTheme\">\n           <property name=\"text\">\n            <string>&amp;Save Theme</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"2\">\n          <widget class=\"QPushButton\" name=\"pushButtonEditTheme\">\n           <property name=\"toolTip\">\n            <string>Edit current theme in external editor</string>\n           </property>\n           <property name=\"text\">\n            <string>E&amp;dit Theme</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\" colspan=\"2\">\n          <widget class=\"QComboBox\" name=\"comboBoxThemes\"/>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"browserParentLayout\" stretch=\"0\">\n     <property name=\"leftMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"label_15\">\n       <property name=\"text\">\n        <string>Preview:</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>pushButtonColorBg</tabstop>\n  <tabstop>pushButtonColorFg</tabstop>\n  <tabstop>pushButtonFont</tabstop>\n  <tabstop>pushButtonColorSelBg</tabstop>\n  <tabstop>pushButtonColorSelFg</tabstop>\n  <tabstop>pushButtonColorFoundBg</tabstop>\n  <tabstop>pushButtonColorFoundFg</tabstop>\n  <tabstop>pushButtonFoundFont</tabstop>\n  <tabstop>pushButtonColorEditorBg</tabstop>\n  <tabstop>pushButtonColorEditorFg</tabstop>\n  <tabstop>pushButtonEditorFont</tabstop>\n  <tabstop>pushButtonColorAltBg</tabstop>\n  <tabstop>pushButtonColorNotesBg</tabstop>\n  <tabstop>pushButtonColorNotesFg</tabstop>\n  <tabstop>pushButtonNotesFont</tabstop>\n  <tabstop>pushButtonColorNumberFg</tabstop>\n  <tabstop>pushButtonNumberFont</tabstop>\n  <tabstop>pushButtonColorNotificationBg</tabstop>\n  <tabstop>pushButtonColorNotificationFg</tabstop>\n  <tabstop>pushButtonNotificationFont</tabstop>\n  <tabstop>checkBoxShowNumber</tabstop>\n  <tabstop>checkBoxScrollbars</tabstop>\n  <tabstop>checkBoxSystemIcons</tabstop>\n  <tabstop>checkBoxAntialias</tabstop>\n  <tabstop>checkBoxStyleMainWindow</tabstop>\n  <tabstop>comboBoxThemes</tabstop>\n  <tabstop>pushButtonLoadTheme</tabstop>\n  <tabstop>pushButtonSaveTheme</tabstop>\n  <tabstop>pushButtonResetTheme</tabstop>\n  <tabstop>pushButtonEditTheme</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/configtabgeneral.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ConfigTabGeneral</class>\n <widget class=\"QScrollArea\" name=\"ConfigTabGeneral\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>639</width>\n    <height>523</height>\n   </rect>\n  </property>\n  <property name=\"frameShape\">\n   <enum>QFrame::NoFrame</enum>\n  </property>\n  <property name=\"widgetResizable\">\n   <bool>true</bool>\n  </property>\n  <widget class=\"QWidget\" name=\"scrollAreaWidgetContents\">\n   <property name=\"geometry\">\n    <rect>\n     <x>0</x>\n     <y>0</y>\n     <width>639</width>\n     <height>523</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout_15\">\n    <item>\n     <spacer name=\"horizontalSpacer_13\">\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     <layout class=\"QVBoxLayout\" name=\"verticalLayout_10\">\n      <item>\n       <spacer name=\"verticalSpacer_3\">\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      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n        <property name=\"bottomMargin\">\n         <number>0</number>\n        </property>\n        <item>\n         <widget class=\"QLabel\" name=\"label\">\n          <property name=\"text\">\n           <string>&amp;Language:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>comboBoxLanguage</cstring>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"comboBoxLanguage\"/>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_3\">\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       </layout>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxTextWrap\">\n        <property name=\"toolTip\">\n         <string>Break text if it's too long to fit on line</string>\n        </property>\n        <property name=\"text\">\n         <string>Wrap l&amp;ong text</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxAlwaysOnTop\">\n        <property name=\"toolTip\">\n         <string>Keep main window above other windows</string>\n        </property>\n        <property name=\"text\">\n         <string>Alwa&amp;ys on Top</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxCloseOnUnfocus\">\n        <property name=\"toolTip\">\n         <string>Close main window when other application has focus</string>\n        </property>\n        <property name=\"text\">\n         <string>Close When Unfocused</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxOpenWindowsOnCurrentScreen\">\n        <property name=\"toolTip\">\n         <string>Enable to open windows on current screen. Disable to open windows where they were last closed</string>\n        </property>\n        <property name=\"text\">\n         <string>O&amp;pen windows on current screen</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxConfirmExit\">\n        <property name=\"toolTip\">\n         <string>Confirm application exit</string>\n        </property>\n        <property name=\"text\">\n         <string>Confirm application e&amp;xit</string>\n        </property>\n        <property name=\"checked\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxAutostart\">\n        <property name=\"toolTip\">\n         <string>Run the application on system startup</string>\n        </property>\n        <property name=\"text\">\n         <string>&amp;Autostart</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxPreventScreenCapture\">\n        <property name=\"toolTip\">\n         <string>Prevent capturing app windows in screenshots and recordings</string>\n        </property>\n        <property name=\"text\">\n         <string>&amp;Hide from screenshots and recordings</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxEncryptTabs\">\n        <property name=\"toolTip\">\n         <string>Encrypt tab data on disk (requires password to be set)</string>\n        </property>\n        <property name=\"text\">\n         <string>Encrypt &amp;Tabs</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxUseKeychain\">\n        <property name=\"toolTip\">\n         <string>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</string>\n        </property>\n        <property name=\"text\">\n         <string>&amp;Use external key store</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayoutChangePassword\">\n        <item>\n         <spacer name=\"horizontalSpacerChangePasswordIndent\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Fixed</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>20</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"pushButtonChangeEncryptionPassword\">\n          <property name=\"toolTip\">\n           <string>Change the password used to encrypt tab data</string>\n          </property>\n          <property name=\"text\">\n           <string>Change Encryption &amp;Password...</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacerChangePassword\">\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       </layout>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayoutNavigationStyle\">\n        <property name=\"bottomMargin\">\n         <number>0</number>\n        </property>\n        <item>\n         <widget class=\"QLabel\" name=\"label_nav_style\">\n          <property name=\"text\">\n           <string>Navigation style / Keymap:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>comboBoxNavigationStyle</cstring>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"comboBoxNavigationStyle\">\n          <property name=\"toolTip\">\n           <string>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</string>\n          </property>\n          <item>\n           <property name=\"text\">\n            <string>Default</string>\n           </property>\n          </item>\n          <item>\n           <property name=\"text\">\n            <string>Vi</string>\n           </property>\n          </item>\n          <item>\n           <property name=\"text\">\n            <string>Emacs</string>\n           </property>\n          </item>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacerNavigationStyle\">\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       </layout>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxSaveFilterHistory\">\n        <property name=\"toolTip\">\n         <string>Save and restore history of item filters</string>\n        </property>\n        <property name=\"text\">\n         <string>Save Filter History</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxAutocompleteCommands\">\n        <property name=\"toolTip\">\n         <string>Automatically show popup to complete function, type and variable names in commands</string>\n        </property>\n        <property name=\"text\">\n         <string>Auto-complete Commands</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QGroupBox\" name=\"groupBox\">\n        <property name=\"title\">\n         <string>Clipboard Manipulation</string>\n        </property>\n        <property name=\"flat\">\n         <bool>false</bool>\n        </property>\n        <property name=\"checkable\">\n         <bool>false</bool>\n        </property>\n        <layout class=\"QGridLayout\" name=\"gridLayout_8\">\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QCheckBox\" name=\"checkBoxCopyClip\">\n           <property name=\"toolTip\">\n            <string>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</string>\n           </property>\n           <property name=\"text\">\n            <string>(&amp;3) Paste clipboard with mouse</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QCheckBox\" name=\"checkBoxCopySel\">\n           <property name=\"toolTip\">\n            <string>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</string>\n           </property>\n           <property name=\"text\">\n            <string>(&amp;4) Paste mouse selection with keyboard</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QCheckBox\" name=\"checkBoxClip\">\n           <property name=\"toolTip\">\n            <string>Save clipboard in history</string>\n           </property>\n           <property name=\"text\">\n            <string>(&amp;1) Store clipboard</string>\n           </property>\n           <property name=\"checked\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QCheckBox\" name=\"checkBoxSel\">\n           <property name=\"toolTip\">\n            <string>Save text selected with mouse (primary selection) in history</string>\n           </property>\n           <property name=\"text\">\n            <string>(&amp;2) Store text selected using mouse</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QCheckBox\" name=\"checkBoxRunSel\">\n           <property name=\"text\">\n            <string>(&amp;5) Run automatic commands on selection</string>\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    </item>\n    <item>\n     <spacer name=\"horizontalSpacer_12\">\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   </layout>\n  </widget>\n </widget>\n <tabstops>\n  <tabstop>comboBoxLanguage</tabstop>\n  <tabstop>checkBoxTextWrap</tabstop>\n  <tabstop>checkBoxAlwaysOnTop</tabstop>\n  <tabstop>checkBoxCloseOnUnfocus</tabstop>\n  <tabstop>checkBoxOpenWindowsOnCurrentScreen</tabstop>\n  <tabstop>checkBoxConfirmExit</tabstop>\n  <tabstop>checkBoxAutostart</tabstop>\n  <tabstop>checkBoxEncryptTabs</tabstop>\n  <tabstop>checkBoxUseKeychain</tabstop>\n  <tabstop>pushButtonChangeEncryptionPassword</tabstop>\n  <tabstop>comboBoxNavigationStyle</tabstop>\n  <tabstop>checkBoxSaveFilterHistory</tabstop>\n  <tabstop>checkBoxAutocompleteCommands</tabstop>\n  <tabstop>checkBoxClip</tabstop>\n  <tabstop>checkBoxSel</tabstop>\n  <tabstop>checkBoxCopyClip</tabstop>\n  <tabstop>checkBoxCopySel</tabstop>\n  <tabstop>checkBoxRunSel</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/configtabhistory.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ConfigTabHistory</class>\n <widget class=\"QScrollArea\" name=\"ConfigTabHistory\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>639</width>\n    <height>523</height>\n   </rect>\n  </property>\n  <property name=\"frameShape\">\n   <enum>QFrame::NoFrame</enum>\n  </property>\n  <property name=\"widgetResizable\">\n   <bool>true</bool>\n  </property>\n  <widget class=\"QWidget\" name=\"scrollAreaWidgetContents_2\">\n   <property name=\"geometry\">\n    <rect>\n     <x>0</x>\n     <y>0</y>\n     <width>639</width>\n     <height>523</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout_16\">\n    <item>\n     <spacer name=\"horizontalSpacer_14\">\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     <layout class=\"QVBoxLayout\" name=\"verticalLayout_11\">\n      <item>\n       <spacer name=\"verticalSpacer_5\">\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      <item>\n       <layout class=\"QFormLayout\" name=\"formLayout_2\">\n        <property name=\"fieldGrowthPolicy\">\n         <enum>QFormLayout::AllNonFixedFieldsGrow</enum>\n        </property>\n        <item row=\"1\" column=\"0\">\n         <widget class=\"QLabel\" name=\"label_4\">\n          <property name=\"text\">\n           <string>Maximum &amp;number of items in history:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>spinBoxItems</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"1\" column=\"1\">\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n          <item>\n           <widget class=\"QSpinBox\" name=\"spinBoxItems\">\n            <property name=\"toolTip\">\n             <string>Maximum number of items in each tab</string>\n            </property>\n            <property name=\"maximum\">\n             <number>100000</number>\n            </property>\n            <property name=\"value\">\n             <number>200</number>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <spacer name=\"horizontalSpacer_4\">\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         </layout>\n        </item>\n        <item row=\"2\" column=\"0\">\n         <widget class=\"QLabel\" name=\"label_3\">\n          <property name=\"text\">\n           <string>&amp;Unload tab after an interval:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>spinBoxExpireTab</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"2\" column=\"1\">\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n          <item>\n           <widget class=\"QSpinBox\" name=\"spinBoxExpireTab\">\n            <property name=\"toolTip\">\n             <string>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</string>\n            </property>\n            <property name=\"suffix\">\n             <string notr=\"true\"> min</string>\n            </property>\n            <property name=\"maximum\">\n             <number>480</number>\n            </property>\n           </widget>\n          </item>\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         </layout>\n        </item>\n        <item row=\"3\" column=\"0\">\n         <widget class=\"QLabel\" name=\"labelEncryptedExpireSeconds\">\n          <property name=\"text\">\n           <string>Require password after an interval:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>spinBoxExpireEncryptedTabSeconds</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"3\" column=\"1\">\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayoutEncryptedExpireSeconds\">\n          <item>\n           <widget class=\"QSpinBox\" name=\"spinBoxExpireEncryptedTabSeconds\">\n            <property name=\"toolTip\">\n             <string>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</string>\n            </property>\n            <property name=\"suffix\">\n             <string notr=\"true\"> s</string>\n            </property>\n            <property name=\"maximum\">\n             <number>999999</number>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <spacer name=\"horizontalSpacerEncryptedExpireSeconds\">\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         </layout>\n        </item>\n        <item row=\"4\" column=\"0\">\n         <widget class=\"QLabel\" name=\"label_6\">\n          <property name=\"text\">\n           <string>External editor command (%&amp;1 is file to edit):</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>lineEditEditor</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"4\" column=\"1\">\n         <widget class=\"QLineEdit\" name=\"lineEditEditor\">\n          <property name=\"toolTip\">\n           <string>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</string>\n          </property>\n          <property name=\"text\">\n           <string/>\n          </property>\n         </widget>\n        </item>\n        <item row=\"0\" column=\"0\">\n         <widget class=\"QLabel\" name=\"label_2\">\n          <property name=\"text\">\n           <string>Ta&amp;b for storing clipboard:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>comboBoxClipboardTab</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"0\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"comboBoxClipboardTab\">\n          <property name=\"toolTip\">\n           <string>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</string>\n          </property>\n          <property name=\"editable\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxEditCtrlReturn\">\n        <property name=\"toolTip\">\n         <string>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</string>\n        </property>\n        <property name=\"text\">\n         <string>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxShowSimpleItems\">\n        <property name=\"toolTip\">\n         <string>Show single line description of each item.\n\nUse Item Preview to display whole items.</string>\n        </property>\n        <property name=\"text\">\n         <string>Sho&amp;w simple items</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxNumberSearch\">\n        <property name=\"toolTip\">\n         <string>Enable searching for numbers, otherwise pressing a digit key activates item on that position</string>\n        </property>\n        <property name=\"text\">\n         <string>S&amp;earch for numbers</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"checkBoxSingleClickActivate\">\n        <property name=\"toolTip\">\n         <string/>\n        </property>\n        <property name=\"text\">\n         <string>Activate item with single click</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QGroupBox\" name=\"groupBox_3\">\n        <property name=\"title\">\n         <string>After item is activated (double-click or Enter key), copy it to clipboard and ...</string>\n        </property>\n        <layout class=\"QVBoxLayout\" name=\"verticalLayout_8\">\n         <item>\n          <widget class=\"QCheckBox\" name=\"checkBoxMove\">\n           <property name=\"toolTip\">\n            <string>Move item to the top of the list after it is activated</string>\n           </property>\n           <property name=\"text\">\n            <string>Move item to the t&amp;op</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QCheckBox\" name=\"checkBoxActivateCloses\">\n           <property name=\"toolTip\">\n            <string>Close main window after item is activated</string>\n           </property>\n           <property name=\"text\">\n            <string>&amp;Close main window</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QCheckBox\" name=\"checkBoxActivateFocuses\">\n           <property name=\"toolTip\">\n            <string>Focus last window after item is activated</string>\n           </property>\n           <property name=\"text\">\n            <string>&amp;Focus last window</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QCheckBox\" name=\"checkBoxActivatePastes\">\n           <property name=\"toolTip\">\n            <string>Paste to current window after item is activated</string>\n           </property>\n           <property name=\"text\">\n            <string>&amp;Paste to current window</string>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </widget>\n      </item>\n      <item>\n       <spacer name=\"verticalSpacer_6\">\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    <item>\n     <spacer name=\"horizontalSpacer_5\">\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   </layout>\n  </widget>\n </widget>\n <tabstops>\n  <tabstop>comboBoxClipboardTab</tabstop>\n  <tabstop>spinBoxItems</tabstop>\n  <tabstop>spinBoxExpireTab</tabstop>\n  <tabstop>spinBoxExpireEncryptedTabSeconds</tabstop>\n  <tabstop>lineEditEditor</tabstop>\n  <tabstop>checkBoxEditCtrlReturn</tabstop>\n  <tabstop>checkBoxShowSimpleItems</tabstop>\n  <tabstop>checkBoxNumberSearch</tabstop>\n  <tabstop>checkBoxSingleClickActivate</tabstop>\n  <tabstop>checkBoxMove</tabstop>\n  <tabstop>checkBoxActivateCloses</tabstop>\n  <tabstop>checkBoxActivateFocuses</tabstop>\n  <tabstop>checkBoxActivatePastes</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/configtablayout.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ConfigTabLayout</class>\n  <widget class=\"QScrollArea\" name=\"scrollArea_5\">\n   <property name=\"geometry\">\n    <rect>\n     <x>9</x>\n     <y>9</y>\n     <width>639</width>\n     <height>523</height>\n    </rect>\n   </property>\n   <property name=\"frameShape\">\n    <enum>QFrame::NoFrame</enum>\n   </property>\n   <property name=\"widgetResizable\">\n    <bool>true</bool>\n   </property>\n   <widget class=\"QWidget\" name=\"scrollAreaWidgetContents_6\">\n    <property name=\"geometry\">\n     <rect>\n      <x>0</x>\n      <y>0</y>\n      <width>639</width>\n      <height>523</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_23\">\n     <item>\n      <spacer name=\"horizontalSpacer_26\">\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      <layout class=\"QVBoxLayout\" name=\"verticalLayout_13\">\n       <item>\n        <spacer name=\"verticalSpacer_11\">\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       <item>\n        <layout class=\"QVBoxLayout\" name=\"verticalLayout_16\">\n         <item>\n          <widget class=\"QGroupBox\" name=\"groupBox_9\">\n           <property name=\"title\">\n            <string>Show/Hide</string>\n           </property>\n           <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n            <item>\n             <widget class=\"QCheckBox\" name=\"checkBoxHideTabs\">\n              <property name=\"toolTip\">\n               <string>Hide tabs (press Alt key to show)</string>\n              </property>\n              <property name=\"text\">\n               <string>Hi&amp;de tabs</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"checkBoxHideToolbar\">\n              <property name=\"toolTip\">\n               <string>Hide toolbar</string>\n              </property>\n              <property name=\"text\">\n               <string>Hide too&amp;lbar</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"checkBoxHideToolbarLabels\">\n              <property name=\"text\">\n               <string>Hide tool&amp;bar labels</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"checkBoxHideWindow\">\n              <property name=\"toolTip\">\n               <string>Hide main window when closed</string>\n              </property>\n              <property name=\"text\">\n               <string>Hide &amp;main window</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QGroupBox\" name=\"groupBox_6\">\n           <property name=\"title\">\n            <string>Layout and Transparency</string>\n           </property>\n           <layout class=\"QFormLayout\" name=\"formLayout\">\n            <property name=\"fieldGrowthPolicy\">\n             <enum>QFormLayout::AllNonFixedFieldsGrow</enum>\n            </property>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"checkBoxTabTree\">\n              <property name=\"toolTip\">\n               <string>Show tree with tabs instead of tab bar</string>\n              </property>\n              <property name=\"text\">\n               <string>Tab T&amp;ree</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"3\" column=\"0\">\n             <widget class=\"QLabel\" name=\"label_30\">\n              <property name=\"text\">\n               <string>&amp;Focused transparency:</string>\n              </property>\n              <property name=\"buddy\">\n               <cstring>spinBoxTransparencyFocused</cstring>\n              </property>\n             </widget>\n            </item>\n            <item row=\"3\" column=\"1\">\n             <layout class=\"QHBoxLayout\" name=\"horizontalLayout_12\">\n              <item>\n               <widget class=\"QSpinBox\" name=\"spinBoxTransparencyFocused\">\n                <property name=\"toolTip\">\n                 <string>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</string>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\">%</string>\n                </property>\n                <property name=\"maximum\">\n                 <number>100</number>\n                </property>\n               </widget>\n              </item>\n              <item>\n               <spacer name=\"horizontalSpacer_9\">\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             </layout>\n            </item>\n            <item row=\"4\" column=\"0\">\n             <widget class=\"QLabel\" name=\"label_29\">\n              <property name=\"text\">\n               <string>&amp;Unfocused transparency:</string>\n              </property>\n              <property name=\"buddy\">\n               <cstring>spinBoxTransparencyUnfocused</cstring>\n              </property>\n             </widget>\n            </item>\n            <item row=\"4\" column=\"1\">\n             <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n              <item>\n               <widget class=\"QSpinBox\" name=\"spinBoxTransparencyUnfocused\">\n                <property name=\"toolTip\">\n                 <string>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</string>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\">%</string>\n                </property>\n                <property name=\"maximum\">\n                 <number>100</number>\n                </property>\n               </widget>\n              </item>\n              <item>\n               <spacer name=\"horizontalSpacer_8\">\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             </layout>\n            </item>\n            <item row=\"2\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"checkBoxShowTabItemCount\">\n              <property name=\"toolTip\">\n               <string>Show number of items in tabs</string>\n              </property>\n              <property name=\"text\">\n               <string>Sho&amp;w Item Count</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_12\">\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     <item>\n      <spacer name=\"horizontalSpacer_30\">\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    </layout>\n   </widget>\n  </widget>\n <resources/>\n</ui>\n"
  },
  {
    "path": "src/ui/configtabnotifications.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ConfigTabNotifications</class>\n <widget class=\"QScrollArea\" name=\"scrollArea_3\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>639</width>\n    <height>523</height>\n   </rect>\n  </property>\n  <property name=\"frameShape\">\n   <enum>QFrame::NoFrame</enum>\n  </property>\n  <property name=\"widgetResizable\">\n   <bool>true</bool>\n  </property>\n  <widget class=\"QWidget\" name=\"scrollAreaWidgetContents_3\">\n   <property name=\"geometry\">\n    <rect>\n     <x>0</x>\n     <y>0</y>\n     <width>639</width>\n     <height>523</height>\n    </rect>\n   </property>\n   <layout class=\"QHBoxLayout\" name=\"horizontalLayout_13\">\n    <item>\n     <spacer name=\"horizontalSpacer_15\">\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     <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n      <item>\n       <spacer name=\"verticalSpacer_8\">\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      <item>\n       <layout class=\"QFormLayout\" name=\"formLayout_3\">\n        <property name=\"fieldGrowthPolicy\">\n         <enum>QFormLayout::AllNonFixedFieldsGrow</enum>\n        </property>\n        <item row=\"1\" column=\"0\">\n         <widget class=\"QLabel\" name=\"label_8\">\n          <property name=\"text\">\n           <string>&amp;Notification position:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>comboBoxNotificationPosition</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"1\" column=\"1\">\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_10\">\n          <item>\n           <widget class=\"QComboBox\" name=\"comboBoxNotificationPosition\">\n            <property name=\"toolTip\">\n             <string>Position on screen for notifications</string>\n            </property>\n            <item>\n             <property name=\"text\">\n              <string>Top</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Bottom</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Top Right</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Bottom Right</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Bottom Left</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Top Left</string>\n             </property>\n            </item>\n           </widget>\n          </item>\n          <item>\n           <spacer name=\"horizontalSpacer_10\">\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         </layout>\n        </item>\n        <item row=\"2\" column=\"0\">\n         <widget class=\"QLabel\" name=\"label_25\">\n          <property name=\"text\">\n           <string>Int&amp;erval in seconds to display notifications:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>spinBoxNotificationPopupInterval</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"2\" column=\"1\">\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n          <item>\n           <widget class=\"QSpinBox\" name=\"spinBoxNotificationPopupInterval\">\n            <property name=\"toolTip\">\n             <string>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</string>\n            </property>\n            <property name=\"minimum\">\n             <number>-1</number>\n            </property>\n            <property name=\"maximum\">\n             <number>9999</number>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <spacer name=\"horizontalSpacer_2\">\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         </layout>\n        </item>\n        <item row=\"3\" column=\"0\">\n         <widget class=\"QLabel\" name=\"label_12\">\n          <property name=\"text\">\n           <string>Num&amp;ber of lines for clipboard notification:</string>\n          </property>\n          <property name=\"buddy\">\n           <cstring>spinBoxClipboardNotificationLines</cstring>\n          </property>\n         </widget>\n        </item>\n        <item row=\"3\" column=\"1\">\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_11\">\n          <item>\n           <widget class=\"QSpinBox\" name=\"spinBoxClipboardNotificationLines\">\n            <property name=\"toolTip\">\n             <string>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</string>\n            </property>\n            <property name=\"maximum\">\n             <number>100</number>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <spacer name=\"horizontalSpacer_11\">\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         </layout>\n        </item>\n        <item row=\"0\" column=\"0\">\n         <widget class=\"QCheckBox\" name=\"checkBoxUseNativeNotifications\">\n          <property name=\"text\">\n           <string>&amp;Use native notifications</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QGroupBox\" name=\"groupBox_2\">\n        <property name=\"title\">\n         <string>Notification Geometry (in screen points)</string>\n        </property>\n        <layout class=\"QFormLayout\" name=\"formLayout_4\">\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_7\">\n           <property name=\"text\">\n            <string>Hori&amp;zontal offset:</string>\n           </property>\n           <property name=\"buddy\">\n            <cstring>spinBoxNotificationHorizontalOffset</cstring>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_19\">\n           <item>\n            <widget class=\"QSpinBox\" name=\"spinBoxNotificationHorizontalOffset\">\n             <property name=\"toolTip\">\n              <string>Notification distance from left or right screen edge in screen points</string>\n             </property>\n             <property name=\"minimum\">\n              <number>-99999</number>\n             </property>\n             <property name=\"maximum\">\n              <number>99999</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_19\">\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          </layout>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_10\">\n           <property name=\"text\">\n            <string>&amp;Vertical offset:</string>\n           </property>\n           <property name=\"buddy\">\n            <cstring>spinBoxNotificationVerticalOffset</cstring>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_20\">\n           <item>\n            <widget class=\"QSpinBox\" name=\"spinBoxNotificationVerticalOffset\">\n             <property name=\"toolTip\">\n              <string>Notification distance from top or bottom screen edge in screen points</string>\n             </property>\n             <property name=\"minimum\">\n              <number>-99999</number>\n             </property>\n             <property name=\"maximum\">\n              <number>99999</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_20\">\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          </layout>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_13\">\n           <property name=\"text\">\n            <string>Maximum &amp;width:</string>\n           </property>\n           <property name=\"buddy\">\n            <cstring>spinBoxNotificationMaximumWidth</cstring>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_21\">\n           <item>\n            <widget class=\"QSpinBox\" name=\"spinBoxNotificationMaximumWidth\">\n             <property name=\"toolTip\">\n              <string>Maximum width for notification in screen points</string>\n             </property>\n             <property name=\"maximum\">\n              <number>9999</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_21\">\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          </layout>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label_14\">\n           <property name=\"text\">\n            <string>Ma&amp;ximum height:</string>\n           </property>\n           <property name=\"buddy\">\n            <cstring>spinBoxNotificationMaximumHeight</cstring>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_22\">\n           <item>\n            <widget class=\"QSpinBox\" name=\"spinBoxNotificationMaximumHeight\">\n             <property name=\"toolTip\">\n              <string>Maximum height for notification in screen points</string>\n             </property>\n             <property name=\"maximum\">\n              <number>9999</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_22\">\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          </layout>\n         </item>\n        </layout>\n       </widget>\n      </item>\n      <item>\n       <spacer name=\"verticalSpacer_7\">\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    <item>\n     <spacer name=\"horizontalSpacer_16\">\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   </layout>\n  </widget>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/configtabtray.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ConfigTabTray</class>\n  <widget class=\"QScrollArea\" name=\"scrollArea_4\">\n   <property name=\"geometry\">\n    <rect>\n     <x>9</x>\n     <y>9</y>\n     <width>639</width>\n     <height>523</height>\n    </rect>\n   </property>\n   <property name=\"frameShape\">\n    <enum>QFrame::NoFrame</enum>\n   </property>\n   <property name=\"widgetResizable\">\n    <bool>true</bool>\n   </property>\n   <widget class=\"QWidget\" name=\"scrollAreaWidgetContents_4\">\n    <property name=\"geometry\">\n     <rect>\n      <x>0</x>\n      <y>0</y>\n      <width>639</width>\n      <height>523</height>\n     </rect>\n    </property>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_17\">\n     <item>\n      <spacer name=\"horizontalSpacer_17\">\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      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <item>\n        <spacer name=\"verticalSpacer_4\">\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       <item>\n        <widget class=\"QCheckBox\" name=\"checkBoxDisableTray\">\n         <property name=\"toolTip\">\n          <string>Don't show tray icon; minimize window when closed</string>\n         </property>\n         <property name=\"text\">\n          <string>Disabl&amp;e tray</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"checkBoxTrayShowCommands\">\n         <property name=\"toolTip\">\n          <string>Show command for current clipboard content in tray menu</string>\n         </property>\n         <property name=\"text\">\n          <string>Sho&amp;w commands for clipboard content</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n         <item>\n          <widget class=\"QLabel\" name=\"label_9\">\n           <property name=\"text\">\n            <string>N&amp;umber of items in tray menu:</string>\n           </property>\n           <property name=\"buddy\">\n            <cstring>spinBoxTrayItems</cstring>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QSpinBox\" name=\"spinBoxTrayItems\">\n           <property name=\"toolTip\">\n            <string>Number of items in tray menu</string>\n           </property>\n           <property name=\"value\">\n            <number>5</number>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"horizontalSpacer_7\">\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        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n         <item>\n          <widget class=\"QCheckBox\" name=\"checkBoxMenuTabIsCurrent\">\n           <property name=\"toolTip\">\n            <string>Show items from current tab in tray menu</string>\n           </property>\n           <property name=\"text\">\n            <string>Show cu&amp;rrent tab in menu,</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"label_24\">\n           <property name=\"text\">\n            <string>or &amp;choose other tab:</string>\n           </property>\n           <property name=\"buddy\">\n            <cstring>comboBoxMenuTab</cstring>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QComboBox\" name=\"comboBoxMenuTab\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"toolTip\">\n            <string>Name of tab to show in tray menu (empty for the first tab)</string>\n           </property>\n           <property name=\"editable\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"horizontalSpacer_6\">\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        </layout>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"checkBoxPasteMenuItem\">\n         <property name=\"toolTip\">\n          <string>Paste item to current window after selecting it in menu</string>\n         </property>\n         <property name=\"text\">\n          <string>&amp;Paste activated item to current window</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QCheckBox\" name=\"checkBoxTrayImages\">\n         <property name=\"toolTip\">\n          <string>Show image preview next to menu items</string>\n         </property>\n         <property name=\"text\">\n          <string>Sh&amp;ow image preview as menu item icon</string>\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     <item>\n      <spacer name=\"horizontalSpacer_18\">\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    </layout>\n   </widget>\n  </widget>\n <resources/>\n</ui>\n"
  },
  {
    "path": "src/ui/configurationmanager.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ConfigurationManager</class>\n <widget class=\"QDialog\" name=\"ConfigurationManager\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>679</width>\n    <height>621</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>320</width>\n    <height>240</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Preferences</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n   <item>\n    <widget class=\"ItemOrderList\" name=\"itemOrderList\" native=\"true\"/>\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::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>ItemOrderList</class>\n   <extends>QWidget</extends>\n   <header>gui/itemorderlist.h</header>\n   <container>1</container>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/importexportdialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ImportExportDialog</class>\n <widget class=\"QDialog\" name=\"ImportExportDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QCheckBox\" name=\"checkBoxAll\">\n     <property name=\"text\">\n      <string>&amp;All</string>\n     </property>\n     <property name=\"tristate\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"labelTabs\">\n     <property name=\"text\">\n      <string>&amp;Tabs:</string>\n     </property>\n     <property name=\"buddy\">\n      <cstring>listTabs</cstring>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QListWidget\" name=\"listTabs\">\n     <property name=\"selectionMode\">\n      <enum>QAbstractItemView::MultiSelection</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"checkBoxConfiguration\">\n     <property name=\"text\">\n      <string>Co&amp;nfiguration</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"checkBoxCommands\">\n     <property name=\"text\">\n      <string>Co&amp;mmands</string>\n     </property>\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   <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>ImportExportDialog</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>ImportExportDialog</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/itemorderlist.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ItemOrderList</class>\n <widget class=\"QWidget\" name=\"ItemOrderList\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>470</width>\n    <height>375</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\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=\"QSplitter\" name=\"splitter\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"MinimumExpanding\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"minimumSize\">\n      <size>\n       <width>320</width>\n       <height>240</height>\n      </size>\n     </property>\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"handleWidth\">\n      <number>8</number>\n     </property>\n     <widget class=\"QWidget\" name=\"verticalLayoutWidget\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <property name=\"spacing\">\n        <number>1</number>\n       </property>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n         <item>\n          <widget class=\"QToolButton\" name=\"pushButtonAdd\">\n           <property name=\"toolTip\">\n            <string/>\n           </property>\n           <property name=\"text\">\n            <string>&amp;Add</string>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonTextBesideIcon</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QToolButton\" name=\"pushButtonRemove\">\n           <property name=\"enabled\">\n            <bool>false</bool>\n           </property>\n           <property name=\"text\">\n            <string>&amp;Remove</string>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonTextBesideIcon</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QToolButton\" name=\"pushButtonUp\">\n           <property name=\"toolTip\">\n            <string extracomment=\"Button moves current item one row up\">Move up</string>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonIconOnly</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QToolButton\" name=\"pushButtonDown\">\n           <property name=\"toolTip\">\n            <string extracomment=\"Button moves current item one row down\">Move down</string>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonIconOnly</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QToolButton\" name=\"pushButtonTop\">\n           <property name=\"toolTip\">\n            <string extracomment=\"Button moves current item to the top\">Move to the top</string>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonIconOnly</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QToolButton\" name=\"pushButtonBottom\">\n           <property name=\"toolTip\">\n            <string extracomment=\"Button moves current item to the bottom\">Move to the bottom</string>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonIconOnly</enum>\n           </property>\n          </widget>\n         </item>\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>0</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <widget class=\"QListWidget\" name=\"listWidgetItems\">\n         <property name=\"dragDropMode\">\n          <enum>QAbstractItemView::InternalMove</enum>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::ExtendedSelection</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"widgetParent\" native=\"true\">\n      <property name=\"focusPolicy\">\n       <enum>Qt::StrongFocus</enum>\n      </property>\n      <layout class=\"QVBoxLayout\" name=\"widgetLayout\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\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 <tabstops>\n  <tabstop>listWidgetItems</tabstop>\n  <tabstop>widgetParent</tabstop>\n  <tabstop>pushButtonAdd</tabstop>\n  <tabstop>pushButtonRemove</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/logdialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>LogDialog</class>\n <widget class=\"QDialog\" name=\"LogDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>585</width>\n    <height>680</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Log</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QPlainTextEdit\" name=\"textBrowserLog\">\n     <property name=\"undoRedoEnabled\">\n      <bool>false</bool>\n     </property>\n     <property name=\"lineWrapMode\">\n      <enum>QPlainTextEdit::NoWrap</enum>\n     </property>\n     <property name=\"readOnly\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"layoutFilters\">\n     <item>\n      <widget class=\"QLabel\" name=\"labelLogFileName\">\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"textInteractionFlags\">\n        <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\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::Close</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>LogDialog</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>LogDialog</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/mainwindow.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>MainWindow</class>\n <widget class=\"QMainWindow\" name=\"MainWindow\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>645</width>\n    <height>421</height>\n   </rect>\n  </property>\n  <property name=\"contextMenuPolicy\">\n   <enum>Qt::PreventContextMenu</enum>\n  </property>\n  <property name=\"windowTitle\">\n   <string/>\n  </property>\n  <widget class=\"QWidget\" name=\"centralWidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <property name=\"spacing\">\n     <number>0</number>\n    </property>\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=\"Utils::FilterLineEdit\" name=\"searchBar\"/>\n    </item>\n    <item>\n     <widget class=\"TabWidget\" name=\"tabWidget\" native=\"true\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n        <horstretch>0</horstretch>\n        <verstretch>1</verstretch>\n       </sizepolicy>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"dockWidgetItemPreview\">\n   <attribute name=\"dockWidgetArea\">\n    <number>8</number>\n   </attribute>\n   <widget class=\"QWidget\" name=\"dockWidgetItemPreviewContents\">\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n     <property name=\"spacing\">\n      <number>0</number>\n     </property>\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=\"QScrollArea\" name=\"scrollAreaItemPreview\">\n       <property name=\"frameShape\">\n        <enum>QFrame::NoFrame</enum>\n       </property>\n       <property name=\"frameShadow\">\n        <enum>QFrame::Plain</enum>\n       </property>\n       <property name=\"lineWidth\">\n        <number>0</number>\n       </property>\n       <property name=\"widgetResizable\">\n        <bool>true</bool>\n       </property>\n       <widget class=\"QWidget\" name=\"scrollAreaWidgetContents\">\n        <property name=\"geometry\">\n         <rect>\n          <x>0</x>\n          <y>0</y>\n          <width>645</width>\n          <height>58</height>\n         </rect>\n        </property>\n       </widget>\n      </widget>\n     </item>\n    </layout>\n   </widget>\n  </widget>\n </widget>\n <layoutdefault spacing=\"6\" margin=\"11\"/>\n <customwidgets>\n  <customwidget>\n   <class>TabWidget</class>\n   <extends>QWidget</extends>\n   <header>gui/tabwidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>Utils::FilterLineEdit</class>\n   <extends>QLineEdit</extends>\n   <header>gui/filterlineedit.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/pluginwidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>PluginWidget</class>\n <widget class=\"QWidget\" name=\"PluginWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"labelDescription\">\n     <property name=\"text\">\n      <string/>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"labelAuthor\">\n     <property name=\"text\">\n      <string/>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\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>1</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/shortcutdialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ShortcutDialog</class>\n <widget class=\"QDialog\" name=\"ShortcutDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>268</width>\n    <height>102</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>New Shortcut</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n       <widget class=\"QKeySequenceEdit\" name=\"lineEditShortcut\"/>\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::Ok|QDialogButtonBox::Cancel|QDialogButtonBox::Reset</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>ShortcutDialog</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>ShortcutDialog</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/shortcutswidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ShortcutsWidget</class>\n <widget class=\"QWidget\" name=\"ShortcutsWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\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    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>&amp;Find:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>lineEditFilter</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"lineEditFilter\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"tabGlobal\">\n      <attribute name=\"title\">\n       <string>Gl&amp;obal</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <item>\n        <widget class=\"QLabel\" name=\"label_2\">\n         <property name=\"text\">\n          <string>Global shortcuts can be triggered from any application.</string>\n         </property>\n         <property name=\"wordWrap\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QTableWidget\" name=\"tableWidgetGlobal\">\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"showGrid\">\n          <bool>false</bool>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tabApplication\">\n      <attribute name=\"title\">\n       <string>A&amp;pplication</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QLabel\" name=\"label_3\">\n         <property name=\"text\">\n          <string>Application shortcuts can only be triggered from the main window.</string>\n         </property>\n         <property name=\"wordWrap\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QTableWidget\" name=\"tableWidgetApplication\">\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"showGrid\">\n          <bool>false</bool>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/ui/tabdialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>TabDialog</class>\n <widget class=\"QDialog\" name=\"TabDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>295</width>\n    <height>130</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QLabel\" name=\"label_2\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"text\">\n      <string>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>&amp;Name:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>lineEditTabName</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"lineEditTabName\"/>\n     </item>\n    </layout>\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 <tabstops>\n  <tabstop>lineEditTabName</tabstop>\n  <tabstop>buttonBox</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>TabDialog</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>TabDialog</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/tabpropertieswidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>TabPropertiesWidget</class>\n <widget class=\"QWidget\" name=\"TabPropertiesWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string/>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"IconSelectButton\" name=\"iconButton\">\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"tabName\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>&amp;Maximum number of items:</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>maxItems</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QSpinBox\" name=\"maxItems\">\n       <property name=\"specialValueText\">\n        <string>default</string>\n       </property>\n       <property name=\"maximum\">\n        <number>100000</number>\n       </property>\n       <property name=\"value\">\n        <number>200</number>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_5\">\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    </layout>\n   </item>\n    <item>\n     <widget class=\"QCheckBox\" name=\"storeItems\">\n      <property name=\"text\">\n       <string>&amp;Save Items</string>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n      <item>\n       <widget class=\"QLabel\" name=\"labelEncryptedExpireSeconds\">\n        <property name=\"text\">\n         <string>Require password after an interval:</string>\n        </property>\n        <property name=\"buddy\">\n         <cstring>spinBoxExpireEncryptedTabSeconds</cstring>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QSpinBox\" name=\"spinBoxExpireEncryptedTabSeconds\">\n        <property name=\"toolTip\">\n         <string>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</string>\n        </property>\n        <property name=\"specialValueText\">\n         <string>global</string>\n        </property>\n        <property name=\"suffix\">\n         <string notr=\"true\"> s</string>\n        </property>\n        <property name=\"maximum\">\n         <number>999999</number>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <spacer name=\"horizontalSpacer_6\">\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     </layout>\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 <customwidgets>\n  <customwidget>\n   <class>IconSelectButton</class>\n   <extends>QPushButton</extends>\n   <header>gui/iconselectbutton.h</header>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>iconButton</tabstop>\n  <tabstop>maxItems</tabstop>\n  <tabstop>storeItems</tabstop>\n  <tabstop>spinBoxExpireEncryptedTabSeconds</tabstop>\n </tabstops>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "src/version.cmake",
    "content": "set(copyq_version \"13.0.0\")\n\nset(copyq_github_sha \"$ENV{GITHUB_SHA}\")\nif (copyq_github_sha)\n    get_filename_component(copyq_github_ref \"$ENV{GITHUB_REF}\" NAME)\n    string(SUBSTRING \"${copyq_github_sha}\" 0 8 copyq_github_sha)\n    set(copyq_version \"${copyq_version}-g${copyq_github_sha}-${copyq_github_ref}\")\nelse()\n    find_package(Git)\n    if(GIT_FOUND)\n        execute_process(COMMAND\n            \"${GIT_EXECUTABLE}\" describe --tags\n            RESULT_VARIABLE copyq_git_describe_result\n            OUTPUT_VARIABLE copyq_git_describe_output\n            ERROR_QUIET\n            OUTPUT_STRIP_TRAILING_WHITESPACE\n        )\n        if(copyq_git_describe_result EQUAL 0)\n            set(COPYQ_VERSION_TAG_REGEX \"^v([0-9]+)\")\n            string(REGEX REPLACE \"${COPYQ_VERSION_TAG_REGEX}\"\n                \"\\\\1\" copyq_git_describe_output\n                \"${copyq_git_describe_output}\"\n                )\n            set(copyq_version \"${copyq_git_describe_output}\")\n        endif()\n    endif()\nendif()\n"
  },
  {
    "path": "src/version_file.cmake",
    "content": "include(version.cmake)\nconfigure_file(\"${INPUT_FILE}\" \"${OUTPUT_FILE}\")\n"
  },
  {
    "path": "translations/copyq_ar.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ar_EG\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>حول البرنامج</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>مدير الحافظة</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>المؤلف</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>البريد الإلكتروني</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>الموقع الإلكتروني</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>تبرع</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation type=\"unfinished\">حوار إجرائات</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>الامر:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>الدخل القياسي:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>تخزين الخرج القياسي:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;فاصل للعناصر الجديدة:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation type=\"unfinished\">&lt;p&gt;التعبير العادي لتقسيم الخرج الى عدة عناصر.&lt;/p&gt;\n&lt;p&gt;استعمل &lt;b&gt;\\n&lt;/b&gt; لتخزين كل سطر في عنصر مستقل. &lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>المخرج &amp;tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>تخزين العناصر في لسان تحت اسم معين (اترك فارغا للتعطيل)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">تم تخزين الامر</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">تم تخزين الامر و يمكن الوصول له من قائمة العناصر.\nيمكنك انشاء الامر من الاعدادات.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>خطأ: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>رمز الخروج: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>الامر %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation type=\"unfinished\">اضف امر</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>اظهر/اخفي النافذة الرئيسية</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation type=\"unfinished\">اظهر القائمة</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>اظهر النافذة الرئيسية عند مؤشر الفأرة</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>عدل clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>عدل العنصر الاول</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>انسخ العنصر الثاني</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>انشئ عنصر جديد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>انسخ العنصر التالي</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>انسخ العنصر السابق</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>الصق محتوى clipboard كنص عادي</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>عطل تخزين clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>اسمح بتخزين clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>الصق و انسخ التالي</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>الصق و انسخ السابق</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>امر جديد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>تجاهر العناصر الفارغة او ذات حرف واحد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>افتح في &amp;المتصفح</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>الصق كنص عادي</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>شغل الفيديو تلقائيا</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>انسخ URL (عنوان صفحة الانترنت) الى لسان اخر</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>انشئ مصغرات (يحتاج ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>انشئ رمز QR من عنوان URL (يحتاج qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>تجاهل الملفات المسوخة</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>تجاهر نافذة كلمة السر *&quot;Password&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>كلمة السر</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>انقل الى القمامة</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(قمامة)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>تجاهل التغييرات؟</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>هل تريد حقاً أن &lt;strong&gt;تتجاهل التغييرات&lt;/strong&gt;؟</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>لا يمكن الاتصال بالملقم! بدء تشغيل ملقم CopyQ أولاً.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>فقد الاتصال!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation type=\"unfinished\">محتوى حافظة</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;التنسيقات:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>المحتوى:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>إزالة التنسيق</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation type=\"unfinished\">محتوى عنصر</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation type=\"unfinished\">انتج عنصرا من الدخل القياسي للبرنامج (اترك فارغا للتعطيل)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation type=\"unfinished\">\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\">المخرج &amp;tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"obsolete\">F2</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"obsolete\">Escape</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\">Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\">خطأ: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">الموقع الإلكتروني</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation type=\"unfinished\">F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\">Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation type=\"unfinished\">F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation type=\"unfinished\">F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation type=\"unfinished\">F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation type=\"unfinished\">F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\">أسم اللسان لا يمكن أن يكون فارغ!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_ca.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ca_ES\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Sobre l&apos;eina</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Administrador de porta-retalls</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Correu electrònic</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Col·labora</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Quadre de diàleg d&apos;acció</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Envia dades del tipus de suport donat a l&apos;entrada estàndard de l&apos;ordre (deixa-ho en blanc per desactivar-ho)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Crea elements des de la sortida estàndard del programa (deixa&apos;l en blanc per desactivar-lo)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Desa els elements a la pestanya amb el nom indicat (deixa&apos;ls en blanc per desar-los a la pestanya actual)</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Error: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Codi de sortida: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Comanda %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Gestor de processos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Afegeix ordres</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Mostra/amaga la finestra principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Mostra el menú de la safata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Mostra la finestra principal sota el cursor del ratolí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Edita el porta-retalls</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Edita el primer element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Copia el segon element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Mostra el diàleg d&apos;acció</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Crea un element nou</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Copia l&apos;element següent</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Copia l&apos;element anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Enganxa el porta-retalls com a text sense format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Desactiva l&apos;emmagatzematge del porta-retalls</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Habilita l&apos;emmagatzematge del porta-retalls</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Enganxa i copia el següent</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Enganxa i copia l&apos;anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Fes una captura de pantalla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Enganxa la data i l&apos;hora actuals</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nova comanda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignora els elements sense o amb un sol caràcter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Enganxa com a text sense format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Reproducció automàtica de vídeos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Copia l&apos;URL (adreça web) a una altra pestanya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Crea una miniatura (necessita ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Crea un codi QR a partir d&apos;una URL (necessita qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tasques</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignora els fitxers copiats</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignora la finestra *&quot;Contrasenya&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Contrasenya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Mou a la paperera</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(paperera)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Neteja la pestanya actual</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Descartar els canvis?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Connexió perduda!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>No es pot connectar al servidor! Primer cal iniciar el servidor CopyQ.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Contingut del porta-retalls</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation type=\"unfinished\">\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\">Error: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_cs.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"cs_CZ\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>O aplikaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Správce schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Přispějte</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Dialog akcí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>&amp;Příkaz:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>&amp;Standardní vstup:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>&amp;Ulož standardní výstup:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Pošle data daného MIME typu na standardní vstup příkazu (pro vypnutí ponechej prázdné)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Vytvoří prvky ze standardního výstupu příkazu (pro vypnutí ponechej prázdné)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Oddělovač prvků na výstupu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Regulární výraz pro rozdělení výstupu do více prvků.&lt;/p&gt;\n&lt;p&gt;Použij &lt;b&gt;\\n&lt;/b&gt; pro uložení každého řádku to jednoho prvku.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Výstupní záložka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Ulož prvky do záložky s daným názvem (do nyní otevřené záložky, pokud není název uveden)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Příkaz byl uložen</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Příkaz byl uložen a je přístupný z menu prvku.\nPříkaz je možné zmenit v nastavení.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Chyba: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Návratový kód: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Příkaz %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Správce procesů</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Ukončit vybrané</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Přidat příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Zobraz/skryj hlavní okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Zobraz menu z lišty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Zobraz hlavní okno pod kurzorem myši</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Edituj schránku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Edituj první prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Zkopíruj druhý prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Zobraz dialog akcí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Vytvoř nový prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Zkopíruj další prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Zkopíruj předchozí prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Vlož schránku jako prostý text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Zakaž ukládání schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Povol ukládání schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Vložit a zkopírovat další</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Vložit a zkopírovat předchozí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Snímek obrazovky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Vložit datum a čas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nový příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignoruj prvky s žádným nebo jedním znakem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>&amp;Otevři v prohlížeči</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Vlož jako prostý text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Automaticky přehrát</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Zkopíruj URL (web. adresu) do jiné záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Vytvoř náhled (vyžaduje ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Výtvoř QR kód z URL (vyžaduje qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Úkoly</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Přidej do záložky %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Přesuň do záložky %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignoruj kopírované soubory</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignoruj *&quot;Heslo&quot;* okna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Přesunout do koše</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(koš)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Odstranit vše z vybrané záložky</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Nelze vytvořit nový prvek</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Záložka je zaplněna. Nepodařilo se odstranit žádné prvky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Nelze přidat nové prvky do záložky %1. Pro uvolnění místa prosím odstraňte některé prvky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Zahodit změny?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Chcete opravdu &lt;strong&gt;zahodit změny&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Nelze se připojit k serveru! Nejdříve je nutné spustit CopyQ server.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Připojení ztraceno!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Obsah schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formáty:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Obsah:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Odstranit formát</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Obsah prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Velikost:&lt;/strong&gt; %1 bajtů</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Velikost:&lt;/strong&gt; %1 bajtů</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ server již běží.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Zrušit aktivní příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Zrušit aktivní příkazy a ukončit?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Přerušit ukončování</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Pokračovat v ukončování</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Mezerník</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definuj nové příkazy, které lze uplatnit automaticky na nový obsah schránky, uživatelem z menu nebo pomocí zkratky v systému.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Hledat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Načíst příkazy…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>&amp;Uložit vybrané…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopírovat vybrané</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Vložit příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Neuložené změny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Dialog příkazů obsahuje neuložené změny.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Otevřít soubory s příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Příkazy (*.ini);; CopyQ nastavení (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Uložit vybrané příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Příkazy (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Uložit příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Nepodařilo se uložit příkazy do souboru „%1“: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Zobraz nápovědu pro příkazy (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Příkaz obsahuje seznam programů s argumenty ke spuštění. Například:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Argument programu %1 bude nahrazen za text prvku, %2 až %9 za texty zachycené regulárním výrazem.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Znak %1 může být použit k předání standardního výstupu do dalšího programu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Funkce uvedené níže mohou být použity jako v následujících příkazech.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;schránka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Následující syntax může být použita pro předání zbytku příkazu jako jediného parametru.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Argument %1 bude nahrazen textem prvku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Výsledek je stejný jako u %1, ale je více užitečný pro delší příkazy.</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Název záložky do které se prvek zkopíruje (nekopíruje se pokud není název uveden)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Název:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <oldsource>Command name (shown in menu)</oldsource>\n        <translation>Název příkazu tak jak bude zobrazen v menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Globální zkratka</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Pokud není políčko prázdné, použij příkaz pouze na prvky, u kterých se text shoduje s tímto regulárním výrazem.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Příklady:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Název PDF souborů    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Obsahuje pouze jeden znak    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Vzdálené multimediální soubory    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Použij příkaz pouze na text zkopírovaný z okna, u kterého se název shoduje s tímto regulárním výrazem. Pod macOS je název okna složen z názvu aplikace, pomlčky (&amp;quot;-&amp;quot;) a titulku okna. Například &amp;quot;Safari - Github&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Použij příkaz jen pokud filtr uspěje.&lt;/p&gt;\n\n&lt;p&gt;Text prvku je předán na &lt;b&gt;standardní vstup&lt;/b&gt; filtru. Příkaz se &lt;b&gt;provede pouze pokud filtr skončí z nulovým kódem&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Výraz &lt;b&gt;%1&lt;/b&gt; bude nahrazen za text prvku a &lt;b&gt;%2&lt;/b&gt; až &lt;b&gt;%9&lt;/b&gt; za texty zachycenými pomocí regularního výrazu (části uzavřené v závorkách).&lt;/p&gt;\n\n&lt;p&gt;Použij &lt;b&gt;|&lt;/b&gt; pro zřetězení více příkazů (předání standardního výstupu do dalšího příkazu).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Příka&amp;z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Výs&amp;tup:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Filtrovat prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Obsah:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Přeskočí příkaz, pokud vstupní text neodpovídá tomuto regulárnímu výrazu (ponechte prázdné, aby vyhovovalo vše).\n\n%2 až %9 (nebo argument[1] a více ve skriptu) v příkazu a filtru budou nahrazeny zachycenými texty.\n\nPříklady:\n\n- Shoda URL: ^(https?|ftp)://\n- Shoda s názvy souborů PDF: \\.pdf$\n- Shoda s jedním znakem: ^.$\n- Shoda se vzdálenými multimédii: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>O&amp;kno:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Data tohoto MIME formátu budou poslána na vstup programu.\nPro vypnutí zanechej prázné.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Akce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Nastavení příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Zobraz dialog akcí před provedením příkazu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Spusť příkaz automaticky pokud je ve schránce nový obsah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtr:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Oddělovač prvků na výstupu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Dialog</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Typ akce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>&amp;Automaticky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Zobrazit příkaz v kontextové nabídce pro nevyfiltrované prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>V &amp;menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Globální zkratka:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the catured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Přeskočí příkaz, pokud se regulární výraz neshoduje s textem na vstupu (prázdný výraz se vždy shoduje).\n\n%2 až %9 v příkazu a filtru budou nahrazeny za texty zachycené regulárním výrazem.\n\nPříklady:\n\n- Shoda s URL: ^(https?|ftp)://\n- Shoda s cestou k PDF souboru: \\.pdf$\n- Shoda s textem s jediným znakem: ^.$\n- Shoda s URL k mediím: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Přeskočí příkaz, pokud filtr skončí s nenulovým kódem.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Odstranit nevyfiltrovaný prvek\n\nPoznámka: Pokud je akce provedena automaticky, žádné následující příkazy se neprovedou.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>O&amp;dstranit prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menu položka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Skrýt hlavní okno po aktivaci příkazu z kontextového menu prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Skrýt hlavní okno po aktivaci položky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Změnit prvek, nevytvářet nové prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>&amp;Transformovat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Vytvoří prvky ze standardního výstupu příkazu (pro vypnutí ponechej prázdné)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Pokročilé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skript</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Typ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Zobrazení</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Přeskočí příkaz, pokud vstupní text neodpovídá tomuto regulárnímu výrazu (ponechte prázdné, aby vyhovovalo vše).\n\n%2 až %9 v příkazu a filtru budou nahrazeny zachycenými texty.\n\nPříklady:\n\n- Shoda URL: Příklad: ^(https?|ftp)://\n- Shoda s názvy souborů PDF: \\.pdf$\n- Shoda s jedním znakem: ^.$\n- Shoda se vzdálenými multimédii: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>&amp;Formát:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Do &amp;záložky:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>Oddě&amp;lovač:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Ulož prvky do záložky s daným názvem (do první záložky, pokud není název uveden)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Pokročilé volby</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Výstupní záložka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Klávesová zkratka:</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Písmo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Pozadí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Obyčejné</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Nalezené</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Vybrané</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Sudé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Popředí</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Zobraz čís&amp;lo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Zobraz posuvníky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>&amp;Systémové ikony</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Vyhlazování</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>P&amp;osuvníky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Tooltip</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Použij ikony z prostředí, pokud je to možné</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>&amp;Aplikuj paletu na záložky, panely a menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Resetovat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Téma:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>N&amp;ačíst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Uložit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Upravit současné téma v editoru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>E&amp;ditovat téma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Náhled:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Vyber prvek\na stiskni F2 pro editaci.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Ukázkový prvek %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Nějaké poznámky (Shift+F2 pro editaci)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Vyhledávaný výraz je %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Otevřít soubor s tématem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Uložit soubor s tématem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Externí editor nenastaven</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Před editací je potřeba nastavit externí editor!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Jazyk:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Zalom řádek pokud je příliš dlouhý</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>&amp;Zalamovat řádky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Ponechat hlavní okno nad ostatními</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>&amp;Ponechat v popředí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Zavři hlavní okno po aktivování jiné aplikace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Zavři okno po deaktivaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Povol k otevírání oken na aktuální obrazovce. Zakaž k otevírání oken, kde byla naposledy uzavřena</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>O&amp;tevírat okna na aktuální obrazovce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Potvrzovat ukončení aplikace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Potvrzovat &amp;ukončení aplikace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Spustit aplikaci po přihlašení do systému</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Automaticky spustit</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Podpora pro Vi navigaci (klávesy H, J, K, L a více), klávesa lomítko (/) pro vyhledávání</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Vi navigace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Zabrání zachytávání oken aplikací ve snímcích a nahrávkách obrazovky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Skrýt na snímcích a nahrávkách obrazovky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Šifrovat data záložek na disku (vyžaduje nastavení hesla)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Ši&amp;frovat záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Použít dostupné externí úložiště klíčů pro heslo šifrování (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>Použít &amp;externí úložiště klíčů</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Změnit heslo používané k šifrování dat záložek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Změnit &amp;heslo šifrování…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Styl navigace:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Podpora pro Vi navigaci (klávesy H, J, K, L a více) a Emacs navigaci (Ctrl+N, P, V a více)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Výchozí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Ukládat a načítat historii filtrů pro prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Ukládat historii filtrování prvků</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Automaticky zobrazí menu pro dokončení názvu funkcí, typů a proměnných v příkazech</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Automaticky dokončovat příkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulace se schránkou</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Povolit vkládání zkopírovaného textu pomocí myši (obvykle prostřední tlačítko myši)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Vkládat schránku pomocí myši</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Povolit vkládání textu vybraného pomocí myši (obvykle Ctrl+V nebo Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Vkládat text vybraný myší pomocí klaves</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Uložit schránku v historii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Ukládat schránku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Ukládat text vybraný myší do historie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Ukládat text vybraný myší</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Spouštět automatické příkazy pro výběr myši</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Maximální počet prvků v historii:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Maximální počet prvků v každé záložce</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Interval v minutách pro odstranění prvků z paměti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>&amp;Interval pro odstranění záložky z paměti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Odstraň načtené záložky z paměti po uběhnutí daného intervalu v minutách.\n\nNastav na 0 pro zachování záložek v paměti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Vyžadovat heslo po uplynutí intervalu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Časový limit v sekundách pro opětovné vyžádání hesla u šifrovaných záložek.\n\nNastav na 0 pro globální vypnutí.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Příkaz pro editor (%&amp;1 je název souboru):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Příkaz pro externí editor (%1 je název souboru).\n  Příklady:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Záložk&amp;a pro ukládání schránky:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Název záložky pro automatické ukládání nového obsahu schránky.\n\nPonechej prázdné pro vypnutí ukládání schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Nezaškrtnuto pro klávesu Enter pro uložení editovaného prvku a Ctrl+Enter pro vytvoření nového řádku.\n\nPozn.: Editované prvky mohou být uloženy pomocí F2 bez ohledu na tuto volbu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>&amp;Ulož prvek pomocí Ctrl+Enter a vytvoř nový řádek pomoci Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Zobrazí jednořádkový popis pro každy prvek.\n\nPoužij Náhled prvku pro zobrazení celého obsahu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Zo&amp;braz jednoduché prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Povolí hledaní čísel; jinak stisk klávesy aktivuje prvek na dané pozici</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Hledaní čísel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Aktivovat prvky jedním kliknutím</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Po aktivování prvku (dvoj-klik nebo klávesa Enter), zkopíruj do schránky a ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Přesunout prvek na začátek seznamu po jeho aktivaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>&amp;Přesunout prvek na začátek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Zavři hlavní okno po aktivování prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Zavři hlavní okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Vyber poslední aktivní okno po aktivování prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Vyber poslední aktivní okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Vlož do vybraného okna po aktivování prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>V&amp;lož do vybraného okna</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Zobrazit/Skrýt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Skrývat záložky (stiskem klávesy Alt se zobrazí)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Skrývat &amp;záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Skryj nástrojový panel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Skryj ná&amp;strojový panel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Skr&amp;yj popisky v panelu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Skrývat hlavní okno po zavření</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Skrýva&amp;t hlavní okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Rozvržení a průhlednost</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Zobraz strom se záložkami místo panelu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Stro&amp;m se záložkami</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Aktivní průhlednost:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Průhlednost aktivního hlavního okna.\n\nPoznámka: Tato funkce není podporována na některých systémech.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>&amp;Neaktivní průhlednost:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Průhlednost neaktivního hlavního okna.\n\nPoznámka: Tato funkce není podporována na některých systémech.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Zobrazovat počet prvků u záložek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Zo&amp;brazovat počet prvků</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Poz&amp;ice upozornění:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Pozice na obrazovce pro zobrazení upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Navrchu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Naspodu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Vpravo nahoře</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Vpravo dole</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Vlevo dole</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Vlevo nahoře</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>&amp;Interval v sekundách pro zobrazení upozornění:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Interval v sekundách pro zobrazení upozornění při kopírovaní prvku (pouze pokud je zavřené hlavní okno).\n\nNastav na 0 pro vypnutí.\n\nNastav na -1 pro skrytí po kliknutí.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Poče&amp;t řádků pro upozornění s obsahem schránky:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Počet řádků zobrazených z obsahu schránky v upozornění.\n\nNastav na 0 pro vypnutí.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>Po&amp;užít nativní upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Velikost a pozice upozornění (v bodech obrazovky)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Hor&amp;izontální posun:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Vzdálenost od levého nebo pravého okraje obrazovky v bodech obrazovky pro zobrazení upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>V&amp;ertikální posun:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Vzdálenost od horního nebo dolního okraje obrazovky v bodech obrazovky pro zobrazení upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>&amp;Maximální šířka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Maximální šířka pro upozornění v bodech obrazovky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>M&amp;aximální výška:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Maximální výška pro upozornění v bodech obrazovky</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Nezobrazovat ikonu v liště; minimalizovat okno při zavření</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Nezobrazovat ikonu v &amp;liště</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Zobraz příkazy pro současný obsah schránky v menu lišty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Z&amp;obraz příkazy pro obsah schánky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>&amp;Počet prvků v menu hlavní lišty:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Počet prvků v menu hlavní lišty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Zobraz prvky z aktivní záložky v menu lišty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>&amp;Zobraz aktivní záložku v menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>nebo &amp;jinou záložku:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Název záložky pro zobrazení v menu (prázdný pro první záložku)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Vložit prvek do aktuálního okna po jeho vybraní z menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Vložit vybraný prvek do aktuálního okna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Zobraz náhled obrázků vedle prvků menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Zo&amp;braz náhledy obrázků jako icony v menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Obecné</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Rozvržení</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Historie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Lišta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Klávesové zkratky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Vzhled</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Neplatná hodnota pro nastavení &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Nutný restart</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Jazyk bude změněn až po restartu aplikace.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Resetovat volby?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Tato akce resetuje všechna nastavení (ve všech záložkách) na implicitní hodnoty. &lt;br /&gt;&lt;br /&gt;Opravdu chcete &lt;strong&gt;resetovat všechna nastavení&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Nastavení</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Nelze vytvořit adresář pro synchronizaci &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Vyber ikonu…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Výběr ikony</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Procházet...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Otevřít soubor s ikonou</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Obrázky (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Vše</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Záložky:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>&amp;Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>&amp;Příkazy</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">Chybový kód editoru je %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Příkaz editoru: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Příkaz pro editaci selhal (viz log)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Uložit</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Uložit prvek (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Zrušit</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Zrušit editaci a vrátit změny</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Escape</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Písmo</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Tučné</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Kurzíva</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Podtržené</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Přeškrtnuté</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Popředí</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Pozadí</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Vymazat styl</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Hledat</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Zpět</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Znovu</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Pro sdílení zašifrovaných prvků na jíném počítači nebo v jiném sezení jsou zapotřebí soubory klíčů:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Ulož tento soukromí klíč na bezpečném místě.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuGP musí být nainstalován pro zobrazení zašifrovaných záložek.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Zašifrovat (vyžaduje GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Dešifrovat</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Dešifrovat a kopírovat</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Dešifrovat a vložit</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Chyba: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Došlo k chybě pří generování klíčů.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Pro sdílení zašifrovaných prvků na jíném počítači nebo v jiném sezení jsou zapotřebí soubory klíčů (musí být uloženy na bezpečném místě):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Hotovo</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Vytváření nových klíčů (může zabrat i několik minut)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Nastavuje se nové heslo...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Pro šifrování prvků &lt;strong&gt;je nutné vygenerovat&lt;/strong&gt; klíče.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Vygenerovat nové klíče...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Změnit heslo...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Šifrování selhalo!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Dešifrování selhalo!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Šifrování</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Šifrování prvků a záložek.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Pro zašifrování a odšifrování prvků přidej příslušné příkazy v záložce Příkazy.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Sdílení zašifrovaných prvků a záložek</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Zašifrované záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Zadej názvy záložek (jedna na řádek), které budou automaticky zašifrováný a dešifrovány.&lt;/p&gt;\n&lt;p&gt;Pro bezpečné odstranění prvků z paměti nastav interval pro odstanění prvků z záložce Historie.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Poškozená záložka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Ne všechny prvky v záložce &lt;strong&gt;%1&lt;/strong&gt; byly úspěšně načteny. Chcete ještě kartu načíst a případně přijít o některé prvky?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim je součástí aplikace Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emuluje chování Vim editoru při editaci prvků.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Povolit FakeVim pro editaci prvků</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Cesta ke konfiguračnímu souboru:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Obrázky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Zobrazení obrázků.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>&amp;Maximální šířka obrázku:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Maximální šířka obrázku zobrazeného v seznamu (nastav na nula pro původní rozměr)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>M&amp;aximální výška obrázku:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Maximální výška obrázku zobrazeného v seznamu (nastav na nula pro původní rozměr)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>&amp;Editor obrázků:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Příkaz pro editaci obrázků podporovaných typů mimo SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG editor:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Příkaz pro editaci SVG obrázků.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Zobrazení poznámek pro prvky.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Umístění poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>N&amp;ad prvkem</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Po&amp;d prvkem</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>V&amp;edle prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>&amp;Zobrazovat tooltip</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Odebrat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Přesunout výše</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Přesunout níže</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Přesunout navrch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Přesunout naspod</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Výše</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Níže</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Nelze odstranit připnutý prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>K odstranění je nutné prvek nejprve odepnout.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Připnout</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Odepnout</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Připnuté prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Připnutí prvku k stávajícímu řádku a prevence odstranění.&lt;/p&gt;&lt;p&gt;Poskytuje klávesové zkratky a skriptovací funkce.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Procházet...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Otevřít adresář pro synchronizaci</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Nelze vytvořit adresář pro synchronizaci</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synchronizace</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Synchronizace prvků a poznámek s adresářem na disku.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Nelze synchronizovat záložku &quot;%1&quot; s adresářem &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Odstranit prvky?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Opravdu chcete &lt;strong&gt;odebrat všechny prvky a přiřazené soubory&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Synchronizace záložek a adresářů</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Synchronizuje obsah &lt;strong&gt;záložky&lt;/strong&gt; s adresářem s danou &lt;strong&gt;cestou&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Nastav &lt;strong&gt;prázdnou cestu&lt;/strong&gt; pro neukládaní prvků v &lt;strong&gt;záložce&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Název záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Cesta k adresáři</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Datové formáty pro soubory</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Nastav typ média na &lt;strong&gt;-&lt;/strong&gt; (znak mínus) pro ignorování souborů. Ostatní neznámé nebo skryté souboru jsou ignorovány.&lt;/p&gt;\n&lt;p&gt;Příklad: Nahraj soubory s příponou &lt;strong&gt;txt&lt;/strong&gt; jako &lt;strong&gt;text/plain&lt;/strong&gt; typ.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Typ média prvku</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Nastav MIME typ na &lt;strong&gt;-&lt;/strong&gt; (znak mínus) pro ignorování souborů. Ostatní neznámé nebo skryté souboru jsou ignorovány.&lt;/p&gt;\n&lt;p&gt;Příklad: Nahraj soubory s příponou &lt;strong&gt;txt&lt;/strong&gt; jako &lt;strong&gt;text/plain&lt;/strong&gt; MIME typ.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Nastav MIME typ na &lt;strong&gt;-&lt;/strong&gt; (pomlčka) pro ignorování souborů. Ostatní neznámé nebo skryté souboru jsou ignorovány.&lt;/p&gt;\n&lt;p&gt;Příklad: Nahraj soubory s příponou &lt;strong&gt;txt&lt;/strong&gt; jako &lt;strong&gt;text/plain&lt;/strong&gt; MIME typ.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Přípony</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">MIME typ prvku</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Přidat štítek</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Odebrat štítek</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Přidat štítek %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Odebrat štítek %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Přepnout štítek %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Nelze odstranit prvky s uzamčeným štítkem</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>K odstranění je nutné uzamčený štítek nejprve odebrat.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Důležité</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Odebrat všechny štítky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Štítky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Zobrazení štítků u prvků.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Menu položky pro přidávaní a odebíraní štítků lze nastvit v dialogovém okně Příkazy.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Další informace jsou dostupné na &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki stránce&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Název štítku</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Styl</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Barva</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ikona</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Zamknout</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Zabraní odstranění prvku</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Text</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Zobrazení textových a jednuduchých HTML prvků.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Ulož a zobraz HTML</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Maximální počet řádků k zobrazení (0 pro zobrazení všech):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Maximální výška prvků v pixelech (0 pro nelimitovaní):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Výchozí styl:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Zobrazení webových stránek.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Maximální výška prvků v pixelech (0 pro nelimitovaní):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Záznam běhu</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Ukončit?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Opravdu chcete aplikaci CopyQ &lt;strong&gt;ukončit&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Zobrazit/Skrýt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editovat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Nápověda</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">Po&amp;vol ukládání schránky</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">Za&amp;kaž ukládání schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Schránka: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ prvky (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nová záložka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Přejmenovat &amp;skupinu %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>&amp;Přejmenovat záložku %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>&amp;Odebrat záložku %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Odebrat skupinu %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Změnit ikonu záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Nastavení pro import</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Šifrování není dostupné</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>Šifrování není dostupné (podrobnosti naleznete v záznamech).\n\nNebude možné šifrovat a dešifrovat data záložek.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Heslo pro import</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Zadejte heslo pro import:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Heslo pro export</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Zadejte heslo pro export (prázdné pro vypnutí šifrování):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Nastavení pro export</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Chyba exportu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Nepodařilo se exportovat soubor %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Chyba importu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Nepodařilo se importovat soubor %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Odstranit všechny záložky ve skupině?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Opravdu chcete odebrat &lt;strong&gt;všechny záložky&lt;/strong&gt; ve skupině &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Odebrat záložku?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Opravdu chcete odebrat záložku &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informace</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n řádek)</numerusform>\n            <numerusform>%1 (%n řádky)</numerusform>\n            <numerusform>%1 (%n řádků)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;SKRYTÁ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;OBRÁZEK&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;PRVKY&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;PRÁZDNÁ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Název Sezení musí obsahovat ne více než 16 znaků,\nkteré mohou být pouze písmena bez diakritiky, čísla, &apos;-&apos; nebo &apos;_&apos;!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n řádek &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n řádky &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n řádků &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;schránka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nový prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importovat...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Exportovat...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Nastavení...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation></translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">&amp;Příkazy/Globální zkratky...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>&amp;Příkazy...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Zobrazit &amp;obsah schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Povol/zakaž ukládání schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>&amp;Správce Procesů</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Ukončit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Uspořádat vybrané prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Obrátit pořadí vybraných prvků</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Vložit prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Kopírovat vybrané prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Najít</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Přesunout do &amp;schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;Zobrazit obsah...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Zobrazit náhled</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Přesunout do &amp;schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Odebrat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editovat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>&amp;Editovat poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">E&amp;ditovat v editoru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Akce...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Přesunout výše</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Přesunout níže</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Dolů</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Přesunout nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Přesunout dolů</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nová záložka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>&amp;Přejmenovat záložku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>&amp;Odebrat záložku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Změnit ikonu záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>&amp;Další záložka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Vpravo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Vlevo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Otevři kontextové menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Př&amp;edchozí záložka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Ulož prvek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Zrušit editaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Zpět</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Znovu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Písmo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Tučně</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Kurzíva</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Podtrhnout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Přeškrtnout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Popředí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Pozadí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Vymazat styl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Hledat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;ktivovat prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>E&amp;ditovat v editoru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Záznam běhu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;O aplikaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Nápověda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Záložka %1 je poškozená nebo chybí některé zásuvné moduly!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Text zkopírován (%n řádek)</numerusform>\n            <numerusform>Text zkopírován (%n řádky)</numerusform>\n            <numerusform>Text zkopírován (%n řádků)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Text zkopírován</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Data zkopírována</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Nové heslo šifrování záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Zadejte nové heslo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>Hesla se neshodují. Zkuste to znovu (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Změnit heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>Nové heslo nemůže být prázdné.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Nastavení hesla selhalo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Překročen maximální počet pokusů o zadání hesla.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Potvrdit heslo šifrování</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Zadejte heslo znovu pro potvrzení:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Aktuální heslo šifrování záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Zadejte aktuální heslo pro šifrování dat záložky:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Neplatné heslo. Zkuste to znovu (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Ověření hesla selhalo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Šifrovací soubory jsou poškozeny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Šifrovací soubory chybí nebo jsou poškozeny. V přísném režimu nelze automaticky obnovit šifrované záložky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Změna hesla selhala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Nepodařilo se změnit heslo. Staré heslo je stále aktivní. Podrobnosti naleznete v záznamech.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Změna hesla úspěšná</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>Heslo bylo úspěšně změněno.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Přešifrovávání záložek…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Přešifrovávání záložky %1 z %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Nepodařilo se zašifrovat následující záložky:\n\n%1\n\nPodrobnosti naleznete v záznamech.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Šifrování selhalo</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Skryje hlavní okno.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Zobrazí nebo skryje hlavní okno.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Otevře kontextové menu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Ukončí server.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Vytiskne obsah schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Vytiskne obsah výběru kurzoru.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ŘÁDEK</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Přidá text do schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Vloží text do daného řádku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Odstraní prvky v daných řádcích.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ŘÁDKY</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Edituje existující prvky nebo nový.\nHodnota -1 znamená text ve schránce.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Vytiskne data schránky nebo prvku v daném řádku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Zobrazí hlavní okno a případně otevře záložku s daným jménem.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Povolí nebo zakaže ukládání obsahu schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Vloží obsah schránky do aktuálního okna\n(nemusí vždy fungovat).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Nastaní text ve schránce.</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nNastaví obsah schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Vytiskne počet prvků ve vybrané záložce.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Zkopíruje prvek v řádku do schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Zkopíruje další prvek z vybrané záložky do schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Zkopíruje předchozí prvek z vybrané záložky do schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Nastaví oddělovač prvků na výstupu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>ODDĚLOVAČ</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nZapíše surová data do daného řádku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Zobrazí dialog akcí.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nSpustí PROGRAM pro vstupní text v daných řádcích.\nPožij %1 v PROGRAMu k předání textu jako parametru.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation></translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nZobrazí zprávu v liště na daný ČAS (milisekundy).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITULEK</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>ZPRÁVA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>ČAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Vypíše názvy existujících záložek.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Spustí příkaz na záložce s daným jménem.\nZáložka je vytvořena, pokud neexistuje.\nPůvodní volba je první záložka.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nSpustí program v jazyce ECMASctipt.\nArgumenty jsou přístupně pomocí &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Spustit testy (přidej argument --help pro více informací).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NÁZEV</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Zkopíruje obsah z aktuálního okna do schránky\n(nemusí vždy fungovat).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Nastaví obsah schránky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Zapíše surová data do daného řádku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Spustí PROGRAM pro vstupní text v daných řádcích.\nPožij %1 v PROGRAMu k předání textu jako parametru.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Zobrazí zprávu v liště na daný ČAS (milisekundy).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>PŘÍKAZ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Odstraní záložku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Přejmenuje záložku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NOVÝ_NÁZEV</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Exportuje prvky do souboru.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>SOUBOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importuje prvky ze souboru.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Zobrazí všechna nastavení.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Vytiskne hodnotu volby.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>VOLBA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Nastaví hodnotu volbu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>HODNOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Vyhodnotí skript.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Spustí nebo se připojí k instanci applikace s daným názvem Sezení.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Vytiskne nápovědu pro PŘÍKAZ nebo všechny příkazy.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Vytiskne verzi programu a jeho knihoven.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Spustí server v pozadí před provedením příkazu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Neplatné nastavení &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SKRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTY</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nSpustí nebo se připojí k instanci applikace s daným názvem Sezení.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SEZENÍ</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nVytiskne nápovědu pro PŘÍKAZ nebo všechny příkazy.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nVytiskne verzi programu a jeho knihoven.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Použití: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Spustí server pokud není zadán žádný příkaz.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  PŘÍKAZY:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>POZNÁMKY:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Použij pomlčku (-) jako argument pro načtení dat ze standardního vstupu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Nepodařilo se exportovat soubor „%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Nepodařilo se importovat soubor „%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Správce Schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Výjimka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Výjimka v %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Nepodařilo se kopírovat do schránky!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Použij dvojitou pomlčku (--) pro načtení všech následujících argumentů\n    bez expandování sekvencí jako jsou \\n, \\t a další.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Použij ? pro MIME pro výpis dostupných MIME typů (implicitní hodnota MIME je &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Špatný počet argumentů!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Příkaz nenalezen!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Ukončuji server.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Nelze uložit soubor &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Nelze importovat soubor &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Záložka s daným názvem neexistuje!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Název záložky nemůže být prázdný!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Záložka se stejným jménem již existuje!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Ukládání schránky zakázáno*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Přidat zkratku</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Nová klávesová zkratka</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Zmáčkněte kombinaci kláves.&lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; pro zrušení.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Klikněte zde a zmáčkněte kombinaci kláves</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Odebrat zkratku</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Zkratka již existuje!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Hledat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;Globální</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Globální klávesová zkratka může být aktivována z jakékoliv aplikace.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;Aplikační</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Aplikační klávesová zkratka může být aktivována pouze z hlavního okna.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Aplikační klávesová zkratka může být aktivována pouze z této aplikace.</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Název záložky musí být neprázdný a unikátní.&lt;br /&gt;\nZáložka &lt;b&gt;Zá&amp;amp;pisky&lt;/b&gt; může být otevřena pomocí &lt;b&gt;Alt+p&lt;/b&gt;.&lt;br /&gt;\nPouožij &lt;b&gt;/&lt;/b&gt; jako rozdělovník pro cestu ve stromu záložek.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Název:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Nová záložka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Přejmenovat záložku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Přejmenovat skupinu záložek</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Maximální počet prvků:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>výchozí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Ukládat prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Vyžadovat heslo po uplynutí intervalu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Časový limit v sekundách pro opětovné vyžádání hesla šifrování pro záložku.\n\nNastav na 0 pro použití globálního nastavení.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>globální</translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;Ukládat prvky</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Stiskni &apos;/&apos; pro vyhledávání</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Začni psát pro vyhledávání</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Regulární výraz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Nerozlišovat velká a malá písmena</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_da.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"da_DK\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation type=\"unfinished\">Om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Udklipsholder administration</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Forfatter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Donér</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation type=\"unfinished\">Handlingsdialog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standard &amp;input:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Gem standard o&amp;utput:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Ko&amp;mmando:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Separator for nye elementer:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Regulær udtryk til at opdele output i flere elementer.&lt;\\p&gt;\n&lt;p&gt;Brug &lt;b&gt;\\n&lt;/b&gt; til at gemme hver linje i separate elementer.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Output fane:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Gemme elementer i fanen med følgende navn (tom gemmer i den aktuelle fane)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Kommandoen er gemt</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Kommandoen blev gemt og kan tilgås fra menuen.\nDu kan ændre kommandoen i indstillinget.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\">Fejl: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation type=\"unfinished\">Exit code: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Kommando %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation type=\"unfinished\">Proces Manager</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation type=\"unfinished\">Tilføj kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Vis/Skjul hovedvinduet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation type=\"unfinished\">Vis skuffemenuen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Vis hovedvinduet under musemarkøren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Rediger udklipsholder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Rediger første element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Kopier andet emne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Vis handlingsdialog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Opret nyt element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Kopier næste element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Kopier forrige element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Indsæt fra udklipsholder som almindelig tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Deaktiver lagring af udklipsholder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Aktiver lagring af udklipsholder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Indsæt og kopier næste</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Indsæt og kopier forrige</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Tag et skærmbillede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Indsæt aktuel dato og tid</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Ny kommando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorere elementer med ingen eller kun enkelte tegn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Åbn i &amp;Browser</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Indsæt som almindelig tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Automatisk afspilning af videoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Kopier URL (webadresse) til anden fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Opret miniature (behøver ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Opret QR kode fra URL (behøver qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Opgaver</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Føj til %1 fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Flyt til %1 fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorer kopierede filer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorere * &quot;Kodeords&quot; * vindue</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Adgangskode</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Flyt til papirkurven</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(Papirkurv)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Kan ikke tilføje nye emner</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"obsolete\">Fanen er fuld. Det lykkedes ikke at fjerne nogle emner.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Kasser ændringer?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Vil du &lt;strong&gt;slette ændringer&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Kan ikke forbinde til server! Start CopyQ server først.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Forbindelsen mistet!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation type=\"unfinished\">Udklipsholder-indhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formater:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>Indhold:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Fjern format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation type=\"unfinished\">Element indhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\">&lt;strong&gt;Størrelse:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Størrelse:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ serveren kører allerede.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Annuller aktive kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Annuller aktive kommandoer og afslut?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Annuller afslut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Afslut alligevel</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Mellemrum</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\">Kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definere nye kommandoer, der enten kan aktiveres automatisk på nyt udklipsholder indhold eller af bruger fra menuen eller ved hjælp af system genvej.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Find:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopier valgte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Indsæt kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Ikke-gemte ændringer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Dialogen kommando har ikke gemte ændringer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Åben filer med kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Kommandoer (*.ini);; CopyQ konfiguration (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Gem valgte kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Kommandoer (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Vis kommando hjælp (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Kommandoen indeholder listen over programmer med argumenter, som vil blive udført. For eksempel:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Programmet argumentet %1 vil erstattes elementtekst, og %2 gennem %9 for tekster fanget af regulære udtryk.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Tegnet 1% kan anvendes til at videregive standard uddata til det næste program.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Følgende syntaks kan bruges at videregive resten af kommandoen som en enkelt parameter.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Dette giver samme output som %1 men er mere nyttigt for længere kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Funktioner nedenfor kan bruges i følgende kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>Udklipsholder</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Navn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Kommandonavnet vises i menuen</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Typen af handling</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Kør kommandoen automatisk, hvis udklipsholder har nyt indhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matisk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Vis kommando i kontekstmenuen til matchende elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>I m&amp;enu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Global genvej:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Global genvej</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation type=\"unfinished\">Matche elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Data af denne MIME-type vil blive sendt til standard input kommando.\nLad være tom for at deaktivere.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Komman&amp;do</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Skjul vindue, når kommando er aktiveret fra kontekstmenuen for et element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Ændre element, opret ikke nye elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Opret elementer fra standard output af programmet (lad være tom for at deaktivere)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Vis avanceret</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Vindue:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"obsolete\">&lt;p&gt;Brug kun kommandoen for elementer, hvis teksten svarer til dette regulære udtryk (lad være tom for at matche noget).&lt;/p&gt; &lt;p&gt;&lt;span style=&quot;font-weight:600;&quot;&gt; eksempler:&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Match URL &lt;span style=&quot;font-weight:600;&quot;&gt; ^(https?| FTP): / /&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Match PDF filnavne &lt;span style=&quot;font-weight:600;&quot;&gt; \\.pdf$&lt;/span&gt;&lt;/p&gt; &lt;p&gt;matcher enkelttegn &lt;span style=&quot;font-weight:600;&quot;&gt; ^. $&lt;/span&gt;&lt;/p&gt; &lt;p&gt;matcher remote multimedia &lt;span style=&quot;font-weight:600;&quot;&gt; ^ http://.*\\. () ogv|VLC|MP4|MP3) $&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Indhold:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filter:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"obsolete\">&lt;p&gt;Brug kun kommandoer, hvis filterkommandoen lykkes.&lt;/p&gt;\n\n&lt;p&gt;Element tekst sendes til &lt;b&gt;standard input&lt;/b&gt; af filterkommandoen. Elementet er &lt;b&gt;matches kun hvis filter kommandoen exit-koden 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Brug &lt;b&gt;%1&lt;/b&gt; for element tekst overføres som argument og &lt;b&gt;%2&lt;/b&gt; til &lt;b&gt;%9&lt;/b&gt; for argumenter fanget af regulære udtryk (dele omsluttet af parenteser).&lt;/p&gt;\n\n&lt;p&gt;Brug &lt;b&gt;|&lt;/b&gt; til kæde kommandoer (passere standard output til næste kommando).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Handling</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Navnet på fanen som nye elementer kopieres til (lad være for tom for ikke at kopiere)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Fjern matchende element\n\nBemærk: Hvis dette anvendes automatisk, udføres ingen andre automatiske kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Fjern element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Handlings menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>Skjul hovedvinduet efter aktivering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>Genvej:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Kommandoindstillinger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Vis dialogboks for handling før du udfører kommandoen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>Vent</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>O&amp;utput:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avanceret</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skript</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Visning</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>F&amp;ormat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Ko&amp;pier til fane:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Separator:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\">Separator, der skal matche for at opdele output til flere emner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Outpu&amp;t fane:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Gem elementer i fane med givet navn (Tom for at gemme i første fane)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Baggrund</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Noter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Fundet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Valgt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Skrifttype</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternativ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Forgrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Meddelelse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Vis &amp;Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Vis rullepaneler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Rullepaneler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Brug ikoner fra skrivebordsmiljø når det er muligt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Angiv farver for faner, værktøjslinjen og menuerne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>S&amp;ystem ikoner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Antialias</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>Nulstil tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>Ind&amp;læs tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>Gem tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Rediger aktuelle tema i ekstern editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Re&amp;diger tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Forhåndsvisning:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Søgestrengen er %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Vælg et element og\ntryk F2 for at redigere.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Eksempel element %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Nogle tilfældige noter (Shift + F2 for at redigere)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Åben temafilen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Gem temafil som</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Ingen ekstern Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Angiv først en ekstern editor!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation type=\"unfinished\">Sprog:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\">Ombryd teksten, hvis den er for lang til at passe på linien</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\">Tekst&amp;omløb</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\">Hold hovedvinduet over andre vinduer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\">Altid forrest</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\">Luk hovedvinduet, når andet program har fokus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\">Luk når ikke har fokus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\">Aktiver for at åbne vinduer på den aktuelle skærm. Deaktiver for at åbne vinduer hvor de sidst blev lukket</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\">Åbn vinduer på det aktuelle skærmbillede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\">Bekræft afslut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation type=\"unfinished\">Bekræft afslut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\">Kør programmet ved system start</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\">&amp;Autostart</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"obsolete\">Undersøtter Vi navigationstaster (H, J, K, L og flere), skråstreg (/) for at søge</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"obsolete\">&amp;Vi navigation</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Gemme og gendanne element filtre historik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\">Gem Filter historik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\">Vis automatisk en popup til at fuldføre funktion, type og variabelnavne i kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\">Automatisk fuldfør kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\">Udklipsholder manipulation</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Tillad at indsætte kopieret indhold på samme måde som muse markeringer (normalt ved at trykke på midterste museknap)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\">(&amp;3) Indsæt Udklipsholder med musen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\">Gør det muligt for at indsætte musemarkeringer med genvej (normalt Ctrl+V eller Shift+Indsæt)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\">(&amp;4) Indsæt musemarkering med tastatur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\">Gemme udklipsholder i historik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\">(&amp;1) Gem Udklipsholder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\">Gem tekst markeret med musen (primær markering) i historik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\">(&amp;2) Gem tekst markeret med musen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\">Maksimalt antal af elementer i historik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\">Maksimalt antal af elementer i hver fane</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"obsolete\">Fjern fane efter interval i min&amp;utter:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\">Fjern hver fane fra hukommelsen efter et bestemt antal minutters inaktivitet.\n\nSæt til 0 for ikke at fjerne faner.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\">Ekstern editor kommando (%&amp;1 er fil der skal redigeres):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\">Ekstern editor kommando (%1 er filen der skal redigeres).\n Eksempler:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\">Fane til lagring udklipsholderen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\">Navn på fane, der automatisk vil gemme nyt udklipsholder indhold.\n\nLad være tom for at deaktivere automatisk lagring.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\">Lad være umarkeret for at lade Returtasten gemme redigerede elementer og Ctrl+Retur for ny line.↵\n↵\nBemærk: Redigerede elementer kan gemmes med F2 på trods af denne mulighed.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\">Gem redigeret element med Ctrl+Retur og opret en ny linje med Returtasten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\">Vis kun en enkelt linje beskrivelse af hvert element.\n\nBrug element eksempelvisning for at få vist hele elementer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\">Vis enkle elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\">Aktiverer søge efter numre, ellers tryk på en ciffertast aktiverer element på denne position</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\">Søg &amp;efter for tal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\">Når elementer er aktiveret (dobbeltklik eller Enter-tasten), kopier det til Udklipsholder og…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\">Flyt elementet til toppen af listen efter det er aktiveret</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\">Flyt elementet til t&amp;oppen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\">Luk hovedvinduet, når elememtet er blevet aktiveret</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\">Luk hovedvinduet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\">Fokus på sidste vindue efter element er aktiveret</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\">&amp;Fokus på sidste vindue</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\">Indsæt i det aktuelle vindue, når elementet er aktiveret</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\">Indsæt i det aktuelle vindue</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\">Vis/Skjul</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\">Skjul faner (tryk på Alt-tasten for at vise)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\">Skjul faner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\">Skjul værktøjslinjen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\">Skjul værktøjslinjen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\">Skjul værktøjslinjeetiketter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\">Skjul ovedvinduet når lukket</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\">Skjul &amp;hovedvinduet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\">Layout og gennemsigtighed</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\">Vis træ med faner i stedet for fanebjælken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\">Fanet&amp;ræ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\">Gennemsigtighed når &amp;fokus:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\">&amp;Ufokuseret gennemsigtighed:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\">Vis antallet af elementer i faner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\">Vis element antal</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\">Meddelelse placering:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\">Position på skærmen for meddelelser</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\">Top</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\">Bund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\">Øverst til højre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\">Nederst til højre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\">Nederst til venstre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\">Øverst til venstre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\">Int&amp;erval i sekunder til at vise meddelelser:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\">Interval i sekunder til at vise meddelelsen for nye udklipsholderens indhold eller hvis emne er kopieret til Udklipsholder (kun hvis hovedvinduet er lukket).\n\nIndstil til 0 for at deaktivere.\n\nIndstil til -1 for at holde synlige indtil klikket.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\">Antallet af linjer i udklipsholder meddelelse:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\">Antallet af linjer, der skal vises for nyt indhold i udklipsholderen.↵\n↵\nSæt til 0 for at deaktivere.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\">Meddelelsesgeometri (i skærmpunkter)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\">Horihorisontal forskydning:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\">Afstand til underretning fra venstre eller højre skærmkant i skærmpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\">&amp;Vertikal forskydning:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\">Afstand til underretning fra toppen eller bunden i skærmpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\">Maksimal bredde:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\">Maksimal bredde for underretning i skærmpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\">Maksimal højde:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\">Maksimal højde for underretning i skærmpunkter</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\">Vis ikke bakke ikon; minimer vindue når lukket</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\">Deaktiv&amp;er skuffe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\">Vis kommando for nuværende udklipsholder indhold i skuffemenuen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\">Vis kommandoer til klippebordsindhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\">Antallet af elementer i skuffemenu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\">Antal elementer i skuffemenuen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\">Vis elementer fra aktuel fane i skuffemenuen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\">Vis aktuelle fane i menuen,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\">eller vælg en anden fane:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\">Navnet på fanen til at vise i skuffe menuen (tom for den første fane)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\">Indsæt element i det aktuelle vindue efter det er valgt i menuen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\">Indsæt aktiveret element i det aktuelle vindue</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\">Vis billedeksempel ved siden af menupunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\">Vis billedeksempel som menupunkt ikon</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"obsolete\">Indstillinger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Ugyldig værdi for indstillingen &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Nulstil indstillinger?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Denne handling vil nulstille alle dine præferencer (i alle faner) til standard værdier. &lt;br /&gt;&lt;br /&gt;vil du virkelig ønsker at &lt;strong&gt;nulstille alle indstillinger&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Genstart er nødvendig</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Sprog vil blive ændret, når programmet genstartes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Kunne ikke oprette synkroniseringsmappen &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+pil ned</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>…</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\">Vælg ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Gennemse…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Åbn ikonfil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Billedfiler (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\">&amp;Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>Faner:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Ko&amp;nfiguration</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Ko&amp;mmandoer</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">Editor afslutningskode er %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Editor kommando: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Gem</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Gem elementet (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Annuller</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Annuller redigering og fortryd ændringer</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Skrifttype</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Fed</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Kursiv</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Understreget</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Gennemstreget</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Forgrund</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Baggrund</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Slet formatering</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Søg</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Fortryd</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Gendan</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"obsolete\">Hvis du vil dele krypterede elementer på en anden computer eller session, behøver du en offentlig og en hemmelige nøglefil: &lt;ul&gt;&lt;li&gt;%1&lt;/li&gt; &lt;li&gt;%2&lt;br/&gt;(opbevar den hemmelige nøgle på et sikkert sted.) &lt;/li&gt; &lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG skal være installeret for at se krypterede faner.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Krypter (kræver GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Dekrypter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Dekrypter og kopier</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Dekrypter og indsæt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\">Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Fejl: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Kunne ikke generere nøgler.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Færdig</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Oprettelse af nye nøgler (kan tage et par minutter)…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Annuller</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Indstil ny adgangskode…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Krypteringsnøgler &lt;strong&gt;skal genereres&lt;/strong&gt; før elementkryptering kan bruges.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Opret nye nøgler…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Skift adgangskode…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Kryptering mislykkedes!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Dekryptering mislykkedes!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Kryptering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Krypter elementer og faner.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>For at kryptere og dekryptere elementer tilføjes relevante kommandoer under fanen Kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Del krypterede elementer og faner</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Krypterede faner</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Angiv navnene på fanerne (én pr. linje), som automatisk vil blive krypteret og dekrypteret.&lt;/p&gt;\n&lt;p&gt;Sæt tidsinterval i Historikfanen til sikkert at fjerne dekrypterede elementer fra hukommelsen.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim udvidelse er en del af Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emuler Vim editor ved redigering af elementer.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Aktiver FakeVim for redigering af elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Sti til konfigurationsfilen:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Billeder</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Vis billeder.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Maksimal billedbredde:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Maksimal bredde på billede, der vises i historik (sæt til nul for oprindelige størrelse)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Maksimal billedhøjde:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Maksimal højde på billede, der vises i historik (sæt til nul for oprindelige størrelse)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>B&amp;illed editor kommando:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Redigeringskommando til understøttede billedformater bortset fra SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG editor kommando:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Redigerings kommando til SVG-billedformat.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Noter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Vis noter for emner.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Note placering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Vis værktøjstip</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>Tilføj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Fjern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Op</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Ned</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Kan Ikke fjerne fastgjorte emner</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Frigør først emner for at fjerne dem.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\">Fastgør</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\">Frigør</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Fastgjorte emner</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Gennemse…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Åbn mappe for synkronisering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Kunne ikke oprette synkroniseringmappe</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synkroniser</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Synkroniser elementet og noter med en mappe på disken.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\">Ikke kunne synkronisere fanen &quot;%1&quot; med mappen &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\">Fjern elementer?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\">Vil du &lt;strong&gt;fjerne elementer og tilhørende filer&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Synkronisering af faner og mapper</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Synkronisere indholdet af&lt;strong&gt;fanen&lt;/strong&gt; med mappe med givet &lt;strong&gt;sti&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Sæt til &lt;strong&gt;tom sti&lt;/strong&gt; for ikke at gemme elementer i &lt;strong&gt;fanen&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Fanenavn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Sti</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Filer til dataformater element</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Angiv MIME typen til &lt;strong&gt;-&lt;/strong&gt; (dash) for at ignorere filer. Andre ukendte eller skjulte filer bliver ignoreret.&lt;/p&gt;\n&lt;p&gt;Eksempel: indlæs &lt;strong&gt;txt&lt;/strong&gt; filtypenavn som &lt;strong&gt;tekst/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Udvidelser</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">MIME type for element</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Tilføj et mærke</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Fjern et mærke</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Mærk som %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Fjern mærket %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Vigtigt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Ryd alle mærker</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Mærker</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\">Vis mærket for emner.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Menupunkterne for at tilføje og fjerne brugerdefinerede mærker kan tilføjes og tilpasses i kommandoer dialogen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Mere info fås på &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt; wiki-side&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Mærkenavn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\">Match</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\">Typografiark</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Farve</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Vis klartekst og simple HTML-elementer.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Gem og vis HTML- og RTF-format</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Maksimalt antal linjer der vises (0 viser alle):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Maksimale højde i pixel (0 for ingen grænse):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Web</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"obsolete\">Maksimale højde i pixel (0 for ingen grænse):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\">Log</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Afslut?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Vil du &lt;strong&gt;afslutte&lt;/strong&gt; CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Fil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>R&amp;ediger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>Faner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hjælp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>Vi&amp;s/Skjul</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Ny fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Omdøb &amp;gruppen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Omdøb fa&amp;nen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Fjern fanen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Fjern gruppen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Ændre faneikon</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"obsolete\">Aktiver udklipsholder lagring</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"obsolete\">&amp;Deaktivere Udklipsholder lagring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\">Indstillinger for Import</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ fejl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\">Indstillinger for eksport</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\">Eksport fejl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Kunne ikke eksportere filen %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\">Import fejl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Kunne ikke importere filen %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>Udklipsholder: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ elementer (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Fjerne alle faner i gruppen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vil du fjerne &lt;strong&gt;alle faner&lt;/strong&gt; i gruppen &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Fjern fanen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vil du fjerne fanen &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Information</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;SKJULT&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n linie)</numerusform>\n            <numerusform>%1 (%n linier)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;BILLED&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;TOM&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Slet</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"obsolete\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linje &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linjer &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Sessionsnavn skal indeholde højst 16 tegn\nsom kan bestå af bogstaver, tal, &apos;-&apos; eller &apos;_&apos;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\">Udklipsholder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nyt element</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Import...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Eksport...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\">Indstillinger…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">K&amp;ommandoer/Globale genveje…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>K&amp;ommandoer…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\">Vis Udklipsholder-indhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\">Skif&amp;t udklipsholderlagring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\">P&amp;roces administrator</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\">Afslut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Sorter de markerede elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\">Omvend valgte elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Indsæt elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\">Kopiere markerede elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Find</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Flyt til Udklipsholder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\">Vis indhold…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Vis eksempel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"obsolete\">Flyt til Udklipsholder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\">Fjern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>R&amp;ediger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Rediger &amp;Noter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"obsolete\">Rediger med editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\">H&amp;andling…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Flyt op</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Pil Op</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Flyt ned</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Pil ned</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Flyt til Toppen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>CTRL+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Flyt til bunden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>CTRL+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Ny fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\">Omdøb fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\">Fjern fanen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\">Ændre faneikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\">Næste fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\">Højre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\">Venstre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\">Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\">Forrige fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\">Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\">Fortryd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\">Gendan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\">Skrifttype</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\">Fed</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\">Kursiv</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\">Understreget</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\">Gennemstreget</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\">Forgrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\">Baggrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\">Slet formatering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\">Søg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\">&amp;Vis Log</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\">Om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hjælp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Fanen %1 er beskadiget eller nogle CopyQ udvidelser mangler!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Annuller</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Skjul hovedvinduet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Vis eller skjul hovedvinduet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Åbn kontekstmenu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Afslut server.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Deaktiverer eller aktiverer lagring af udklipsholder indhold.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Udskriv udklipsholderens indhold.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Udskriv indholdet af X11 markering.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Indsæt Udklipsholderens aktuelle vindue\n(Virker muligvis ikke med nogle programmer).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\">Indstil udklipsholder teksten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXT</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"obsolete\">\nIndstil udklipsholder-indhold.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\">Kopiere element i rækken til Udklipsholder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ROW</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Kopier næste element fra aktuelle fane til Udklipsholder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Kopier forrige element fra den aktuelle fane til Udklipsholder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Tilføj tekst til Udklipsholder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Indsæt tekst i given række.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Fjern elementer i givne rækker.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ROWS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\">Rediger elementer eller redigere nye.\nVærdien -1 er for nuværende tekst i Udklipsholder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\">Sæt separator til elementer på output.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Udskriv rådata i Udklipsholder eller element i rækken.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nSkriv rådata til rækken.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\">Vis dialogboks for handling.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"obsolete\">\nKør PROGRAM på elementtekst i rækkerne.↵\nBrug %1 i PROGRAM til videregive  tekst som argument.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"obsolete\">\nVis skuffe popup besked til TID millisekunder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITEL</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>BESKED</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TID</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>List tilgængelige fanenavnene.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Kør kommandoen på fanen med navnet.\nFanen oprettes, hvis den ikke findes.\nStandard er den første fane.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nEvaluer ECMAScript program.\nArgumenter er tilgængelige via &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Kør program test (tilføj --help argument for mere information).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Vis hovedvinduet og eventuelt åbne fanen med navnet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Udskriv mængden af elementer i aktuelle fane.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMMAND</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Fjern fanen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Omdøbe fane.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NEW_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Eksportere element til fil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILE_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importer elementer fra fil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>List alle valgmuligheder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\">Få optionsværdi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Angiv parameterværdi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALUE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"obsolete\">\nStarter eller forbinder til ansøgning instans med given session navn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSION</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nUdskriv hjælp for KOMMANDO eller alle kommandoer.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nUdskriv programversion og biblioteker.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Brug: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Start server, hvis der ikke er specificeret nogen kommando.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  Kommandoer:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTER:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\">  - Brug dobbelt-bindestreg argument (--) til at læse alle følgende argumenter\n    uden at udvide escape-sekvenser (dvs. \\n, \\t m.fl.).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  -Brug ? for MIME til at udskrive tilgængelige MIME-typer (standard er &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Ugyldigt antal argumenter!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Undtagelse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Kunne ikke kopiere til udklipsholder!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Kommandoen blev ikke fundet!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Afslutter serveren.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Undtagelse i %1</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Kan ikke gemme filen &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  -Brug bindestreg argument (-) til at læse data fra standard input.</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">K.an ikke importere filen &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Ugyldig indstilling &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Fanen med det pågældende navn eksisterer ikke!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Fanenavn må ikke være tomt!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Fanen med det angivne navn findes allerede!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"obsolete\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"obsolete\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Tilføj genvej</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\">Ny genvej</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"obsolete\">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tryk på enhver tastekombination. &lt;span style=&quot;font-weight:600;&quot;&gt;Esc&lt;/span&gt;for at annullere.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Klik her og tryk på tastekombination</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Fjern genvej</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Find:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Genvejen findes allerede!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Fanenavn skal være unik og ikke-tom.&lt;br/&gt;\nFanen &lt;b&gt; No&amp;amp;ter&lt;/b&gt; kan åbnes ved hjælp &lt;b&gt; Alt+T&lt;/b&gt;&lt;br/&gt;\nBrug &lt;b&gt;/&lt;/b&gt; som sti separator i trævisningen under fanen layout.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Navn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\">Ny fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\">Omdøb faneblad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\">Omdøb fanegruppe</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Tryk &apos;/&apos; for at søge</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Skriv for at søge</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Regulært udtryk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Versal-ufølsom</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_de.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"de_DE\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Über</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Zwischenablageverwaltung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-Mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Spenden</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Aktionsdialog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>&amp;Befehl:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standarde&amp;ingabe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Standarda&amp;usgabe speichern:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Daten dieses MIME-Type an die Standardeingabe weiterleiten (zum Deaktivieren leer lassen)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Elemente anhand der Standardausgabe erstellen (zum Deaktivieren leer lassen)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Trennungszeichen für neue Elemente:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Regulärer Ausdruck, um die Ausgabe in mehrere Elemente aufzuteilen.&lt;\\p&gt;\n&lt;p&gt;&lt;b&gt;\\n&lt;/b&gt; verwenden, um jede Zeile in ein eigenes Element zu speichern.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Ausgaberei&amp;ter:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Elemente in Reiter mit folgendem Namen speichern (leerlassen, um in den aktuellen Reiter zu speichern)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Befehl gespeichert</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Befehl wurde gespeichert und kann über das Menü erreicht werden.\nSie könnnen den Befehl in den Einstellungen ändern.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Fehler: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Exitcode: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Befehl %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Prozessverwalter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>Ausgewähltes abbrechen</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Befehle hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Hauptfenster anzeigen/ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Das Traymenü anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Hauptfenster unter Mauszeiger anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Zwischenablage bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Erstes Element bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Zweites Element kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Aktionsdialog anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Neues Element erstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Nächstes Element kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Vorheriges Element kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Inhalt der Zwischenablage als reinen Text einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Speichern der Zwischenablage deaktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Speichern der Zwischenablage aktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Einfügen und nächstes Element kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Einfügen und vorheriges Element kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Bildschirmfoto erstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Aktuelles Datum und Uhrzeit einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Neuer Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Elemente mit keinem oder nur einem Zeichen ignorieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Im &amp;Browser öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Als reinen Text einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Videos automatisch abspielen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>URL in einen anderen Reiter kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Vorschaubild erstellen (benötigt ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>QR-Code aus URL erstellen (benötigt qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Aufgaben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Zum Reiter %1 hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>In den Reiter %1 verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Kopierte Dateien ignorieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>*„Passwort“*-Fenster ignorieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>In Papierkorb verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(Papierkorb)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Aktuellen Tab leeren</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Es können keine neuen Elemente hinzugefügt werden</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Reiter ist voll. Es konnten keine Elemente entfernt werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Kann keine neuen Einträge zu Tab %1 hinzufügen. Bitte entferne diese manuell, um Platz zu schaffen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Änderungen verwerfen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Wollen Sie wirklich die &lt;strong&gt;Änderungen verwerfen&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Es kann keine Verbindung zum Server hergestellt werden! Bitte zuerst den CopyQ-Server starten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Verbindung verloren!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Inhalt der Zwischenablage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formate:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Inhalt:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Format entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Elementeinhalt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Größe:&lt;/strong&gt; %1 Byte</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Größe:&lt;/strong&gt; %1 Byte</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ-Server ist bereits gestartet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Aktive Befehle abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Aktive Befehle abbrechen und beenden?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Doch nicht beenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Trotzdem beenden</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Strg+Leertaste</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Befehle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Neue Befehle definieren, die entweder bei neuem Inhalt in der Zwischenablage automatisch, vom Benutzer per Menü oder per Tastenkombination ausgeführt werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>Suchen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Lade Befehle…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Ausgewählte Befehle speichern…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Ausgewählte Befehle kopieren [Strg+C]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Befehle einfügen [Strg+V]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Nicht gespeicherte Änderungen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Dialog „Befehl“ enthält nicht gespeicherte Änderungen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Dateien mit Befehlen öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Befehle (*.ini);; CopyQ-Konfiguration (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Ausgewählte Befehle speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Befehle (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Befehle speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Speichern der Befehle in der Datei &quot;%1&quot; ist gescheitert: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Hilfe für Befehle anzeigen (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Der Befehl enthält die Liste der Programme mit Argumenten, die ausgeführt werden. Zum Beispiel:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Programmargument %1 wird durch den Text des Elements ersetzt. %2 bis %9 werden durch die Ergebnisgruppen des regulären Ausdruck ersetzt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Der Elementtext wird durch das Programmargument %1 ersetzt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Das Zeichen %1 kann verwendet werden, um STDOUT an das nächste Programm zu übergeben.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Die folgende Syntax kann verwendet werden, um den Rest des Befehls als einen Parameter weiterzuleiten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Das erzeugt dieselbe Ausgabe wie %1, ist aber bei längeren Befehlen hilfreicher.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Die nachfolgenden Funktionen können wie in den folgenden Beispielbefehlen verwendet werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>Zwischenablage</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Name des Reiters, in den die Elemente kopiert werden sollen (leerlassen, um nicht zu kopieren)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Name:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <oldsource>Command name (shown in menu)</oldsource>\n        <translation>Anzuzeigender Befehlsname</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Globale Tastenkombination</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Befehle nur auf Elemente anwenden, die mit dem regulären Ausdruck übereinstimmen (leerlassen, um mit allen übereinzustimmen).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Beispiele:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  auf „.pdf“ endende Dateinamen    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Ein einzelnes Zeichen    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  URL mit einer der angegeben Dateiendungen    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Befehl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>A&amp;usgabe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Elemente erfassen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Inhalt:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Fenster:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Die Daten dieses MIME-Typs werden zur Standardeingabe des Befehls gesendet.\nZum Deaktivieren leerlassen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filter:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Verwenden Sie den Befehl nur für Elemente, die aus dem Fenster, mit einem Titeltext, der mit diesem regulären Ausdruck übereinstimmt in die Zwischenablage kopiert wurden (leer lassen, um mit einem beliebigen Fenster übereinzustimmen). Unter macOS enthält dies den Anwendungsnamen, gefolgt von einem Bindestrich (&amp;quot;-&amp;quot;) und dem Fenstertitel. Z.B. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Aktion</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Befehlsoptionen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Ausführungsdialog anzeigen bevor Befehl ausgeführt wird</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Befehl automatisch ausführen, wenn Zwischenablage neuen Inhalt bekommt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Trennzeichen für die Aufteilung der Ausgabe in mehrere Elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Warten</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Der Befehl wird nur angewendet, wenn dieser Filterbefehl erfolgreich ausgeführt werden kann.&lt;/p&gt;\n\n&lt;p&gt;Der Text des Elements wird per &lt;b&gt;Standardeingabe&lt;/b&gt; an den Filterbefehl weitergereicht. Nur wenn &lt;b&gt;der Filterbefehl 0 als Exitcode zurückliefert&lt;/b&gt; wird der Befehl angewendet.&lt;/p&gt;\n\n&lt;p&gt;Der Platzhalter &lt;b&gt;%1&lt;/b&gt; beinhaltet den Text des Elements und die Platzhalter &lt;b&gt;%2&lt;/b&gt; bis &lt;b&gt;%9&lt;/b&gt; die Gruppierungen des regulären Ausdrucks (die Teile des regulären Ausdrucks, die in runde Klammern eingefasst sind).&lt;/p&gt;\n\n&lt;p&gt;&lt;b&gt;|&lt;/b&gt; verwenden, um Befehle zu verketten (Standardausgabe wird an den nächsten Befehl übergeben).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Art der Aktion</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matisch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Befehl im Kontextmenü der erfassten Elemente anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>Im M&amp;enü</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Globale Tastenkombination:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Überspringt den Befehl, wenn der Eingabtext nicht mit diesem regulären Ausdruck übereinstimmt (leer lassen, wenn alles übereinstimmen soll).\n\n%2 bis %9 (oder Argument[1] und in Skript) im Befehl und Filter werden durch die erfassten Texte ersetzt.\n\nBeispiele:\n\n- URL: ^(https?|ftp)://\n- PDF-Dateinamen: \\.pdf$\n- Einzelcharakter: ^.$\n- Multimedia im Web: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Überspringt den Befehl, wenn der Filterbefehl mit einem Exit-Code ungleich Null fehlschlägt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Übereinstimmende Elemente entfernen\n\nAnmerkung: Wenn diese Aktion automatisch angewendet wird, werden keine weiteren automatischen Befehle ausgeführt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Element entfe&amp;rnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menüaktion</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Fenster ausblenden, nachdem der Befehl per Kontextmenü aktiviert wird</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Hauptfenster nach der Aktivierung ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Element anpassen, keine neuen Elemente anlegen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Elemente aus der Standardausgabe eines Programms erstellen (zum Deaktivieren leerlassen)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>Erweitert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skript</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Typ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Anzeige</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Überspringt den Befehl, wenn der Eingabetext nicht mit diesem regulären Ausdruck übereinstimmt (leer lassen, um alles zu finden).\n\n%2 bis %9 in Befehl und Filter werden durch die erfassten Texte ersetzt.\n\nBeispiele:\n\n- Übereinstimmung URL: ^(https?|ftp)://\n- Übereinstimmung PDF-Dateinamen: \\.pdf$\n- Übereinstimmung mit einzelnem Zeichen: ^.$\n- Übereinstimmung Multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>F&amp;ormat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>In folgenden Reiter ko&amp;pieren:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>Trenn&amp;zeichen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Elemente in den Reiter mit folgendem Namen speichern (leerlassen, um in den ersten Reiter zu speichern)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Erweiterte Eigenschaften anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Reiter der &amp;Ausgabe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>Tastenkombination:</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Zahlen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Schriftart</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Hintergrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Gefunden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Ausgewählt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternativ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Vordergrund</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notizen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Benachrichtigung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Numme&amp;r anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Bildlaufleisten anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>&amp;Systemsymbole</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>K&amp;antenglättung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Bildlaufleis&amp;ten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Tooltips</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Symbole der Desktopumgebung verwenden, wann immer möglich</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Farb&amp;en für Reiter, Symbolleisten und Menüs einstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>Theme zu&amp;rücksetzen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Theme:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>Theme &amp;laden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>Theme s&amp;peichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Aktuelles Theme in externem Editor bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Theme b&amp;earbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Vorschau:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Ein Element wählen und\nF2 zum Bearbeiten drücken.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Beispielelement %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Einige zufällige Notizen (Umschalt+F2 zum Bearbeiten)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Der Suchtext lautet %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Theme-Datei öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Theme-Datei speichern unter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Kein externer Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Erst einen externen Editor festlegen!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>Sprache:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Text umbrechen, falls für Zeile zu lang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Langen Text umbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Hauptfenster immer im Vordergrund anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Immer im Vordergrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Hauptfenster schließen falls ein andere Anwendung fokussiert wird</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Bei Verlust des Fokus schließen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Aktivieren, um Fenster immer auf aktuellem Bildschirm zu öffnen. Deaktivieren, um Fenster dort zu öffnen, wo diese zuletzt geschlossen wurden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Fenster auf aktuellem Bildschirm öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Bestätigung vor dem Beenden der Anwendung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Be&amp;stätigung vor dem Beenden der Anwendung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Anwendung beim Systemstart ausführen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Autostart</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Unterstützung für Vi-Navigationstasten (H, J, K, L und weitere), Schrägstrich (/) um zu suchen</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Vi-ähnliche Navigation</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Erfassung von App-Fenstern bei Bildschirmfotos und Aufnahmen verhindern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>Vor Bildschirmfotos und Aufnahmen verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Verschlüsseln der Reiter-Daten auf der Festplatte (Festlegen eines Passworts ist notwendig)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Reiter verschlüsseln</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Verwenden eines vorhandenen externen Schlüsselspeichers für das Verschlüsselungspasswort (Windows-Anmeldedatenspeicher, macOS-Schlüsselbund, GNOME-Schlüsselbund, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>Verwende externen Schlüsselspeicher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Ändern des Passworts, mit dem die Reiter-Daten verschlüsselt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Verschlüsselungs-Passwort ändern...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Navigationsstil / Tastenbelegung:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Unterstützung für Vi-Navigation (Tasten H, J, K, L, / und mehr) und Emacs-Navigation (Strg+N, P, V und mehr)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Filterverlauf für Elemente speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Filterverlauf speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Popup für die Autovervollständigung von Funktionen, Typen und Variablen bei Befehlen anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Befehle automatisch vervollständigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Zwischenablage verändern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Erlauben, kopierte Inhalte auf dieselbe Weise wie bei Mausauswahl einzufügen (meist über die mittlere Maustaste)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Zwischenablage mit der Maus einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Erlauben, per Maus ausgewählte Inhalte über Tastenkombinationen einzufügen (meist Strg+V oder Umschalt+Einf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Einfügen der Maus-Auswahl per Tastatur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Zwischenablage in Verlauf speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Zwischenablage speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Mit der Maus ausgewählten Text (primäre Auswahl) im Verlauf speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Mit der Maus ausgewählten Text speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Automatische Befehle bei Auswahl ausführen</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Maximale Anzahl von Elementen im Verlauf:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Maximale Anzahl von Elementen in jedem Reiter</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Reiter nach einem Inter&amp;vall entladen (Minuten):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>Reiter nach einem Intervall entladen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Bei Inaktivität eines Reiters wird dieser nach der angegeben Anzahl von Minuten aus dem Speicher entladen.\n\nSetze 0 als Wert um das Entladen von Reitern zu verhindern.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Intervall für die Passwort-Abfrage:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Zeitraum in Sekunden, nach dem für verschlüsselte Reiter das Passwort erneut eingegeben werden muss\n\nAuf 0 setzen, um die Funktion global zu deaktivieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Befehl für externen Editor (%&amp;1 ist die zu bearbeitende Datei):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Befehl für externen Texteditor (%1 ist die zu bearbeitende Datei).\n  Beispiele:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Reiter zum Speichern der Zwischenablage:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Name des Reiters, in dem automatisch neue Inhalte der Zwischenablage gespeichert werden sollen.\n\nLeerlassen, um die automatische Speicherung zu deaktivieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Nicht auswählen, um mit der Eingabetaste bearbeitete Elemente zu speichern und mit Strg+Eingabe neue Zeilen zu erstellen.\n\nHinweis: Bearbeitete Elemente können mit F2 gespeichert werden, ungeachtet dieser Option.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Be&amp;arbeitete Elemente mit Strg+Eingabe speichern und neue Zeile mit Eingabetaste erstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Nur eine einzeilige Beschreibung des Elements anzeigen.\n\nÜber die Elementvorschau wird das komplette Element angezeigt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Einfache Elemente anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Ermöglicht das Suchen nach Zahlen. Falls diese Option deaktiviert ist, wird durch Drücken einer Ziffer das Element an dieser Position aktiviert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Nach Zahlen such&amp;en</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Element mit einem einzigen Klick aktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Nachdem Element aktiviert wurde (Doppelklick oder Eingabetaste), dieses in die Zwischenablage kopieren und …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Element an den Anfang der Liste verschieben, nachdem es aktiviert wurde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Eintrag an den Anfang verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Hauptfenster schließen nachdem ein Element aktiviert wurde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>Hauptfenster s&amp;chließen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Letztes Fenster fokussieren nachdem ein Element aktiviert wurde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>Letztes Fenster &amp;fokussieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Im aktuellen Fenster einfügen nachdem das Element aktiviert wurde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>Im aktuellen Fenster einfügen</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Zeigen/Ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Reiter ausblenden (zum Anzeigen die Alt-Taste drücken)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Reiter ausblen&amp;den</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Symbolleiste ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Symbol&amp;leiste ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Bezeichnungen von Sym&amp;bolleisten verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Hauptfenster nach dem Schließen ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Hauptfenster ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Layout und Transparenz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Verwende zur Anzeige der Reiter einen Baum anstatt einer Leiste</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>&amp;Reiter in einem Baum darstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Transparenz, wenn &amp;fokussiert:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparenz des Hauptfensters wenn es fokussiert ist.\n\nHinweis: Dies wird nicht von allen Systemen unterstützt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Transparenz wenn nicht fok&amp;ussiert:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparenz des Hauptfensters, wenn es nicht fokussiert ist.\n\nHinweis: Dies wird nicht von allen Systemen unterstützt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>In Reitern die Anzahl der Elemente anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Anzahl der Elemente anzeigen</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Position für Be&amp;nachrichtigungen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Position auf dem Bildschirm für Benachrichtgungen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Oben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Unten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Oben rechts</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Unten rechts</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Unten links</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Oben links</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Anzeigedauer von Benachrichtigungen in Sekunden:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Dauer in Sekunden zum Anzeigen von Benachrichtigungen für neue Inhalte in der Zwischenablage oder wenn ein Eintrag in die Zwischenablage kopiert wurde (nur wenn das Hauptfenster geschlossen ist).\n\nAuf 0 setzen, um die Anzeige zu deaktivieren.\n\nAuf -1 setzen, um Benachrichtigung bis zum Klicken sichtbar zu halten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Anzuzeigende Zeilenanzahl bei &amp;Benachrichtigungen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Anzahl der Zeilen die bei neuen Inhalten der Zwischenablage angezeigt werden sollen.\n\nZum Deaktivieren auf 0 setzen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>Verwende System-Benachrichtigungen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geometrie der Benachrichtigungen (in Bildschirmpunkten)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Hori&amp;zontaler Versatz:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Abstand der Benachrichtigungen zum linken oder rechten Bildschirmrand in Bildschirmpunkten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Vertikaler Offset:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Abstand der Benachrichtigungen zum oberen oder unteren Bildschirmrand in Bildschirmpunkten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Maximale Breite:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Maximale Breite für Benachrichtigungen in Bildschirmpunkten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Ma&amp;ximale Höhe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Maximale Höhe für Benachrichtigungen in Bildschirmpunkten</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Kein Tray-Icon anzeigen; Fenster minimieren wenn geschlossen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Tray-Symbol &amp;deaktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Befehl für aktuellen Inhalt der Zwischenablage im Tray-Menü anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Befehle für Inha&amp;lte der Zwischenablage anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Anzahl von Elementen im Tray-Menü:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Anzahl von Elementen im Tray-Menü</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Elemente des aktiven Reiters im Tray-Menü anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Aktuellen &amp;Reiter in Menü anzeigen,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>oder einen anderen Reiter aus&amp;wählen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Name des Reiters, der im Tray-Menü gezeigt werden soll (leerlassen für ersten Reiter)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Element, nach dessen Auswahl im Menü, im aktuellen Fenster einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>Einfügen des ausgewählten Elements im aktuellen Fenster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Bildvorschau neben Menüelementen anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Bildvorschau als Symbol des Menüeintrags anzeigen</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Einstellungen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Benachrichtigungen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Ungültiger Wert für die Option „%1“</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Allgemein</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Layout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Verlauf</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Tray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Tabs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Tastenkombinationen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Erscheinungsbild</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Neustart erforderlich</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Zum Ändern der Spracheinstellung ist ein Neustart der Anwendung nötig.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Einstellungen zurücksetzen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Diese Aktion wird alle Einstellungen auf die Standardwerte zurücksetzen. &lt;br /&gt;&lt;br /&gt;Möchten Sie wirklich &lt;strong&gt;alle Einstellungen zurücksetzen&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Einstellungen</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Erstellen des Synchronisiationsverzeichnis fehlgeschlagen „%1“!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Pfeil runter</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Symbol auswählen…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>…</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Wähle Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Durchsuchen …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Symboldatei öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Bildateien (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>Rei&amp;ter:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Ko&amp;nfiguration</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>&amp;Befehle</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">Editor-Exitcode: %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Editorbefehl: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Befehl des Editors fehlgeschlagen (siehe Protokolle)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Speichern</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Eintrag speichern (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Abbrechen</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Bearbeitung abbrechen und Änderungen rückgängig machen</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Schriftart</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Fett</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Kursiv</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Unterstrichen</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Durchgestrichen</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Vordergrund</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Hintergrund</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Formatierung entfernen</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Suche</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Rückgängig</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Wiederherstellen</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Um verschlüsselte Elemente für andere Computer oder Sitzungen freizugeben, benötigen Sie öffentliche und geheimen Schlüsseldateien:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt; (Bewahren Sie diesen geheimen Schlüssel an einem sicheren Ort auf.) &lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG muss installiert sein, um verschlüsselte Reiter anzuzeigen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Verschlüsseln (benötigt GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Strg+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Entschlüsseln</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Entschlüsseln und kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Strg+Umschalt+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Entschlüsseln und einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Fehler: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Schlüsselerstellung fehlgeschlagen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Um verschlüsselte Elemente auf einem anderen Computer oder einer anderen Sitzung zu teilen, benötigen Sie diese geheimen Schlüsseldateien (bewahren Sie sie an einem sicheren Ort auf):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Erledigt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Neue Schlüssel werden erzeugt (dies kann einige Minuten dauern) …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Neues Passwort festlegen …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Die Verschlüsselungsschlüssel &lt;strong&gt;müssen erzeugt werden&lt;/strong&gt;, bevor die Verschlüsselung von Elementen genutzt werden kann.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Neue Schlüssel erzeugen …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Passwort ändern …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Verschlüsselung fehlgeschlagen!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Entschlüsselung fehlgeschlagen!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Verschlüsselung</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Elemente und Reiter verschlüsseln.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Um Elemente zu ver- und entschlüsseln, im Reiter „Befehle“ die entsprechenden Befehle hinzufügen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Verschlüsselte Elemente und Reiter teilen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Verschlüsselte Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Legen Sie Namen der Reiter fest (einen pro Zeile). Diese werden automatische ver- und entschlüsselt.&lt;/p&gt;\n&lt;p&gt;Legen Sie ein Zeitlimit für Reiter fest, bevor verschlüsselte Elemente im Verlauf sicher aus dem Speicher entfernt werden.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Beschädigter Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Nicht alle Elemente im Reiter &lt;strong&gt;%1&lt;/strong&gt; wurden erfolgreich geladen. Möchten Sie den Reiter trotzdem laden (und möglicherweise manche Elemente verlieren)?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Das Plug-in FakeVim ist Teil von Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emuliert den Editor Vim beim Bearbeiten von Elementen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>FakeVim zum Bearbeiten von Elementen verwenden</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Pfad zu den Konfigurationsdateien:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Bilder</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Bilder anzeigen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>&amp;Maximale Bildbreite:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Maximale Anzeigebreite von Bildern im Verlauf (Null für Originalgröße)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Maximale Bild&amp;höhe:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Maximale Anzeigehöhe von Bildern im Verlauf (Null für Originalgröße)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Befehl für die B&amp;ildverarbeitung:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Programmbefehl, der alle Bildformate außer SVG unterstützt.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG-Editorbefehl:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Editorbefehl für das SVG-Bildformat.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Notizen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Notizen zu Elementen anzeigen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Position von Notizen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>&amp;Über Element</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Unter Ele&amp;ment</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Neben Ele&amp;ment</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>&amp;Kurzinfo anzeigen</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Entfe&amp;rnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Nach unten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Ganz nach oben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Ganz nach unten</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Hoch</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Runter</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Angeheftete Elemente können nicht entfernt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Bevor Elemente entfernt werden können, müssen diese losgelöst werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Anheften</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Loslösen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Angeheftete Elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Elemente anheften, um sie in der aktuellen Zeile zu sperren und ein Löschen zu verhindern (es sei denn, sie sind losgelöst).&lt;/p&gt;&lt;p&gt;Bietet Verknüpfungen und Skriptfunktionen.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Durchsuchen …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Verzeichnis für Synchronisierung öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Synchronisierungsverzeichnis konnte nicht erstellt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synchronisieren</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Elemente und Notizen mit einem Verzeichnis auf der Festplatte synchronisieren.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Synchronisieren des Reiters „%1“ mit Verzeichnis „%2“ fehlgeschlagen!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Elemente entfernen?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Möchten Sie wirklich &lt;strong&gt;alle Elemente und zugehörige Dateien entfernen&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Synchronisieren von Reitern und Verzeichnissen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Inhalte des &lt;strong&gt;Reiters&lt;/strong&gt; mit dem Verzeichnis mit folgendem &lt;strong&gt;Pfad&lt;/strong&gt; synchronisieren.&lt;/p&gt;\n&lt;p&gt;Setzen Sie einen &lt;strong&gt;leeren Pfad&lt;/strong&gt;, um die Elemente dieses &lt;strong&gt;Reiters&lt;/strong&gt; nicht zu speichern.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Reitername</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Pfad</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Dateien zum Dateiformateintrags</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Ändere den Medientyp zu &lt;strong&gt;-&lt;/strong&gt; (Minuszeichen), um Dateien zu ignorieren. Alle anderen unbekannten oder versteckten Dateien werden ignoriert.&lt;/p&gt;\n&lt;p&gt;Beispiel: Lade die &lt;strong&gt;txt&lt;/strong&gt; - Dateiendung als den &lt;strong&gt;text/plain&lt;/strong&gt; Medientyp&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Item - Medientyp</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;MIME-Typ auf &lt;strong&gt;-&lt;/strong&gt;(Bindestrich) setzen, um Dateien zu ignorieren. Andere unbekannte oder versteckte Dateien werden ignoriert.&lt;/p&gt;\n&lt;p&gt;Beispiel: &lt;strong&gt;txt&lt;/strong&gt;-Dateierweiterung als &lt;strong&gt;text/plain&lt;/strong&gt; MIME-Typ laden.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Erweiterung</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">MIME-Typ-Eintrag</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Ein Tag hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Ein Tag entfernen</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Als %1 taggen</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Tag %1 entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Tag %1 umschalten</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Elemente mit einem gesperrten Tag können nicht entfernt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Zuerst Tags von Elementen entfernen um sie zu löschen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Wichtig</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Alle Tags entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Tags</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Alle Tags für das Element anzeigen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Menüeinträge zum Hinzufügen und zum Entfernen von Tags können im Dialog „Befehle“ konfiguriert werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Mehr Informationen sind im &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;Wiki&lt;/a&gt; verfügbar.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Name des Tags</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Match</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Style Sheet</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Farbe</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Symbol</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Sperre</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Vermeide Entfernen des Elements</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Text</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Elemente aus reinem Text und HTML anzeigen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>HTML und RTF speichern und anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Anzahl maximal anzuzeigender Zeilen (0 um alle anzuzeigen):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Maximale Höhe in Pixeln (0 für keine Begrenzung):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Standard-Stylesheet:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Webseiten anzeigen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Maximale Höhe in Pixeln (0 für keine Begrenzung):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Protokoll</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Beenden?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Möchten Sie CopyQ &lt;strong&gt;beenden&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Datei</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Optionen für den Import</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Anzeigen/Ausblenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ-Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Neuer Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Verschlüsselung nicht verfügbar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>Verschlüsselung ist nicht verfügbar (siehe Logs für Details)\n\nEs wird möglich sein, Reiter-Daten zu ver- oder entschlüsseln.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Import-Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Passwort für den Import eingeben:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Export-Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Passwort für den Export eingeben (leer lassen für keine Verschlüsselung):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>&amp;Gruppe %1 umbenennen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Reiter %1 umbe&amp;nennen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Reiter %1 en&amp;tfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Gruppe %1 entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Reitersymbol ändern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Optionen für den Export</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Exportfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Die Datei %1 konnte nicht exportiert werden!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Importfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Die Datei %1 konnte nicht importiert werden!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hilfe</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">Speichern der Zwisch&amp;enablage aktivieren</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">Speichern der Zwischenablage &amp;deaktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Zwischenablage: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ-Elemente (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Alle Reiter in der Gruppe entfernen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Wollen Sie wirklich &lt;strong&gt;alle Reiter&lt;/strong&gt; in der Gruppe &lt;strong&gt;%1&lt;/strong&gt; entfernen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Reiter entfernen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Wollen Sie den Reiter &lt;strong&gt;%1&lt;/strong&gt; entfernen?</translation>\n    </message>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Information</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;VERSTECKT&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n Zeile)</numerusform>\n            <numerusform>%1 (%n Zeilen)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;BILD&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ELEMENTE&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;LEER&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATEN&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Rücktaste</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Entf</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Sitzungsname darf höchstens 16 Zeichen enthalten,\nerlaubt sind Buchstaben, Zahlen, „-“ oder „_“!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n Zeile &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n Zeilen &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>Zwis&amp;chenablage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Neues Element</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Strg+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importieren …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Exportieren …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>Ein&amp;stellungen …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Strg+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">Befehle/Gl&amp;obale Tastenkombinationen …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>Be&amp;fehle …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>&amp;Inhalt der Zwischenablage anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Strg+Umschalt+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Speichern der Zwischenablage de-/ak&amp;tivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Strg+Umschalt+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>P&amp;rozess Manager</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Strg+Umschalt+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>Beenden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Strg+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>Ausgewählte Elemente &amp;sortieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Strg+Umschalt+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Reihenfolge der ausgewählten Elemente umkehren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Strg+Umschalt+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Elemente einfügen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>Ausgewählte Elemente &amp;kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Suchen</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">In die Zwis&amp;chenablage verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Inhalt anzeigen …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Vor&amp;schau anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">In die Zwis&amp;chenablage verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Entfe&amp;rnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>&amp;Notizen bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Umschalt+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Mit E&amp;ditor bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Strg+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Aktion …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Nach oben verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Strg+Pfeil hoch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Nach unten verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Strg+Pfeil runter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>An Anfang verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Strg+Pos1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Ans Ende verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Strg+Ende</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Neuer Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Strg+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Reiter umb&amp;enennen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Strg+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Reiter entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Strg+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Reitersymbol ändern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Strg+Umschalt+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>&amp;Nächster Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Rechts</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Links</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Kontextmenü für Elemente öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Umschalt+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>&amp;Vorheriger Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Strg+Umschalt+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Eintrag speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Bearbeitung abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Rückgängig</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Wiederherstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Schriftart</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Fett</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Kursiv</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Unterstrichen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Durchgestrichen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Vordergrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Hintergrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Stil löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Suche</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>Einträge a&amp;ktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Mit E&amp;ditor bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Log anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Über</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hilfe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Der Inhalt des Reiters %1 ist beschädigt oder benötigte CopyQ-Plugins sind nicht vorhanden!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Text kopiert (%n Zeile)</numerusform>\n            <numerusform>Text kopiert (%n Zeilen)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Text kopiert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Daten kopiert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Neues Passwort für die Reiter-Verschlüsselung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Neues Passwort eingeben:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>Das neue Passwort darf nicht leer sein.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Passwortänderung fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Das Passwort konnte nicht geändert werden. Das alte Passwort ist noch immer aktiv. Bitte die Logs für weitere Informationen überprüfen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Erfolgreiche Passwortänderung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>Das Passwort wurde erfolgreich geändert.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Verschlüsselung fehlgeschlagen</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Hauptfenster ausblenden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Hauptfenster anzeigen oder ausblenden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Kontextmenü öffnen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Server beenden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Inhalt der Zwischenablage ausgeben.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Inhalt der X11 Selektion(en) ausgeben.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ROW</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Text in die Zwischenablage einfügen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Text in die angegebene Zeile einfügen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Elemente der angegebenen Reihe entfernen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ROWS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Elemente bearbeiten oder neue Elemente erstellen.\nWert -1 steht für die aktuelle Zwischenablage.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Rohdaten der Zwischenablage oder des Elements in die Reihe ausgeben.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Hauptfenster anzeigen und optional den Reiter mit dem angegeben Namen öffnen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Speichern der Zwischenablage aktivieren oder deaktivieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Zwischenablage in das aktuelle Fenster einfügen\n(funktioniert möglicherweise mit einigen Anwendungen nicht).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Zwischenablagetext festlegen.</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nInhalt der Zwischenablage festlegen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Anzahl der Elemente des aktiven Reiters ausgeben.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Element der aktuellen Reihe in die Zwischenablage kopieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Nächstes Element des aktuellen Reiters in die Zwischenablage kopieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Vorheriges Element des aktuellen Reiters in die Zwischenablage kopieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Trennzeichen für Elemente bei der Ausgabe festlegen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATOR</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nRohdaten in die aktuelle Zeile schreiben.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Ausführungsdialog anzeigen.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nPROGRAM auf Elementtexte in der Reihe ausführen.\n%1 in PROGRAM verwenden, um Elementtexte zu verarbeiten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nTray-Popupmeldung für TIME anzeigen (in Millisekunden).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITLE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESSAGE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Verfügbare Reiternamen auflisten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Befehl auf Reiter mit angegebenem Namen ausführen.\nReiter wird erstellt, falls er nicht vorhanden ist.\nStandard ist der erste Reiter.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nECMAScript (JavaScript) Programm bestimmen .\nArgumente sind mit &quot;arguments[0..N]&quot; verfügbar.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Anwendungstests ausführen (--help als Argument anhängen, um weitere Informationen zu erhalten).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Kopiere die Zwischenablage aus dem aktuellen Fenster\n(funktioniert möglicherweise nicht unter allen Anwendungen).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Lege den Inhalt der Zwischenablage fest.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Schreibe Rohdaten in die ?gegebene Zeile.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Führe PROGRAMM für Elemententext in den Reihen aus.\nVerwende %1 im PROGRAMM, um Text als Argument zu übernehmen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Zeige eine Benachrichtigung für die ZEIT in Millisekunden in der Taskleiste.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMMAND</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Reiter entfernen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Reiter umbenennen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NEW_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Elemente in Datei exportieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILE_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Elemente aus Datei importieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Alle Optionen auflisten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Optionswert auslesen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Optionswert festlegen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALUE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Skript auswerten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Startet oder verbindet sich mit der Anwendungsinstanz mit dem gegebenen Sitzungsname.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Zeige die Hilfe für BEFEHL oder alle Befehle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Zeige Programm- und Bibliotheksversionen an.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Starte Server im Hintergrund vor Start eines Kommandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Ungültige Option „%1“!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SKRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTE</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nStartet oder stellt die Verbindung zur Anwendungsinstanz mit dem folgenden Sitzungsnamen her.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SITZUNG</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nGibt die Hilfe für BEFEHL oder für alle Befehle aus.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nGibt die Versionen des Programms und der Bibliotheken aus.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Verwendung: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Startet Server, sofern kein Befehl angegeben wurde.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  BEFEHLe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTIZEN:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Bindestrichargument (-) verwenden, um von der Standardeingabe zu lesen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Clipboard-Manager</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Fehler in %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Das Kopieren in die Zwischenablage ist fehlgeschlagen!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Doppelbindestrichargument (--) verwenden, um alle folgenden Argumente\n    zu lesen ohne die Escapesequenzen zu erweitern (z.&#xa0;B. \\n, \\t und weitere).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - ? verwenden, um alle verfügbaren MIME-Typen auszugeben (Standard ist „text/plain“).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Ungültige Anzahl an Argumenten!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Befehl wurde nicht gefunden!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Server wird beendet.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Datei „%1“ kann nicht gespeichert werden!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Datei „%1“ kann nicht importiert werden!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Es existiert kein Reiter mit dem angegebenen Namen!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Der Name eines Reiters darf nicht leer sein!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Es existiert bereits ein Reiter mit dem angegebenen Namen!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Speicherung der Zwischenablage deaktiviert*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Tastenkombination hinzufügen</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Neue Tastenkombination</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Beliebige Tastenkombination drücken. Zum Abbrechen &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; drücken.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Hier klicken und eine Tastenkombination drücken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Tastenkombination entfernen</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Suchen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Gl&amp;obal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Globale Tastenkombinationen können aus jeder Anwendung heraus ausgelöst werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>Anwendung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Anwendungsweite Tastenkombinationen können nur innerhalb des Hauptfensters ausgelöst werden.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Anwendungsweite Tastenkombinationen können nur innerhalb des Hauptfensters ausgelöst werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Diese Tastenkombination existiert bereits!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Der Name des Reiters muss eindeutig sein und darf nicht leer sein.&lt;br /&gt;\nDer Reiter &lt;b&gt;No&amp;amp;tizen&lt;/b&gt; kann mit &lt;b&gt;Alt+T&lt;/b&gt; geöffnet werden.&lt;br/&gt;\nIn der Baumansicht der Reiter kann &lt;b&gt;/&lt;/b&gt; als Pfadtrennzeichen verwendet werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Name:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Neuer Reiter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Reiter umbenennen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Reitergruppe umbenennen</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Maximale Anzahl von Elementen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>Standard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>Elemente &amp;speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">Elemente &amp;speichern</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Zum Suchen „/“ drücken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Zum Suchen eingeben</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Regulärer Ausdruck</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Groß-/Kleinschreibung ignorieren</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_el.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"el_GR\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Σχετικά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Διαχειριστής προχείρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Δημιουργός</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Ηλεκτρονικό ταχυδρομείο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Ιστός</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Δωρεά</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Διάλογος ενέργειας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Ε&amp;ντολή:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Τυπική εί&amp;σοδος:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Αποθήκευση της τυπικής ε&amp;ξόδου:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Αποστολή των δεδομένων του δοθέντος τύπου μέσου στην τυπική είσοδο της εντολής (αφήστε το κενό για απενεργοποίηση)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Δημιουργία αντικειμένων από την τυπική έξοδο του προγράμματος (αφήστε το κενό για απενεργοποίηση)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Διαχωριστικό νέων αντικειμένων:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Κανονική έκφραση για τον διαχωρισμό της εξόδου σε περισσότερα αντικείμενα.&lt;\\p&gt;\n&lt;p&gt;Χρησιμοποιήστε το &lt;b&gt;\\n&lt;/b&gt; για την αποθήκευση κάθε γραμμής σε διαφορετικό αντικείμενο.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Καρτέλα εξόδου:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Αποθήκευση των αντικειμένων σε καρτέλα με το δοθέν όνομα (αφήστε το κενό για αποθήκευση στην τρέχουσα καρτέλα)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Αποθήκευση εντολής</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Η εντολή αποθηκεύτηκε και μπορεί να προσπελαστεί από το μενού αντικειμένων.\nΜπορείτε να ρυθμίσετε την εντολή από τις προτιμήσεις.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Σφάλμα: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Κώδικας εξόδου: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Εντολή %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Διαχειριστής διεργασιών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Φίλτρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Τερματισμός των επιλεγμένων</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Προσθήκη εντολών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Εμφάνιση/απόκρυψη του κύριου παραθύρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Εμφάνιση του μενού του πλαισίου συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Εμφάνιση του κυρίου παραθύρου κάτω από τον δρομέα του ποντικιού</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Επεξεργασία του προχείρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Επεξεργασία του πρώτου αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Αντιγραφή του δεύτερου αντικείμενου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Εμφάνιση του διαλόγου ενέργειας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Δημιουργία νέου αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Αντιγραφή επόμενου αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Αντιγραφή προηγούμενου αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Επικόλληση προχείρου ως απλό κείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Απενεργοποίηση της αποθήκευσης στο πρόχειρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Ενεργοποίηση της αποθήκευσης στο πρόχειρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Επικόλληση και αντιγραφή του επόμενου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Επικόλληση και αντιγραφή του προηγμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Λήψη ενός στιγμιότυπου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Επικόλληση της τρέχουσας ημερομηνίας και ώρας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Νέα εντολή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Αγνόηση των αντικειμένων με έναν ή κανέναν χαρακτήρα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Άνοιγμα σε πρόγραμμα &amp;περιήγησης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Επικόλληση ως απλό κείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Αυτόματη αναπαραγωγή των βίντεο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Αντιγραφή της διευθύνσεως ιστού (URL) σε άλλη καρτέλα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Δημιουργία εικόνας επισκόπησης (απαιτείται το ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Δημιουργία κωδικού QR από το URL (απαιτείται το qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Εργασίες</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Προσθήκη στην καρτέλα %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Μετακίνηση στην καρτέλα %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Αγνόηση των αντιγραμμένων αρχείων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Αγνόηση του παραθύρου *&quot;Κωδικός πρόσβασης&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Κωδικός πρόσβασης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Μετακίνηση στα απορρίμματα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(απορρίμματα)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Εκκαθάριση της τρέχουσας καρτέλας</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Αδύνατη η προσθήκη νέων αντικειμένων στην καρτέλα %1. Παρακαλώ αφαιρέστε τα αντικείμενα χειροκίνητα για να δημιουργήσετε χώρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Απόρριψη των αλλαγών;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Επιθυμείτε πραγματικά την &lt;strong&gt;απόρριψη των αλλαγών&lt;/strong&gt;;</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Η σύνδεση χάθηκε!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Αδύνατη η σύνδεση στην εξυπηρετητή! Εκκινήστε πρωτίστως τον εξυπηρετητή CopyQ.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Περιεχόμενο του προχείρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Μορφές:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Περιεχόμενο:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Αφαίρεση της μορφής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Περιεχόμενο του αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Μέγεθος:&lt;/strong&gt; %1 δυφιοσυλλαβές</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Ο εξυπηρετητής CopyQ εκτελείται ήδη.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Ακύρωση των ενεργών εντολών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Ακύρωση των ενεργών εντολών και εγκατάλειψη;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Ακύρωση εγκατάλειψης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Εγκατάλειψη ούτως ή άλλως</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Διάστημα</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Εντολές</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Ορισμός νέων εντολών που μπορούν να κληθούν αυτόματα σε νέο περιεχόμενο προχείρου ή από τον χρήστη από το μενού ή χρησιμοποιώντας τις συντομεύσεις του συστήματος.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Αναζήτηση:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Φόρτωση εντολών…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Απο&amp;θήκευση των επιλεγμένων…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Αντιγραφή των επιλεγμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Επικόλληση εντολών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Μη αποθηκευμένες αλλαγές</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Ο διάλογος εντολών έχει μη αποθηκευμένες εντολές.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Άνοιγμα αρχείων με εντολές</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Εντολές (*.ini);; Διαμόρφωση CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Αποθήκευση των αποθηκευμένων εντολών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Εντολές (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Αποθήκευση Εντολών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Αποτυχία αποθήκευσης εντολών στο αρχείο &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Η εντοή περιέχει ένα κατάστιχο προγραμμάτων με τα ορίσματα που θα εκτελεστούν. Για παράδειγμα:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Το όρισμα %1 του προγράμματος θα αντικατασταθεί από το κείμενο του αντικειμένου, και τα ορίσματα %2 ως %9 από το συλληφθέν κείμενο στην κανονική έκφραση.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Το όρισμα %1 του προγράμματος θα αντικατασταθεί για το κείμενο του αντικειμένου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Ο χαρακτήρας %1 μπορεί να χρησιμοποιηθεί για το πέρασμα της τυπικής εξόδου στο επόμενο πρόγραμμα.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Η σύνταξη που ακολουθεί μπορεί να χρησιμοποιηθεί για το πέρασμα του υπολοίπου της εντολής ως μια παράμετρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Δίνει την ίδια έξοδο με το %1 αλλά είναι πιο χρήσιμο για μακρύτερες εντολές.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Οι παρακάτω λειτουργίες μπορούν να χρησιμοποιηθούν όπως στις ακόλουθες εντολές.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;πρόχειρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Εμφάνιση της βοήθειας της εντολής (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>Ό&amp;νομα:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Εμφανιζόμενο όνομα της εντολής στο μενού</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Πληκτρολογήστε:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Συντόμευση:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Καθολική συντόμευση:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Ε&amp;ντολή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Προηγμένα</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Τύπος της ενέργειας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Εκτέλεση της εντολής αυτόματα αν το πρόχειρο έχει ένα νέο περιεχόμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Αυτό&amp;ματο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Εμφάνιση της εντολής στο σχετικό μενού των ταιριαστών αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>Στο με&amp;νού</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Καθολική συντόμευση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Σενάριο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Εμφάνιση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Αντιστοίχιση αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Περιεχόμενο:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Χρησιμοποιήστε την εντολή μόνο για αντικείμενα των οποίων το κείμενο ταιριάζει με την κανονική έκφραση (αφήστε το κενό για ταίριασμα όλων).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Παραδείγματα:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Ταίριασμα URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Ταίριασμα ονομάτων αρχείων PDF    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Ταίριασμα μονού χαρακτήρα    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Ταίριασμα απομακρυσμένου πολυμέσου    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Παράθυρο:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Χρήση της εντολής μόνο για αντικείμενα που έχουν αντιγραφεί στο πρόχειρο από παράθυρο με τίτλο που ταιριάζει αυτήν την κανονική έκφραση (αφήστε το κενό για ταίριασμα όλων των παραθύρων). Σε macOS, περιέχει το όνομα της εφαρμογής ακολουθούμενο από μια παύλα (&amp;quot;-&amp;quot;) και τον τίτλο του παραθύρου. Π.χ. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>&amp;Μορφή:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Τα δεδομένα αυτού του τύπου MIME θα στέλνονται στην τυπική είσοδο της εντολής.\nΑφήστε το κενό για να το απενεργοποιήσετε.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Φίλτρο:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Χρήση των εντολών μόνο αν η εντολή του φίλτρου επιτύχει.&lt;/p&gt;\n\n&lt;p&gt;Το κείμενο του αντικειμένου πέρασε στην &lt;b&gt;τυπική είσοδο&lt;/b&gt; του φίλτρου. Το αντικείμενο &lt;b&gt;χρησιμοποιείται μόνο αν ο κωδικός εξόδου της εντολής του φίλτρου είναι 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Χρησιμοποιήστε &lt;b&gt;%1&lt;/b&gt; για το κείμενο του αντικειμένου που έχει περάσει ως όρισμα και &lt;b&gt;%2&lt;/b&gt; ως &lt;b&gt;%9&lt;/b&gt; για το συλληφθέν κείμενο από την κανονική έκφραση (τα τμήματα μέσα στις παρενθέσεις).&lt;/p&gt;\n\n&lt;p&gt;Χρησιμοποιήστε &lt;b&gt;|&lt;/b&gt; για την αλυσίδωση περισσότερων εντολών (περνά την τυπική έξοδο στην επόμενη εντολή).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Παράληψη της εντολής αν το κείμενο εισαγωγής δεν ταιριάζει με την κανονική έκφραση (αφήστε το κενό για ταίριασμα όλων).\n\n%2 μέσω %9 στην εντολή και φιλτράρισμα θα αντικατασταθεί από τα συλληφθέντα κείμενα.\n\nΠαραδείγματα:\n\n- Ταίριασμα URL: ^(https?|ftp)://\n- Ταίριασμα ονομάτων αρχείων PDF: \\.pdf$\n- Ταίριασμα ενός χαρακτήρα: ^.$\n- Ταίριασμα απομακρυσμένου πολυμέσου: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Παραλείπει την εντολή αν το κείμενο εισόδου δεν ταιριάζει με αυτή την κανονική έκφραση (αφήστε την κενή για να ταιριάζει με τα πάντα).\n\nΤα %2 έως %9 (ή argument[1] και πάνω στη δέσμη ενεργειών) στις εντολές και το φίλτρο θα αντικατασταθούν με τα κείμενα που συλλαμβάνονται.\n\nΠαραδείγματα:\n\n- Αντιστοίχιση URL: ^(https?|ftp)://\n- Αντιστοίχιση ονομάτων αρχείων PDF: \\.pdf$\n- Αντιστοίχιση μεμονωμένου χαρακτήρα: ^.$\n- Αντιστοίχιση απομακρυσμένων πολυμέσων: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Παράληψη της εντολής αν η εντολή φίλτρου αποτύχει με μη μηδενικό κωδικό εξόδου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Ενέργεια</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Αντιγρα&amp;φή στην καρτέλα:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Το όνομα της καρτέλας για την αντιγραφή των νέων αντικειμένων (αφήστε το κενό για να μην γίνει αντιγραφή)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Αφαίρεση του αντικειμένου που ταιριάζει\n\nΣημείωση: Αν εφαρμόζεται αυτομάτως, δεν θα εκτελούνται άλλες αυτόματες εντολές.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Αφαίρεση αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Ενέργεια του μενού</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Απόκρυψη του παραθύρου μετά την ενεργοποίηση μιας εντολής από το σχετικό μενού ενός αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>Απόκρυ&amp;ψη του κύριου παραθύρου μετά την ενεργοποίηση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Επιλογές εντολής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Έ&amp;ξοδος:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Δημιουργία αντικειμένων από την τυπική έξοδο του προγράμματος (αφήστε το κενό για απενεργοποίηση)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Διαχωριστικό:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Ο διαχωριστής που θα ταιριάζει για τον διαχωρισμό της εξόδου σε πολλαπλά αντικείμενα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Καρτέλα εξόδου:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Αποθήκευση των αντικειμένων σε καρτέλα με το δοθέν όνομα (αφήστε το κενό για αποθήκευση στην πρώτη καρτέλα)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Εμφάνιση του διαλόγου ενέργειας πριν την εκτέλεση της εντολής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>Ανα&amp;μονή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Αλλαγή του αντικειμένου, να μην δημιουργηθούν νέα αντικείμενα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Μετασ&amp;χηματισμός</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Προβολή προηγμένων</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Παρασκήνιο</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Σημειώσεις</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Επεξηγήσεις εργαλείων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Βρέθηκαν</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Επιλεγμένα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Αριθμός</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Κανονικό</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Επεξεργαστής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Γραμματοσειρά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Εναλλακτικό</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Προσκήνιο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Ειδοποίηση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Εμφάνιση του αρι&amp;θμού</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Εμφάνιση των γραμμών κύλισης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Γραμμές &amp;κύλισης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Χρήση των εικονιδίων από το περιβάλλον εργασίας όταν είναι εφικτό</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Εικονίδια του &amp;συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>Ε&amp;ξομάλυνση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>&amp;Ορίστε τα χρώματα για τις καρτέλες, την γραμμή εργαλείων και τα μενού</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Επαναφορά θέματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Θέμα:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Φόρτωση θέματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Αποθήκευση του θέματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Επεξεργασία του τρέχοντος θέματος σε εξωτερικό κειμενογράφο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Επε&amp;ξεργασία του θέματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Προεπισκόπηση:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Άνοιγμα αρχείου θέματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Αποθήκευση του αρχείου θέματος ως</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Κανένας εξωτερικός κειμενογράφος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Ορίστε την εντολή για τον εξωτερικό κειμενογράφο πρώτα!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Αβγ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>αντικείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Η συμβολοσειρά αναζήτησης είναι η %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Επιλέξτε ένα αντικείμενο και\nπιέστε F2 για επεξεργασία.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Παράδειγμα αντικείμενο %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Μερικές τυχαιοποιημένες σημειώσεις (Shift+F2 για επεξεργασία)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Γλώσσα:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Αναδιπλώνει το κείμενο αν είναι πολύ μακρύ ούτως ώστε να χωρέσει στην γραμμή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Αναδίπλωση &amp;μακριού κειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Διατήρηση του κύριου παραθύρου πάνω από τα άλλα παράθυρα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>&amp;Πάντα στην κορυφή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Κλείσιμο του κύριου παραθύρου όταν μια άλλη εφαρμογή έχει την εστίαση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Κλείσιμο κατά την απώλεια εστίασης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Όταν είναι ενεργοποιημένο τα παράθυρα θα ανοίγουν στην τρέχουσα οθόνη. Όταν είναι απενεργοποιημένο τα παράθυρα θα ανοίγουν στην τελευταία τους τοποθεσία</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Ά&amp;νοιγμα των παραθύρων στην τρέχουσα οθόνη</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Επιβεβαίωση εγκατάλειψης της εφαρμογής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Επιβεβαίωση ε&amp;γκατάλειψης της εφαρμογής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Εκτέλεση της εφαρμογής κατά την εκκίνηση του συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Αυτόματη εκκίνηση</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Υποστήριξη για τα πλήκτρα πλοήγησης του Vi (H, J, K, L και άλλων), πλαγιοκάθετος (/) για αναζήτηση</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Τεχνοτροπία πλοήγησης &amp;Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Στυλ πλοήγησης / Keymap:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Υποστήριξη πλοήγησης στο Vi (πλήκτρα H, J, K, L, / και άλλα) και πλοήγησης στον Emacs (Ctrl+N, P, V και άλλα)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Προεπιλογή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Αποθήκευση και επαναφορά του ιστορικού των φίλτρων των αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Αποθήκευση του ιστορικού φίλτρων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Αυτόματη εμφάνιση των αναδυόμενων για συμπλήρωση των λειτουργιών και των ονομάτων των τύπων και των μεταβλητών στις εντολές</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Αυτόματη συμπλήρωση των εντολών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Χειρισμός προχείρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Επιτρέπει την επικόλληση με τον ίδιο τρόπο όπως οι επιλογές ποντικιού (συνήθως πιέζοντας το μεσαίο κλικ του ποντικιού)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Επικόλληση του προχείρου με το ποντίκι</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Επιτρέπει την επικόλληση επιλογών ποντικιού μέσω συντόμευσης (συνήθως με Ctrl+V ή Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Επικόλληση της επιλογής ποντικιού μέσω πληκτρολογίου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Αποθήκευση του πρόχειρου στο ιστορικό</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Αποθήκευση του πρόχειρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Αποθήκευση του επιλεγμένου με το ποντίκι κειμένου (πρώτη επιλογή) στο ιστορικό</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Αποθήκευση του επιλεγμένου με το ποντίκι κειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Εκτέλεση αυτόματων εντολών κατά την επιλογή</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Μέγιστος α&amp;ριθμός αντικειμένων στο ιστορικό:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Μέγιστος αριθμός αντικειμένων στις καρτέλες</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Εκφόρτωση της καρτέλας μετά της καθυστέρησης σε λεπτά:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Εκφόρτωση των καρτελών από την μνήμη μετά από ένα καθορισμένο χρονικό διάστημα αδράνειας σε λεπτά.\n\nΟρίστε το σε 0 για απενεργοποίηση.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Εντολή εξωτερικού κειμενογράφου (το %&amp;1 είναι το αρχείο προς επεξεργασία):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Εντολή εξωτερικού κειμενογράφου (το %1 αντιστοιχεί στο αρχείο προς επεξεργασία).\n  Παραδείγματα:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>&amp;Καρτέλα για την αποθήκευση στο πρόχειρο:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Το όνομα της καρτέλας που θα αποθηκεύεται αυτομάτως το νέο περιεχόμενο στο πρόχειρο\n\nΑφήστε το κενό για απενεργοποίηση.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Αφήστε το αποεπιλεγμένο για την αποθήκευση του επεξεργασμένου αντικείμενου με το πλήκτρο Enter και την εισαγωγή νέας γραμμής με Ctrl + Enter.\n\nΣημείωση: Ανεξάρτητα με την επιλογή αυτή, η επεξεργασία των αντικειμένων μπορεί να αποθηκευθεί με το πλήκτρο F2.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Απο&amp;θήκευση του επεξεργασμένου αντικειμένου με Ctrl+Enter και εισαγωγή νέας γραμμής με Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Εμφάνιση της περιγραφής σε μια γραμμή για κάθε αντικείμενο.\n\nΧρησιμοποιήστε την Προεπισκόπηση για την εμφάνιση ολόκληρου του αντικειμένου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Εμ&amp;φάνιση απλών αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Ενεργοποίηση αναζήτησης αριθμών, διαφορετικά πιέζοντας ένα πλήκτρο ψηφίου ενεργοποιείται το αντικείμενο στην συγκεκριμένη θέση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Ανα&amp;ζήτηση αριθμών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Ενεργοποίηση των αντικειμένων με μονό κλικ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Μετά την ενεργοποίηση του αντικειμένου (με διπλό κλικ ή με το πλήκτρο Enter), αντιγραφή στο πρόχειρο και ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Μετακίνηση του αντικειμένου στην κορυφή του κατάστιχου μετά την ενεργοποίησή του</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Μετακίνηση του αντικειμένου στην &amp;κορυφή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Κλείσιμο του κύριου παραθύρου μετά την ενεργοποίηση του αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Κλείσιμο του κύριου παραθύρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Εστίαση στο τελευταίο παράθυρο μετά την ενεργοποίηση του αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Εστίαση στο τελευταίο παράθυρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Επικόλληση στο τρέχον παράθυρο μετά την ενεργοποίηση του αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Επικόλληση στο τρέχον παράθυρο</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Εμφάνιση/Απόκρυψη</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Απόκρυψη των καρτελών (πιέστε το πλήκτρο Alt για εμφάνιση)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Απόκρυ&amp;ψη των καρτελών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Απόκρυψη της εργαλειοθήκης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Απόκρυψη της εργαλειο&amp;θήκης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Απόκρυψη των ετικετών της εργα&amp;λειοθήκης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Απόκρυψη του κύριου παραθύρου κατά το κλείσιμο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Απόκρυψη του &amp;κύριου παραθύρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Διάταξη και διαφάνεια</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Εμφάνιση του δέντρου καρτελών αντί της γραμμής καρτελών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>&amp;Δέντρο καρτελών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Διαφάνεια εστίασης:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Η διαφάνεια του κύριου παραθύρου κατά την εστίαση.\n\nΣημείωση: Δεν υποστηρίζεται σε όλα τα συστήματα.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Δια&amp;φάνεια άνευ εστίασης:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Η διαφάνεια του κύριου παραθύρου άνευ εστίασης\n\nΣημείωση: Δεν υποστηρίζεται σε όλα τα συστήματα.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Εμφάνιση των αριθμών των αντικειμένων στις καρτέλες</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Εμ&amp;φάνιση πλήθους αντικειμένων</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Θέση ειδοποίησης:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Η θέση των ειδοποιήσεων στην οθόνη</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Κορυφή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Βάση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Πάνω δεξιά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Κάτω δεξιά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Κάτω αριστερά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Πάνω αριστερά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Χρονικό &amp;διάστημα εμφάνισης ειδοποιήσεων:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Χρονικό διάστημα σε δευτερόλεπτα για την εμφάνιση της ειδοποίησης νέου περιεχομένου στο πρόχειρο ή κατά την αντιγραφή ενός αντικειμένου στο πρόχειρο (μόνο αν το κύριο παράθυρο είναι κλειστό).\n\nΟρίστε το σε 0 για απενεργοποίηση.\n\nΟρίστε το σε 1 για να διατηρηθεί ορατό μέχρι να το επιλέξετε.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Αρι&amp;θμός γραμμών για την ειδοποίηση του πρόχειρου:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Αριθμοί γραμμών εμφάνισης του νέου περιεχομένου του πρόχειρου.\n\nΟρίστε το σε 0 για απενεργοποίηση.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Χρήση αυτόχθονων κοινοποιήσεων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Γεωμετρία ειδοποιήσεων (σε σημεία οθόνης)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>&amp;Οριζόντια μετατόπιση:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Απόσταση των ειδοποιήσεων από την αριστερή ή δεξιά πλευρά της οθόνης σε σημεία οθόνης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Κάθετη μετατόπιση:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Απόσταση των ειδοποιήσεων από την κορυφή ή την βάση της οθόνης σε σημεία οθόνης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Μέγιστο &amp;πλάτος:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Μέγιστο πλάτος για τις ειδοποιήσεις σε σημεία οθόνης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Μέγιστο ύ&amp;ψος:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Μέγιστο ύψος για τις ειδοποιήσεις σε σημεία οθόνης</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Να μην εμφανίζεται το εικονίδιο στο πλαίσιο συστήματος· ελαχιστοποίηση του παραθύρου κατά το κλείσιμο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Α&amp;πενεργοποίηση του πλαισίου συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Εμφάνιση της εντολής για το τρέχον περιεχόμενου στο πρόχειρο στο μενού του πλαισίου συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Ε&amp;μφάνιση των εντολών για το περιεχόμενο του πρόχειρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>&amp;Πλήθος αντικειμένων στο πλαίσιο συστήματος:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Πλήθος αντικειμένων στο πλαίσιο συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Εμφάνιση των αντικειμένων από την τρέχουσα καρτέλα στο πλαίσιο συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Εμφάνιση της &amp;τρέχουσας καρτέλας στο μενού,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>ή &amp;επιλογή μιας άλλης καρτέλας:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Το όνομα της καρτέλας προς εμφάνιση στο μενού του πλαισίου συστήματος (αφήστε κενό για την πρώτη καρτέλα)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Επικόλληση του αντικειμένου στο τρέχον παράθυρο μετά την επιλογή του στο μενού</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Επικόλληση του ενεργοποιημένου αντικειμένου στο τρέχον παράθυρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Εμφάνιση της προεπισκόπησης της εικόνας δίπλα από το μενού αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>&amp;Εμφάνιση της προεπισκόπησης της εικόνας ως εικονίδιο του αντικειμένου στο μενού</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Διαμόρφωση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Γενικά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Διάταξη</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Ιστορικό</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Πλαίσιο συστήματος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Ειδοποιήσεις</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Καρτέλες</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Αντικείμενα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Συντομεύσεις</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Εμφάνιση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Μη έγκυρη τιμή για την επιλογή &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Επαναφορά των προτιμήσεων;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Αυτή η ενέργεια θα επαναφέρει όλες σας τις ρυθμίσεις (σε όλες τις καρτέλες) στις προκαθορισμένες τιμές.&lt;br /&gt;&lt;br /&gt;Επιθυμείτε πραγματικά την &lt;strong&gt;επαναφορά όλων των ρυθμίσεων&lt;/strong&gt;;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Απαιτείται επανεκκίνηση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Η αλλαγή της γλώσσας θα λάβει χώρα μετά την επανεκκίνηση της εφαρμογής.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Προτιμήσεις</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Αποτυχία δημιουργίας του καταλόγου συγχρονισμού &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Κάτω</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Επιλογή εικονιδίου…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Επιλογή εικονιδίου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Περιήγηση...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Άνοιγμα αρχείου εικονιδίου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Αρχεία εικόνας (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>Ό&amp;λες</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Καρτέλες:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>&amp;Διαμόρφωση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>&amp;Εντολές</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Η εντολή επεξεργαστή απέτυχε (ανατρέξτε στις καταγραφές)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Αποθήκευση</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Αποθήκευση του αντικειμένου (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Άκυρο</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Ακύρωση της επεξεργασίας και επαναφορά των αλλαγών</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Διαφυγή (Escape)</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Αναίρεση</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Επανάληψη</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Γραμματοσειρά</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Έντονα</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Πλάγια</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Υπογράμμιση</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Μεσογράμμιση</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Προσκήνιο</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Παρασκήνιο</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Διαγραφή τεχνοτροπίας</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Αναζήτηση</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Η κρυπτογράφηση απέτυχε!</translation>\n    </message>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Για την κοινή χρήση κρυπτογραφημένων αντικειμένων σε άλλον υπολογιστή ή συνεδρία, χρειάζεστε τα αρχεία δημοσίου και μυστικού κλειδιού:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Διατηρήστε το μυστικό κλειδί σε ασφαλές μέρος.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Για να μοιραστείτε κρυπτογραφημένα στοιχεία σε άλλο υπολογιστή ή συνεδρία, θα χρειαστείτε αυτά τα αρχεία μυστικών κλειδιών (κρατήστε τα σε ασφαλές μέρος):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Για την προβολή των κρυπτογραφημένων καρτελών, πρέπει να έχετε εγκατεστημένο το GnuPG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Κρυπτογράφηση (απαιτείται το GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Αποκρυπτογράφηση</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Αποκρυπτογράφηση και αντιγραφή</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Αποκρυπτογράφηση και επικόλληση</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Εισαγωγή</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Αποτυχία δημιουργίας των κλειδιών.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Σφάλμα: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Έγινε</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Δημιουργία νέων κλειδιών (μπορεί να διαρκέσει μερικά λεπτά)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Άκυρο</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Ορισμός νέου κωδικού πρόσβασης...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Τα κλειδιά κρυπτογράφησης &lt;strong&gt;πρέπει να δημιουργηθούν&lt;/strong&gt; πριν από την χρήση της κρυπτογράφησης αντικειμένων.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Δημιουργία νέων κλειδιών...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Αλλαγή κωδικού πρόσβασης...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Η αποκρυπτογράφηση απέτυχε!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Κρυπτογράφηση</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Κρυπτογράφηση αντικειμένων και καρτελών.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Για την κρυπτογράφηση και αποκρυπτογράφηση των αντικειμένων προσθέστε τις κατάλληλες εντολές στην καρτέλα εντολών.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Κοινή χρήση κρυπτογραφημένων αντικειμένων και καρτελών</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Κρυπτογραφημένες καρτέλες</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Καθορίστε τα ονόματα των καρτελών (μια ανά γραμμή) που θα κρυπτογραφηθούν/αποκρυπτογραφούν αυτομάτως.&lt;/p&gt;\n&lt;p&gt;Ορίστε το χρονικό διάστημα εκφόρτωσης της καρτέλας από το ιστορικό ούτως ώστε να εκφορτωθούν με ασφάλεια τα αποκρυπτογραφημένα αντικείμενα από την μνήμη.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Κατεστραμμένη καρτέλα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Δεν φορτώθηκαν με επιτυχία όλα τα στοιχεία στην καρτέλα &lt;strong&gt;%1&lt;/strong&gt;. Θέλετε ακόμα να φορτώσετε την καρτέλα και ενδεχομένως να χάσετε κάποια στοιχεία;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Το πρόσθετο FakeVim είναι μέρος του Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Προσομοίωση του επεξεργαστή Vim κατά την επεξεργασία των αντικειμένων.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Ενεργοποίηση του FakeVim για την επεξεργασία των αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Διαδρομή του αρχείου διαμόρφωσης:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Εικόνες</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Εμφάνιση εικόνων.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Μέγιστο &amp;πλάτος εικόνας:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Μέγιστο πλάτος της εικόνας του ιστορικού (ορίστε το σε μηδέν για το αρχικό μέγεθος)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Μέγιστο ύ&amp;ψος εικόνας:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Μέγιστο ύψος της εικόνας του ιστορικού (ορίστε το σε μηδέν για το αρχικό μέγεθος)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Εντολή επεξεργαστή ει&amp;κόνας:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Εντολή επεξεργαστή για υποστηριζόμενους τύπους εικόνων εκτός SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Εντολή επεξεργαστή &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Εντολή επεξεργαστή για τον τύπο εικόνας SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Σημειώσεις</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Εμφάνιση των σημειώσεων των αντικειμένων.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Θέση σημειώσεων</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>&amp;Πάνω από το αντικείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>&amp;Κάτω από το αντικείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>&amp;Δίπλα από το αντικείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Εμφάνιση υπόδει&amp;ξης</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Προσθήκη</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Α&amp;φαίρεση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Μετακίνηση πάνω</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Μετακίνηση κάτω</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Μετακίνηση στη κορυφή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Μετακίνηση στη βάση</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Πάνω</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Κάτω</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Αδύνατη η αφαίρεση καρφιτσωμένων αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Ξεκαρφιτσώστε τα αντικείμενα πρώτα για να τα αφαιρέσετε.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Καρφίτσωμα</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Ξεκαρφίτσωμα</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Καρφιτσωμένα αντικείμενα</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Καρφίτσωμα των αντικειμένων για κλείδωμα στην τρέχουσα γραμμή και αποφυγή διαγραφής (εκτός και αν το ξεκαρφιτσώσετε).&lt;/p&gt;&lt;p&gt;Παροχή συντομεύσεων και λειτουργία εγγραφής σεναρίων.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Περιήγηση...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Άνοιγμα καταλόγου για συγχρονισμό</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Αποτυχία δημιουργίας του καταλόγου συγχρονισμού</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Συγχρονισμός</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Συγχρονισμός αντικειμένων και σημειώσεων με ένα κατάλογο στον δίσκο.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Αποτυχία συγχρονισμού της καρτέλας &quot;%1&quot; με τον κατάλογο &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Αφαίρεση αντικειμένων;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Επιθυμείτε πραγματικά την &lt;strong&gt;αφαίρεση των αντικειμένων και των συσχετισμένων αρχείων&lt;/strong&gt;;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Συγχρονισμός καρτελών και καταλόγων</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Συγχρονισμός των περιεχομένων της &lt;strong&gt;καρτέλας&lt;/strong&gt; με τον κατάλογο της δοθείσας &lt;strong&gt;διαδρομής&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Αφήστε &lt;strong&gt;κενή την διαδρομή&lt;/strong&gt; για να μην αποθηκεύονται τα αντικείμενα στην &lt;strong&gt;καρτέλα&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Όνομα καρτέλας</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Διαδρομή</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Ο τύπος δεδομένων των αντικειμένων για τα αρχεία</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Ορίστε τον τύπο του μέσου σε &lt;strong&gt;-&lt;/strong&gt; (παύλα) για αγνόηση των αρχείων. Όλα τα υπόλοιπα άγνωστα ή κρυφά αρχεία θα αγνοηθούν.&lt;/p&gt;\n&lt;p&gt;Παράδειγμα: Φόρτωση της επέκτασης &lt;strong&gt;txt&lt;/strong&gt; ως τύπο μέσου&lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Επεκτάσεις</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Τύπος μέσου αντικειμένου</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Προσθήκη ετικέτας</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Αφαίρεση ετικέτας</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Προσθήκη ετικέτας %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Διαγραφή της ετικέτας %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Εναλλαγή ετικέτας %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Δεν είναι δυνατή η αφαίρεση αντικειμένων με κλειδωμένη ετικέτα</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Ξεκαρφιτσώστε τα αντικείμενα πρώτα για να τα αφαιρέσετε.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Σημαντικό</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Καθαρισμός όλων των ετικετών</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Ετικέτες</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Εμφάνιση των ετικετών στα αντικείμενα.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Τα αντικείμενα του μενού για την προσθήκη και αφαίρεση προσαρμοσμένων ετικετών μπορούν να προστεθούν και να προσαρμοστούν από τον διάλογο &quot;Εντολές&quot;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Για περισσότερες πληροφορίες ανατρέξτε στην σελίδα του &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Όνομα ετικέτας</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Ταίριασμα</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Φύλλο αισθητικής επικάλυψης</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Χρώμα</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Εικονίδιο</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Κλειδαριά</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Αποφύγετε την αφαίρεση αντικειμένου</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Κείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Εμφάνιση αντικειμένων απλού κειμένου και απλής HTML.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Αποθήκευση και εμφάνιση HTML και εμπλουτισμένου κειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Μέγιστος αριθμός γραμμών προς εμφάνιση (0 για εμφάνιση όλων):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Μέγιστο ύψος σε εικονοστοιχεία (0 για απεριόριστο):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Προεπιλεγμένο φύλλο στυλ:</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Καταγραφή</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ Αντικείμενα (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Εμφάνιση/Απόκρυψη</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Έξοδος;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Επιθυμείτε την &lt;strong&gt;έξοδο&lt;/strong&gt; από το CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Αρχείο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Επεξεργασία</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Αντικείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Καρτέλες</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Βοήθεια</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Νέα καρτέλα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Μετονομασία της &amp;ομάδος %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>&amp;Μετονομασία της καρτέλας %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Α&amp;φαίρεση της καρτέλας %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Αφαίρεση της ομάδος %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Αλλαγή του ει&amp;κονιδίου καρτέλας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Πρόχειρο: %1</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Ενεργοποίηση της αποθήκευσης στο πρόχειρο</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Απενεργοποίηση της αποθήκευσης στο πρόχειρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Επιλογές εισαγωγής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Σφάλμα CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Επιλογές εξαγωγής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Σφάλμα εξαγωγής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Αποτυχία εξαγωγής του αρχείου %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Σφάλμα εισαγωγής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Αποτυχία εισαγωγής του αρχείου %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Αφαίρεση όλων των καρτελών στην ομάδα;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Επιθυμείτε την αφαίρεση &lt;strong&gt;όλων των καρτελών&lt;/strong&gt; στην ομάδα &lt;strong&gt;%1&lt;/strong&gt;;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Αφαίρεση της καρτέλας;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Επιθυμείτε την αφαίρεση της καρτέλας &lt;strong&gt;%1&lt;/strong&gt;;</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Πληροφορίες</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;πρόχειρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;ΚΡΥΦΟ&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n γραμμή)</numerusform>\n            <numerusform>%1 (%n γραμμές)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;ΕΙΚΟΝΑ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ΑΝΤΙΚΕΙΜΕΝΑ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;ΚΕΝΟ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;ΔΕΔΟΜΕΝΑ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Οπισθοδιάστημα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Διαγραφή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Νέο αντικείμενο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Εισαγωγή...</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Εξαγωγή...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Προτιμήσεις...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">Ε&amp;ντολές/Καθολικές συντομεύσεις...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>&amp;Εντολές...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Εμφάνιση του &amp;περιεχόμενου του πρόχειρου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Εμφάνιση προεπισκόπησης</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Ε&amp;ναλλαγή της αποθήκευσης στο πρόχειρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>&amp;Διαχειριστής διεργασιών</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>Έ&amp;ξοδος</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Ταξινόμηση επιλεγμένων αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Αντιστροφή επιλεγμένων αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Ε&amp;πικόλληση αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Αντιγραφή των επιλεγμένων αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Αναζήτηση</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Μετακίνηση στο &amp;πρόχειρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>Ενεργοποίηση των &amp;αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Εμ&amp;φάνιση του περιεχομένου...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Α&amp;φαίρεση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Επεξεργασία</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Επεξεργασία των &amp;σημειώσεων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Ε&amp;πεξεργασία σε κειμενογράφο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Αποθήκευση αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Ακύρωση επεξεργασίας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Διαφυγή (Escape)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Αναίρεση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Επανάληψη</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Γραμματοσειρά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Έντονα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Πλάγια</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Υπογράμμιση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Διαγράμμιση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Προσκήνιο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Παρασκήνιο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Διαγραφή τεχνοτροπίας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Αναζήτηση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Επεξεργασία με επεξεργαστή κειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Ενέργεια...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Μετακίνηση πάνω</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Up</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Μετακίνηση κάτω</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Down</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Μετακίνηση πάνω</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Μετακίνηση κάτω</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Νέα καρτέλα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>&amp;Μετονομασία της καρτέλας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Α&amp;φαίρεση της καρτέλας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Α&amp;λλαγή του εικονιδίου της καρτέλας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Επό&amp;μενη καρτέλα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Δεξιά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>&amp;Προηγούμενη καρτέλα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Αριστερά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Βοήθεια</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Εμφάνιση της καταγραφής</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Σχετικά</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Άνοιγμα του σχετικού μενού του αντικειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Η καρτέλα %1 είναι κατεστραμμένη ή λείπουν μερικά πρόσθετα του CopyQ!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Το όνομα της συνεδρίας δεν μπορεί να περιέχει περισσότερους από 16 χαρακτήρες\nαπό γράμματα, αριθμούς, &quot;-&quot; ή &quot;_&quot;!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n γραμμή &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n γραμμές &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Αντιγραφή κειμένου (%n γραμμές)</numerusform>\n            <numerusform>Αντιγραφή κειμένων (%n γραμμές)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Αντιγραφή κειμένου</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Αντιγραφή δεδομένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Άκυρο</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Εμφάνιση του κύριου παραθύρου και προαιρετικά άνοιγμα της καρτέλας με το δοθέν όνομα.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>ΟΝΟΜΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Απόκρυψη κύριου παραθύρου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Εμφάνιση ή απόκρυψη του κύριου παραθύρου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Άνοιγμα του σχετικού μενού.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Έξοδος εξυπηρετητή.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Ενεργοποίηση ή απενεργοποίηση της αποθήκευσης στο πρόχειρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Εκτύπωση του περιεχομένου του πρόχειρου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Εμφάνιση του επιλεγμένου με το ποντίκι περιεχομένου (X11).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Επικόλληση του πρόχειρου στο τρέχον παράθυρο\n(μπορεί να μην δουλεύει σε μερικές εφαρμογές).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Αντιγραφή του πρόχειρου από το τρέχον παράθυρο\n(μπορεί να μην δουλεύει σε μερικές εφαρμογές).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Ορισμός του κειμένου του πρόχειρου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>ΚΕΙΜΕΝΟ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Ορισμός του περιεχομένου του πρόχειρου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>ΔΕΔΟΜΕΝΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Εμφάνιση του πλήθους αντικειμένων στην τρέχουσα καρτέλα.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Αντιγραφή του αντικειμένου της γραμμής στο πρόχειρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ΓΡΑΜΜΗ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Αντιγραφή του επόμενου αντικειμένου από την τρέχουσα καρτέλα στο πρόχειρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Αντιγραφή του προηγούμενου αντικειμένου από την τρέχουσα καρτέλα στο πρόχειρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Προσθήκη κειμένου στο πρόχειρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Εισαγωγή του κειμένου στην δοθείσα γραμμή.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Αφαίρεση των αντικείμενων από τις δοθείσες γραμμές.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ΓΡΑΜΜΕΣ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Επεξεργασία των αντικειμένων ή δημιουργία ενός νέου.\nΗ τιμή -1 είναι για το τρέχον κείμενο στο πρόχειρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Ορισμός του διαχωριστή για τα αντικείμενα στην έξοδο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>ΔΙΑΧΩΡΙΣΤΙΚΟ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Εμφάνιση ακατέργαστων δεδομένων του πρόχειρου ή ενός αντικειμένου στη γραμμή.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Εγγραφή ακατέργαστων δεδομένων στην δοθείσα γραμμή.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Εμφάνιση του διαλόγου ενέργειας.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Εκτέλεση του ΠΡΟΓΡΑΜΜΑΤΟΣ στο κείμενο του αντικειμένου στις γραμμές.\nΧρησιμοποιήστε %1 στο ΠΡΟΓΡΑΜΜΑ για να περάσετε το κείμενο ως όρισμα.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>ΠΡΟΓΡΑΜΜΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Εμφάνιση του αναδυόμενου μηνύματος στο πλαίσιο συστήματος για τα χιλιοστά δευτερολέπτου του ΧΡΟΝΟΥ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>ΤΙΤΛΟΣ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>ΜΥΝΗΜΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>ΩΡΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Εμφάνιση των διαθέσιμων ονομάτων των καρτελών.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Εκτέλεση της εντολής στην καρτέλα με το δοθέν όνομα.\nΑν η καρτέλα δεν υπάρχει, θα δημιουργηθεί.\nΗ πρώτη καρτέλα είναι και η εξ ορισμού.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>ΕΝΤΟΛΗ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Αφαίρεση καρτέλας.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Μετονομασία της καρτέλας.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>ΝΕΟ_ΟΝΟΜΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Εξαγωγή αντικειμένων σε αρχείο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>ΟΝΟΜΑ_ΑΡΧΕΙΟΥ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Εισαγωγή αντικειμένων από αρχείο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Εμφάνιση όλων των επιλογών.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Λήψη της τιμής της επιλογής.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>ΕΠΙΛΟΓΗ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Ορισμός της τιμής της επιλογής.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>ΤΙΜΗ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Αξιολόγηση σεναρίου.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>ΣΕΝΑΡΙΟ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ΟΡΙΣΜΑΤΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Εκκίνηση ή σύνδεση στην εφαρμογή με το δοθέν όνομα συνεδρίας.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>ΣΥΝΕΔΡΙΑ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Εμφάνιση της βοήθειας για την ΕΝΤΟΛΗ ή για όλες τις εντολές.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Εμφάνιση της έκδοσης του προγράμματος και των βιβλιοθηκών.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Εκτέλεση ελέγχων της εφαρμογής (προσθέστε το όρισμα --help για περισσότερες πληροφορίες).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Εκκίνηση του διακομιστή στο παρασκήνιο πριν από την εκτέλεση μιας εντολής.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Χρήση: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Εκκίνηση του εξυπηρετητή αν δεν έχει καθοριστεί κάποια εντολή.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  ΕΝΤΟΛΕΣ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>ΣΗΜΕΙΩΣΕΙΣ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Χρήση της παύλας (-) ως όρισμα για ανάγνωση από την τυπική είσοδο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Χρήση διπλής παύλας ως όρισμα (--) για ανάγνωση όλων των ακόλουθων ορισμάτων\n    χωρίς την επέκταση των ακολουθιών διαφυγής (π.χ. \\n, \\t και άλλων).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Χρήση του τύπου MIME ? για εμφάνιση των διαθέσιμων τύπων MIME (ο προκαθορισμένος είναι &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Μη έγκυρος αριθμός ορισμάτων!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Αδύνατη η αποθήκευση στο αρχείο &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Αδύνατη η εισαγωγή του αρχείου &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>Διαχειριστής πρόχειρου CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Δεν βρέθηκε η εντολή!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Τερματισμός του εξυπηρετητή.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Μη έγκυρη επιλογή &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Εξαίρεση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Εξαίρεση στο %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Αποτυχία αντιγραφής στο πρόχειρο!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Η καρτέλα με το δοθέν όνομα δεν υπάρχει!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Το όνομα της καρτέλας δεν μπορεί να είναι κενό!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Η καρτέλα με το δοθέν όνομα υπάρχει ήδη!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Απενεργοποιημένη αποθήκευση σε πρόχειρο *</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Προσθήκη συντόμευσης</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Νέα συντόμευση</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; για ακύρωση.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Κάντε κλικ εδώ και πιέστε έναν συνδυασμό πλήκτρων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Αφαίρεση συντόμευσης</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Αναζήτηση:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;Καθολικές</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Οι καθολικές συντομεύσεις μπορούν να ενεργοποιηθούν από οποιαδήποτε εφαρμογή.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>Ε&amp;φαρμογή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Οι συντομεύσεις της εφαρμογής μπορούν να ενεργοποιηθούν μόνον από το κύριο παράθυρο.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Η συντόμευση υπάρχει ήδη!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Το όνομα της καρτέλας δεν πρέπει να είναι κενό και διπλότυπο.&lt;br /&gt;\nΜπορείτε να έχετε πρόσβαση στις &lt;b&gt;Ση&amp;amp;μειώσεις&lt;/b&gt; της καρτέλας με &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nΧρησιμοποιήστε &lt;b&gt;/&lt;/b&gt; ως διαχωριστικό διαδρομής στην διάταξη δέντρου προβολής καρτελών.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>Ό&amp;νομα:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Νέα καρτέλα</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Μετονομασία καρτέλας</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Μετονομασία της ομάδας της καρτέλας</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Μέγιστος αριθμός αντικειμένων:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>προεπιλογή</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>Απο&amp;θήκευση αντικειμένων</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Πιέστε &apos;/&apos; για αναζήτηση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Πληκτρολογείστε για αναζήτηση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Κανονική έκφραση</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Χωρίς διάκριση πεζών/κεφαλαίων</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_es.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"es_ES\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Acerca de</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Administrador de portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Correo electrónico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Donar</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Diálogo de acción</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>O&amp;rden:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>&amp;Entrada estándar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Almacenar salida e&amp;stándar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Enviar datos de tipo de medio indicado a entrada estándar de orden (dejar vacío para desactivar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Crear elementos desde salida estándar del programa (dejar vacío para desactivar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>S&amp;eparador para nuevos elementos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Expresión regular para dividir la salida en varios elementos.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; para guardar cada línea en un elemento diferente.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Pestaña de salida:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Guardar los elementos en la pestaña con el nombre indicado (dejar en blanco para guardar en la pestaña actual)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Orden guardada</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Se guardó la orden y es accesible a través del menú de elementos.\nPuede configurar la orden desde las preferencias.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Error: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Código de salida: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Orden %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Administrador de procesos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtrar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Terminar seleccionado</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Añadir órdenes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Mostrar/ocultar la ventana principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Mostrar el menú de la bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Mostrar la ventana principal bajo el cursor del ratón</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Editar portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Editar el primer elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Copiar el segundo elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Mostrar el diálogo de acción</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Crear nuevo elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Copiar el elemento siguiente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Copiar el elemento anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Pegar el portapapeles como texto plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Desactivar el almacenamiento del portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Activar el almacenamiento del portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Pegar y copiar el siguiente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Pegar y copiar el anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Tomar una captura de pantalla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Pegar la fecha y hora actual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Orden nueva</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorar elementos vacíos o con un solo carácter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Abrir en &amp;Navegador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Pegar como texto plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Reproducir vídeos automáticamente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Copiar URL (dirección web) en otra pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Crear imagen miniatura (necesita ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Crear código QR a partir de una URL (necesita qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tareas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Agregar a pestaña %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Mover a pestaña %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorar archivos copiados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorar ventana *&quot;Contraseña&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Contraseña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Mover a la papelera</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(papelera)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Limpiar pestaña actual</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">No se pueden agregar nuevos elementos</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Pestaña llena. No se puede eliminar ningún elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>No se pueden añadir elementos nuevos a la pestaña %1. Quite elementos manualmente para hacer espacio.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>¿Descartar los cambios?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>¿Confirma que quiere &lt;strong&gt;descartar los cambios&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>¡No se pudo conectar al servidor! Inicie el servidor CopyQ primero.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>¡Se perdió la conexión!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Contenido del portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formatos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>C&amp;ontenido:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Quitar formato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Contenido del elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Tamaño:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Tamaño:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>El servidor CopyQ ya está en ejecución.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Cancelar órdenes activas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>¿Quiere cancelar las órdenes activas y salir?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Cancelar salida</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Salir de todas formas</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Espacio</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Órdenes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definir nuevas órdenes que se pueden ejecutar automáticamente en cada nuevo elemento agregado al portapapeles, o por el usuario desde un menú o utilizando atajos de sistema.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Buscar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Cargar órdenes…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>G&amp;uardar selección…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Copiar selección</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Órdenes para Pegar [CTRL+V]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Cambios no guardados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>La Orden tiene cambios no guardados.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Abrir archivos con órdenes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Órdenes (*.ini);; Configuración CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Guardar las Órdenes seleccionadas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Órdenes (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Guardar comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>No se pudieron guardar los comandos en el archivo &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Mostrar ayuda de la orden (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>La orden contiene una lista de programas y sus parámetros que serán ejecutados. Por ejemplo:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Se sustituirá el parámetro de programa %1 con el texto del elemento y dessde %2 a %9 con las porciones de texto capturados por la expresión regular.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>El argumento %1 se sustituirá por el texto del elemento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Puede utilizar el carácter %1 para pasar la salida estándar al siguiente programa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Puede utilizar la siguiente sintaxis para pasar el resto de la orden como sólo un parámetro.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Esto genera la misma salida que %1 pero es más útil para órdenes más extensas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Puede utilizar las funciones enumeradas a continuación como órdenes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;portapapeles</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nombre:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Nombre de la orden para mostrar en el menú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Elementos coincidentes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Contenido:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Usar orden sólo en los elementos cuyo texto coincida con esta expresión regular (dejar en blanco para coincidir con cualquier texto).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Ejemplos:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Archivo PDF    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Un solo carácter    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Contenido multimedia remoto    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Ventana:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Se enviarán los datos de este tipo MIME a la entrada estándar de la orden.\nDejar en blanco para desactivarlo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Acción</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Nombre de la pestaña a la que copiar nuevos elementos (dejar en blanco para no copiar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtro:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Or%den</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Omite el comando si el texto de entrada no coincide con esta expresión regular (déjelo en blanco para que coincida con todo).\n\n%2 a %9 en Comando y Filtro se reemplazarán con los textos capturados.\n\nEjemplos:\n\n- URL de coincidencia: ^(https?|ftp)://\n- Coincidir con nombres de archivos PDF: \\.pdf$\n- Coincidir con un solo carácter: ^.$\n- Coincidir con multimedia remota: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Ocultar la ventana después de activar una orden desde el menú contextual de un elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Opciones de la orden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Mostrar diálogo de acción antes de ejecutar la orden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Esperar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Modificar elemento, no crear ningún elemento nuevo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Crea elementos desde la salida estándar del programa (dejar vacío para desactivar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Use el comando solo para elementos copiados al portapapeles desde la ventana cuyo texto del título coincida con esta expresión regular (déjelo vacío para que coincida con cualquier ventana). En macOS, contiene el nombre de la aplicación seguido de un guión (&amp;quot;-&amp;quot;) y luego el título de la ventana. Por ejemplo: &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Mostrar Avanzados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Ejecutar la orden automáticamente si el portapapeles tiene contenido nuevo</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Usar órdenes sólo si la orden de filtro es exitosa.&lt;/p&gt;\n\n&lt;p&gt;Se pasará el texto del elemento a la &lt;b&gt;entrada estándar&lt;/b&gt; de la orden de filtro. El elemento &lt;b&gt;coincide sólo si el código de salida de la orden de filtro es 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; en lugar del texto del elemento pasado como parámetro y desde &lt;b&gt;%2&lt;/b&gt; hasta &lt;b&gt;%9&lt;/b&gt; en lugar de las porciones de texto capturados por la expresión regular (partes encerradas entre paréntesis).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; para encadenar órdenes (pasar la salida estándar a la siguiente orden).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Tipo de acción</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;mático</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Mostrar orden en el menú contextual de los elementos coincidentes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>En el m&amp;enú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>Atajo &amp;global:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avanzado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Atajo Global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Tipo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Secuencia de órdenes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Visualización</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Omite el comando si el texto de entrada no coincide con esta expresión regular (déjela vacía para que coincida con todo).\n\n%2 a %9 (o argumento[1] en adelante en el script) en Comando y Filtro serán reemplazados por los textos capturados.\n\nEjemplos:\n\n- URL coincidente: ^(https?|ftp)://\n- Coincidir con nombres de archivos PDF: \\.pdf$\n- Coincidencia de un solo carácter: ^.$\n- Coincidir con multimedia remoto: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>F&amp;ormato:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Omite el comando si el comando de filtro falla con un código de salida distinto de cero.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Co&amp;piar a pestaña:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Quitar elemento concidente\n\nNota: si se aplica automáticamente, no se ejecutará ninguna otra orden automática.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Quita&amp;r elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Acción de menú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Ocultar la ventana principal después de la activación</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>&amp;Salida:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Separador:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Separador para dividir la salida en múltiples elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Pes&amp;taña de salida:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Guardar los elementos en la pestaña con el nombre indicado (dejar en blanco para guardar en la primera pestaña)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Atajo:</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Tipografía</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Fondo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Encontrado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Principal</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Notificación</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Mostrar &amp;número</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Mostrar barras de deplazamiento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Íconos del s&amp;istema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Antialias</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Barras de desplazamiento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Información sobre herramientas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Usar íconos del entorno de escritorio siempre que sea posible</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>D&amp;efinir colores de las pestañas, barra de tareas y menúes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Reiniciar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Cargar Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Guardar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Editar el tema actual en un editor externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>E&amp;ditar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Vista Previa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Seleccionar un elemento y\npulsar F2 para editar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Elemento de ejemplo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Algunas notas al azar (Mayús+F2 para editar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Buscar cadena %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Abrir archivo de tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Guardar archivo de tema como</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>No se encontró un editor externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>¡Defina la orden del editor primero!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Idioma:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Divide el texto si es demasiado largo para que quepa en una sola línea</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Ajustar texto larg&amp;o</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Mantener ventana principal por encima de las otras ventanas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Siem&amp;pre Arriba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Cerrar la ventana principal cuando otra aplicación tenga el foco</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Cerrar cuando no tenga el foco</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Activar para abrir las ventanas en la pantalla actual. Desactivar para abrir las ventanas donde fueron cerradas por última vez</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Abrir ventanas en la &amp;pantalla actual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Confirmar salida de la aplicación</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Confirmar &amp;salida de la aplicación</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Ejecutar la aplicación al iniciar el sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>Inicio &amp;Automático</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Compatibilidad con teclas de navegación Vi (H, J, K, L, etc.), tecla de barra diagonal (/) para buscar</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Estilo de navegación &amp;Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Evita la captura de ventanas en capturas de pantalla y grabaciones</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Ocultar de capturas de pantalla y gracaciones</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Estilo de navegación / Mapa de teclas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Compatibilidad con navegación Vi (teclas H, J, K, L, / y más) y navegación Emacs (Ctrl+N, P, V y más)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Guardar y restablecer el historial de los filtros de elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Guardar el Historial de los Filtros</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Mostrar automáticamente una ventana emergente para completar la función, tipo y nombre de variables en comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Autocompletar Comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulación del Portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Permitir pegar el contenido copiado de la misma manera que las selecciones del ratón (generalmente presionando el botón medio del raton)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Pegar el portapapeles con el ratón</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Permitir pegar las selecciones del ratón usando atajos (normalmente Ctrl+V o Mayús+Insertar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Pegar selección del ratón con el teclado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Guardar portapapeles en el historial</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Guardar el portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Guardar texto seleccionado con el ratón (selección primaria) en el historial</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Almacenar el texto seleccionado con el ratón</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>Ejecutar comandos automáticos en la selección</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Número máximo de elementos en el historial:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Número máximo de elementos en cada pestaña</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Suprimir pestaña desp&amp;ués de un intervalo (en minutos):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Quitar cada pestaña de la memoria después de un número especificado de minutos de inactividad.\n\nDefinir como 0 para no quitar pestañas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Comando de editor externo (%&amp;1 es el fichero a editar):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Comando de editor externo (%1 es el archivo a editar).\n  Ejemplos:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Pestaña para guardar el portapapeles:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Nombre de la pestaña que guardará automáticamente el nuevo contenido del portapapeles.\n\nDejar vacío para deshabilitar el guardado automático.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Deje sin marcar la tecla Retorno para guardar el elemento editado y Ctrl+Retorno para crear una nueva línea.\n\nNota: Los elementos editados se pueden guardar con F2 sin tener en cuenta esta opción.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Guardar el elemento editado con Ctrl+Enter y crear una nueva línea con la tecla Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Mostrar la descripción en una sola línea de cada elemento.\n\nUsar Previsualizar Elemento para mostrar todos los elementos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Mostrar elementos simples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Habilite la búsqueda de números; de lo contrario, al presionar una tecla numérica se activa el elemento que está en esa posición</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Búsqu&amp;eda de números</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Activar elemento con un solo clic</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Después de activar el elemento (doble-click o tecla Enter), copiarlo al portapapeles y...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Mover elemento arriba después de que este sea activado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Mover elemento arriba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Cerrar ventana principal tras activar el elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Cerrar la ventana principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Mover foco a la última ventana tras activar el elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>Mover el foco a la última ventana</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Pegar a la ventana actual tras activar el elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Pegar a la ventana actual</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Mostrar/ocultar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Ocultar pestañas (pulsar la tecla Alt para mostrarlas)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Ocultar pestañas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Ocultar barra de herramientas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Ocultar barra de herramientas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Ocultar etiquetas de la &amp;barra de herramientas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Ocultar la ventana principal cuando se cierre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Ocultar ventana &amp;principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Diseño y transparencia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Mostrar árbol con pestañas en lugar de barra de pestañas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Árbol de pestañas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Transparencia al hacer foco:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparencia de la ventana principal si tiene el foco.\n\nNota: esto no es posible en todos los sistemas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Transparencia desenfocada:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparencia de la ventana principal si no tiene el foco.\n\nNota: Esto no es posible en todos los sistemas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Mostrar cantidad de elementos en las pestañas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Mostrar cantidad de elementos</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Posición de las notificaciones:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Posición en la pantalla de las notificaciones</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Arriba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Abajo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Arriba a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Abajo a la derecha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Abajo a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Arriba a la izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Intervalo (en segundos) durante en cual mostrar notificaciones:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Intervalo en segundos para mostrar la notificación que indica que hay contenido nuevo en el portapapeles o que algo se ha copiado al portapapeles (sólo si la ventana principal está cerrada).\n\nDefinir como 0 para deshabilitar esta opción.\n\nDefinir como -1 para mantenerla visible hasta que se pulse en ella.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Cantidad de líneas de la notificación del portapapeles:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Número de líneas para mostrar del contenido nuevo del portapapeles.\n\nDefinir 0 para desactivar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>Usar notificaciones nativas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geometría de las notificaciones (en puntos de pantalla)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Despla&amp;zamiento horizontal:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Distancia de la notificación al borde derecho o izquierdo de la pantalla en puntos de pantalla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>Desplazamiento vertical:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Distancia de la notificación al borde superior o inferior de la pantalla en puntos de pantalla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Ancho máximo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Ancho máximo de la notificación en puntos de pantalla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Altura máxima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Altura máxima de la notificación en puntos de pantalla</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>No mostrar el ícono de la bandeja; minimizar la ventana cuando se cierre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Desactivar bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Mostrar el comando para el contenido actual del portapapeles en el menú de la bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Mostrar comandos para el contenido del portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>&amp;Número de elementos en el menú de la barra principal:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Número de elementos en el menú de la bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Mostrar elementos de la pestaña activa en el menú de la bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>&amp;Mostrar la pestaña activa en el menú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>o &amp;elegir otra pestaña:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>El nombre de la pestaña que se muestra en la bandeja del sistema (el nombre de la primera pestaña está vacío)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Después de seleccionar un elemento en el menú, péguelo en el panel actual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Pegar el elemento seleccionado en la ventana actual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Vista previa de imágenes junto a los elementos del menú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Mostrar vistas previas de imágenes como iconos en el menú</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"obsolete\">Configuración</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Notificaciones</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>El valor no es válido para la opción «%1»</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>General</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Diseño</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Historia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Pestañas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Atajos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Apariencia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>¿Reiniciar preferencias?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Esta acción reiniciará todas sus preferencias (en todas las pestañas) a los valores predeterminados.&lt;br /&gt;&lt;br /&gt;¿Confirma que quiere &lt;strong&gt;restablecer todas las preferencias&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Necesita reinicar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Se cambiará el idioma luego de que reinicie la aplicación.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Preferencias</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>¡No se pudo crear el directorio de sincronización «%1»!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Abajo</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Seleccionar Icono…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Seleccionar icono</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Navegar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Abrir archivo de ícono</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Archivos de imagen (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Todos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Pestañas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Co&amp;nfiguración</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Co&amp;mandos</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">el código de salida del editor es %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Orden del editor: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Error en el comando del editor (ver registros)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Guardar</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Guardar elemento (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Cancelar</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Cancelar la edición y deshacer los cambios</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Escape</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Tipo de letra</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Negrita</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Itálico</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Subrayar</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Tachado</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Primer Plano</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Fondo</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Borrar Estilo</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Buscar</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Deshacer</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Rehacer</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Para compartir los elementos cifrados con otros equipos o sesiones necesitará archivos de claves pública y privada:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Mantenga esta clave privada en un lugar seguro.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Necesitará tener GnuPG instalado para ver pestañas cifradas.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Cifrar (requiere GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Descifrar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Descifrar y copiar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Mayús+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Desencriptar y Pegar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Ingresar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Error: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>No se pudo general las claves.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Para compartir elementos encriptados en otro ordenador o sesión, necesitarás estos archivos de claves secretas (guárdalos en un lugar seguro):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Hecho</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Creando nuevas claves (esto puede tardar unos minutos)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Estableciendo una nueva contraseña...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>&lt;strong&gt;Debe generar&lt;/strong&gt; las claves de cifrado para poder cifrar elementos.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Generar nuevas claves...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Cambiar contraseña...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>¡No se pudo cifrar!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>¡No se pudo descifrar!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Cifrado</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Cifrar elementos y pestañas.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Para cifrar y descifrar elementos, añada las órdenes apropiadas en la pestaña «Órdenes».</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Compartir elementos y pestañas cifradas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Pestañas cifradas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Indique los nombres de las pestañas (una por línea) para cifrar y descifrar automáticamente.&lt;/p&gt;\n&lt;p&gt;Indique el intervalo de limpieza de pestañas en la pestaña «Histórico» para limpiar de manera segura los elementos de la memoria.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Pestaña corrompida</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>No fueron cargados correctamente todos los elementos de la pestaña &lt;strong&gt;%1&lt;/strong&gt;. ¿Deseas seguir cargando la pestaña pero quizá perder algunos elementos?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>El complemento FakeVim es parte de Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emular el editor Vim al editar elementos.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Activar FakeVim para editar elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Ruta al archivo de configuración:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Imágenes</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Mostrar imágenes.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>A&amp;ncho máximo de la imagen:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Ancho máximo de la imagen mostrada en el historial (cero para usar el tamaño original)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>A&amp;ltura máximo de la imagen:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Altura máxima de la imagen mostrada en el historial (cero para usar el tamaño original)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Orden del editor de &amp;imágenes:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Orden del editor de imágenes con otros formatos compatibles distintos a SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Orden del editor &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Orden del editor de imágenes con formato SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Mostrar notas para los elementos.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Posición de las notas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>&amp;Encima del Elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>&amp;Debajo del Elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Al &amp;lado del Elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Mostrar te&amp;xto de ayuda</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Añadir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Quita&amp;r</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Subir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Bajar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Mover a la parte superior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Mover a la parte inferior</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">Arri&amp;ba</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">A&amp;bajo</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>No puedo quitar Elementos Fijados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Desfije los elementos para poder quitarlos.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Fijar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Desfijar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Elementos Fijados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Fijar elementos para bloquearlos en la fila actual y evitar que se borren (a menos se desfijen).&lt;/p&gt;&lt;p&gt;Proporciona atajos de teclado y funcionalidades para scripts.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Navegar...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Abrir directorio para sincronizar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>No se pudo crear el directorio de sincronización</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sincronizar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Sincronizar elementos y notas con un directorio en disco.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>¡No se pudo sincronizar la pestaña &quot;%1&quot; con el directorio &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>¿Quitar Elementos?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>¿Realmente desea &lt;strong&gt;quitar los elementos y archivos asociados&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Sincronización de pestañas y directorios</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sincronizar el contenido de la &lt;strong&gt;pestaña&lt;/strong&gt; con el directorio en la &lt;strong&gt;ruta&lt;/strong&gt; indicada.&lt;/p&gt;\n&lt;p&gt;Dejar una &lt;strong&gt;ruta vacía&lt;/strong&gt; para no guardar los elementos de la &lt;strong&gt;pestañas&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Nombre de la pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Ruta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Archivos para formato de datos de los elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Establecer el tipo de medio en &lt;strong&gt;-&lt;/strong&gt; (carácter menos) para ignorar los archivos. Cualquier otro archivo desconocido u oculto se ignora.&lt;/p&gt;\n&lt;p&gt;Ejemplo: cargar la extensión de archivo &lt;strong&gt;txt&lt;/strong&gt; como tipo de medio &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Tipo de medio del elemento</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Definir el tipo MIME como &lt;strong&gt;-&lt;/strong&gt; (guión) para ignorar archivos. Se ignorarán todos los demás archivos desconocidos u ocultos.&lt;/p&gt;\n&lt;p&gt;Ejemplo: cargar los archivos de extensión &lt;strong&gt;txt&lt;/strong&gt; como el tipo MIME &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Extensiones</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">Tipo MIME del elemento</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Añadir etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Quitar etiqueta</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Etiquetar como %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Quitar etiqueta %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Alternar la etiqueta %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>No Se Pueden Eliminar Elementos Marcados Con La Etiqueta &quot;Bloqueado&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Para elimininar elementos, primero quiteles las etiquetas.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Quitar todas las marcas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Marcas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Mostrar las marcas de los elementos.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Los elementos de menú para añadir y quitar etiquetas personalizadas pueden añadirse y personalizarse en el diálogo de Comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Mas información disponible en &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt; la página wiki&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Nombre de etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Coincidir</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Hoja de estilos</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Color</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Icono</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Bloquear</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Evitar quitar elemento</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Mostrar elementos en texto plano y HTML sencillo.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Guardar y mostrar HTML y texto enriquecido</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Cantidad máxima de líneas para mostrar (0 para mostrar todas):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Altura máxima en píxeles (0 para ilimitado):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Hoja de estilo por defecto:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Mostrar páginas web.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"obsolete\">Altura máxima en píxeles (0 para ilimitado):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Registro</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>¿Salir?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>¿Desea &lt;strong&gt;salir&lt;/strong&gt; de CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Mostrar/ocultar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Pestañas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Ayuda</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Activar el almacenamiento del portapapeles</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Desactivar el almacenamiento del portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Error de CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Portapapeles: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Elementos CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nueva pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Renombrar &amp;grupo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Re&amp;nombrar pestaña %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Qu&amp;itar pestaña %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Quitar grupo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Cambiar ícono de la pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Configuraciones para importar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Configuraciones para exportar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Error de exportación</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Fracaso exportar archivo %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>error de importación</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Fracaso importar archivo %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>¿Desea cerrar todas las pestañas del grupo?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>¿Desea cerrar &lt;strong&gt;todas las pestañas&lt;/strong&gt; del grupo &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>¿Desea quitar la pestaña?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>¿Desea quitar la pestaña &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Información</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n línea)</numerusform>\n            <numerusform>%1 (%n líneas)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;OCULTO&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;IMAGEN&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ELEMENTOS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;VACÍO&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATOS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Retroceso</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Eliminar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>¡El nombre de la sesión debe contener 16 carácteres\ncomo máximo que pueden ser letras, dígitos, «-» o «_»!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n línea &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n líneas &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nuevo Elemento</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importar..</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Exportar..</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Preferencias...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">Ataj&amp;os de órdenes/globales...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>&amp;Órdenes...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Mostar el Contenido del Portapapeles (&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Mayús+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Al&amp;ternar Almacenamiento del Portapapeles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Mayús+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Administrador de P&amp;rocesos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Mayús+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Salir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>Ordenar Elementos &amp;Seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Mayús+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>Inverti&amp;r Elementos Seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Mayús+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Pegar Elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Copiar Elementos Seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Buscar</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Mover al Portapapeles (&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Mo&amp;strar Contenido...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Mo&amp;strar Vista Previa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"obsolete\">Mover al Portapapeles (&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Quita&amp;r</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Editar &amp;Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Mayús+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">E&amp;ditar con un editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Acción...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Mover Arriba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Arriba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Mover Abajo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Abajo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Mover al Principio</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Inicio</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Mover al Final</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+Fin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nueva Pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>R&amp;enombrar Pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Eli&amp;minar Pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Cambiar Icono de la Pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Mayús+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Pestaña &amp;Siguiente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Derecha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Izquierda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Abrir Menú Contextual Elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Mayús+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Pestaña &amp;Anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Guardar elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Cancelar edición</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Deshacer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Restaurar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Fuente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>En negrita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>En Cursiva</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Subrayado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Tachado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Primer plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Fondo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Eliminar estilo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Búsqueda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;ctivar Elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>E&amp;ditar con Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Mostrar Bitácora (&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Acerca de</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Ayuda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>¡La pestaña %1 está dañada o faltan algunos complementos de CopyQ!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Texto copiado (%n línea)</numerusform>\n            <numerusform>Textos copiados (%n líneas)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Texto copiado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Datos copiados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Ocultar la ventana principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Mostrar u ocultar la ventana principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Abrir menú contextual.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Apagar servidor.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Activar o desactivar el almacenamiento del contenido del portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Imprimir el contenido del portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Imprimir el contenido de la selección X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Pegar el portapapeles a la ventana actual\n(puede que no funcione con algunos programas).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Definir el texto del portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXTO</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nDefinir el contenido del portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATOS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Copiar el elemento de la fila al portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>FILA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Copiar el elemento siguiente desde la pestaña actual al portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Copiar el elemento anterior desde la pestaña actual al portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Añadir texto al portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Insertar el texto en la fila indicada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Quitar los elementos de las filas indicadas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>FILAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Editar elementos o editar uno nuevo.\nUse el valor -1 para editar el texto actual del portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Definir el separador para los elementos en la salida.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARADOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Imprimir los datos sin formato del portapapeles o el elemento en la fila.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nEscribir datos sin formato a la fila indicada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Mostrar el diálogo de acción.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nEjecutar PROGRAMA sobre el texto de los elementos de las filas.\nUse %1 en PROGRAMA para pasar el texto como parámetro.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAMA</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nMostrar el mensaje emergente en la bandeja durante TIEMPO milisegundos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TÍTULO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MENSAJE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TIEMPO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Enumerar los nombres de las pestañas disponibles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Ejecutar la orden en la pestaña con el nombre indicado.\nSe creará la pestaña si no existe.\nSe utilizará la primera pestaña de forma predeterminada.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"obsolete\">\nConsidera el programa ECMAScript.\nLos argumentoss son accesibles usando con &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Ejecuta pruebas de la aplicación (adjunta el argumento --help para más información).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NOMBRE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Mostrar la ventana principal y, opcionalmente, abrir la pestaña con el nombre indicado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Copiar el portapapeles de la ventana actual\n(puede que no funcione con algunas aplicaciones).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Establecer el contenido del portapapeles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Imprime la cantidad de elementos en la pestaña actual.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Escribir los datos sin formato en la fila indicada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Ejecute PROGRAMA en el texto del elemento en las filas.\nUtilice %1 en PROGRAMA para pasar el texto como argumento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Muestrar el mensaje emergente de la bandeja durante TIEMPO milisegundos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>ORDEN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Quitar la pestaña.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Renombrar la pestaña.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NUEVO_NOMBRE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Exportar los elementos a un archivo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>ARCHIVO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importar los elementos desde un archivo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Enumerar todas las opciones.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Obtener el valor de la opción.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPCIÓN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Definir el valor de la opción.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Evaluar script.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Inicia o se conecta a la instancia de la aplicación con un nombre de sesión dado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Imprimir ayuda para COMANDO o todos los comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Muestra la versión del programa y de las bibliotecas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Inicie el servidor en segundo plano antes de ejecutar un comando.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>¡La opción «%1» no es válida!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>PARÁMETROS</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nInicia o conecta a una instancia de la aplicación con el nombre de sesión indicado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESIÓN</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nImprimir la ayuda para ORDEN o para todas las órdenes.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nImprimir la versión del programa y de las bibliotecas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Uso: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Iniciar el servidor si no se especifica ninguna orden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  ÓRDENes:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTAS:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Use el argumento guión (-) para leer datos de la entrada estándar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Clipboard Manager</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Excepción</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Excepción en %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Fracaso copiar al portapapeles!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Use un doble guión (--) como parámetro para leer todos los parámetros siguientes sin\n    expandir secuencias de escape (es decir: \\n, \\t y otras).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Use ? para imprimir los tipos MIME disponibles (el valor predeterminado es «text/plain»).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>¡Cantidad incorrecta de parámetros!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>!No se encontró la orden!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Apagando servidor.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">!No se pudo guardar en el archivo «%1»!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">!No se pudo importar el archivo «%1»!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>¡No existe una pestaña con el nombre indicado!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>¡El nombre de la pestaña no puede estar vacío!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>¡Ya existe una pestaña con el nombre indicado!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Almacenamiento en el portapapeles desactivado*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"obsolete\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"obsolete\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Agregar atajo</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Nuevo acceso directo</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Presione cualquier combinación de teclas. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; para cancelar.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Pulse aquí con el ratón y cualquier combinación de teclas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Quitar atajo</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>¡El atajo indicado ya existe!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Buscar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Gl&amp;obal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Los atajos de teclado globales se pueden activar desde cualquier aplicación.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>A&amp;plicación</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Los atajos de teclado de aplicaciones solo se pueden activar desde la ventana principal.</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>El nombre de la pestaña no debe estar vacío y debe ser único&lt;br /&gt;\nPuede abrir la pestaña &lt;b&gt;No&amp;amp;tas&lt;/b&gt; con &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; como separador en el árbol de pestañas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nombre:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Nueva pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Renombrar la pestaña</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Renombrar el grupo de pestañas</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>Número &amp;máximo de elementos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>valor por defecto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Guardar Elementos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Presione &apos;/&apos; para buscar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Escriba para buscar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1: %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Expresión Regular</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Ignorar mayúscula y minúsculas</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_et.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"et_EE\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_fa.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"fa_IR\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>مدیریت حافظه‌ی موقت</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>سازنده</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>رایانامه</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>وب</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>کمک مالی</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>درباره ما</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>گفتگوی اکشن</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>دستور:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>ایجاد موارد از خروجی استاندارد برنامه (برای خاموش کردن آن را خالی بگذارید)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>جداکننده موارد جدید:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt; عبارت منظم برای تقسیم خروجی به چند مورد. &lt;\\ p&gt;\n&lt;p&gt; از &lt;b&gt; \\ n &lt;/b&gt; برای ذخیره هر خط در مورد جداگانه استفاده کنید. &lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>زبانه خروجی:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>موارد را در برگه با نام مشخص ذخیره کنید (برای ذخیره در برگه کنونی خالی بگذارید)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">فرمان ذخیره شد</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">فرمان ذخیره شد و می توان از منوی مورد به آن دسترسی داشت.\nمی توانید فرمان را در تنظیمات برگزیده تنظیم کنید.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>خطا:٪ 1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>کد خروج:%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>فرمان%1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>مدیر فرآیند</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>فیلتر</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>نمایش/پنهان کردن پنجره اصلی</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>نمایش منوی سینی (tray)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>نمایش پنجره اصلی زیر نشاندهنده‌ی ماوس</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>ویرایش کلیپ بورد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>ویرایش اولین مورد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>کپی مورد دوم</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>نمایش پنجره عملکرد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>ایجاد مورد جدید</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>کپی مورد بعدی</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>کپی مورد قبلی</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>کلیپ بورد را به صورت یک متن ساده جایگذاری کنید</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>غیرفعال کردن ذخیره سازی کلیپ بورد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>فعال کردن ذخیره سازی کلیپ بورد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>بچسبان و بعدی را کپی کن</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>بچسبان و قبلی را کپی کن</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>عکسبرداری از صفحه مانیتور</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>تاریخ و زمان فعلی را بچسبان</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>فرمان جدید</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>نادیده گرفتن موارد بدون کاراکتر یا تک کاراکتر</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>بازکردن در &amp;مرورگر</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>چسباندن به عنوان متن ساده</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>پخش خودکار فیلم ها</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>URL (آدرس وب) را به برگه دیگر کپی کنید</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>ایجاد تصویر بندانگشتی (نیاز به ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>ایجاد کد QR از URL (نیاز به qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation type=\"unfinished\">وظایف</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>افزودن به برگه %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>انتقال به برگه %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>نادیده گرفتن فایل های کپی شده</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>نادیده گرفتن پنجره *&quot;رمز عبور&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>رمز عبور</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>انتقال به سطل زباله</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(سطل زباله)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>افزودن فرمان ها</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>موارد جدید را نمی توان به برگه %1 اضافه کرد. لطفاً موارد را به صورت دستی حذف کنید تا فضا خالی شود.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>لغو تغییرات؟</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>اتصال از دست رفت!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>محتویات کلیپ‌بورد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>حذف فرمت</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>محتویات مورد</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation type=\"unfinished\">\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\">زبانه خروجی:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\">خطا:٪ 1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">وب</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>پیش‌فرض</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_fi.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"fi_FI\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Tietoja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Leikepöydän muokkaaja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Tekijä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Sähköposti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Lahjoita</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Toiminnon valintaikkuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>&amp;Komento::</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Vakio &amp;syöttö:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Tallenna vakio &amp;lähtö:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Lähetä tietyn mediatyypin tiedot komennon vakiosyötteeseen (jätä tyhjäksi sammuttaaksesi)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Luo kohteita ohjelman vakiolähtöstä (jätä tyhjä sammuttamiseksi)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Uusien esineiden erotin:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Säännöllinen lauseke tulosteen jakamiseen useiksi kohteiksi.&lt;\\p&gt;\n&lt;p&gt;Käytä &lt;b&gt;\\n&lt;/b&gt;:ta jokaisen rivin tallentamiseen ja erottamiseen.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;välilehti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Tallenna kohteet välilehdelle annetulla nimellä (jätä tyhjäksi tallentaaksesi nykyiselle välilehdelle)</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Virhe: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Poistumiskoodi: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Komento &apos;%1&apos;</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Prosessien hallinta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Suodata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Lopeta valittu</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Lisää komentoja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Näytä/piilota pääikkuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Näytä lokerovalikko</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Näytä pääikkuna hiiren kohdistimen alla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Muokkaa leikepöytää</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Muokkaa ensimmäistä kohdetta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Kopioi toinen kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Näytä toimintavalintaikkuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Luo uusi kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Kopioi seuraava kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Kopioi edellinen kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Liitä leikepöytä pelkkänä tekstinä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Poista leikepöydälle tallentaminen käytöstä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Ota leikepöydälle tallentaminen käyttöön</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Liitä ja kopioi seuraava</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Liitä ja kopioi edellinen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Ota kuvakaappaus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Liitä nykyinen päivämäärä ja aika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Uusi komento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ohita kohteet, joissa ei ole yhtään merkkiä tai joissa on vain yksi merkki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Avaa &amp;selaimessa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Liitä pelkkänä tekstinä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Toista videot automaattisesti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Kopioi URL-osoite (verkko-osoite) toiseen välilehteen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Luo pikkukuva (vaatii ImageMagickin)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Luo QR-koodi URL-osoitteesta (vaatii qrencoden)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tehtävät</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Lisää välilehteen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Siirrä välilehteen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ohita kopioidut tiedostot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ohita *&quot;Salasana&quot;*-ikkuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Salasana</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Siirrä roskakoriin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(roskakori)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Tyhjennä nykyinen välilehti</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Uusia kohteita ei voi lisätä välilehteen %1. Poista kohteet manuaalisesti tilan vapauttamiseksi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Hylätäänkö muutokset?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Haluatko todella &lt;strong&gt;hylätä muutokset&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Yhteys katkesi!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Ei voi muodostaa yhteyttä palvelimeen! Käynnistä CopyQ-palvelin ensin.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Leikepöydän sisältö</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Muodot:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Sisältö:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Poista muoto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Kohteen sisältö</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Koko:&lt;/strong&gt; %1 tavua</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ-palvelin on jo käynnissä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Peruuta aktiiviset komennot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Perutaanko aktiiviset komennot ja poistutaanko?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Peruuta poistuminen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Poistu joka tapauksessa</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+välilyönti</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Komennot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Määritä uudet komennot, jotka voidaan käynnistää joko automaattisesti uudessa leikepöydän sisällössä tai käyttäjän toimesta valikosta tai järjestelmän pikakuvakkeen avulla.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Löydä:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Lataa komennot…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>&amp;Tallenna valitut…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopioi valitut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Liitä komennot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Tallentamattomat muutokset</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Komento-valintaikkunassa on tallentamattomia muutoksia.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Avaa tiedostot komennoilla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Komennot (*.ini);; CopyQ-kokoonpano (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Tallenna valitut komennot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Komennot (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Komento sisältää listan suoritettavista ohjelmista argumenteineen; esimerkiksi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Ohjelman argumentti %1 korvataan kohteen tekstille.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Merkkiä %1 voidaan käyttää vakiolähtöön välittämiseen seuraavalle ohjelmalle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Seuraavaa syntaksia voidaan käyttää komennon loppuosan välittämiseen yhtenä parametrina.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Tämä antaa saman tulosteen kuin %1, mutta on hyödyllisempi pitemmille komentoille.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Alla lueteltuja toimintoja voidaan käyttää seuraavien komentojen mukaisesti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;leikepöytä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Näytä komennon apu (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nimi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Komennon nimi näkyy valikossa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Tyyppi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Suorita komento automaattisesti, jos leikepöydällä on uutta sisältöä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>&amp;Automaattinen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Näytä komento vastaavien kohteiden valikossa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>&amp;Valikossa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Laajamittainen pikanäppäin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Komentosarja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Näyttö</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Pikanäppäin:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Laajamittainen pikanäppäin:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>&amp;Komento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Edistynyt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Vastaa kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Sisältö:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Ohittaa komennon, jos syöttöteksti ei vastaa tätä säännöllistä lauseketta (jätä tyhjäksi, jos se vastaa kaikkea).\n\n%2 kautta %9 (tai argumentti[1] ja ylöspäin komentosarjassa) Komennossa ja Suodattimessa korvataan kaapatuilla teksteillä.\n\nEsimerkit:\n\n- Vastaa URL-osoitetta: ^(https?|ftp)://\n- Vastaa PDF-tiedostojen nimet: \\.pdf$\n- Vastaa yhtä merkkiä: ^.$\n- Etsi etämultimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Ikkuna:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Käytä komentoa vain kohteille, jotka on kopioitu leikepöydälle ikkunasta, jonka otsikkoteksti vastaa tätä säännöllistä lauseketta (jätä tyhjäksi, jos haluat vastata mitä tahansa ikkunaa). MacOS:ssa tämä sisältää sovelluksen nimen, jota seuraa viiva (&amp;quot;-&amp;quot;) ja sitten ikkunan otsikon; esim. &amp;quot;Safari – GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>&amp;Muoto:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Tämän MIME-tyypin tiedot lähetetään komennon vakiosyötteeseen.\nPoista tämä käytöstä jättämällä tyhjäksi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Suodatin:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Ohittaa komennon, jos suodatinkomento epäonnistuu nollasta poikkeavalla poistumiskoodilla.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Toiminta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Kopioi välilehteen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Välilehden nimi, johon uudet kohteet kopioidaan (jätä tyhjäksi, jos et kopioi)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Poista vastaava kohde\n\nHuomautus: Jos tätä käytetään automaattisesti, muita automaattisia komentoja ei suoriteta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Poista kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Valikko Toiminta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Piilota ikkuna sen jälkeen, kun komento on aktivoitu kohteen kontekstivalikosta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Piilota pääikkuna aktivoinnin jälkeen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Komentovaihtoehdot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>&amp;Lähtö:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Luo kohteita ohjelman vakiolähdöstä (jätä tyhjäksi poistaaksesi käytöstä)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Erotin:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Erotin, joka vastaa tulosteen jakamista useisiin kohteisiin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Lähtö&amp;välilehti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Tallenna kohteet välilehdelle määritetyllä nimellä (jätä tyhjäksi tallentaaksesi ensimmäiselle välilehdelle)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Näytä toimintaikkuna ennen komennon suorittamista</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Odota</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Vaihda kohdetta, älä luo uusia kohteita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>&amp;Muuta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Näytä Edistynyt</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Tausta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Työkaluvinkit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Löytyi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Valittuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Numero</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normaali</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Muokkain</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Fontti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Vaihda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Etuala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Ilmoitus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Näytä &amp;numero</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Näytä vierityspalkit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Vierityspalkit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Käytä kuvakkeita työpöytäympäristöstä aina kun mahdollista</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>&amp;Järjestelmäkuvakkeet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Vasta-alias</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>&amp;Aseta värit välilehdille, työkaluriville ja valikoille</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Palauta teema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Teema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Lataa teema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Tallenna teema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Muokkaa nykyistä teemaa ulkoisessa muokkaimessa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>&amp;Muokkaa teemaa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Esikatselu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Avaa teematiedosto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Tallenna teematiedosto nimellä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Ei ulkoista muokkainta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Aseta ensin ulkoisen muokkainkomento!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Hakumerkkijono on %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Valitse kohde ja\npaina F2 muokkaamista varten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Esimerkkikohde %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Jotkut satunnaiset huomautukset (Vaihto+F2, muokkaamista varten)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Kieli:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Katkaise teksti, jos se on liian pitkä mahtumaan riville</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Kääri &amp;pitkä teksti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Pidä pääikkuna muiden ikkunoiden päällä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>&amp;Aina ylhäällä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Sulje pääikkuna, kun toinen sovellus on kohdistettu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Sulje kun ei ole kohdistettu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Ota käyttöön ikkunoiden avaaminen nykyisellä näytöllä. Poista käytöstä ikkunoiden avaaminen siellä, missä ne viimeksi suljettiin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>&amp;Avaa ikkunat nykyisellä näytöllä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Vahvista sovelluksesta poistuminen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Vahvista sovelluksesta &amp;poistuminen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Suorita sovellus järjestelmän käynnistyksen yhteydessä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Automaattinen käynnistys</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Navigointityyli / Näppäinkartta:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Tuki Vi-navigaatiolle (näppäimet H, J, K, L, / ja enemmän) ja Emacs-navigaatiolle (Ctrl+N, P, V ja enemmän)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Oletus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Tallenna ja palauta kohdesuodattimien historia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Tallenna suodatinhistoria</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Näytä automaattisesti ponnahdusikkuna funktioiden, tyyppien ja muuttujien nimien suorittamiseksi komentoissa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Täydennä komennot automaattisesti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Leikepöydän manipulointi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Salli liittää kopioitu sisältö samalla tavalla kuin hiiren valinnat (yleensä painamalla hiiren keskipainiketta)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Liitä leikepöytä hiirellä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Salli liittää hiiren valinnat pikanäppäimellä (yleensä Ctrl+V tai Vaihto+Syötä)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Liitä hiiren valinta näppäimistöllä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Tallenna leikepöytä historiaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Tallenna leikepöytä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Tallenna hiirellä valittu teksti (ensisijainen valinta) historiaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Tallenna valittu teksti hiirtä käyttäen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Suorita automaattiset komennot valinnan yhteydessä</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Kohteiden enimmäismäärä historiassa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Kohteiden enimmäismäärä kullakin välilehdellä</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Kumoa välilehden lataaminen minuutin kuluttua:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Kumoa jokaisen välilehden lataaminen muistista tietyn minuutin käyttämättömyyden jälkeen.\n\nAseta arvoksi 0, jotta välilehtien lataaminen ei kumoteta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Ulkoisen muokkainkomento (%&amp;1 on muokattava tiedosto):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Ulkoisen muokkainkomento (%1 on muokattava tiedosto).\n Esimerkit:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Välilehti leikepöydän tallentamiseen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Välilehden nimi, joka tallentaa automaattisesti uuden leikepöydän sisällön.\n\nJätä tyhjäksi ottaaksesi automaattisen tallennuksen pois käytöstä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Jätä valitsematta, jotta Syötä-näppäin voi tallentaa muokatun kohteen ja Ctrl+Syötä uuden rivin luomiseen.\n\nHuomautus: Muokatut kohteet voidaan tallentaa F2-näppäimellä tätä vaihtoehtoa huomioimatta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Tallenna muokattu kohde näppäimillä Ctrl+Syötä ja luo uusi rivinäppäimellä Syötä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Näytä kunkin kohteen yksirivinen kuvaus.\n\nKäytä kohteen esikatselua näyttääksesi kokonaisia kohteita.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>&amp;Näytä yksinkertaiset kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Ota numerohaku käyttöön. Muussa tapauksessa numeronäppäimen painaminen aktivoi kyseisen kohdan kohteen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Hae numeroita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Aktivoi kohde yhdellä napsautuksella</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Kun kohde on aktivoitu (kaksoisnapsauta tai Syötä-näppäin), kopioi se leikepöydälle ja...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Siirrä kohde luettelon ylhäälle, kun se on aktivoitu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Siirrä kohde yläreunaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Sulje pääikkuna kohteen aktivoimisen jälkeen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Sulje pääikkuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Kohdista viimeinen ikkunan kohteen aktivoinnin jälkeen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Kohdista viimeinen ikkuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Liitä nykyiseen ikkunaan, kun kohde on aktivoitu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Liitä nykyiseen ikkunaan</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Näytä/Piilota</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Piilota välilehdet (näytä painamalla Alt-näppäintä)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>&amp;Piilota välilehdet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Piilota työkalupalkki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Piilota työkalu&amp;palkki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Piilota työkalupalkin &amp;otsikot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Piilota pääikkuna, kun se suljetaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Piilota &amp;pääikkuna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Asettelu ja läpinäkyvyys</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Näytä puu, jossa on välilehdet välilehtipalkin sijaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Välilehti &amp;Puu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Kohdistettu läpinäkyvyys:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Pääikkunan läpinäkyvyys jos kohdistettuna.\n\nHuomautus: Tätä ei tueta kaikissa järjestelmissä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>&amp;Kohdistamaton läpinäkyvyys:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Pääikkunan läpinäkyvyys jos kohdistamattomana\n\nHuomautus: Tätä ei tueta kaikissa järjestelmissä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Näytä kohteiden määrä välilehdillä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>&amp;Näytä kohteiden määrä</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Ilmoitusten sijainti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Ilmoitusten sijainti näytöllä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Ylhäällä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Alhaalla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Ylhäällä oikea</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Alhaalla oikea</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Alhaalla vasen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Ylhäällä vasen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Ilmoitusten &amp;näyttöväli sekunneissa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Aikaväli sekunneissa ilmoituksen näyttämiseen uudesta leikepöydän sisällöstä tai jos kohde kopioidaan leikepöydälle (vain jos pääikkuna on suljettu).\n\nAseta arvoksi 0 poistaaksesi tämän käytöstä.\n\nAseta arvoksi -1, jotta se pysyy näkyvissä, kunnes napsautetaan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Leikepöydän ilmoituksen rivien&amp;määrä:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Näytettävien rivien määrä uudelle leikepöydän sisällölle.\n\nAseta arvoksi 0 poistaaksesi käytöstä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Käytä alkuperäisiä ilmoituksia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Ilmoitusgeometria (näytön pisteissä)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Ilmoitusetäisyys näytön vasemmasta tai oikeasta reunasta näyttöpisteissä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Ilmoitusetäisyys näytön ylä- tai alareunasta näyttöpisteissä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Enimmäis&amp;leveys:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Ilmoituksen enimmäisleveys näyttöpisteissä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Enimmäis&amp;korkeus:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Ilmoituksen enimmäiskorkeus näyttöpisteissä</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Älä näytä lokerokuvaketta; pienennä ikkuna suljettaessa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Poista lokero käytöstä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Näytä leikepöydän nykyisen sisällön komento lokerovalikossa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Näytä leikepöydän sisällön komennot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Kohteiden &amp;lukumäärä lokerovalikossa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Kohteiden LUKUmäärä lokerovalikossa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Näytä nykyisen välilehden kohteet lokerovalikossa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Näytä &amp;nykyinen välilehti valikossa,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>tai &amp;valitse toinen välilehti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Lokerovalikossa näytettävän välilehden nimi (tyhjä ensimmäiselle välilehdelle)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Liitä kohde nykyiseen ikkunaan, kun olet valinnut sen valikosta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Liitä aktivoitu kohde nykyiseen ikkunaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Näytä kuvan esikatselu valikkokohteiden vieressä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>&amp;Näytä kuvan esikatselu valikkokohdan kuvakkeena</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Asetukset</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Yleinen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Asettelu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Historia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Lokero</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Ilmoitukset</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Välilehdet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Pikanäppäimet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Ulkoasu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Epäkelvollinen arvo vaihtoehdolle &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Nollataanko asetukset?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Tämä toiminta palauttaa kaikki asetuksesi (kaikilla välilehdillä) oletusarvoihin.&lt;br /&gt;&lt;br /&gt;Haluatko todella &lt;strong&gt;nollata kaikki asetukset&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Uudelleenkäynnistys vaaditaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Kieli vaihtuu sovelluksen uudelleenkäynnistyksen jälkeen.</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Synkronointihakemiston &quot;%1&quot; luominen epäonnistui!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Alas</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Valitse kuvake…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Valitse kuvake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Selaa...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Avaa kuvaketiedosto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Kuvatiedostot (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Kaikki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Välilehdet:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>&amp;Kokoonpano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>&amp;Komennot</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Muokkainkomento epäonnistui (katso lokit)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Salaus epäonnistui!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Salattujen kohteiden jakamiseksi toisessa tietokoneessa tai istunnossa, tarvitset nämä salaiset avaintiedostot (säilytä ne turvallisessa paikassa):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG on asennettava salattujen välilehtien tarkastelemiseksi.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Salaa (vaatii GnuPG:n)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Pura salaus</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Pura salaus ja kopioi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Vaihto+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Pura salaus ja liitä</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Syötä</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Avainten luominen epäonnistui.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Virhe: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Tehty</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Luodaan uusia avaimia (tämä voi kestää muutaman minuutin)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Peruuta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Asetetaan uutta salasanaa...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Salausavaimet &lt;strong&gt;on luotava&lt;/strong&gt;, ennen kuin kohteiden salausta voidaan käyttää.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Luo uusia avaimia...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Vaihda salasana...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Salauksen purku epäonnistui!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Salaus</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Salaa kohteet ja välilehdet.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Kohteiden salaamiseksi ja salauksen purkamiseksi lisää asianmukaiset komennot Komennot-välilehdelle.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Salattujen kohteiden ja välilehtien jakaminen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Salatut välilehdet</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Määritä välilehtien nimet (yksi per rivi), jotka salataan ja salaus puretaan automaattisesti.&lt;/p&gt;\n&lt;p&gt;Aseta välilehden lataamisen kumoamisaikaväli Historia-välilehdelle, kumotaksesi purettujen salattujen kohteiden lataaminen turvallisesti muistista.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Vioittunut välilehti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Kaikkia välilehdessä &lt;strong&gt;%1&lt;/strong&gt; olevia kohteita ei ladattu onnistuneesti. Haluatko silti ladata välilehden ja mahdollisesti menettää joitain kohteita?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim-liitännäinen on osa Qt Creatoria</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emuloi Vim-muokkainta kohteiden muokkauksen aikana.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Ota FakeVim käyttöön kohteiden muokkaamista varten</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Polku kokoonpanotiedostoon:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Kuvat</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Näytä kuvat.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Kuvan enimmäis&amp;leveys:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Historiassa näytettävän kuvan enimmäisleveys (asetettu nollaan alkuperäisen koon kohdalla)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Kuvan enimmäis&amp;korkeus:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Historiassa näytettävän kuvan enimmäiskorkeus (asetettu nollaan alkuperäisen koon kohdalla)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>&amp;Kuvamuokkainkomento:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Muokkainkomento muille tuetuille kuvamuodoille kuin SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG-muokkainkomento:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Muokkainkomento SVG-kuvamuodolle.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Huomautukset</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Näytä huomautukset kohteille.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Huomautusten sijainti</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>Kohteen &amp;yläpuolella</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Kohteen &amp;alapuolella</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Kohteen &amp;vieressä</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Näytä työkalu&amp;vihje</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Lisää</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Poista</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Siirrä ylös</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Siirrä alas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Siirrä ylhäälle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Siirrä alhaalle</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Kiinnitettyjä kohteita ei voi poistaa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Irrota kohteet ensin poistaaksesi ne.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Kiinnitä</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Irrota kiinnitys</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Kiinnitetyt kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Kiinnitä kohteet lukitaksesi ne nykyiselle riville ja välttääksesi poistamisen (ellei niitä ole irrotettu).&lt;/p&gt;&lt;p&gt;Tarjoaa pikakuvakkeita ja komentosarjatoimintoja.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Selaa...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Avaa hakemisto synkronointia varten</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Synkronointihakemiston luominen epäonnistui</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synkronoi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Synkronoi kohteet ja huomautukset levyllä olevan hakemiston kanssa.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Välilehden &quot;%1&quot; synkronointi hakemiston &quot;%2&quot; kanssa epäonnistui!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Poistetaanko kohteet?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Haluatko todella &lt;strong&gt;poistaa kohteet ja niihin liittyvät tiedostot&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Synkronointivälilehdet ja hakemistot</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Synkronoi &lt;strong&gt;välilehden&lt;/strong&gt; sisältö tietyn &lt;strong&gt;polun&lt;/strong&gt; hakemiston kanssa.&lt;/p&gt;\n&lt;p&gt;Aseta &lt;strong&gt;tyhjä polku&lt;/strong&gt; olemaan tallentamatta kohteita &lt;strong&gt;välilehdissä&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Välilehden nimi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Polku</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Tiedostot kohteiden tietomuotoihin</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Aseta mediatyypiksi &lt;strong&gt;-&lt;/strong&gt; (miinusmerkki), jotta tiedostot jätetään huomioimatta. Kaikki muut tuntemattomat tai piilotetut tiedostot ohitetaan.&lt;/p&gt;\n&lt;p&gt;Esimerkki: Lataa &lt;strong&gt;txt&lt;/strong&gt;-tiedostotunniste &lt;strong&gt;teksti/tavallinen&lt;/strong&gt; -mediatyypiksi.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Laajennukset</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Kohteen mediatyyppi</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Lisää tunniste</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Poista tunniste</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Vaihda tunniste %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Lukitulla tunnisteella varustettuja kohteita ei voi poistaa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Poista ensin kohteiden tunnistetta, jotta ne voidaan poistaa.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Tärkeä</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Tyhjennä kaikki tunnisteet</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Tunnisteet</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Näytä tunnisteet kohteille.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Valikkokohteita mukautettujen tunnisteiden lisäämiseksi ja poistamiseksi voidaan lisätä ja mukauttaa Komennot-valintaikkunassa.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Lisätietoja on saatavilla &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki-sivulla&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Tunnisteen nimi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Vastaa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Tyylisivu</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Väri</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Kuvake</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Lukitse</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Vältä kohteen poistamista</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Teksti</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Näytä pelkkä teksti ja yksinkertaiset HTML-kohteet.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Tallenna ja näytä HTML ja Rich Text</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Näytettävien rivien enimmäismäärä (0 näyttääksesi kaikki):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Enimmäiskorkeus pikseleinä (0 ilman rajoituksen saamiseksi):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Oletustyylisivu:</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Loki</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ-kohteet (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Näytä/Piilota</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Poistutaanko?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Haluatko &lt;strong&gt;poistua&lt;/strong&gt; CopyQ:sta?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Tiedosto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Muokkaa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Välilehdet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Apu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Uusi välilehti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Nimeä &amp;ryhmä %1 uudelleen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>&amp;Nimeä välilehti %1 uudelleen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>&amp;Poista välilehti %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Poista ryhmä %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Vaihda välilehden kuvaketta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Leikepöytä: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Tuontivaihtoehdot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ-virhe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Vientivaihtoehdot</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Vientivirhe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Tiedoston %1 vienti epäonnistui!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Tuontivirhe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Tiedoston %1 tuonti epäonnistui!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Poistetaanko kaikki ryhmässä olevat välilehdet?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Haluatko poistaa &lt;strong&gt;kaikki välilehdet&lt;/strong&gt; ryhmästä &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Poistetaanko välilehti?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Haluatko poistaa välilehden &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Tieto</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;leikepöytä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;PIILOTETTU&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n riviä)</numerusform>\n            <numerusform>%1 (%n riviä)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;KUVA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;KOHTEET&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;TYHJÄ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Askelpalautin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Poista</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Uusi kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Tuo...</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Vie...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Asetukset...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>&amp;Komennot...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Näytä &amp;leikepöydän sisältö</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Vaihto+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Näytä esikatselu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Ota leikepöydälle tallennus päälle/pois</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Vaihto+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>&amp;Prosessien hallinta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Vaohto+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Poistu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Lajittele valitut kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Vaihto+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Käännä valitut kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Vaihto+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Liitä kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Kopioi valitut kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Löydä</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Tallenna kohde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Peruuta muokkaus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Pakene</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Kumoa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Toista</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Fontti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Lihavoitu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Kursiivi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Alleviivaa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Yliviivattu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Etuala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Tausta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Pyyhi tyyli</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Haku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>&amp;Aaktivoi kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;Näytä sisältö...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Poista</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Muokkaa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Muokkaa &amp;huomautuksia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Vaihto+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Muokkaa muokkaimella</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Toiminta...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Siirrä ylös</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Ylös</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Siirrä alas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Alas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Siirrä ylhälle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Siirrä alhaalle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Uusi välilehti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Nimeä välilehti &amp;uudelleen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>&amp;Poista välilehti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Vaihda välilehden kuvaketta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+vAIHTO+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>&amp;Seuraava välilehti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Oikea</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>&amp;Edellinen välilehti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Vasen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Apu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Näytä loki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Tietoa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Avaa kohteen kontekstivalikko</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Vaihto+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Välilehti %1 on vioittunut tai jotkin CopyQ-liitännäiset puuttuvat!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Istunnon nimessä saa olla enintään 16 merkkiä,\njotka voivat olla kirjaimia, numeroita, &apos;-&apos; tai &apos;_&apos;!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Teksti kopioitu (%n riviä)</numerusform>\n            <numerusform>Teksti kopioitu (%n riviä)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Teksti kopioitu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Data kopioitu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Peruuta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Näytä pääikkuna ja valinnaisesti avaa välilehti annetulla nimellä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NIMI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Piilota pääikkuna.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Näytä tai piilota pääikkuna.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Avaa kontekstivalikko.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Poistu palvelimesta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Poista leikepöydän sisällön tallennus käytöstä tai ota se käyttöön.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Tulosta leikepöydän sisältö.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Tulosta X11-valinnan sisältö.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Liitä leikepöytä nykyiseen ikkunaan\n(ei ehkä toimi joidenkin sovellusten kanssa).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Kopioi leikepöytä nykyisestä ikkunasta\n(ei ehkä toimi joidenkin sovellusten kanssa).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Aseta leikepöydän teksti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEKSTI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Aseta leikepöydän sisältö.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Tulosta nykyisen välilehden kohteiden lukumäärä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Kopioi rivin kohde leikepöydälle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>RIVI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Kopioi seuraava kohde nykyiseltä välilehdeltä leikepöydälle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Kopioi edellinen kohde nykyiseltä välilehdeltä leikepöydälle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Lisää tekstiä leikepöydälle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Lisää tekstiä tietylle riville.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Poista kohteet annetuilta riveiltä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>RIVIT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Muokkaa kohteita tai muokkaa uutta.\nArvo -1 on leikepöydän nykyiselle tekstille.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Aseta erotin tulostetuille kohteille.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>EROTIN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Tulosta leikepöydän tai kohteen raakatiedot rivissä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Kirjoita raakadata annetulle riville.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Näytä toimintavalintaikkuna.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Suorita OHJELMA rivien kohteen tekstissä.\nKäytä %1 OHJELMASSA lähettääksesi tekstiä argumenttina.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>OHJELMA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Näytä lokeron ponnahdusviesti AIKA:n millisekunnin saamiseksi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>AIKA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>VIESTI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>AIKA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Luettele käytettävissä olevat välilehtien nimet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Suorita komento välilehdellä annetulla nimellä.\nVälilehti luodaan, jos sitä ei ole olemassa.\nOletus on ensimmäinen välilehti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>KOMENTO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Poista välilehti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Nimeä välilehti uudelleen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>UUSI_NIMI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Vie kohteet tiedostoon.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>TIEDOSTO_NIMI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Tuo kohteet tiedostosta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Luettele kaikki vaihtoehdot.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Hanki vaihtoehdon arvo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>VAIHTOEHTO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Aseta vaihtoehdon arvo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>ARVO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Arvioi komentosarja.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>KOMENTOSARJA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTIT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Käynnistää tai muodostaa yhteyden sovellusesiintymään annetulla istunnon nimellä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>ISTUNTO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Tulosta apu KOMENTO:lle tai kaikille komennoille.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Tulosta ohjelman ja kirjastojen versio.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Suorita sovellustestit (lisää argumentti &apos;--help&apos; saadaksesi lisätietoja).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Käynnistä palvelin taustalla ennen komennon suorittamista.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Käyttö: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Käynnistää palvelimen, jos mitään komentoa ei ole määritetty.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  KOMENTO:t:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>HUOMAUTUKSET:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Käytä viiva-argumenttia (-) lukeaksesi tietoja vakiosyötteestä.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Käytä kaksiviivaista argumenttia (--) lukeaksesi kaikki seuraavat argumentit ilman\n  laajennat Escape-sekvenssit (eli \\n, \\t ja muut).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Käytä &apos;?&apos; MIME:lle, tulostaaksesi käytettävissä olevat MIME-tyypit (oletus on &quot;teksti/täysi&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Epäkelvollinen argumenttien lukumäärä!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Ei voida tallentaa tiedostoon &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Tiedostoa &quot;%1&quot; ei voi tuoda!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ-leikepöydän hallinta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Komentoa ei löytynyt!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Lopetetaan palvelin.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Epäkelvollinen vaihtoehto &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Poikkeus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Poikkeus %1:ssa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Kopioiminen leikepöydälle epäonnistui!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Välilehti annetulla nimellä ei ole olemassa!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Välilehden nimi ei voi olla tyhjä!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Välilehti annetulla nimellä on jo olemassa!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Leikepöydän tallentaminen poistettu käytöstä*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Lisää pikanäppäin</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Uusi pikanäppäin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Poista pikanäppäin</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Löydä:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;Laajamittainen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Yleisesti pätevät pikanäppäimet voidaan laukaista mistä tahansa sovelluksesta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;Sovellus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Sovellusten pikanäppäimet voidaan käynnistää vain pääikkunasta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Pikanäppäin on jo olemassa!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Välilehden nimi ei saa olla tyhjä ja yksilöllinen.&lt;br /&gt;\nVälilehti &lt;b&gt;Ei&amp;amp;tes&lt;/b&gt; voidaan avata painamalla &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nKäytä &lt;b&gt;/&lt;/b&gt;-polun erottimena puunäkymän välilehtiasettelussa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nimi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Uusi välilehti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Nimeä välilehti uudelleen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Nimeä välilehtiryhmä uudelleen</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Kohteiden enimmäismäärä:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>oletus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Tallenna kohteet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Paina &apos;/&apos; hakeaksesi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Kirjoita hakeaksesi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Säännöllinen lauseke</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Kirjainkoko ei välitä</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_fr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"fr_FR\" sourcelanguage=\"en\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>À propos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Gestionnaire de presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Auteur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Courriel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Site web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Faire un don</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Gestionnaire d&apos;actions</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Co&amp;mmande :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Sa&amp;isie standard :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>&amp;Stocker la sortie standard :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Envoyer les données d&apos;un type de support donné à l&apos;entrée standard de commande (laisser vide pour désactiver)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Créer des éléments à partir de la sortie standard du programme (laisser vide pour éteindre)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Séparateur pour les nouveaux éléments :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translatorcomment>The &lt;\\p&gt; in the source is rather suspicious...</translatorcomment>\n        <translation>&lt;p&gt;Expression régulière pour séparer la sortie en plusieurs éléments.&lt;/p&gt;\n&lt;p&gt;Utiliser&lt;b&gt;\\n&lt;/b&gt; pour stocker chaque ligne dans un élément distinct.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Onglet de sortie :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Enregistrer des éléments dans l&apos;onglet avec le nom donné (laisser vide pour enregistrer dans l&apos;onglet actuel)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Commande enregistrée</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">La commande a été enregistrée et est accessible à partir du menu de l&apos;élément.\nVous pouvez configurer la commande dans les préférences.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Erreur : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Code de sortie : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Commande %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Gestionnaire de processus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Terminer Sélectionné</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Ajouter des commandes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Afficher / masquer la fenêtre principale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Afficher le menu dans la barre d&apos;état</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Afficher la fenêtre principale sous le curseur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Modifier le presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Modifier le premier élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Copier le second élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Afficher le gestionnaire d&apos;actions</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Créer un nouvel élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Copier l&apos;élément suivant</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Copier l&apos;élément précédent</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Coller le presse-papiers en texte brut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Désactiver le stockage du presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Activer le stockage du presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Coller et copier suivant</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Coller et copier précédent</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Faire une capture d&apos;écran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Coller la date et l&apos;heure actuelle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nouvelle commande</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorer les éléments de 0 ou 1 caractère</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Ouvrir dans le &amp;navigateur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Coller en tant que texte brut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Lecture automatique des vidéos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Copier les URL (adresse web) dans un autre onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Créer un aperçu (nécessite ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Créez un Code QR à partir d&apos;une URL (nécessite qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tâches</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Ajouter à l&apos;onglet %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Déplacer vers l&apos;onglet %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorer les fichiers copiés</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorer la fenêtre *&quot;Mot de passe&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Mettre dans la corbeille</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(corbeille)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Effacer l&apos;onglet actuel</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Impossible d&apos;ajouter de nouveaux éléments</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translatorcomment>Is this correct? Is it really &quot;remove&quot;?</translatorcomment>\n        <translation type=\"vanished\">L&apos;onglet est plein. Impossible d&apos;enlever des éléments.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Impossible d&apos;ajouter de nouveaux éléments à l&apos;onglet %1. Veuillez enlever manuellement des éléments pour libérer de l&apos;espace.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Annuler les modifications ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Voulez-vous vraiment &lt;strong&gt;annuler les modifications&lt;/strong&gt; ?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Impossible de se connecter au serveur&#x202f;! Lancer d&apos;abord le serveur CopyQ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Connexion perdue !</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Contenu du presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formats :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>C&amp;ontenu :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Supprimer le format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Contenu de l&apos;élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Taille :&lt;/strong&gt; %1 octets</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Taille :&lt;/strong&gt; %1 octets</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Le serveur CopyQ est déjà en cours d&apos;exécution.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Annuler les commandes en cours</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Annuler les commandes en cours et quitter ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Annuler Quitter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Quitter quand même</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Espace</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Commandes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Définir de nouvelles commandes qui pourront être appelées sur un nouveau contenu dans le presse-papiers, ou par l&apos;utilisateur via un menu, ou par des raccourcis globaux.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Recherche :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>Charger les commandes …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Enregistrer la sélection …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Copier la sélection</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Coller les commandes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Changements non sauvegardés</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>La fenêtre de commandes a des changements non sauvegardés.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Ouvrir des fichiers en utilisant des commandes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Commandes (*.ini)&#x202f;;; Configuration de CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Enregistrer les commandes sélectionnées</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Commandes (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Commandes d&apos;enregistrement</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Échec de l&apos;enregistrement des commandes dans le fichier &quot;%1&quot;&#xa0;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Afficher l&apos;aide des commandes (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>La commande contient une liste de programmes à exécuter avec leurs arguments respectifs. Par exemple :</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">L&apos;argument %1 du programme sera remplacé par le texte de l&apos;élément, et les arguments %2 à %9 par les textes capturés par une expression régulière.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>L&apos;argument de programmation %1 sera remplacé par le texte de l&apos;élément.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Le caractère %1 peut être utilisé pour passer la sortie standard au programme suivant.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>La syntaxe qui suit peut être utilisée pour passer le reste de la commande comme un seul paramètre.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Ça donne la même sortie que %1 mais c&apos;est plus utile pour les commandes assez longues.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Les fonctions listées ci-dessous peuvent être utilisées comme dans les commandes suivantes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;presse-papiers</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Nom de l&apos;onglet vers lequel copier de nouveaux éléments (laisser vide pour ne pas copier)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nom :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <oldsource>Command name (shown in menu)</oldsource>\n        <translation>Nom de la commande affiché dans le menu</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Utiliser la commande seulement sur les éléments dont le texte correspond à cette expression régulière (laisser vide pour pas de rejet)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight:600;&quot;&gt;Exemples :&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  URL    &lt;span style=&quot;font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Fichiers PDF    &lt;span style=&quot;font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Un seul caractère    &lt;span style=&quot;font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Multimédia à distance    &lt;span style=&quot;font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Utiliser les commandes seulement si la commande de filtre réussit.&lt;/p&gt;\n\n&lt;p&gt;Le texte de l&apos;élément est passé à &lt;b&gt;l&apos;entrée standard&lt;/b&gt; du filtre. L&apos;élément est &lt;b&gt;utilisé uniquement si le code de sortie de la commande de filtre est 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Utiliser &lt;b&gt;%1&lt;/b&gt; pour le texte de l&apos;élément passé en argument, et &lt;b&gt;%2&lt;/b&gt; à &lt;b&gt;%9&lt;/b&gt; pour les textes capturés par l&apos;expression régulière (les parties entre parenthèses).&lt;/p&gt;\n\n&lt;p&gt;Utiliser &lt;b&gt;|&lt;/b&gt; pour enchaîner plusieurs commandes (passe la sortie standard à la prochaine commande).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Comman&amp;de</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Sort&amp;ie :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Éléments correspondant à</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Contenu :</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Ignore la commande si la saisie ne correspond pas à cette expression régulière (laissez vide pour tout correspondre).\n\n%2 à %9 dans Commande et Filtre seront remplacés par les textes récupérés.\n\nExemples :\n\n- Rechercher une URL : ^(https?|ftp)://\n- Rechercher des fichiers PDF : \\.pdf$\n- Rechercher un seul caractère : ^.$\n- Rechercher un fichier multimédia distant : ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>Fenê&amp;tre :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Les données de ce type MIME seront envoyées à l&apos;entrée de la commande.\nLaisser vide pour désactiver.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Action</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Options de commande</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Afficher le gestionnaire d&apos;actions avant d&apos;exécuter la commande</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Exécuter la commande automatiquement si le presse-papiers a un nouveau contenu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtre :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Séparateur à utiliser pour diviser la sortie en éléments multiples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Attendre</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Type d&apos;action</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Automati&amp;que</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Afficher la commande dans le menu contextuel d&apos;éléments correspondants</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>Dans le men&amp;u</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>Raccourci &amp;global :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avancée</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Raccourci global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Type :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Programme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Afficher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Ignore la commande si le texte d&apos;entrée ne correspond pas à l&apos;expression régulière (laisser vide pour tout faire correspondre).\n\nLes paramètres %2 à %9 (ou argument[1] et suivants dans un script) dans la commande et le filtre seront remplacés par les textes capturés.\n\nExemples&#xa0;:\n\n— Correspondance d&apos;URL&#xa0;: ^(https?|ftp)://\n— Correspondance de nom de PDF&#xa0;: \\.pdf$\n— Correspondance d&apos;un caractère&#xa0;: ^.$\n— Correspondance d&apos;un fichier multimédia distant&#xa0;: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;mat :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Ignore la commande si la commande de filtrage échoue avec un résultat différent de zéro.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Copier &amp;vers un onglet :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Supprimer l&apos;élément trouvé\n\nRemarque : si cette option est automatiquement appliquée, aucune autre commande automatique ne sera effectuée.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Su&amp;pprimer l&apos;élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Action du menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Cacher la fenêtre après l&apos;activation d&apos;une commande lancée via le menu contextuel d&apos;un élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>Masquer &amp;la fenêtre principale après l&apos;activation</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Changement d&apos;un élément, n&apos;en crée pas de nouveaux</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Transform&amp;er</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Créer des éléments à partir de la sortie standard du programme (laisser vide pour désactiver)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Utiliser la commande uniquement pour les éléments copiés dans le presse-papiers à partir d&apos;une fenêtre dont le texte du titre correspond à cette expression régulière (laisser vide pour correspondre à n&apos;importe quelle fenêtre). Sous macOS, ceci contient le nom de l&apos;application suivi d&apos;un tiret (&amp;quot;-&amp;quot;) puis le titre de la fenêtre. Par exemple, &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Séparateur :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Enregistrer les éléments dans l&apos;onglet avec le nom donné (laisser vide pour sauver dans le premier onglet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Afficher les options avancées</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Onglet de sortie :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Raccourci :</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Police</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Éditeur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Arrière-plan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Trouvé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternatif</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Premier plan</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Notification</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Afficher le &amp;nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Afficher les barres de défilement</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Icônes du s&amp;ystème</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Anticrénelage</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Barres de défilement</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Infobulles</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Utiliser les icônes du bureau quand c&apos;est possible</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>&amp;Configurer les couleurs des onglets, de la barre d&apos;outil et des menus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Réinitialiser thème</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Thème :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>C&amp;harger un thème</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Enregistrer le thème</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Modifier le thème actuel dans l&apos;éditeur externe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Mo&amp;difier le thème</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Aperçu :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Sélectionner un élément et\nappuyer sur F2 pour modifier.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Exemple d&apos;élément %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Des notes aléatoires (Maj+F2 pour modifier)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Le texte de recherche est %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Ouvrir le fichier de thème</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Enregistrer le fichier du thème sous</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Aucun éditeur externe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Définir la commande d&apos;éditeur externe d&apos;abord !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Langue :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Tronquer le texte s&apos;il est trop long pour tenir sur une seule ligne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Revenir à la ligne pour les textes trop longs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Conserver la fenêtre principale au-dessus des autres fenêtres</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Toujours au premier plan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Fermer la fenêtre principale lorsqu&apos;une autre application est sélectionnée</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Fermer en cas de désélection</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Activer pour ouvrir des fenêtres sur l&apos;écran actuel. Désactiver pour ouvrir les fenêtres là où elles ont été fermées la dernière fois</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Ouvrir les fenêtres sur l&apos;écran actuel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Confirmer la sortie de l&apos;application</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Confirmer la sortie de l&apos;application</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Exécuter l&apos;application au démarrage du système</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>Démarrage automatique</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Prise en charge des raccourcis clavier de Vi (touches H, J, K, L etc.), touche (/) pour rechercher</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Navigation de type Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Empêcher la capture des fenêtres d&apos;application dans les captures d&apos;écran et les enregistrements</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Masquer des captures d&apos;écran et des enregistrements</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Chiffrer les données des onglets sur le disque (nécessite un mot de passe)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Chiffrer les onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Utilisez un gestionnaire de clés externe pour le mot de passe de chiffrement (Gestionnaire d&apos;informations d&apos;identification Windows, macOS Keychain, GNOME Keyring, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Utiliser un gestionnaire de clés externe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Modifier le mot de passe utilisé pour chiffrer les données des onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Modifier le mot de passe de chiffrement...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Style de navigation / Configuration du clavier&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Prise en charge de la navigation Vi (touches H, J, K, L, / et autres) et navigation Emacs (Ctrl+N, P, V et autres)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Sauvegarder et restaurer l&apos;historique des filtres</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Sauvegarder l&apos;historique des filtres</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Afficher automatiquement une infobulle pour compléter la fonction, le type et les noms de variables dans les commandes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Auto-complétion des commandes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulation du presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Permettre de coller du contenu copié comme les sélections de souris (généralement en pressant le bouton du milieu de la souris)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Coller le presse-papiers avec la souris</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Permettre de coller les sélections de la souris en utilisant un raccourci (Ctrl+V ou Maj+Insérer)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Coller la sélection de la souris avec le clavier</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Enregistrer le presse-papiers dans l&apos;historique</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Enregistrer le presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Enregistrer le texte sélectionné avec la souris (sélection principale) dans l&apos;historique</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Enregistrer le texte sélectionné avec la souris</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Exécuter des commandes automatiques lors de la sélection</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Nombre maximal d&apos;éléments dans l&apos;historique :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Nombre maximal d&apos;éléments par onglet</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Décharger l&apos;onglet après un intervalle en &amp;minutes :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>&amp;Décharger l&apos;onglet après un certain temps&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Décharger chaque onglet de la mémoire après le nombre de minutes d&apos;inactivité indiqué.\n\nMettre 0 pour ne pas décharger les onglets.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Demander le mot de passe après un certain temps&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Délai d&apos;expiration (en secondes) avant que les onglets chiffrés ne demandent à nouveau le mot de passe.\n\nDéfinissez cette valeur sur 0 pour désactiver cette fonctionnalité globalement.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Commande de l&apos;éditeur externe (%&amp;1 est le fichier à éditer) :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Commande pour l&apos;éditeur externe (%1 est le nom du fichier à modifier).\n  Exemples :\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Onglet pour stoc&amp;ker le presse-papiers :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Nom de l&apos;onglet qui va automatiquement stocker le nouveau contenu du presse-papiers.↵\n↵\nLaisser vide pour désactiver le stockage automatique.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Laisser décoché pour que Entrée enregistre l&apos;élément édité et Ctrl+Entrée crée une nouvelle ligne\n\nRemarque : les éléments modifiés peuvent être enregistrés à l&apos;aide de F2, quelle que soit l&apos;option.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Enregistrer l&apos;élément édité avec Ctrl+Entrée et créer une nou&amp;velle ligne avec la touche Entrée</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Afficher la description de chaque éléments sur une ligne .↵\n↵\nAperçu de l’élément permet d’afficher des éléments en entiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Afficher les éléments sim&amp;ples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Activer la recherche de chiffres, sinon appuyer sur une touche numérique active l&apos;élément à cette position</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>R&amp;echerche de chiffres</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Activer l&apos;élément en un seul clic</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Après que l&apos;élément est activé (double-clic ou la touche Entrée), le copier dans le presse-papiers et...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Déplacer l&apos;objet en haut de la liste après qu&apos;il ait été activé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Déplacer l&apos;élément vers le &amp;haut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Fermer la fenêtre principale après que l&apos;élément ait été activé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Fermer la fenêtre principale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Donner le contrôle à la dernière fenêtre active après que l&apos;élément ait été activé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>Basculer sur la &amp;dernière fenêtre active</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Coller dans la fenêtre active après que l’élément ait été activé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Coller vers la fenêtre active</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Afficher / Masquer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Masquer les onglets (appuyez sur la touche Alt pour afficher)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Masquer les &amp;onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Masquer la barre d&apos;outils</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>&amp;Masquer la barre d&apos;outils</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Masquer les textes de la &amp;barre d&apos;outils</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Masquer la fenêtre principale lorsque fermé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Masquer la &amp;fenêtre principale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Disposition et transparence</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Afficher l&apos;arborescence des onglets à la place de la barre des onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Vue &amp;arborescente des onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Transparence sur focus :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparence de la fenêtre principale si focalisée.\n\nRemarque&#xa0;: ceci n&apos;est pas pris en charge par tous les systèmes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>&amp;Transparence sur perte de focus :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparence de la fenêtre principale si elle n&apos;est pas focalisée.\n\nRemarque&#xa0;: ceci n&apos;est pas pris en charge par tous les systèmes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Afficher le nombre d&apos;éléments dans les onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>&amp;Afficher le nombre d&apos;éléments</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Emplacement des &amp;notifications&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Position des notifications sur l&apos;écran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>En haut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>En bas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>En haut à droite</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>En bas à droite</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>En bas à gauche</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>En haut à gauche</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Int&amp;ervalle en secondes pour afficher les notifications&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Intervalle en secondes pour notifier d&apos;un nouveau contenu dans le presse-papiers (seulement lorsque la fenêtre principale est fermée).\n↵\nMettre à 0 pour désactiver.\n↵\nMettre à -1 pour garder visible jusqu&apos;à ce qu&apos;elle soit cliquée.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Nom&amp;bre de lignes pour la notification du presse-papiers :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Nombre de lignes à afficher pour le nouveau contenu du presse-papiers.\n\nMettre à 0 pour désactiver.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Utiliser les notifications natives</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Géométrie de la notification (en points d&apos;écran)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Décalage hori&amp;zontal :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Distance de la notification par rapport à la droite ou la gauche de l&apos;écran, en points d&apos;écran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>Décalage &amp;vertical :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Distance de la notification par rapport au haut ou au bas de l&apos;écran, en points d&apos;écran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Lar&amp;geur maximale :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Largeur maximale des notifications en points d&apos;écran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Hauteur ma&amp;ximale :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Hauteur maximale pour les notifications en points d&apos;écran</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Ne pas afficher l&apos;icône dans la zone de notifications ; minimiser la fenêtre quand elle est fermée</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Désactiver la &amp;zone de notifications</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Afficher la commande pour le contenu actuel du presse-papiers dans le menu de la zone de notification</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>&amp;Afficher les commandes pour le contenu du presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Nombre d&apos;éléments dans le menu de la &amp;zone de notifications :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Nombre d&apos;éléments dans la zone de notifications</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Afficher les éléments de l&apos;onglet actuel dans le menu de la zone de notification</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Affiche&amp;r l&apos;onglet actif dans le menu,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>ou &amp;choisir un autre onglet :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Nom de l&apos;onglet à afficher dans le menu de la zone de notification (vide pour le premier onglet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Coller l&apos;élément dans la fenêtre active après qu&apos;il ait été sélectionné dans le menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Coller l&apos;élément actif dans la fenêtre active</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Afficher l&apos;aperçu de l&apos;image à côté des éléments de menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Afficher la prévisualisation d&apos;&amp;image comme une icône d&apos;un élément de menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"obsolete\">Configuration de</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Notifications</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Générale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Disposition</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Historique</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Zone de notification</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Éléments</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Raccourcis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Apparence</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Valeur non valide pour l&apos;option &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Redémarrage nécessaire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>La langue sera modifiée après le redémarrage de l&apos;application.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Réinitialiser les préférences ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Cette action réinitialise tous les paramètres (dans tous les onglets) vers les valeurs par défaut.&lt;br /&gt;&lt;br /&gt;Êtes-vous certain de vouloir &lt;strong&gt;réinitialiser tous les paramètres&lt;/strong&gt;&#x202f;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Préférences</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Impossible de créer le répertoire de synchronisation &quot;%1&quot; !</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Bas</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Sélectionner une icône…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>…</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Sélection d&apos;icône de</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Parcourir...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Ouvrir le fichier d&apos;icônes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Fichiers images (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Tout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Onglets :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Co&amp;nfiguration</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Co&amp;mmandes</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">le code de sortie d&apos;édition est %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Commande de l&apos;éditeur : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Échec de la commande de l&apos;éditeur (voir les journaux)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Enregistrer</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Enregistrer l&apos;élément (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Annuler</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Annule l&apos;édition et supprime les modifications</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Échap</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Fonte</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Gras</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Italique</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Souligné</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Barré</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Premier plan</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Arrière-plan</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Effacer le style</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Rechercher</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Annuler</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Rétablir</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Pour partager des éléments chiffrés sur un autre ordinateur ou une autre session, vous aurez besoin des fichiers de clés publique et secrète : &lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br&gt;(Conservez cette clé secrète dans un endroit sûr.)&lt;/br&gt;&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG doit être installé pour afficher les onglets de chiffrement.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Chiffrer (nécessite GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Déchiffrer</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Déchiffrer et copier</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Maj+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Décrypter et coller</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translatorcomment>A context would be useful here. I suppose it is about the Enter key.</translatorcomment>\n        <translation>Entrée</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Erreur : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Impossible de générer les clés.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Pour partager des éléments chiffrés à d&apos;autres ordinateurs ou sessions, vous aurez besoin de ces fichiers de clés secrètes (conservez-les dans un endroit sécurisé)&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Terminé</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Création d&apos;une nouvelle clé (cela peut prendre plusieurs minutes)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Définition du nouveau mot de passe...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Les clés de chiffrement &lt;strong&gt;doivent être générées&lt;/strong&gt; avant que le chiffrement de l&apos;élément puisse être utilisé.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Générer de nouvelles clés...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Changer le mot de passe...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Le chiffrement a échoué !</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Le déchiffrement a échoué !</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Chiffrement</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Chiffrer les éléments et les onglets.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Pour chiffrer et déchiffrer les éléments, ajouter les commandes appropriées dans l&apos;onglet Commandes.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Partage des éléments et onglets chiffrés</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Onglets chiffrés</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Spécifiez les noms des onglets (un par ligne) qui seront automatiquement chiffrés et déchiffrés.&lt;/p&gt;\n&lt;p&gt;Pour décharger sans risque des éléments de la mémoire, définissez l&apos;intervalle de déchargement des onglets dans l&apos;onglet Historique.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Onglet corrompu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Tous les éléments de l&apos;onglet &lt;strong&gt;% 1 &lt;/strong&gt; n&apos;ont pas été chargés avec succès. Voulez-vous toujours charger l&apos;onglet et perdre potentiellement certains éléments&#x202f;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim est inclus avec Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Émuler le comportement de l&apos;éditeur Vim lors de l&apos;édition des éléments.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Utiliser FakeVim pour modifier des éléments</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Chemin d&apos;accès au fichier de configuration :</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Images</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Afficher les images.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>&amp;Largeur maximale des images :</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Largeur maximale des images affichées dans l&apos;historique (mettre à zéro pour la taille d&apos;origine)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>&amp;Hauteur maximale des images :</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Hauteur maximale des images affichées dans l&apos;historique (mettre à zéro pour la taille d&apos;origine)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Commande pour l&apos;éditeur d&apos;&amp;images :</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Commande pour éditer les fichiers de formats d&apos;images autres que SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Commande pour l&apos;éditeur &amp;SVG :</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Commande pour l&apos;édition des images au format SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Notes</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Afficher les notes sur les éléments.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Positionnement des notes</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>Au Dess&amp;us de l&apos;Élément</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>En &amp;Dessous de l&apos;Élément</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>À &amp;côté de l&apos;Élément</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Afficher les info&amp;bulles</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Ajouter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Déplacer vers le haut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Déplacer vers le bas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Déplacer en haut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Déplacer en bas</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Monter</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Descendre</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Impossible de supprimer les éléments épinglés</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Désépingler les éléments avant de les supprimer.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Épingler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Désépingler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Éléments épinglés</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Épinglez des éléments pour les verrouiller dans la ligne en cours et éviter leur suppression.&lt;/p&gt;&lt;p&gt;Fournit des raccourcis et une fonctionnalité de script.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Parcourir...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Ouvrir le dossier pour synchroniser</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>La création des répertoires synchronisés a échouée</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synchronisation</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Synchroniser les éléments et des notes avec un répertoire sur le disque.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Impossible de synchroniser l&apos;onglet &quot;%1&quot; avec le répertoire &quot;%2&quot; !</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Supprimer les éléments ?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Voulez-vous vraiment &lt;strong&gt;supprimer les éléments et les fichiers associés&lt;/strong&gt; ?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Synchronisation des onglets et répertoires</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Synchroniser le contenu de &lt;strong&gt;l&apos;onglet&lt;/strong&gt; avec le &lt;strong&gt;chemin&lt;/strong&gt; du répertoire donné.&lt;/p&gt;↵\n&lt;p&gt;Donner un &lt;strong&gt;chemin vide&lt;/strong&gt; pour ne pas enregistrer des éléments dans &lt;strong&gt;l&apos;onglet&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Nom de l&apos;onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Chemin</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Les formats de données des éléments pour les fichiers</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Réglez le type de média sur &lt;strong&gt;-&lt;/strong&gt; (caractère moins) pour ignorer les fichiers. Tous les autres fichiers inconnus ou cachés sont ignorés. &lt;/p&gt;\n&lt;p&gt;Exemple : chargez l&apos;extension de fichier &lt;strong&gt;txt&lt;/strong&gt; en tant que type de média &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Type de média d’élément</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Utiliser le type MIME&lt;strong&gt;-&lt;/strong&gt;  (tiret) pour ignorer des fichiers. Les autres fichiers inconnus ou cachés sont ignorés.&lt;/p&gt;\n&lt;p&gt;Exemple : charger les fichiers d&apos;extension &lt;strong&gt;txt&lt;/strong&gt; avec le type MIME &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Extensions</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">Le type MIME de l&apos;élément</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Ajouter une étiquette</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Supprimer une étiquette</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Étiqueter avec %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Supprimer l&apos;étiquette %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Afficher l&apos;étiquette %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Impossible de retirer les articles avec une étiquette verrouillée</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Enlever l&apos;étiquette des éléments avant de les supprimer.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Important</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Supprimer toutes les étiquettes</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Étiquettes</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Afficher les étiquettes des éléments.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Des éléments de menu pour ajouter et supprimer des étiquettes personnalisées peuvent être ajoutés et modifiés dans le gestionnaire d&apos;actions.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translatorcomment>This is no longer a wiki...</translatorcomment>\n        <translation>Plus d&apos;info sur la &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;documentation&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Nom de l&apos;étiquette</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Correspondance</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Feuille de style</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Couleur</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Icône</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Bloquer</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Évitez de supprimer l&apos;élément</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Texte</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Afficher les éléments en texte brut et en HTML simple.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Enregistrer et afficher le code HTML et le texte enrichi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Le nombre maximal de lignes à afficher (0 pour afficher tous) :</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>La hauteur maximale de l&apos;élément en pixels (0 pour illimité) :</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Feuille de style par défaut&#x202f;:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Afficher les pages web.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"obsolete\">La hauteur maximale de l&apos;élément en pixels (0 pour illimité) :</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Journal</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Quitter ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Voulez-vous &lt;strong&gt;quitter&lt;/strong&gt; CopyQ ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Afficher / Masquer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>É&amp;dition</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>Élé&amp;ment</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Onglets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Erreur de CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Aide</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Autoriser le stockage du presse-papiers</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Désactiver le stockage du presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Presse-papier : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Éléments de CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nouvel onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Renommer le &amp;groupe %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Re&amp;nommer l&apos;onglet %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>&amp;Supprimer l&apos;onglet %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Supprimer le groupe %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Changer l’icône de l&apos;onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Options de CopyQ pour l&apos;import</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Chiffrement indisponible</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>Le chiffrement n&apos;est pas disponible (voir les journaux pour plus de détails).\n\nIl sera possible de chiffrer et de déchiffrer les données des onglets.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Importer le mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Entrer le mot de passe pour l&apos;import&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Exporter le mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Entrez le mot de passe pour l&apos;export (champ vide pour ne pas chiffrer)&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Options de CopyQ pour l&apos;export</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Erreur d&apos;exportation</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>L&apos;exportation du fichier %1 a échoué !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Erreur d&apos;importation</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>L&apos;importation du fichier %1 a échoué !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Supprimer tous les onglets dans le groupe ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Voulez-vous supprimer &lt;strong&gt;tous les onglets&lt;/strong&gt; dans le groupe &lt;strong&gt;%1&lt;/strong&gt; ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Supprimer l&apos;onglet ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Voulez-vous supprimer l&apos;onglet &lt;strong&gt;%1&lt;/strong&gt;&#x202f;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Information</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n ligne)</numerusform>\n            <numerusform>%1 (%n lignes)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;CACHÉ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;IMAGE&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ARTICLES&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;VIDE&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DONNÉES&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Retour arrière</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Le nom de session doit contenir au plus 16 caractères\nqui peuvent être des lettres, des chiffres, des &apos;-&apos; ou &apos;_&apos; !</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n ligne &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lignes &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nouvel élément</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importer...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>E&amp;xporter...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Préférences...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">C&amp;ommandes / Raccourcis généraux...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>C&amp;ommandes...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Montrer le contenu du &amp;presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Maj+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Activer le s&amp;tockage du presse-papiers</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Maj+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Gestionnaire de p&amp;rocessus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Maj+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Quitter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Trier les éléments sélectionnés</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Maj+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Inverser les éléments sélectionnés</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Maj+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Coller les éléments</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Copier les éléments sélectionnés</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Rechercher</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Déplacer dans le &amp;presse-papier</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;Afficher le contenu...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Afficher l’aperçu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Déplacer dans le &amp;presse-papier</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Suppri&amp;mer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>É&amp;dition</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Modifier des &amp;notes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Maj+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Mo&amp;difier avec l&apos;éditeur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Action...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Monter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Haut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Descendre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Bas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Monter en premier</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Accueil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Descendre en dernier</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+Fin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nouvel onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>R&amp;enomer l&apos;onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Suppri&amp;mer l&apos;onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Changer l’icône de l&apos;onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Maj+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Onglet &amp;suivant</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Droite</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Gauche</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Ouvrir le menu contextuel de l&apos;élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Maj+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Onglet &amp;précédent</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Maj+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Sauvegarder l’élément</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Annuler la modification</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Échap</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Rétablir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Police</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Gras</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Italique</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Souligner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Barré</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Premier plan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Arrière-plan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Effacer le style</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Rechercher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>Activer les éléments</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Éditer avec l&apos;éditeur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Afficher le journal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>À &amp;propos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Aide</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>L&apos;onglet %1 est corrompu ou certains plugins CopyQ manquent !</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Texte copié (%n ligne)</numerusform>\n            <numerusform>Texte copié (%n lignes)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Texte copié</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Donnée copiée</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Mot de passe de chiffrement du nouvel onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Entrez un nouveau mot de passe&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>Les mots de passe ne correspondent pas. Veuillez réessayer (%1/%2)&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Changer le mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>Le nouveau mot de passe ne doit pas être vide.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Échec de la configuration du mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Le nombre maximal de tentatives de mot de passe a été dépassé.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Confirmez le mot de passe de chiffrement</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Entrez à nouveau votre mot de passe pour confirmer&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Mot de passe de chiffrement de l&apos;onglet actuel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Entrez le mot de passe actuel pour chiffrer les données de l&apos;onglet&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Mot de passe incorrect. Veuillez réessayer (%1/%2)&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Échec de la vérification du mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Fichiers chiffrés corrompus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Les fichiers de chiffrement sont manquants ou corrompus. Le mode strict ne peut pas récupérer automatiquement les onglets chiffrés.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Échec de la modification du mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>La modification du mot de passe a échoué. Votre ancien mot de passe est toujours valide. Veuillez consulter les journaux pour plus de détails.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Modification du mot de passe réussi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>Le mot de passe a été modifié avec succès.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Rechiffrement des onglets...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Rechiffrement de l&apos;onglet %1 sur %2&#xa0;: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Échec du chiffrement des onglets suivants&#xa0;:\n\n%1\n\nVeuillez consulter les journaux pour plus de détails.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Échec du chiffrement</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Masquer la fenêtre principale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Afficher ou masquer la fenêtre principale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Ouvrir le menu contextuel.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Quitter le serveur.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Afficher le contenu du presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Afficher le contenu sélectionné avec la souris (X11).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>LIGNE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Ajouter le texte dans le presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXTE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Insérer le texte dans la ligne indiquée.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Supprimer les éléments dans les lignes indiquées.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>LIGNES</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Modifier des éléments ou créer un nouveau.\nLa valeur -1 est pour le texte actuellement dans le presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Afficher les données brutes du presse-papiers ou de l&apos;élément dans la ligne.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DONNÉES</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Afficher la fenêtre principale et éventuellement ouvrir l&apos;onglet avec le nom donné.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Activer ou désactiver l&apos;enregistrement du contenu du presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Coller le contenu du presse-papiers dans la fenêtre active\n(peut ne pas fonctionner avec certaines applications).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Définir le texte du presse-papiers.</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nDéfinir le contenu du presse-papier.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Afficher le nombre d&apos;éléments contenus dans l&apos;onglet actuel.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Copier l&apos;élément de la ligne dans le presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Copier l&apos;élément suivant de l&apos;onglet actuel dans le presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Copier l&apos;élément précédent de l&apos;onglet actuel dans le presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translatorcomment>pas sur</translatorcomment>\n        <translation>Définir le séparateur des éléments sur la sortie.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SÉPARATEUR</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nÉcrire des données brutes à la ligne indiquée.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Afficher le gestionnaire d&apos;actions.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nExécuter PROGRAMME sur le texte des éléments dans les lignes.\nUtiliser %1 dans PROGRAMME pour passer le texte comme paramètre.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAMME</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nAfficher un message dans une infobulle de la zone de notification pour TEMPS millisecondes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITRE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESSAGE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TEMPS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translatorcomment>Why &quot;available&quot;?</translatorcomment>\n        <translation>Lister les noms des onglets disponibles.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Exécuter la commande dans l&apos;onglet avec le nom donné.\nL&apos;onglet est créé s&apos;il n&apos;existe pas.\nPar défaut, cible le premier onglet.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nÉvaluation du programme ECMAScript.\nLes arguments sont accessibles avec &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Lancer les tests de l&apos;application (ajouter l&apos;argument --help pour plus d&apos;info).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NOM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Copier le presse-papiers de la fenêtre actuelle\n(peut ne pas fonctionner avec certaines applications).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Définissez le contenu du presse-papiers.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Écrivez des données brutes sur une ligne donnée.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Exécutez PROGRAMME sur le texte de l&apos;élément dans les lignes.\nUtilisez %1 dans PROGRAMME pour passer du texte comme argument.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Afficher un message dans une infobulle de la zone de notification pour TEMPS millisecondes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMMANDE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Supprimer l&apos;onglet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Renommer l&apos;onglet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NOUVEAU_NOM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Exporte les éléments dans un fichier.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>NOM_DE_FICHIER</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importer des éléments d&apos;un fichier.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Afficher toutes les options.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Récupère la valeur de l&apos;option.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Définit la valeur de l&apos;option.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALEUR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Évaluer le script.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Démarre ou se connecte à l&apos;instance de l&apos;application avec le nom de session donné.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Montre l&apos;aide pour COMMAND ou pour toutes les commandes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Affiche la version du programme et des bibliothèques.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Démarre le serveur en arrière-plan avant d&apos;exécuter une commande.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Option &quot;%1&quot; non valide&#x202f;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTS</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nDémarre ou connecte à une instance d&apos;application avec le nom de session donné.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSION</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nAfficher l&apos;aide pour COMMAND ou toutes les commandes.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nAffiche la version du programme et de ses bibliothèques.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Usage : copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Lance le serveur s&apos;il n&apos;y a pas commande.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  COMMANDES :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTES :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Utiliser l&apos;argument tiret (-) pour lire des données depuis l&apos;entrée standard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Échec de l&apos;exportation du fichier &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Échec de l&apos;importation du fichier &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Gestionnaire de presse-papierss</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Exception</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Exception dans %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Impossible de copier dans le presse-papiers !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Utiliser un double tiret (--) pour récupérer tous les arguments suivants\n    sans l&apos;expansion des séquences d&apos;échappement (telles que \\n, \\t et autres).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Utiliser le type MIME ? pour voir une liste des types MIME disponibles (la valeur par défaut est &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Nombre d&apos;arguments incorrect !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>La commande n&apos;a pas été trouvée !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Interruption serveur.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Impossible d&apos;enregistrer le fichier &quot;%1&quot; !</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Impossible d&apos;importer le fichier &quot;%1&quot; !</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Aucun onglet avec ce nom !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Le nom de l&apos;onglet ne peut pas être vide !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Un onglet existe déjà avec ce nom !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Stockage du presse-papier désactivé*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Ajouter un raccourci</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Nouveau raccourci</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Appuyer sur n&apos;importe quelle combinaison de touches. &lt;span style=&quot;font-weight:600;&quot;&gt;Échap&lt;/span&gt; pour annuler.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Cliquer ici et appuyer sur une combinaison de touches</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Supprimer le raccourci</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Le raccourci existe déjà !</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Rechercher :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Les raccourcis globaux peuvent être déclenchés à partir de n&apos;importe quelle application.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>Application</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Les raccourcis d&apos;application ne peuvent être déclenchés qu&apos;à partir de la fenêtre principale.</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Le nom de l&apos;onglet doit être non vide et unique.&lt;br /&gt;\nL&apos;onglet &lt;b&gt;Notes&lt;/b&gt; peut être ouvert avec &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUtiliser &lt;b&gt;/&lt;/b&gt; comme séparateur de chemin dans l&apos;arborescence de l&apos;onglet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nom :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Nouvel onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Renommer l&apos;onglet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Renommer un groupe d&apos;onglets</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>Nombre maximum d&apos;éléments&#x202f;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>Enregistrer éléments</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Demander le mot de passe après un certain temps&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Délai d&apos;expiration en secondes par onglet avant de demander à nouveau le mot de passe de chiffrement.\n\nDéfinissez cette valeur sur 0 pour utiliser le paramètre global.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>global</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Appuyer sur &apos;/&apos; pour rechercher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Taper pour rechercher</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Expression régulière</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Ignorer la casse des lettres</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_ga.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ga\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Maidir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Bainisteoir Gearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Údar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Ríomhphost</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Gréasán</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Tabhair síntiús</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Dialóg Gníomhaíochta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>O&amp;rdú:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Ionchur ca&amp;ighdeánach:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Stóráil asch&amp;ur caighdeánach:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Seol sonraí de chineál áirithe meán chuig ionchur caighdeánach ordaithe (fág folamh le múchadh)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Cruthaigh míreanna ó aschur caighdeánach an chláir (fág folamh le múchadh)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Deighilteoir le haghaidh míreanna nua:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Slonn rialta chun aschur a roinnt ina mhíreanna iolracha. &lt;\\p&gt;\n&lt;p&gt;Bain úsáid &lt;b&gt;as\\n&lt;/b&gt; chun gach líne a stóráil chun mír a scaradh.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Sábháil míreanna sa chluaisín leis an ainm tugtha (fág folamh le sábháil sa chluaisín reatha)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Cluaisín &amp;Aschuir:</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Cód scoir: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Ordú %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Earráid: %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Bainisteoir Próisis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Scagaire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Foirceannadh Roghnaithe</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Cuir Orduithe leis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Taispeáin/folaigh an phríomhfhuinneog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Taispeáin roghchlár an tráidire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Taispeáin an phríomhfhuinneog faoi chúrsóir na luiche</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Cuir gearrthaisce in eagar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Cuir an chéad mhír in eagar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Cóipeáil an dara mír</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Taispeáin dialóg gníomhaíochta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Cruthaigh mír nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Cóipeáil an chéad mhír eile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Cóipeáil an mhír roimhe seo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Greamaigh an gearrthaisce mar ghnáth-théacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Díchumasaigh stóráil ghearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Cumasaigh stóráil ghearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Greamaigh agus cóipeáil an chéad cheann eile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Greamaigh agus cóipeáil roimhe seo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Tóg pictiúr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Greamaigh an dáta agus an t-am reatha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Ordú nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Déan neamhaird de mhíreanna gan carachtar nó carachtar amháin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Oscail sa &amp;Bhrabhsálaí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Greamaigh mar Ghnáth-Théacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Físeáin a sheinm go huathoibríoch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Cóipeáil URL (seoladh gréasáin) go cluaisín eile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Cruthaigh mionsamhail (teastaíonn ImageMagic uaidh)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Cruthaigh Cód QR ó URL (teastaíonn qrencode uaidh)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tascanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Cuir le cluaisín %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Bog go dtí cluaisín %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Déan neamhaird de chomhaid chóipeáilte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Déan neamhaird d&apos;fhuinneog *&quot;Pasfhocal&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Pasfhocal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Bog go dtí an Bruscar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(bruscar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Glan an Cluaisín Reatha</translation>\n    </message>\n    <message>\n        <source>Tasks</source>\n        <translation type=\"vanished\">Tascanna</translation>\n    </message>\n    <message>\n        <source>Add to %1 tab</source>\n        <translation type=\"vanished\">Cuir le cluaisín %1</translation>\n    </message>\n    <message>\n        <source>Move to %1 tab</source>\n        <translation type=\"vanished\">Bog go dtí cluaisín %1</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Ní féidir míreanna nua a chur leis an gcluaisín %1. Bain míreanna de láimh le do thoil chun spás a dhéanamh.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Cuir athruithe i leataobh?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>An bhfuil fonn ort &lt;strong&gt;athruithe a chaitheamh i leataobh&lt;/strong&gt; i ndáiríre?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Ceangal caillte!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Ní féidir ceangal leis an bhfreastalaí! Tosaigh freastalaí CopyQ ar dtús.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Ábhar an Ghearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formáidí:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>Á&amp;bhar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Bain Formáid</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Ábhar na Míre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Méid:&lt;/strong&gt; %1 beart</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <translation type=\"vanished\">&lt;strong&gt;Méid:&lt;/strong&gt; %1 beart</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Tá freastalaí CopyQ ag rith cheana féin.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Cealaigh Orduithe Gníomhacha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Cealaigh orduithe gníomhacha agus scoir?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Cealaigh Scoir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Scoir Mar Sin Féin</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <source>Ctrl+Space</source>\n        <translation type=\"vanished\">Ctrl+Spás</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Spás</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Orduithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Sainmhínigh orduithe nua ar féidir iad a agairt go huathoibríoch ar ábhar gearrthaisce nua nó ag an úsáideoir ón roghchlár nó ag baint úsáide as aicearra córais.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Lódáil Orduithe…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>S&amp;ábháil Roghnaithe…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Cóipeáil Roghnaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Greamaigh Orduithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Athruithe Gan Sábháil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Tá athruithe gan sábháil ag dialóg ordaithe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Oscail Comhaid le hOrduithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Orduithe (*.ini);; Cumraíocht CopyQ (copyq.conf, copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Sábháil Orduithe Roghnaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Orduithe (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Sábháil Orduithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Theip ar orduithe a shábháil chuig an gcomhad &quot;%1&quot;: %2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Aimsigh:</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Tá liosta de na cláir le hargóintí a fhorghníomhófar san ordú. Mar shampla:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Cuirfear argóint chláir %1 in ionad téacs na míre.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Is féidir carachtar %1 a úsáid chun aschur caighdeánach a aistriú chuig an gcéad chlár eile.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Is féidir an chomhréir seo a úsáid chun an chuid eile den ordú a rith mar pharaiméadar aonair.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Tugann sé seo an t-aschur céanna le %1 ach tá sé níos úsáidí le haghaidh orduithe níos faide.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Is féidir feidhmeanna atá liostaithe thíos a úsáid mar atá sna horduithe seo a leanas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;gearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Taispeáin cabhair ordaithe (F1)</translation>\n    </message>\n    <message>\n        <source>&amp;clipboard</source>\n        <translation type=\"vanished\">&amp;gearrthaisce</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Ainm an ordaithe a thaispeántar sa roghchlár</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Cineál:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Rith an t-ordú go huathoibríoch má tá ábhar nua ag an ngearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Uathoib&amp;ríoch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Taispeáin an t-ordú i roghchlár comhthéacs na míreanna comhoiriúnacha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>Sa R&amp;oghchlár</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Aicearra Domhanda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Script</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Taispeáint</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Aicearra:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Aicearra Domhanda:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Or&amp;dú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Casta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Meaitseáil Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Ábhar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Scipeáil an t-ordú mura bhfuil an téacs ionchuir ag teacht leis an slonn rialta seo (fág folamh chun gach rud a mheaitseáil).\n\nCuirfear na téacsanna gafa in ionad %2 trí %9 (nó argóint [1] agus suas sa script) in Ordú agus Scagaire.\n\nSamplaí:\n\n- Meaitseáil URL: ^(https?|ftp)://\n- Meaitseáil ainmneacha comhaid PDF: \\.pdf$\n- Meaitseáil carachtar aonair: ^.$\n- Meaitseáil ilmheán iargúlta: ^http://.*\\. (ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Fuinneog:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Úsáid an t-ordú ach amháin le haghaidh míreanna a chóipeáiltear go gearrthaisce ón bhfuinneog le téacs teidil a mheaitseálann an slonn rialta seo (fág folamh chun aon fhuinneog a mheaitseáil). Ar macOS, tá ainm an fheidhmchláir agus Fleasc (&amp;quot;-&amp;quot;) ina dhiaidh sin teideal na fuinneoige. M.sh. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;máid:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Seolfar sonraí den chineál MIME seo chuig ionchur caighdeánach ordaithe.\nFág folamh chun é seo a dhíchumasú.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Scagaire:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Scipeáil an t-ordú má theipeann ar an ordú scagaire le cód scoir nach nialasach.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Gníomh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Cóipeái&amp;l chuig cluaisín:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Ainm an chluaisín le míreanna nua a chóipeáil ann (fág folamh gan cóipeáil)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Bain mír meaitseála\n\nTabhair faoi deara: Má chuirtear é seo i bhfeidhm go huathoibríoch, ní fhorghníomhaítear aon orduithe uathoibríocha eile.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Bain Mír</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Gníomh Roghchláir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Folaigh fuinneog tar éis ordú a ghníomhachtú ó roghchlár comhthéacs míre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Folaigh an phríomhfhuinneog tar éis dó a ghníomhachtú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Roghanna ordaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Asch&amp;ur:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Cruthaigh míreanna ó aschur caighdeánach an chláir (fág folamh le díchumasú)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Deighilteoir:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Deighilteoir le meaitseáil chun an t-aschur a scoilteadh go míreanna iolracha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Sábháil míreanna sa chluaisín le hainm tugtha (fág folamh le sábháil sa chéad chluaisín)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Taispeáin dialóg gníomhaíochta sula ndéantar an t-ordú a rith</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Fan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Athraigh míre, ná cruthaigh aon mhíreanna nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Cl&amp;aochlú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Taispeáin Casta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Ainm:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Cluaisín &amp;Aschuir:</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Leideanna uirlisí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Aimsithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Roghnaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Uimhir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Gnáth</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Eagarthóir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Malartach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Fógra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Taispeáin &amp;Uimhir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Taispeáin barraí scrollaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>S&amp;barraí scrollbharra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Bain úsáid as deilbhíní ó thimpeallacht deisce nuair is féidir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>D&amp;eilbhíní Córais</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Antialias</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Soc&amp;raigh dathanna do chluaisíní, barra uirlisí agus biachláir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Athshocraigh Téama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Téama:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Luchtaigh Téama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Sábháil Téama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Cuir an téama reatha in eagarthóir seachtrach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>C&amp;uir an Téama in Eagar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Réamhamharc:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Oscail Comhad Téama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Sábháil Comhad Téama Mar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Gan Eagarthóir Seachtrach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Socraigh ordú eagarthóra seachtrach ar dtús!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>mír</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Is é teaghrán cuardaigh %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Roghnaigh mír agus\nbrúigh F2 le cur in eagar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Mír shampla %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Roinnt nótaí randamacha (Shift+F2 a chur in eagar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Cúlra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Cló</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Túlra</translation>\n    </message>\n    <message>\n        <source>Abc</source>\n        <translation type=\"vanished\">Abc</translation>\n    </message>\n    <message>\n        <source>item</source>\n        <translation type=\"vanished\">mír</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Teanga:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Briseadh téacs má tá sé rófhada le bheith oiriúnach ar líne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Fill téac&amp;s fada</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Coinnigh an phríomhfhuinneog os cionn fuinneoga eile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>I gcónaí a&amp;r a Bharr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Dún an phríomhfhuinneog nuair a bhíonn fócas ag feidhmchlár eile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Dún Nuair nach bhfuil Dírithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Cumasaigh fuinneoga a oscailt ar an scáileán reatha. Díchumasaigh chun fuinneoga a oscailt san áit ar dúnadh iad go deireanach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Fuinneoga O&amp;peann ar an scáileán reatha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Deimhnigh scoir an fheidhmchláir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Deimhnigh s&amp;coir an fheidhmchláir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Rith an feidhmchlár ag tosú an chórais</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Uaththosú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Cosc a chur ar fhuinneoga aipeanna a ghabháil i nglacadh scáileáin agus i dtaifeadtaí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Folaigh ó scáileáin agus taifeadtaí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Criptigh sonraí cluaisíní ar dhiosca (ní mór pasfhocal a shocrú)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Criptigh &amp;Cluaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Bain úsáid as stór eochrach seachtrach atá ar fáil don fhocal faire criptithe (Stór Dintiúr Windows, Eochairshlabhra macOS, Eochairfháinne GNOME, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Úsáid stór eochrach seachtrach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Athraigh an focal faire a úsáidtear chun sonraí cluaisíní a chriptiú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Athraigh Criptiú &amp;Pasfhocal...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Stíl nascleanúna / Eochairléarscáil:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Tacaíocht do nascleanúint Vi (eochracha H, J, K, L, / agus níos mó) agus nascleanúint Emacs (Ctrl + N, P, V agus níos mó)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Réamhshocrú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Sábháil agus athchóirigh stair scagairí míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Sábháil Stair na Scagaire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Taispeáin aníos go huathoibríoch chun ainmneacha feidhme, cineáil agus athróg in orduithe a chomhlánú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Comhlánaigh Orduithe Uathoibríoch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Ionramháil Gearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Ceadaigh ábhar cóipeáilte a ghreamú ar an mbealach céanna le roghnúcháin luiche (de ghnáth trí chnaipe lár na luiche a bhrú)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Greamaigh gearrthaisce le luch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Ceadaigh roghanna luiche a ghreamú ag baint úsáide as aicearra (Ctrl+V nó Shift+Ionsáigh de ghnáth)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Greamaigh roghnúchán luiche le méarchlár</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Sábháil gearrthaisce sa stair</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Stóráil gearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Sábháil an téacs roghnaithe leis an luch (príomhroghnú) sa stair</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Stóráil an téacs roghnaithe ag baint úsáide as an luch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Rith orduithe uathoibríocha ar roghnú</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Uaslíon na mírea&amp;nna sa stair:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Uasmhéid míreanna i ngach cluaisín</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Díluchtaigh cluaisín tar éis eatramh i nóiméid:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>&amp;Díluchtaigh an cluaisín tar éis eatramh:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Díluchtaigh gach cluaisín ón gcuimhne tar éis líon sonraithe nóiméad neamhghníomhaíochta.\n\nSocraigh go 0 gan cluaisíní a dhíluchtú.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Éiligh pasfhocal tar éis eatramh:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Teorainn ama i soicindí le go n-éileoidh cluaisíní criptithe pasfhocal arís.\n\nSocraigh go 0 le díchumasú go domhanda.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Ordú eagarthóra seachtrach (is comhad é %&amp;1 le cur in eagar):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Ordú eagarthóra seachtrach (is comhad é %1 le cur in eagar).\n  Samplaí:\n    gedit %1\n    Ceap nótaí %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Cl&amp;uaisín chun an ghearrthaisce a stóráil:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Ainm an chluaisín a stórálfaidh ábhar nua gearrthaisce go huathoibríoch.\n\nFág folamh chun stóráil uathoibríoch a dhíchumasú.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Fág gan seiceáil le haghaidh Return eochair chun mír eagarthóireachta a shábháil agus Ctrl+Return cruthaigh líne nua.\n\nTabhair faoi deara: Is féidir míreanna curtha in eagar a shábháil le F2 gan aird a thabhairt ar an rogha seo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>&amp;Sábháil an mhír curtha in eagar le Ctrl+Return agus cruthaigh líne nua le heochrach Return</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Taispeáin cur síos líne amháin ar gach míre.\n\nBain úsáid as Réamhamharc Míreanna chun míreanna iomlána a thaispeáint.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Taispeái&amp;n míreanna simplí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Cumasaigh cuardach le haghaidh uimhreacha, nó cuirtear mír ar an suíomh sin i ngníomh nuair a bhrúnn tú eochair dhigit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Cu&amp;ardaigh uimhreacha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Gníomhachtaigh mír le cliceáil amháin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Tar éis an mhír a ghníomhachtú (cliceáil faoi dhó nó Iontráil eochair), cóipeáil é go gearrthaisce agus ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Bog mír go barr an liosta tar éis é a ghníomhachtú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Bog an mhír go b&amp;arr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Dún an phríomhfhuinneog tar éis an mhír a ghníomhachtú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Dún an phríomhfhuinneog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Dírigh ar an bhfuinneog dheireanach tar éis an mhír a ghníomhachtú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Dírigh thar an bhfuinneog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Greamaigh go dtí an fhuinneog reatha tar éis an mhír a ghníomhachtú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Greamaigh go dtí an fhuinneog reatha</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Taispeáin/Folaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Folaigh cluaisíní (brúigh eochair Alt le taispeáint)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Fola&amp;igh cluaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Folaigh barra uirlisí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Folaigh freisin &amp;lbarra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Folaigh lipéid &amp;bharra uirlisí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Folaigh an phríomhfhuinneog nuair a bhíonn sé dúnta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Folaigh an &amp;phríomhfhuinneog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Leagan Amach agus Trédhearcacht</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Taispeáin crann le cluaisíní in ionad barra cluaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Crann na gCl&amp;uaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Trédhearcacht dhírithe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Trédhearcacht na príomhfhuinneog má tá sé dírithe.\n\nTabhair faoi deara: Ní thacaítear leis seo ar gach córas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Trédhearcacht &amp;neamhdhírithe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Trédhearcacht na príomhfhuinneog mura bhfuil sé dírithe.\n\nTabhair faoi deara: Ní thacaítear leis seo ar gach córas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Taispeáin líon na míreanna i gcluaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Taispeái&amp;n Líon na Míreanna</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Suíomh an fhógra:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Suíomh ar an scáileán le haghaidh fógraí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Barr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Bun</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Barr ar Dheis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Bun ar Dheis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Bun ar Chlé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Barr ar Chlé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>E&amp;atramh i soicindí chun fógraí a thaispeáint:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Eatramh i soicind chun fógra a thaispeáint maidir le hábhar nua an ghearrthaisce nó má chóipeáiltear an mhír go gearrthaisce (ach amháin má tá an phríomhfhuinneog dúnta).\n\nSocraigh go 0 chun é seo a dhíchumasú.\n\nSocraigh go -1 chun é a choinneáil infheicthe go dtí go gcliceáiltear air.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Líon agus líon na línte le haghaidh fógra gearrthaisce:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Líon na línte le taispeáint d&apos;ábhar nua an ghearrthaisce\n\nSocraigh go 0 le díchumasú.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Úsáid fógraí dúchasacha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geoiméadracht Fógra (i bpointí scáileáin)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Fritháireamh &amp;criosaithe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Fad fógra ó imeall an scáileáin chlé nó ar dheis i bpointí scáileáin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Fritháireamh ingearach:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Fad fógra ó imeall barr nó bun an scáileáin i bpointí scáileáin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Leithead &amp;uasta:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Uasleithead le haghaidh fógra i bpointí scáileáin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Aird&amp;e uasta:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Uasairde le haghaidh fógra i bpointí scáileáin</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Ná taispeáin deilbhín tráidire; Íoslaghdaigh an fhuinneog nuair a bhíonn sé dúnta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Díchumasaigh an tráidir&amp;e</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Taispeáin an t-ordú don ábhar gearrthaisce reatha sa roghchlár tráidire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Taispeáin &amp;orduithe le haghaidh ábhar an ghearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Líon na &amp;míreanna sa roghchlár tráidire:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Líon na míreanna sa roghchlár tráidire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Taispeáin míreanna ón táb reatha sa roghchlár tráidire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Taispeáin cluaisín cuairt sa roghchlár,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>nó &amp;roghnaigh cluaisín eile:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Ainm an chluaisín le taispeáint sa roghchlár tráidire (folamh don chéad chluaisín)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Greamaigh mír go dtí an fhuinneog reatha tar éis é a roghnú sa roghchlár</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Greamaigh mír ghníomhachtaithe san fhuinneog reatha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Taispeáin réamhamharc íomhá in aice le míreanna roghchláir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Réamhamharc íomhá mar dheilbhín míre r&amp;oghchláir</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Sainroghanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Ginearálta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Leagan Amach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Stair</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Tráidire</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Fógraí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Cluaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Aicearraí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Cuma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Luach neamhbhailí don rogha &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Athshocraigh sainroghanna?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Athshocróidh an gníomh seo do chuid sainroghanna go léir (i ngach cluaisín) go luachanna réamhshocraithe.&lt;br /&gt;&lt;br /&gt;An bhfuil fonn ort &lt;strong&gt;gach rogha a athshocrú&lt;/strong&gt; i ndáiríre?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Atosaigh ag teastáil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Athrófar an teanga tar éis an t-iarratas a atosú.</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Theip ar chomhadlann sioncrónaithe &quot;%1&quot; a chruthú!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <source>Alt+Down</source>\n        <translation type=\"vanished\">Alt+Síos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Síos</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Roghnaigh Deilbhín…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n    <message>\n        <source>...</source>\n        <translation type=\"vanished\">...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Roghnaigh Deilbhín</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Brabhsáil...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Oscail Comhad Deilbhín</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Comhaid Íomhá (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Gach rud</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Cluaisíní:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Cu&amp;mraíocht</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Or&amp;duithe</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Theip ar ordú an eagarthóra (féach logaí)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Theip ar chriptiú!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Chun míreanna criptithe a roinnt ar ríomhaire nó ar sheisiún eile, beidh na comhaid eochair rúnda seo ag teastáil uait (coinnigh in áit shábháilte iad):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Ní mór GnuPG a shuiteáil chun cluaisíní criptithe a fheiceáil.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Criptigh (teastaíonn GnuPG uaidh)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Díchriptiú</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Díchriptiú agus Cóipeáil</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Díchriptigh agus Greamaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Iontráil</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Theip ar eochracha a ghiniúint.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Críochnaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Eochracha nua á chruthú (d&apos;fhéadfadh sé seo cúpla nóiméad a thógáil)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Cuir ar ceal</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Pasfhocal nua á shocrú...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Ní mór eochracha criptithe a &lt;strong&gt;ghiniúint&lt;/strong&gt; sular féidir criptiú míreanna a úsáid.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Cruthaigh Eochracha Nua...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Athraigh Pasfhocal...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Theip ar dhíchriptiú!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Criptiú</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Criptigh míreanna agus cluaisíní.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Earráid: %1</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Chun míreanna a chriptiú agus a dhíchriptiú, cuir orduithe cuí leis faoin gcluaisín Orduithe.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Míreanna agus Cluaisíní Criptithe á roinnt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Cluaisíní Criptithe</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sonraigh ainmneacha cluaisíní (ceann in aghaidh na líne) a chripteofar agus a dhíchripteofar go huathoibríoch.&lt;/p&gt;\n&lt;p&gt;Socraigh eatramh cluaisín díluchtaithe sa chluaisín Stair chun míreanna díchriptithe a dhíluchtú go sábháilte ón gcuimhne.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Cluaisín Truaillithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Níor lódáladh gach mír sa chluaisín &lt;strong&gt;%1&lt;/strong&gt; go rathúil. Ar mhaith leat an cluaisín a lódáil fós agus b&apos;fhéidir roinnt míreanna a chailleadh?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Tá an breiseán FakeVim mar chuid de Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Aithris a dhéanamh ar eagarthóir Vim agus míreanna á n-eagarthóireacht agat.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Cumasaigh FakeVim le haghaidh Eagarthóireacht Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Conair chuig Comhad Cumraíochta:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Íomhánna</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Taispeáin íomhánna.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Uasleithead Ío&amp;mhá:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Uasleithead na híomhá a thaispeántar sa stair (socraithe go nialas don bhunmhéid)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Uasmhéid Íomhá &amp;Airde:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Uasairde na híomhá a thaispeántar sa stair (socraithe go nialas don bhunmhéid)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Ordú &amp;eagarthóra íomhá:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Ordú eagarthóra le haghaidh formáidí íomhá tacaithe seachas SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Ordú eagarthóra &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Ordú eagarthóra le haghaidh formáid íomhá SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Nótaí</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Taispeáin nótaí le haghaidh míreanna.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Suíomh na Nótaí</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>M&amp;ír Thuas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Thío&amp;s Mír</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>In aice leis an &amp;Mír</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Taispeáin L&amp;eid Uirlis</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>C&amp;uir leis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Bog suas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Bog síos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Bog go dtí an barr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Bog go dtí an bun</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Bain</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Ní féidir Míreanna Greamaithe a Bhaint</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Díphionnaigh míreanna ar dtús chun iad a bhaint.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Bioráin</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Díphionnaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Míreanna Greamaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Bioráin míreanna chun iad a ghlasáil sa tsraith reatha agus iad a sheachaint (mura bhfuil siad neamhphionáilte).&lt;/p&gt;&lt;p&gt;Soláthraíonn aicearraí agus feidhmiúlacht scriptithe.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Brabhsáil...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Oscail Comhadlann le haghaidh Sioncrónaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Theip ar chomhadlann sioncrónaithe a chruthú</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sioncrónaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Sioncrónaigh míreanna agus nótaí le comhadlann ar dhiosca.</translation>\n    </message>\n    <message>\n        <source>Browse...</source>\n        <translation type=\"vanished\">Brabhsáil...</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Theip ar an gcluaisín &quot;%1&quot; a shioncronú le comhadlann &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Bain Míríreanna?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>An bhfuil fonn ort &lt;strong&gt;míreanna agus comhaid ghaolmhara a bhaint&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Cluaisíní agus Eolairí Sioncrónaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sioncrónaigh inneachar an &lt;strong&gt;chluaisín&lt;/strong&gt; leis an gcomhadlann leis an &lt;strong&gt;gcosán&lt;/strong&gt; tugtha.&lt;/p&gt;\n&lt;p&gt;Socraigh &lt;strong&gt;cosán folamh&lt;/strong&gt; gan míreanna a shábháil sa &lt;strong&gt;chluaisín&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Ainm an Chluaisín</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Conair</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Comhaid go Formáidí Sonraí Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Socraigh cineál meán go &lt;strong&gt;-&lt;/strong&gt; (lúide carachtar) chun neamhaird a dhéanamh de chomhaid. Déantar neamhaird ar aon chomhaid anaithnid nó i bhfolach eile.&lt;/p&gt;\n&lt;p&gt;Sampla: Luchtaigh síneadh comhaid &lt;strong&gt;txt&lt;/strong&gt; mar chineál &lt;strong&gt;téacs / meán plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Eisínteachtaí</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Cineál Meán Míre</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Cuir Clib leis</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Bain Clib</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Scoránaigh Clib %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Ní féidir míreanna a bhfuil clib faoi ghlas acu a bhaint</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Díchlibeáil míreanna ar dtús chun iad a bhaint.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Tábhachtach</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Glan na clibeanna go léir</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Clibeanna</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Taispeáin clibeanna le haghaidh míreanna.</translation>\n    </message>\n    <message>\n        <source>Important</source>\n        <translation type=\"vanished\">Tábhachtach</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Is féidir míreanna roghchláir chun clibeanna saincheaptha a chur leis agus a bhaint agus iad a shaincheapadh i dialóg Orduithe.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Tá tuilleadh eolais ar fáil ar an &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;leathanach vicí&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Ainm Clibeanna</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Meaitseáil</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Bileog Stíle</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Dath</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Deilbhín</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Faoi Ghlas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Seachain mír a bhaint</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Téacs</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Taispeáin gnáththéacs agus míreanna HTML simplí.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Sábháil agus taispeáin HTML agus téacs saibhir</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Uaslíon na línte le taispeáint (0 chun gach rud a thaispeáint):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Airde uasta i bpicteilíní (0 le haghaidh gan teorainn):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Bileog stíl réamhshocraithe:</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Logáil</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Míreanna CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Criptiú Gan Fáil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>Níl criptiú ar fáil (féach na logaí le haghaidh sonraí).\n\nBeidh sé indéanta sonraí cluaisíní a chriptiú agus a dhíchriptiú.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Pasfhocal Iompórtála</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Cuir isteach focal faire le haghaidh allmhairithe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Easpórtáil Pasfhocal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Cuir isteach focal faire le haghaidh easpórtála (folamh mura bhfuil criptiú ann):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Taispeáin/Folaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Scoir?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>An bhfuil fonn ort CopyQ &lt;strong&gt;a scoIr&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Comhad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Mír</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Cluaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Athainmnigh &amp;Grúpa %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Athainm&amp;nigh Cluaisín %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Ba&amp;in Cluaisín %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Bain Grúpa %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Gearrthaisce: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Roghanna le hIompórtáil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Earráid CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Roghanna le haghaidh Easpórtála</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Earráid Easpórtála</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Theip ar easpórtáil an chomhaid %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Earráid Iompórtála</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Theip ar iompórtáil an chomhaid %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Bain gach cluaisín sa ghrúpa?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Ar mhaith leat &lt;strong&gt;gach cluaisín&lt;/strong&gt; sa ghrúpa &lt;strong&gt;%1&lt;/strong&gt; a bhaint?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Bain Cluaisín?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Ar mhaith leat an cluaisín &lt;strong&gt;%1&lt;/strong&gt; a bhaint?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Eagar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Cabhair</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Cluaisín Nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Athraigh Deilbhín an Chluaisín</translation>\n    </message>\n    <message>\n        <source>&amp;Clipboard: %1</source>\n        <translation type=\"vanished\">&amp;gearrthaisce: %1</translation>\n    </message>\n    <message>\n        <source>CopyQ Error</source>\n        <translation type=\"vanished\">Earráid CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Eolas</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Mír Nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Iompórtáil...</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Easpórtáil...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Sainroghanna...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>Or&amp;duithe...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Taispeáin Ábhar an &amp;Ghearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Taispeáin Réamhamharc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Scoránaigh Stóráil Gearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Bainisteoir P&amp;róisis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>S&amp;coir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Sórtáil Míreanna Roghnaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Droim ar ais Míreanna Roghnaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Greamaigh Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Cóipeáil Míreanna Roghnaithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Aimsigh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Sábháil Mír</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Cealaigh Eagarthóireacht</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Éalú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Cealaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Déan arís</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Cló trom</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Iodálach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Faoi líne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Stríoc tríd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Scrios Stíl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Cuardaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>G&amp;níomhachtaigh Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Taispeáin Ábhar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Cuir &amp;Nótaí in Eagar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Cuir in Ea&amp;gar leis an Eagarthóir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Gníomh...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Bog Suas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Suas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Bog Síos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Síos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Bog go barr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Baile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Bog go Bun</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+Deireadh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Cluaisín &amp;Ainm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Bai&amp;n an Cluaisín</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>An Chluaisín E&amp;ile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Ar dheis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>&amp;Cluaisín Roimhe Seo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Ar chlé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Taispeáin Loga</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Maidir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Roghchlár Comhthéacs Míre Oscailte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Tá Cluaisín %1 truaillithe nó tá roinnt breiseán CopyQ ar iarraidh!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Ní mór 16 charachtar ar a mhéad a bheith in ainm an tseisiúin\na d&apos;fhéadfadh a bheith ina litreacha, digití, &apos;-&apos; nó &apos;_&apos;!</translation>\n    </message>\n    <message>\n        <source>&amp;clipboard</source>\n        <translation type=\"vanished\">&amp;gearrthaisce</translation>\n    </message>\n    <message>\n        <source>&lt;HIDDEN&gt;</source>\n        <translation type=\"vanished\">&lt;HIDDEN&gt;</translation>\n    </message>\n    <message>\n        <source>%1 (%n lines)</source>\n        <translation type=\"vanished\">%1 (%n líne)</translation>\n    </message>\n    <message>\n        <source>&lt;IMAGE&gt;</source>\n        <translation type=\"vanished\">&lt;IMAGE&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;ITEMS&gt;</source>\n        <translation type=\"vanished\">&lt;ITEMS&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;EMPTY&gt;</source>\n        <translation type=\"vanished\">&lt;EMPTY&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;DATA&gt;</source>\n        <translation type=\"vanished\">&lt;DATA&gt;</translation>\n    </message>\n    <message>\n        <source>Backspace</source>\n        <translation type=\"vanished\">Cúlspás</translation>\n    </message>\n    <message>\n        <source>Delete</source>\n        <translation type=\"vanished\">Scrios</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <translation type=\"vanished\">Éalú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Cló</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Túlra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Cúlra</translation>\n    </message>\n    <message>\n        <source>A&amp;ctivate Items</source>\n        <translation type=\"vanished\">G&amp;níomhachtaigh Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Bain</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Eagar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>Cluaisín &amp;Nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Athraigh Deilbhín an Chluaisín</translation>\n    </message>\n    <message>\n        <source>Right</source>\n        <translation type=\"vanished\">Ar dheis</translation>\n    </message>\n    <message>\n        <source>Left</source>\n        <translation type=\"vanished\">Ar chlé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Cabhair</translation>\n    </message>\n    <message>\n        <source>Shift+F10</source>\n        <translation type=\"vanished\">Shift+F10</translation>\n    </message>\n    <message>\n        <source>Text Copied (%n lines)</source>\n        <translation type=\"vanished\">Téacs Cóipeáilte (%n líne)</translation>\n    </message>\n    <message>\n        <source>Text Copied</source>\n        <translation type=\"vanished\">Téacs Cóipeáilte</translation>\n    </message>\n    <message>\n        <source>Data Copied</source>\n        <translation type=\"vanished\">Sonraí Cóipeáilte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;gearrthaisce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;FOLACH&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n líne)</numerusform>\n            <numerusform>%1 (%n línte)</numerusform>\n            <numerusform>%1 (%n línte)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;ÍOMHÁ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;MÍREANNA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;FOLAMH&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;SONRAÍ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Cúlspás</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Scrios</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Téacs Cóipeáilte (%n líne)</numerusform>\n            <numerusform>Téacs Cóipeáilte (%n línte)</numerusform>\n            <numerusform>Téacs Cóipeáilte (%n línte)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Téacs Cóipeáilte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Sonraí Cóipeáilte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Pasfhocal Criptithe Cluaisín Nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Cuir isteach focal faire nua:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>Níorbh ionann na pasfhocail. Déan iarracht arís (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Athraigh Pasfhocal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>Ní féidir an focal faire nua a fhágáil folamh.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Theip ar shocrú pasfhocail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Sáraíodh an líon uasta iarrachtaí pasfhocail.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Deimhnigh Pasfhocal Criptithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Ath-iontráil an focal faire le deimhniú:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Pasfhocal Criptithe an Chluaisín Reatha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Cuir isteach an focal faire reatha chun sonraí an chluaisín a chriptiú:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Pasfhocal neamhbhailí. Déan iarracht arís (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Theip ar Fhíorú Pasfhocail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Comhaid Chriptithe Truaillithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Tá comhaid chriptithe ar iarraidh nó truaillithe. Ní féidir le mód dian cluaisíní criptithe a aisghabháil go huathoibríoch.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Theip ar Athrú Pasfhocail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Theip ar an bpasfhocal a athrú. Tá do sheanphasfhocal fós gníomhach. Seiceáil na logaí le haghaidh sonraí.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Athrú Pasfhocail Rathúil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>Athraíodh an focal faire go rathúil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Ag athchriptiú cluaisíní...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Cealaigh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Ag athchriptiú cluaisín %1 de %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Theip ar chriptiú na gcluaisíní seo a leanas:\n\n%1\n\nSeiceáil na logaí le haghaidh sonraí.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Theip ar an gCriptiú</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Taispeáin an phríomhfhuinneog agus oscail an cluaisín le hainm tugtha.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>AINM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Folaigh an phríomhfhuinneog.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Taispeáin nó folaigh an phríomhfhuinneog.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Oscail roghchlár comhthéacs.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Scoir an freastalaí.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Cumasaigh nó díchumasaigh stóráil ábhar ar an ngearrthaisce.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Priontáil ábhar an ghearrthaisce .</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Priontáil ábhar roghnúcháin X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Greamaigh gearrthaisce san fhuinneog reatha\n(b&apos;fhéidir nach n-oibreoidh sé le roinnt feidhmchlár).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Cóipeáil gearrthaisce ón bhfuinneog reatha\n(b&apos;fhéidir nach n-oibreoidh sé le roinnt feidhmchlár).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Socraigh téacs an ghearrthaisce seo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TÉACS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Socraigh ábhar an ghearrthaisce .</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>SONRAÍ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Priontáil méid na míreanna sa chluaisín reatha.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Cóipeáil mír sa ró chuig an ghearrthaisce.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>RÓ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Cóipeáil an chéad mhír eile ón gcluaisín reatha go dtí an gearrthaisce seo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Cóipeáil an mhír roimhe seo ón gcluaisín reatha go dtí an gearrthaisce seo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Cuir téacs isteach sa ghearrthaisce.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Cuir isteach téacs i sraith áirithe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Bain míreanna i sraitheanna áirithe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>SRAITHEANNA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Cuir míreanna in eagar nó cuir ceann nua in eagar.\nTá luach -1 don téacs reatha sa ghearrthaisce .</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Socraigh deighilteoir d&apos;ítimí ar an aschur.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>DEIGHILTEOIR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Priontáil sonraí amh an ghearrthaisce nó na míre i ndiaidh a chéile.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Scríobh sonraí amh chuig an am a chéile áirithe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Taispeáin dialóg gníomhaíochta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Rith CLÁR ar théacs míre sna sraitheanna.\nBain úsáid as %1 i gCLÁR chun téacs a phasáil mar argóint.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>CLÁR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Taispeáin teachtaireacht aníos tráidire ar feadh milleasoicind TIME.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TEIDEAL</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>TEACHTAIREACHT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>AM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Liostaigh ainmneacha na gcluaisíní atá ar fáil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Rith an t-ordú ar an gcluaisín leis an ainm tugtha.\nCruthaítear cluaisín mura bhfuil sé ann.\nIs é an réamhshocrú an chéad chluaisín.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>ORDÚ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Bain cluaisín.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Athainmnigh cluaisín.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>AINM_NUA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Easpórtáil míreanna go comhad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILE_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Iompórtáil míreanna ó chomhad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Liostaigh na roghanna go léir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Faigh luach rogha.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>ROGHA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Socraigh luach rogha.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>LUACH</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Script a mheas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGÓINTÍ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Tosaíonn nó nascann sé le sampla feidhmchláir le hainm seisiúin tugtha.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SEISIÚN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Priontáil cabhair le haghaidh COMMAND nó gach ordú.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Priontáil leagan den chlár agus de na leabharlanna.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Rith tástálacha feidhmchláir (cuir argóint --help leis le haghaidh tuilleadh eolais).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Tosaigh an freastalaí sa chúlra sula ritheann tú ordú.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Úsáid: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Tosaíonn an freastalaí mura bhfuil aon ordú sonraithe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  ORDUITHE:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NÓTAÍ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Bain úsáid as argóint fleasc (-) chun sonraí a léamh ó ionchur caighdeánach.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Úsáid argóint fleasc dúbailte (--) chun gach argóint seo a leanas a léamh gan\n    seichimh éalaithe a leathnú (i.e. \\n, \\t agus eile).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Bain úsáid as? chun MIME chun cineálacha MIME atá ar fáil a phriontáil (is é &quot;text/plain&quot; an réamhshocrú).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Líon neamhbhailí argóintí!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Theip ar easpórtáil an chomhaid &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Theip ar an gcomhad &quot;%1&quot; a iompórtáil</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Ní féidir sábháil i gcomhad &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Ní féidir comhad &quot;%1&quot; a iompórtáil!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>Bainisteoir Gearrthaisce CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Níor aimsíodh an t-ordú!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Ag críochnú an fhreastalaí.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Rogha neamhbhailí &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Eisceacht</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Eisceacht i %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Theip ar chóipeáil chuig an ghearrthaisce!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Níl cluaisín le hainm tugtha ann!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Ní féidir ainm an chluaisín a bheith folamh!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Tá cluaisín le hainm tugtha ann cheana!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Stóráil ar an nGearrthaisce Díchumasaithe*</translation>\n    </message>\n    <message>\n        <source>*Clipboard Storing Disabled*</source>\n        <translation type=\"vanished\">*Stóráil ar an nGearrthaisce Díchumasaithe*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Cuir aicearra leis</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Aicearra Nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Bain Aicearra</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>D&amp;omhanda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Is féidir aicearraí domhanda a spreagadh ó aon fheidhmchlár.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>Fei&amp;dhmchlár</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Ní féidir aicearraí feidhmchláir a ghníomhachtú ach ón bpríomhfhuinneog.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Tá aicearra ann cheana!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Aimsigh:</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Ní mór ainm an táb a bheith neamhfholamh agus uathúil.&lt;br /&gt;\nIs féidir an táb &lt;b&gt;Notaí&lt;/b&gt; a oscailt le &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nÚsáid &lt;b&gt;/&lt;/b&gt; mar dheighilteoir cosáin i leagan amach crainn na dtáb.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Cluaisín Nua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Athainmnigh Cluaisín</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Athainmnigh Grúpa Cluaisíní</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Ainm:</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Uasmhéid míreanna:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>réamhshocraithe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Sábháil Míreanna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Éiligh pasfhocal tar éis eatramh:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Am scoir in aghaidh an chluaisín i soicindí le haghaidh pasfhocal criptithe a éileamh arís.\n\nSocraigh go 0 chun socruithe domhanda a úsáid.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>domhanda</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Brúigh &apos;/&apos; chun cuardach a dhéanamh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Clóscríobh chun cuardach a dhéanamh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n    <message>\n        <source>&amp;%1. %2</source>\n        <translation type=\"vanished\">&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Slonn Rialta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Cás Neamhíogair</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_he.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"he_IL\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>אודות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>מנהל לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>יוצר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>דוא&quot;ל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>רשת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>תרומה</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>דו־שיח פעולה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>פקודה:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>קלט &amp;תיקני:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>אחסון &amp;פלט תיקני:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>שליחת נתוני מדיה מסוג נתון לקלט פקודה תקני (להשאיר ריק לכיבוי)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>יצירת פריטים מפלט התוכנית התיקנית (להשאיר ריק לכיבוי)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;מפריד לפריטים חדשים:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;ביטוי רגיל לפיצול פלט לפריטים מרובים.&lt;\\p&gt;\n&lt;p&gt;נא להשתמש ב־&lt;b&gt;\\n&lt;/b&gt; כדי לאחסן כל שורה בפריט נפרד.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>לשונית &amp;פלט:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>שמירת פריטים בלשונית בשם נתון (להשאיר ריק לשמירה בלשונית נוכחית)</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>שגיאה: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>קוד יציאה: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>פקודה %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>מנהל תהליכים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>מסנן</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>סיים תהליכים שנבחרו</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>הוסף פקודות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>הצג/הסתר חלון ראשי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>הצג תפריט מגש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>הצג חלון ראשי מתחת לסמן העכבר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>ערוך לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>ערוך פריט ראשון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>העתקת פריט שני</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>הצגת דו־שיח פעולה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>יצירת פריט חדש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>העתקת הפריט הבא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>העתקת הפריט הקודם</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>העתקת לוח־גזירים כמלל רגיל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>השבתת מיון לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>אפשור מיון לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>הדבקה והעתקת הבא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>הדבקה והעתקת הקודם</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>צילום־מרקע</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>הדבקת תאריך ושעה נוכחיים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>פקודה חדשה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>להתעלם מפריטים עם תו בודד או ללא תווים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>פתיחה ב&amp;דפדפן</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>הדבקה כמלל רגיל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>הפעלת סרטונים אוטומטית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>העתקת כתובת URL (כתובת מרשתת) ללשונית אחרת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>יצירת דוגמית (מצריך ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>יצירת קוד QR מכתובת URL (מצריך qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>משימות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>הוספה ללשונית %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>העברה ללשונית %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>להתעלם מקובצים שהועתקו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>להתעלם מחלוןן *&quot;סיסמה&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>סיסמה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>העברה לסל־המחזור</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(סל־מחזור)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>ניקוי לשונית נוכחית</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>לא ניתן להוסיף פריטים חדשים ללשונית %1. נא להסיר פריטים באופן ידני כדי לפנות מקום.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>לסלק שינויים?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>האם &lt;strong&gt;לסלק שינויים&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>החיבור אבד!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>לא ניתן להתחבר לשרת! נא לאתחל את שרת CopyQ תחילה.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>תכולת לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;תסדירים:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;תוכן:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>הסרת תסדיר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>תוכן פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;גודל&lt;/strong&gt; %1 ביתים</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>שרת CopyQ כבר מופעל.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>ביטול פקודות פעילות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>לבטל פקודות פעילות ולצאת?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>ביטול יציאה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>לצאת בכל מקרה</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+רווח</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>פקודות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>הגדרת פקודות חדשות שניתן לעורר, באמצעות תוכן חדש בלוח־הגזרים, באופן אוטומטי, על ידי משתמש מהתפריט או באמצעות קיצורי דרך של המערכת.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;חיפוש:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;טעינת פקודות…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>&amp;שמירת פריטים שנבחרו…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>העתקת פריטים שנבחרו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>הדבקת פקודות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>שינויים שלא נשמרו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>קיימים שימויים שלא נשמרו בדו־שיח פקודה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>פתיחת קובץ באמצעות פקודות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>פקודות (*.ini);; תצורת CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>שמירת פקודות שנבחרו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>פקודות (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>פקודה שמכילה רשימת תוכניות עם משתנים שיבוצעו. לדוגמה:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>משתנה תוכנית %1 יחליף את מלל הפריט.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>ניתן להשתמש בתו %1 כדי להעביר פלט תני לתוכנית הבאה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>ניתן להשתמש בתחביר הבא כדי להעביר את שאר הפקודה כפרמטר בודד.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>מייצר פלט זהה ל־%1 אך שימושי יותר עבור פקודות ארוכות יותר.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>ניתן להשתמש בפונקציות המפורטות להלן כמו בפקודות הבאות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>הצגת עזרת פקודה (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;שם:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>שם פקודה מוצג בתפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>סוג:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>להפעיל את הפקודה באופן אוטומטי אם בלוח־הגזירים יש תוכן חדש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>אוטו&amp;מטי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>הצגת פקודה בתפריט הקשר לפריטים מתאימים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>ב&amp;תפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>קיצור־דרך כללי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>סקריפט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>מצג</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;קיצור־דרך:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;קיצור־דרך כללי:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>פ&amp;קודה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;אפשרויות מתקדמות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>התאמת פריטים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;תוכן:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">לדלג על הפקודה אם מלל הקלט לא תואם לביטוי הרגיל הבא (להשאיר ריק להתאים הכל).\n\n%2 עד %9 בפקודה יוחלפע במלל שנלכד.\n\nדוגמאות:\n\n- התאמת כתובת URL: ^(https?|ftp)://\n- התאמת שם קובץ PDF: \\.pdf$\n- התאמת תו יחיד: ^.$\n- התאמת רב־מדיה מרוחקת: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;חלון:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;להשתמש בפקודה רק עבור פריטים שהועתקו ללוח־הגזירים מחלון עם מלל כותרת התואם את הביטוי הרגיל הזה (להשאיר ריק כדי להתאים לכל חלון). ב־macOS, הביטוי כולל את שם היישומון כשמקף (&amp;quot;-&amp;quot;)מפריד בינו לבין כותרת החלון. לדוגמה. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>תס&amp;דיר:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>נתונים מסוג MIME זה יישלחו כקלט פקודה תיקני.\nלהשאיר ריק כדי להשבית זאת.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;מסנן:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>דילוג על הפקודה אם פקודת המסנן כשלה עם קוד יציאה לא־אפס.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>פעולה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>העתקה ל&amp;לשונית:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>שם לשונית לתוכה יועתקו פריטים חדשים (להשאיר ריק כדי לא להעתיק)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>הסרת פריט תואם\n\nהערה: אם מוחל באופן אוטומטי, פקודות אוטומטיות אחרות לא תתבצענה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;הסרת פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>פעולת תפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>הסתרת חלון לאחר אפשור פקודה מפריט תפריט הקשר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;הסתרת חלון ראשי לאחר אפשור</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>אפשרויות פקודה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>פ&amp;לט:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>יצירת פריטים מפלט תוכניות תיקני (להשאיר ריק כדי להשבית)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>%מפריד:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>מפריד שמשמש התאמת פיצול הפלט לפריטים מרובים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>לשונית &amp;פלט:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>שמירת פריטים בלשונית עם שם נתון (להשאיר ריק לשמירה בלשונית ראשונה)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>הצגת דו־שיח פעולה לפני ביצוע הפקודה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;המתנה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>שינוי פריט, לא ליצור פריטים חדשים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>ה&amp;תמרה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>הצגת אפשרויות מתקדמות</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>רקע</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>רמז־צץ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>פריטים שנמצאו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>פריטים שנבחרו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>מספר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>תקין</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>עורך</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>גופן</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>חילוף</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>קידמה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>הודעה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>הצגת &amp;מספר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>הצגת סרגלי־גלילה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;סרגלי־גלילה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>שימוש בסמלילי סביבת שולחן העבודה ככל שניתן</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>סמליל מ&amp;ערכת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;אנטיאלייסינג</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>ה&amp;גדרת שבעים ללשוניות,סרגלי כלים ותפריטים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;שיצוב ערכת־נושא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>ערכת־נושא:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>טעינת ערכת־נושא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;שמירת ערכת־נושא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>עריכת ערכת נושא נוכחית בעורך חיצוני</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>&amp;עריכת ערכת־נושא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>תצוגה מקדימה:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>פתיחת קובץ ערכת נושא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>שמירת קובץ ערכת נושא בשם</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>אין עורך חיצוני</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>תחילה יש להגדיר פקודת עורך חיצוני!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>א-ב</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>מחרוזת חיפוש %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>בחירת פריט ולחיצה\nעל F2 לעריכה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>פריט דוגמה %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>כמה הערות אקראיות (Shift+F2 לעריכה)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;שפה:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>פיצול מלל אם ארוך מכדי להתאים לשורה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>עיטוף מלל א&amp;רוך</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>להשאיר חלון ראשי מעל לחלונות אחרים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>תמיד עליון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>סגירת חלון ראשי כאשר יישומים אחרים במוקד</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>סגירה כאשר לא במוקד</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>לאפשר פתיחת חלונות במרקע הנוכחי. להשבית לפתיחת חלונות שנסגרו לאחרונה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>פתיחת חלונות במרקע הנוכחי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>אישור יציאה מהישומון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>אישור י&amp;ציאה מהישומון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>הפעלת היישומון עם אתחול המערכת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;איתחול אוטומטי</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">תמיכה במפתחות ניווט Vi (H, J, K, L ועוד), מפתח לוכסן ( /) לחיפוש</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">סגנון ניווט Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>שמירה ושחזור היסטוריית מסנני הפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>שמירת היסטורית סינון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>הצגת חלון־צץ באופן אוטומטי להשלמת פעולה, סוג ושמות משתנים בפקודות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>פקודות השלמה אוטומטית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>טפלול לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>לאפשרהדבקת תוכן מועתק באופן זההל בחירת עכבר (בדרך כלל על ידי לחיצה על לחצן עכבראמצעי)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) הדבקת לוח־גזירים באמצעות עכבר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>לאפשר הדבקת פריטים שנבחרו באמצעות עכבר תוך שימוש בקיצור־דרך (בדרך כלל Ctrl+V או Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) הדבקת בחירת עכבר באמצעות מקלדת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>שמירת היסטורית לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) אחסון לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>שמירת מלל שנבחר באמצעות עכבר (בחירה ראשית) בהיסטוריה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) אחסון מלל שנבחר באמצעות עכבר</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) הפעלת פקודות אוטומטיות בעת בחירה</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>כמות פריטים מירבית בהיסטוריה:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>מספר פריטים מירבי בכל לשונית</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;פריקת לשונית לאחר מרווח־זמן בדקות:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>פריקת כל לשונית מהזיכרון לאחר חוסר פילות של מספר דקות מוגדר.\n\nהגדרת 0 כדי לא לפרוק לשוניות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>פקודת עורך חיצוני (%&amp;1 הוא קובץ לעריכה):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>פקודת עורך חיצוני (%1 הוא קובץ לעריכה).\nדוגמאות:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>ל&amp;שונית לאחסון לוח־גזירים:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>שם לשונית שתאחסן תוכן לוח־גזירים חדש באופן אוטומטי.\n\nלהשראיר ריק להשבתת אחסון אוטומטי.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>להשאיר לא מסומן כדי שמקש Return ישמור פריט שנערך ו־Ctrl+Return ייצור שורה חדשה.\n\nהערה: ניתן לשמור פריטים שנערכו באמצעות F2 מבלי להתחשב באפשרות זו.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>ש&amp;מירת פריטים שנערכו עם קיצור־דרך Ctrl+Return ויצירת קו חדש עם מקש Return</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>הצג תיאור כל פריט בשורה אחת.\n\nניתן להשתמש בתצוגת פריט מקדימה כדי להציג פריטים בשלמותם.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>ה&amp;צגת פריטים פשוטים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>לאפשר חיפוש מספרים, אחרת לחיצה על מקש ספרות תשפעל פריט במיקום זה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;חיפוש מספרים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>שפעול פריט בהקשה יחידה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>לאחר שפעול פריט (הקשת עכבר כפולה או מקש Enter), הוא יועתק לוח־גזירים ו...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>להעביר פריט לראש הרשימה לאחר שהוא שופעל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>העברת פריט ל&amp;ראש הרשימה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>סגירת החלון הראשי לאחר שופעל פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;סגירת חלון ראשי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>להתמקד על חלון אחרון לאחר שופעל פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;מיקוד על חלון אחרון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>הדבקה לחלון הנוכחי לאחר הפעלת פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>ה&amp;דבקה לחלון נוכחי</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>הצגה/הסתרה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>הסתרת לשוניות (לחיצה על מקש Alt להצגה)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>ה&amp;סתרת לשוניות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>הסתרת סרגל כלים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>הסתרת סרגל &amp;כלים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>הסתרת תויות סרגל כלים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>הסתרת חלון ראשי בעת סגירה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>הסתרת חלון &amp;ראשי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>עימוד ושקיפות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>הצגת עץ לשוניות במקום סרגל לשוניות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>עץ ל&amp;שוניות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>מיקוד שקיפות:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>שקיפות החלון הראשי אם הוא במוקד.\n\nהערה: לא נתמך בכול המערכות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>&amp;שקיפות בלתי ממוקדת:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>שקיפות החלון הראשי אם לא במוקד.\n\nהערה: לא נתמך בכול המערכות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>הצגת מספר פריטים בלשוניות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>ה&amp;צגת מספר פריטים</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;איות הודעה:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>איות הודעות על המרקע</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>מעלה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>מטה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>מעלה מימין</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>מטה מימין</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>מטה משמאל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>מעלה משמאל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>מרווח־זמן בשניות להצגת הודעות:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>מרווח־זמן בשניות להצגת התראה על תוכן חדש או העתקת פריט ללוח־הגזירים (רק כאשר החלון הראשי סגור).\n\nהגדרת 0 כדי להשבית אפשרות זו.\n\nהגדרת 1 כדי להישאר גלוי עד להקשה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>מספר שורות להודעות לוח־גזירים:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>מספר השורות שיוצגו עבור תוכן חדש בלוח־הגזירים.\n\nהגדרת 0 כדי להשבית.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;שימוש בהודעות מובנות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>גאומטרית הודעה (איות על המרקע)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>הסט א&amp;פקי:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>מרחק הודעה מימין או משמאל לאיות שפת המרקע</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>הסט א&amp;נכי:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>מרחק הודעה מלמעלה או מלמטה לאיות שפת המרקע</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>רוחב מ&amp;רבי:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>רוחב הודעה מירבי באיות המרקע</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>&amp;גובה מרבי:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>גובה הודעה מירבי באיות המרקע</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>לא להציג סמליל מגש; מזעור חלון בעת סבירה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>ה&amp;שבתת מגש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>הצגת פקודה לתוכן לוח־גזירים נוכחי בתפריט מגש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>הצ&amp;גת פקודה לתוכן לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>&amp;מספר הפריטים בתפריט מגש:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>מספר הפריטים בתפריט מגש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>הצגת פריטים מלשונית נוכחית בתפריט מגש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>הצגת לשונית נוכחית בתפריט,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>או ב&amp;חירת לשונית אחרת:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>שם לשונית להצגה בתפריט מגש (להשאיר ריק להצגת לשונית ראשונה)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>הדבקת פריט לחלון נוכחי לאחר בחירתו בתפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>הדבקת פריט משופעל לחלון נוכחי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>הצגת תצוגת תמונה מקדימה ליד פריטי תפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>ה&amp;צגת תצוגה מקדימה של תמונות כסמליל פריט תפריט</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>העדפות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>כללי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>עימוד</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>היסטוריה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>מגש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>הודעות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>לשוניות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>פריטים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>קיצורי־דרך</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>מראה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>ערך לא תקין לאפשרות &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>האם לשצב העדפות?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>פעולה זו תשצב את כל ההעדפות (בכל הלשוניות) לערכי ברירת מחדל.&lt;br /&gt;&lt;br /&gt; האם &lt;strong&gt; לשצב את כל ההעדפות &lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>נדרש אתחול</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>שפה תשתנה לאחר שתחול היישומון.</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>יצירת מחיצת סנכרון &quot;%1&quot; כשלה!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Down</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>בחירת סמליל…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>בחירת סמליל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>דפדוף...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>פתיחת קובץ סמליל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>קובצי תמונה (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;הכול</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;לשוניות:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>תי&amp;צור</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>&amp;הכול</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>פקודת עורך כשלה (נא לעיין ביומני פעולות)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>הצפנה כשלה!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>כדי לשתף פריטים מוצפנים במחשב או בשיח אחר, קובצי מפתח סודי אלה נדרשים (יש לשמור אותם במקום בטוח):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG חייב להיות מותקן כדי להציג לשוניות מוצפנות.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>הצפנה (נדרש GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>לפענח</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>פענוח והעתקה</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>פענוח והדבקה</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>אנטר</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>נכשל לייצר מפתחות.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>שגיאה: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>בוצע</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>יצירת מפתחות חדשים (עשוי לארוך מספר דקות).</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>ביטול</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>קביעת סיסמה חדשה...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>&lt;strong&gt;נדרש לחולל&lt;/strong&gt; מפתחות הצפנה לפני שניתן יהיה להשתמש בהצפנת פריט.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>חילול מפתחות חדשים...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>שינוי ססמה...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>פענוח כשל!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>הצפנה</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>הצפנת פריטים ולשוניות.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>כדי להצפין ולפענוח פריטים יש להוסיף פקודות מתאימות בלשונית פקודות.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>שיתוף פריטים מוצפנים ולשוניות</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>לשוניות מוצפנות</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt; שמות לשוניות מסוימים (שם אחד בשורה) שיוצפנו ויפוענחו באופן אוטומטי.&lt;/p&gt;\n&lt;p&gt;יש להגדיר מרווח־זמן לפריקת לשונית בלשונית ההסטוריה, כדי לפרוק מהזכרון, באופן בטוח, פריטים לא מוצפנים.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>לשונית משובשת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>לא כל הפריטים בלשונית &lt;strong&gt;%1&lt;/strong&gt; נטענו בהצלחה. האם לטעון את הלשונית בכול זאת עם התכנות לאובדן מספר פריטים?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>מתקע FakeVim הוא חלק מ־Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>חיקוי עורך Vim בעת עריכת פריטים.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>אפשור FakeVim לעריכת פריטים</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>נתיב לקובץ תצורה:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>תמונות</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>הצגת תמונות.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>&amp;רוחב תמונה מרבי:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>רוחב תמונה מרבי שמוצגת בהיסטוריה (קביעת אפס לגודל מקורי)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>&amp;גובה תמונה מרבי:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>גובה תמונה מרבי שתוצג בהיסטוריה (לקבוע אפס לגודל המקורי)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>פקודת עורך &amp;תמונות:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>פקודת עורך לתסדירי תמונות נתמכות מלבד SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>פקודת עורך &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>פקודת עורך לתסדירי תמונות SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>הערות</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>הצגת הערות פריטים.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>איות הערות</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>מ&amp;על לפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>מ&amp;תחת לפריט</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>ל&amp;צד פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>הצגת רמ&amp;ז־צץ</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>הו&amp;ספה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>הס&amp;רה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>העברה מעלה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>העברה מטה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>לעבור לראש הרשימה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>לעבור לתחתית‏ הרשימה</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>לא ניתן להסיר פריטים נעוצים</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>חילוץ נעיצת פריטים כדי להסירם.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>נעיצה</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>חילוץ נעיצה</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>פריטים נעוצים</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;לנעוץ פריטים ולנעול אותם בשורה הנוכחית ולמנוע מחיקה (אלא אם הנעיצה חולצה).&lt;/p&gt;&lt;p&gt;מאפשר קיצורי־דרך ויכולות תסרוט.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>דפדוף...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>פתיחת מחיצה לסינכרון</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>יצירת מחיצת סינכרון כשלה</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>סינכרון</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>סינכרון פריטים והערות עם מחיצה על כונן.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>סינכרון לשונת &quot;%1&quot; עם מחיצה &quot;%2&quot; כשל!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>האם להסיר פריטים?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>האם &lt;strong&gt;להסיר פריטים וקבצים מוסמכים&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>סנכרון לשוניות ומחיצות</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;סנכרון תוכן &lt;strong&gt;לשונית&lt;/strong&gt; עם מחיצה ב&lt;strong&gt;נתיב&lt;/strong&gt; נתון.&lt;/p&gt;\n&lt;p&gt;הגדרת&lt;strong&gt; נתיב ריק&lt;/strong&gt; כדי לא לשמור פריטים ב&lt;strong&gt;לשונית&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>שם לשונית</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>נתיב</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>קבצים לתסדירי נתוני פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;הגדרת סוג מדיה ל&lt;strong&gt;&apos;-&apos;&lt;/strong&gt; (סימן חיסור) כדי להתעלם מקבצים. קבצים לא ידועים או מוסתרים אחרים יתעלמו.&lt;/p&gt;\n&lt;p&gt;דוגמה: טעינת קובץ בסיומת &lt;strong&gt;txt&lt;/strong&gt; כסוג מדיה &lt;strong&gt;מלל/רגיל&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>הרחבות</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>סיג פריט מדיה</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>הוספת תג</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>הסרת תג</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>מיתוג תג %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>לא ניתן להסיר פריט כשתג נעול</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>יש להסיר תגים מפריטים לפני שניתן יהיה להסירם.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>פריטים חשובים</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>לנקות את כל התגים</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>תגים</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>הצגת תגי פריטים.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>ניתן להוסיף ולהתאים אישית פריטי תפריט להוספת והסרת תגים מותאמים אישית בדו־שיח פקודות.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>מידע נוסף זמין בעמוד ויקי &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>שם תג</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>התאמה</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>גיליון סגנון</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>צבע</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>סמליל</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>לנעול</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>להימנע הסרת פריט</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>מלל</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>הצגת מלל ופריטHTML פשוטים.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>שמירה והצגת HTML ןמלל עשיר</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>מספר קווים מרבי לתצוגה (0 כדי להראות את הכל):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>גובה מרבי בפיקסלים (0 ללא הגבלה):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>גיליון סגנון בררת מחדל:</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>יומן־רשומות</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>פרטי CopyQ (*cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>ה&amp;צגה/הסתרה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>לצאת?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>האם &lt;strong&gt;לצאת&lt;/strong&gt; מ־CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;קובץ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;עריכה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;לשוניות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;עזרה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;לשונית חדשה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>שינוי שם &amp;קבוצה %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>שינוי &amp;שם לשונית %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>ה&amp;סרת לשונית %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>הסרת קבוצה %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>ה&amp;חלפת סמליל לשונית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;לוח־גזירים: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>אפשרויות ייבוא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>שגיאת copyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>אפשרויות יצוא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>שגיאת ייצוא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>ייצוא קובץ %1 כשל!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>שגיאת ייבוא</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>ייבוא קוץ %1 כשל!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>האם להסיר את כל התגים בקבוצה?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>האם לנסיר את &lt;strong&gt;כל הלשוניות&lt;/strong&gt; בקבוצה &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>האם להסיר לשונית?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>האם להסיר לשונית&lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>מידע</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;מוסתר&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n שורה)</numerusform>\n            <numerusform>%1 (%n שורות)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;תמונה&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;פריטים&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;ריק&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;נתונים&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>רווח אחורי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>מחיקה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>פריט &amp;חדש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;ייבוא...</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;ייצוא...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;העדפות...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>פ&amp;קודות...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>הצגת תוכן לוח־&amp;גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>ה&amp;צגת תצוגה מקדימה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>מ&amp;תוג אחסון לוח־גזירים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>מנהל &amp;תהליכים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>יצי&amp;אה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>מיון פריטים שנבחרו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;היפוך מיון פריטים שנבחרו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>ה&amp;דבקת פריטים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>ה&amp;עתקת פריטים שנבחרו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;חיפוש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>שמירת פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>ביטול עריכה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>ביטול פעולה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>החזרת פעולה שבוטלה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>גופן</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>תו מודגש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>תו נטוי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>קו תחתון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>קו חוצה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>קידמה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>רקע</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>סגנון מחיקה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>חיפוש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>לש&amp;פעל פריטים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>ה&amp;צגת תוכן...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>ה&amp;סרה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;עריכה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>עריכת ה&amp;ערות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>ע&amp;ריכה באמצעות עורך</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;פעולה...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>העברה מעלה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Up</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>העברה מטה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Down</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>העברה לראש הרשימה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>העברה לתחתית הרשינה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>לשונית &amp;חדשה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>שינוי &amp;שם לשונית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>ה&amp;סרת לשונית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>ה&amp;חלפת סמליל לשונית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>הלשונית ה&amp;באה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>ימין</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>הלשונית ה&amp;קודמת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>שמאל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;עזרה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>הצגת יומן־&amp;פעולות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>על־&amp;אודות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>פתיחת תפריט הקשר של פריט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>לשונית %1 פגומה או שכמה מתקעי CopyQ חסרים!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>שם שיח חייב להכיל 16 תווים לכל היותר\nשיכולים להיות אותיות, ספרות, &apos;-&apos; או &apos;_&apos;!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>מלל הועתק ( שורה %n)</numerusform>\n            <numerusform>מלל הועתק (%n שורות)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>מלל הועתק</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>נתונים הועתקו</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">ביטול</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>הצגת חלון ראשי ולחלופין פתיחת לשונית בשם נתון.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>שם</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>הסתרת חלון ראשי.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>הצגת או הסתרת חלון ראשי.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>פתיחת תפריט הרשר.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>יציאה מהשרת.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>להשבית או לאפשר אחסון תוכן לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>הדפסת תוכן לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>הדפסת בחירת תוכן X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>הדבקת לוח־גזירים לחלון נוכחי\n(עשוי לא לעבוד עם כמה יישומונים).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>העתקת לוח־גזירים מחלון נוכחי\n(עשוי לא לעבוד עם כמה יישומונים).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>הגדת מלל לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>מלל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>הגדרת תוכן לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>נתונים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>הדפסת מספר הפריטים בלשונית נוכחית.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>העתק פריט שבשורה אל לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>שורה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>העתקת הפריט הבא מלשונית נוכחית לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>העתקת פריט קודם מלשונית נוכחית לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>להוסיף מלל לתוך לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>להכניס מלל לשורה נתונה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>להסיר פריטים משורה נתונה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>שורות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>עריכת פריטים או עריכת חדשים.\nערך1 - הוא למלל הנוכחי לוח־גזירים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>הגדרת מפריד לפריטים בפלט.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>מפריד</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>הדפסת נתוני לוח־גזירים גולמיים או פריט בשורה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>כתיבת נתונים גולמיים לשורה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>הצגת דו־שיח פעולה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>הפעלת תוכנית על פריט מלל בשורות.\nלהשתמש בתוכנית ב־%1 כדי להעביר מלל כמשתנה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>תוכנית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>הצגת הודעה חלון־צץ למשך אלפיות שניה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>כותרת</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>הודעה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>זמן</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>רשימת שמות לשוניות זמינים.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>הפעלת פקודה מלשונית בשם נתון.\nאם הלשונית לא קיימת היא תיווצר.\nברירת מחדל היא הלשונית הראשונה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>פקודה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>הסרת לשונית.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>שינוי שם לשונית.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>שם_חדש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>ייצוא פריטים לקובץ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>שם_קובץ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>ייבוא פריטים מקובץ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>רשימת כל האפשרויות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>קבלת ערך אפשרות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>אפשרות</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>הגדרת ערך אפשרויות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>ערך</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>הערכת תסריט.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>סקריפט</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>משתנים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>אתחול או התחברות לאדגם יישומוןן עם שם שיח נתון.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>שיח</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>הדפסת עזרה לפקודה או לכל הפקודות.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>הדפסת גרסת תוכנית וספריות.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">הפעלת בדיקות יישומום (append - משתנה עזרה לקבלת מידע נוסף).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>אתחול שרת ברקע לפני הפעלת פקודה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>שימוש: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>אתחול שרת אם לא צויינה פקודה.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  פקודות:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>העות:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  להשתמש במשתנה מקף (-) כדי לקרוא נתונים מקלט רגיל.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - להשתמש במשתנה מקף כפול (--) כדי לקרוא את כל המשתנים הבאים ללא\n    הרחבת רצפי בריחה (כלומר \\n, \\t ואחרים).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - להשתמש ב־? עבור MIME כדי להדפיס סוגי MIME זמינים (ברירת מחדל הוא &quot;מלל/רגיל&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>לא ניתן לשמור קובץ &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">לא ניתן לשמור לקובץ &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">לא ניתן לייבא קובץ &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>מנהל לוח־גזירים CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>לא נמצא פקודה!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>סיום שרת.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>אפשרות &quot;%1&quot; לא תקינה!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>חריגה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>חריגה ב־%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>העתקה ללוח־גזירים כשלה!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>לא קיימת לשונית בשם הנתון!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>שם לשונית לא יכול להיות ריק!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>לשונית בשם הנתון קיימת כבר!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*דו־שיח אחסון לוח־גזירים*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>הוספת קיצור־דרך</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>קיצור־דרך חדש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>הסרת קיצור־דרך</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;חיפוש:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;כללי</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>ניתן להפעיל קיצורי דרך כלליים מכל יישומון.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;יישומון</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>ניתן להפעיל קיצורי דרך יישומונים רק מהחלון הראשי.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>קיצור־דרך קיים כבר!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\">שם הכרטיסייה אינו יכול להיות ריק, וחייב להיות ייחודי.&lt;br /&gt;\nניתן לפתוח את הכרטיסייה &lt;b&gt;No&amp;amp;tes&lt;/b&gt; באמצעות &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nהשתמש ב-&lt;b&gt;/&lt;/b&gt; כמפריד נתיבים בפריסת כרטיסיית תצוגת עץ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;שם:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>לשונית חדשה</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>שינוי שם לשונית</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>שינוי שם קבוצת לשוניות</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>מ&amp;פר פריטים מירבי:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>ברירת מחדל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;שמירת פריטים</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>לחיצה על &apos;/&apos; לחיפוש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>להקליד כדי לחפש</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>ביטוי רגיל</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>לא רגיש לרישיות</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_hr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"hr_HR\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Informacije</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Upravljač međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Doniraj</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Dijalog radnje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>&amp;Naredba:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standardni &amp;unos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Spremi standardni rez&amp;ultat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Pošalji podatke zadane vrste medija na standardni unos naredbe (ostavi prazno za deaktiviranje)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Stvori elemente iz standardnog rezultata programa (ostavi prazno za isključavanje)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Znak razdvajanja za nove elemente:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Regularni izraz za rastavljanje rezultata u pojedinačne elemente.&lt;\\p&gt;\n&lt;p&gt;Koristi &lt;b&gt;\\n&lt;/b&gt; za spremanje svakog retka u zasebni element.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Kartica &amp;rezultata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Spremi elemente u karticu sa zadanim imenom (ostavi prazno za spremanje u trenutačnu karticu)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Naredba spremljena</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Naredba je spremljena i može joj se pristupiti u izborniku elemenata.\nNaredbu je moguće postaviti u postavkama.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Greška: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Kod za zatvaranje: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Naredba %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Upravljač procesa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Prekini odabrano</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Dodaj naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Prikaži/sakrij glavni prozor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Prikaži izbornik programske trake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Prikaži glavni prozor ispod pokazivača miša</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Uredi međuspremnik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Uredi prvi element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Kopiraj drugi element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Prikaži dijalog radnje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Stvori novi element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Kopiraj sljedeći element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Kopiraj prethodni element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Umetni međuspremnik kao običan tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Deaktiviraj spremanje međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Aktiviraj spremanje međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Kopiraj i umetni sljedeće</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Kopiraj i umetni prethodno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Snimi sliku ekrana</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Umetni trenutačni datum i vrijeme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nova naredba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Zanemari elemente s nijednim ili sa samo jednim znakom</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Otvori u &amp;pregledniku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Umetni kao običan tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Automatski pokreni videosnimke</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Kopiraj URL (web-adresu) u drugu karticu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Stvori minijature (treba ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Stvori QR-kod iz URL-a (treba qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Zadaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Dodaj kartici „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Premjesti na karticu „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Zanemari kopirane datoteke</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Zanemari prozor *„Lozinka”*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Lozinka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Premjesti u smeće</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(smeće)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Izbriši trenutačnu karticu</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Nije moguće dodati nove elemente u karticu „%1”. Oslobodi mjesta ručnim uklanjanjem elemenata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Odbaciti promjene?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Zaista želiš &lt;strong&gt;odabaciti promjene&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Veza izgubljena!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Nije moguće povezati se s poslužiteljem. Najprije pokreni poslužitelj CopyQ-a.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Sadržaj međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formati:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Sadržaj:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Ukloni format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Sadržaj elementa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Veličina:&lt;/strong&gt; %1 bajta</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ poslužitelj je već pokrenut.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Prekini aktivne naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Prekinuti aktivne naredbe i zatvoriti program?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Prekini zatvaranje programa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Svejedno zatvori</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Razmaknica</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Odredi nove naredbe koje se mogu automatski pozvati na novom sadržaju međuspremnika ili koje korisnik može pozvati iz izbornika ili pomoću sustavskih prečaca.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Nađi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Učitaj naredbe …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Spre&amp;mi odabrano …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopiraj odabrano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Umetni naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Nespremljene promjene</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Dijalog naredbi sadrži nespremljene promjene.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Otvori datoteke s naredbama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Naredbe (*.ini);; CopyQ konfiguracija (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Spremi odabrane naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Naredbe (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Spremi naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Neuspjelo spremanje naredbi u datoteku „%1”: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Naredba sadrži popis programa s argumentima koji će se izvršiti. Na primjer:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Programski argument „%1” bit će zamijenjen za tekst elementa, a „%2” do „%9” za tekstove koji se pronađu regularnim izrazom.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Programski argument %1 zamijenit će se za tekst elementa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Znak „%1” može se koristiti za prosljeđivanje standardnog rezultata sljedećem programu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Sljedeća sintaksa može se koristiti za prosljeđivanje ostatka naredbe kao jedan parametar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Ovo daje isti rezultat kao „%1”, ali je korisnije za duže naredbe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Dolje nabrojane funkcije mogu se koristiti kao u sljedećim naredbama.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;međuspremnik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Prikaži naredbu za pomoć (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Ime:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>U izborniku prikazano ime naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Vrsta:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Prečac:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Globalni prečac:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Nare&amp;dba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Napredno</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Vrsta radnje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Pokreni naredbu automatski, ako međuspremnik ima novi sadržaj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matski</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Prikaži naredbu u kontekstualnom izborniku poklapajućih elemenata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>U &amp;izborniku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Globalni prečac</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skripta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Prikaz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Poklopi elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Sadržaj:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Koristi naredbu samo za elemente, čiji se tekst poklapa s ovim regularnim izrazom (ostavi prazno za bilo koje poklapanje).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Primjeri:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Poklopi URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Poklopi imena PDF datoteka    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Poklopi jedan znak    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Poklopi udaljenu multimediju    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Prozor:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Koristi naredbu samo za elemente koji su kopirani u međuspremnik iz prozora s tekstom naslova, koji se poklapa s ovim regularnim izrazom (ostavi prazno za poklapanje s bilo kojim prozorom). Na macOS-u ovo sadrži ime programa, nakon kojeg slijedi crtica (&amp;quot;-&amp;quot;), a zatim naslov prozora. Npr. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;mat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Podaci ove MIME vrste bit će poslani na standardni unos naredbe.\nOstavi prazno za deaktiviranje ovoga.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtar:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Koristi naredbe samo ako naredba filtra uspije.&lt;/p&gt;\n\n&lt;p&gt;Tekst elementa proslijeđuje se &lt;b&gt;standardnom unosu&lt;/b&gt; naredbe filtra. Element se &lt;b&gt;poklapa samo, ako je izlazni kod naredbe filtra 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Koristi &lt;b&gt;%1&lt;/b&gt; za tekst elementa koji se proslijeđuje kao argument, a &lt;b&gt;%2&lt;/b&gt; do &lt;b&gt;%9&lt;/b&gt; za argumente dobivene regularnim izrazom (dijelovi uključeni u zagradama).&lt;/p&gt;\n\n&lt;p&gt;Koristi &lt;b&gt;|&lt;/b&gt; za povezivanje naredbi (proslijedi standardni rezultat sljedećoj naredbi).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Preskače naredbu ako tekst unosa ne odgovara ovom regularnom izrazu (ostavi prazno da odgovara svemu).\n\n%2 do %9 u naredbi i filtru zamijenit će se snimljenim tekstovima.\n\nPrimjeri:\n\n- Uskladi URL: ^(https?|ftp)://\n- Uskladi imena PDF datoteka: \\.pdf$\n- Uskladi jedan znak: ^.$\n- Uskladi udaljene multimedije: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Preskače naredbu ako ulazni tekst ne odgovara ovom regularnom izrazu (ostavi prazno kako bi odgovaralo svemu).\n\n%2 do %9 (ili argument[1] i nadalje u skripti) u Naredbi i Filtru će se zamijeniti s uhvaćenim tekstovima.\n\nPrimjeri:\n\n- Podudaranje URL-a: ^(https?|ftp)://\n- Podudaranje imena PDF datoteka: .pdf$\n- Podudaranje jednog znaka: ^.$\n- Podudaranje udaljenog multimedijskog sadržaja: ^http://.*.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Preskače naredbu ako naredba filtra završi kodom koji nije nula.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Radnja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>&amp;Kopiraj u karticu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Ime kartice u koju se kopiraju novi elementi (ostavi prazno, da se ne kopiraju)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Ukloni poklapajući element\n\nNapomena: Ako se ovo automatski primijeni, ostale automatske naredbe se ne izvršavaju.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Ukloni element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Radnje u izborniku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Sakrij prozor nakon aktiviranja naredbe u kontekstnom izborniku elementa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Sakrij glavni prozor nakon aktiviranja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Opcije naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Rez&amp;ultat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Stvori elemente iz standardnog rezultata programa (ostavi prazno za deaktiviranje)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Znak razdvajanja:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Znak razdvajanja za rastavljanje rezultata u pojedinačne elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Kartica &amp;rezultata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Spremi elemente u karticu sa zadanim imenom (ostavi prazno za spremanje u prvu karticu)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Prikaži dijalog radnje prije izvršavanja naredbe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>Č&amp;ekaj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Promijeni element, nenoj stvoriti nove elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformiraj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Prikaži napredne</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Stražnja boja</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Napomene</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Opis alata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Pronađeno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Odabrano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Broj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normalno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Uređivač</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Font</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Zamjena</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Prednja boja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Obavijest</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Prikaži &amp;broj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Prikaži klizne trake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Klizne trake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Koristi ikone radne površine kad god moguće</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>&amp;Ikone sustava</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Zaglađivanje rubova</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Postavi boj&amp;e za kartice, alatnu traku i izbornike</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Vrati standardnu temu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Učitaj temu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Spremi temu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Uredi trenutačnu temu u vanjskom uređivaču</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Ure&amp;di temu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Pretprikaz:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Otvori datoteku teme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Spremi datoteku teme kao</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Nema vanjskog uređivača</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Najprije postavi naredbu za vanjski uređivač!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Znakovni niz za pretragu je „%1”.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Odaberi element i\npritisni F2 za uređivanje.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Element primjera %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Neke slučajno odabrane napomene (Shift+F2 za uređivanje)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Jezik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Prelomi tekst, ako je predugačak da bi stao u redak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Prel&amp;omi dugačak tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Zadrži glavni prozor ispred ostalih prozora</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Uvije&amp;k ispred ostalih</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Zatvori glavni prozor kad je fokusiran jedan drugi program</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Zatvori kad nije fokusiran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Aktiviraj za otvaranje prozora na trenutačnom ekranu. Deaktiviraj za otvaranje prozora na mjestu gdje su zadnji put zatvoreni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Otvori &amp;prozore na trenutačnom ekranu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Potvrdi zatvaranje programa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Potvrdi &amp;zatvaranje programa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Pokreni program nakon pokretanja sustava</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Automatsko pokretanje</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Podrška za navigacijske tipke za Vi (H, J, K, L i više), kosa crta (/) za pretragu</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Vi stil navigacija</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Spriječi snimanje prozora aplikacija u slikama ekrana i u snimkama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Sakrij od slika ekrana i snimki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Stil navigacije / Tipke:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Podrška za Vi navigaciju (tipke H, J, K, L, / i više) i Emacs navigaciju (Ctrl+N, P, V i više)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Standardno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Spremi i obnovi kronologiju filtara elemenata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Spremi kronologiju filtara</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Automatski prikaži skočni prozor za dovršavanje funkcije, vrste i imena varijabli u naredbama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Automatsko dovršavanje naredbi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipuliranje međuspremnikom</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Dozvoli umetanje kopiranog sadržaja na isti način kao odabir mišem (obično pritiskom srednje tipke miša)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Umetni međuspremnik s mišem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Dozvoli umetanje odabira mišem koristeći prečac (obično Ctrl+V ili Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Umetni odabir mišem s tipkovnicom</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Spremi međuspremnik u kronologiju</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Spremi međuspremnik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Spremi mišem odabrani tekst (primarni odabir) u kronologiju</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Spremi mišem odabrani tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Pokreni automatske naredbe na odabir</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Maksimalni broj elemenata u kronologiji:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Maksimalni broj elemenata u svakoj kartici</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Ukloni karticu nakon određenog vremena u minutama:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Ukloni svaku karticu iz memorije nakon određenog vremena neaktivnosti u minutama.\n\nPostavi na 0 za neuklanjanje kartica.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Naredba za vanjski uređivač („%&amp;1” je datoteka koja se uređuje):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Naredba za vanjski uređivač („%1” je datoteka koja se uređuje).\n  Primjeri:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>&amp;Kartica za spremanje međuspremnika:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Ime kartice koja će automatski spremiti novi sadržaj međuspremnika.\n\nOstavi prazno za deaktiviranje automatskog spremanja.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Ostavi neoznačeno, kako bi se tipkom Return spremio uređeni element i tipkama Ctrl+Return stvorio novi redak.\n\nNapomena: Uređeni elementi mogu se spremiti pomoću tipke F2, zanemarujući ovu opciju.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>&amp;Spremi uređeni element pomoću Ctrl+Return i stvori novi redak pomoću tipke Return</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Prikaži jednoredni opis svakog elementa.\n\nKoristi „Element &gt; Prikaži pretprikaz” za prikaz cijelih elemenata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>&amp;Prikaži jednostavne elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Aktiviraj traženje brojeva, inače se pritiskom numeričke tipke aktivira element na tom položaju</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Traži brojeve</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Aktiviraj element jednim pritiskom</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Nakon aktiviranja elementa (dvaput pritisni mišem ili tipku Enter), kopiraj ga u međuspremnik i …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Premjesti element na vrh popisa nakon što ste se aktivira</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Premjesti element na &amp;vrh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Zatvori glavni prozor nakon što ste se element aktivira</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Zatvori glavni prozor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Fokusiraj zadnji prozor nakon aktiviranja elementa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Fokusiraj zadnji prozor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Umetni u trenutačni prozor nakon što ste se element aktivira</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>U&amp;metni u trenutačni prozor</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Prikaži/Sakrij</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Sakrij kartice (pritisni tipku Alt za prikaz)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Sa&amp;krij kartice</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Sakrij alatnu traku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Sakrij &amp;alatnu traku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Sakrij &amp;oznake alatne trake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Sakrij glavni prozor kad se zatvori</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Sakrij g&amp;lavni prozor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Prikaz i prozirnost</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Prikaži stablo s karticama umjesto trake kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Stablo s ka&amp;rticama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Prozirnost &amp;fokusiranog:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Prozirnost glavnog prozora kad je fokusiran.\n\nNapomena: Ovo nije podržano u svim sustavima.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Prozirnost &amp;nefokusiranog:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Prozirnost glavnog prozora kad nije fokusiran.\n\nNapomena: Ovo nije podržano u svim sustavima.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Prikaži broj elemenata u karticama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Prikaži &amp;broj elemenata</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Položaj obavijesti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Položaj obavijesti na ekranu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Gore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Dolje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Gore desno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Dolje desno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Dolje lijevo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Gore lijevo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Vrij&amp;eme u sekundama za prikaz obavijesti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Vrijeme u sekundama za prikaz obavijesti za novi sadržaj međuspremnika ili ako se element kopira u međuspremnik (samo ako je glavni prozor zatvoren).\n\nPostavi na 0 za deaktiviranje ove mogućnosti.\n\nPostavi na -1 za prikazivanje obavijesti, sve dok se ne pritisne.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>&amp;Broj redaka za obavijesti međuspremnika:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Broj prikazanih redaka za novi sadržaj međuspremnika:\n\nPostavi 0 za deaktiviranje prikaza.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Koristi izvorne obavijesti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geometrija obavijesti (u ekranskim točkama)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>&amp;Vodoravni odmak:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Udaljenost obavijesti od lijeve ili desne strane ruba ekrana u ekranskim točkama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Okomiti odmak:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Udaljenost obavijesti od gornje ili donje strane ruba ekrana u ekranskim točkama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>&amp;Maksimalna širina:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Maksimalna širina obavijesti u ekranskim točkama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Ma&amp;ksimalna visina:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Maksimalna visina obavijesti u ekranskim točkama</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Ne prikazuj ikonu programske trake; sklopi prozor kad se zatvori</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>D&amp;eaktiviraj programsku traku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Prikaži naredbe za trenutačni sadržaj međuspremnika u izborniku programske trake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Prikaži naredbe &amp;za sadržaj međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Broj elemenata &amp;u izborniku programske trake:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Broj elemenata u izborniku programske trake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Prikaži elemente trenutačne kartice u izborniku programske trake</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>P&amp;rikaži trenutačnu karticu u izborniku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>ili odaberi jednu drugu karti&amp;cu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Ime kartice za prikaz u izborniku programske trake (prazno za prvu karticu)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Umetni element u trenutačni prozor nakon što ste se odabere u izborniku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Umetni aktivirani element u trenutačni prozor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Prikaži pretprikaz slike pored elemenata izbornika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Prikaži pretprikaz slike ka&amp;o ikonu elementa izbornika</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Konfiguracija</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Opće</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Raspored</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Kronologija</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Programska traka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Obavijesti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Kartice</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Prečaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Izgled</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Neispravna vrijednost za opciju „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Vratiti postavke na standardne vrijednosti?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Ova radnja vraća sve postavke (u svim karticama) na standardne vrijednosti.&lt;br /&gt;&lt;br /&gt;Zaista želiš &lt;strong&gt;vratiti sve postavke&lt;/strong&gt; na standardne vrijednosti?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Zahtijeva ponovno pokretanje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Jezik će se promijeniti nakon ponovnog pokretanja programa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Postavke</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Neuspjelo stvaranje mape za sinkronizaciju „%1”!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Dolje</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Odberi ikonu …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>…</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Odberi ikonu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Pregledaj …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Otvori datoteku ikone</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Slikovne datoteke (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Sve</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Kartice:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Ko&amp;nfiguracija</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Na&amp;redbe</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">kod za zatvaranje uređivača je „%1”</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Naredba za uređivač: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Naredba uređivača nije uspjela (pogledaj dnevnike)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Spremi</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Spremi element (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Prekini</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Prekini uređivanje i poništi promjene</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Escape</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Poništi</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Ponovi</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Font</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Podebljano</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Ukošeno</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Podcrtano</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Precrtano</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Prednja boja</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Stražnja boja</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Izbriši stil</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Traži</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Šifriranje neuspjelo!</translation>\n    </message>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Za dijeljenje šifriranog elementa na drugom računalu ili primjerku programa, potrebne su javne i tajne datoteke ključeva:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Čuvaj ovaj tajni ključ na sigurnom mjestu.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Za dijeljenje šifriranih stavki na drugom računalu ili sesiji trebat ćete ove datoteke s tajnim ključem (čuvajte ih na sigurnom mjestu):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Za prikaz šifriranih kartica GnuPG mora biti instaliran.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Šifriraj (treba GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Dešifriraj</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Dešifriraj i kopiraj</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Dešifriraj i umetni</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Neuspjelo generiranje ključeva.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Greška: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Gotovo</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Stvaranje novih ključeva (ovo može potrajati par minuta) …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Prekini</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Postavljanje nove lozinke …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Za šifriranje elemenata, najprije se&lt;strong&gt;moraju generirati&lt;/strong&gt; ključevi za šifriranje.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Generiraj nove ključeve …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Promijeni lozinku …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Dešifriranje neuspjelo!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Šifriranje</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Šifriraj elemente i kartice.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Za šifriranje i dešifriranje elemenata, dodaj odgovarajuće naredbe u kartici „Naredbe”.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Dijeljenje šifriranih elemenata i kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Šifrirane kartice</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Odredi imena kartica (jedno ime po retku) koje će se automatski šifrirati i dešifrirati.&lt;/p&gt;\n&lt;p&gt;Postavi vrijeme za uklanjanje kartice u kartici kronologije za sigurno uklanjanje dešifriranih elemenata iz memorije.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Oštećena kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Sve stavke na kartici &lt;strong&gt;%1&lt;/strong&gt; nisu uspješno učitane. Želiš li i dalje učitati karticu i potencijalno izgubiti neke stavke?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Dodatak FakeVim je dio Qt Creatora</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emuliraj Vim uređivač tijekom uređivanja elemenata.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Aktiviraj FakeVim za uređivanje elemenata</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Staza do konfiguracijske datoteke:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Slike</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Prikaži slike.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Maksimalna š&amp;irina slike:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Maksimalna širina slike prikazana u kronologiji (postavi na nula za izvornu veličinu)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Maksimalna &amp;visina slike:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Maksimalna visina slike prikazana u kronologiji (postavi na nula za izvornu veličinu)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>&amp;Naredba za uređivač slika:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Naredba za uređivač koji podržava slikovne formate koji nisu SVG format.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Naredba za uređivač &amp;SVG-ova:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Naredba za uređivač slika u SVG formatu.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Napomene</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Prikaži napomene za elemente.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Položaj napomena</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>I&amp;znad elementa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>I&amp;spod elementa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Pored ele&amp;menta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Prikaži &amp;savjete</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>Dod&amp;aj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Ukloni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Pomakni gore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Pomakni dolje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Pomakni skroz gore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Pomakni skroz dolje</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Gore</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Dolje</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Nije moguće ukloniti prikvačene elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Za uklanjanje elemenata najprije ih otkvači.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Prikvači</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Otkvači</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Prikvačeni elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Prikvači elemente da bi se zaključali u trenutačnom retku i da bi se izbjeglo brisanje (osim ako nisu otkvačeni).&lt;/p&gt;&lt;p&gt;Omogućuje upotrebu prečaca i skriptanja.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Pregledaj …</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Otvori mapu za sinkronizaciju</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Neuspjelo stvaranje mape za sinkronizaciju</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sinkroniziraj</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Sinkroniziraj elemente i napomene s mapom na disku.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Neuspjelo sinkroniziranje kartice „%1” s mapom „%2”!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Ukloniti elemente?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Zaista želiš &lt;strong&gt;ukloniti elemente i povezane datoteke&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Sinkronizacija kartica i mapa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sinkroniziraj sadržaj &lt;strong&gt;kartice&lt;/strong&gt; s mapom zadane &lt;strong&gt;staze&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Postavi &lt;strong&gt;praznu stazu&lt;/strong&gt; kako se elementi ne bi spremali u &lt;strong&gt;karticu&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Ime kartice</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Staza</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Datoteke u datotečne formate elemenata</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Za zanemarivanje datoteka, postavi vrstu medija na &lt;strong&gt;-&lt;/strong&gt; (crtica). Sve ostale nepoznate ili skrivene datoteke se zanemaruju.&lt;/p&gt;\n&lt;p&gt;Primjer: Učitaj datotečni nastavak &lt;strong&gt;txt&lt;/strong&gt; kao &lt;strong&gt;tekstualnu/običnu&lt;/strong&gt; vrstu medija.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Nastavci</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Medijska vrsta elementa</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Dodaj oznaku</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Ukloni oznaku</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Označi kao „%1”</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Ukloni oznaku „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Uključi/Isključi oznaku %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Nije moguće ukloniti elemente sa zaključanom oznakom</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Za uklanjanje elemenata najprije ih odznači.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Važno</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Ukloni sve oznake</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Oznake</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Prikaži oznake za elemente.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Elementi izbornika za dodavanje i uklanjanje prilagođenih oznaka mogu se dodati i prilagoditi u dijalogu „Naredbe”.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Daljnje informacije dostupne su na &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki stranici&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Ime oznake</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Poklapanje</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Definicija stilova</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Boja</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ikona</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Lokot</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Izbjegni uklanjanje elementa</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Prikaži običan tekst i jednostavne HTML elemente.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Spremi i prikaži HTML i formatirani tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Maksimalni broj prikazanih redaka (0 za prikaz svih):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Maksimalna visina u pikselima (0 za neograničenu):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Standardna definicija stilova:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Prikaži web-stranice.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Maksimalna visina u pikselima (0 za neograničenu):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Log-zapis</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ elementi (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>Prikaž&amp;i/Sakrij</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Zatvoriti?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Želiš li &lt;strong&gt;zatvoriti&lt;/strong&gt; CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Datoteka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Uredi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Kartice</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Pomoć</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nova kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Ukloni &amp;grupu „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Preime&amp;nuj karticu „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Ukl&amp;oni karticu „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Ukloni grupu „%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>P&amp;romijeni ikonu kartice</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Međuspremnik: %1</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Aktiviraj spremanje međuspremnika</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">D&amp;eaktiviraj spremanje međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Opcije za uvoz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ greška</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Opcije za izvoz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Greška izvoza</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Neuspio izvoz datoteke „%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Greška uvoza</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Neuspio uvoz datoteke „%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Ukloniti sve kartice iz grupe?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Želiš li ukloniti &lt;strong&gt;sve kartice&lt;/strong&gt; u grupi &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Ukloniti karticu?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Želiš li ukloniti karticu &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Podaci</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;međuspremnik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;SKRIVENO&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n redak)</numerusform>\n            <numerusform>%1 (%n retka)</numerusform>\n            <numerusform>%1 (%n redaka)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;SLIKA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ELEMENTI&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;PRAZNO&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;PODACI&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Tipka Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Tipka Delete</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Novi element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>U&amp;vezi …</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Izvezi …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Postavke …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">Nared&amp;be/Globalni prečaci …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>Nared&amp;be …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Prikaži sadržaj &amp;međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Prikaži &amp;pretprikaz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Uklj/Isklj spremanje međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Upravljač p&amp;rocesa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Zatvori</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Razvrstaj odabrane elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Obrni redoslijed odabranih elemenata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Umetni elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Kopiraj odabrane elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>N&amp;ađi</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Premjesti u &amp;međuspremnik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;ktivitaj elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Prikaži &amp;sadržaj …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>U&amp;kloni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Uredi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Uredi &amp;napomene</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Ure&amp;di s uređivačem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Spremi element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Prekini uređivanje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Poništi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Ponovi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Font</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Podebljano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Kurziv</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Podcrtano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Precrtano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Prednja boja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Stražnja boja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Izbriši stil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Pretraga</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Ure&amp;di s uređivačem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Radnja …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Premjesti prema gore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Gore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Premjesti prema dolje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Dolje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Premjesti na vrh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Početak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Premjesti na kraj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+Kraj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nova kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Pr&amp;eimenuj karticu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>U&amp;kloni karticu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Pro&amp;mijeni ikonu kartice</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>S&amp;ljedeća kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Desno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Pret&amp;hodna kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Lijevo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Pomoć</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Prikaži log-zapis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>In&amp;formacije</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Otvori kontekstni izbornik elementa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Kartica „%1” je pokvarena ili neki CopyQ dodaci nedostaju!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Ime sesije smije sadržavati najviše 16 znakova.\nDopušteni znakovi su slova, znamenke, crtica ili trotočka!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;ndash; %n redak &amp;ndash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;ndash; %n retka &amp;ndash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;ndash; %n redaka &amp;ndash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Kopirani tekst (%n redak)</numerusform>\n            <numerusform>Kopirani tekst (%n retka)</numerusform>\n            <numerusform>Kopirani tekst (%n redaka)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Kopirani tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Kopirani podaci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Prekini</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Prikaži glavni prozor i opcionalno otvori karticu sa zadanim imenom.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAZIV</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Sakrij glavni prozor.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Prikaži ili sakrij glavni prozor.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Otvori kontekstni izbornik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Zatvori poslužitelja.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Aktiviraj ili deaktiviraj spremanje sadržaja međuspremnika.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Ispiši sadržaj međuspremnika.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Ispiši sadržaj X11 odabira.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Umetni međuspremnik u trenutačni prozor\n(možda neće raditi s nekim programima).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Kopiraj međuspremnik iz trenutačnog prozora\n(možda neće raditi s nekim programima).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Postavi tekst međuspremnika.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEKST</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Postavi sadržaj međuspremnika.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>PODACI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Ispiši količinu elemenata u trenutačnoj kartici.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Kopiraj element u retku u međuspremnik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>REDAK</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Kopiraj sljedeći element trenutačne kartice u međuspremnik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Kopiraj prethodni element trenutačne kartice u međuspremnik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Dodaj tekst u međuspremnik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Umetni tekst u zadani redak.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Ukloni elemente u zadanim redcima.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>REDCI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Uredi elemente ili uredi novi element.\nVrijednost -1 odnosi se na trenutačni tekst u međuspremniku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Postavi znak razdvajanja za elemente pri izradi razultata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>ZNAK RAZDVAJANJA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Ispiši neformatirane podatke međuspremnika ili elementa redom.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Zapiši neformatirane podatke u zadani redak.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Prikaži dijalog radnje.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Pokreni PROGRAM na tekstu elementa u redcima.\nKoristi „%1” u PROGRAMU za proslijeđivanje teksta kao argument.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Prikaži skočnu poruku programske trake za VRIJEME u milisekundama.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>NASLOV</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>PORUKA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>VRIJEME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Nabroji dostupna imena kartica.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Pokreni naredbu na kartici sa zadanim imenom.\nKartica će se stvoriti, ako ne postoji.\nStandardno se koristi prva kartica.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>NAREDBA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Ukloni karticu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Preimenuj karticu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NOVO_IME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Izvezi elemente u datoteku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>IME_DATOTEKE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Uvezi elemente iz datoteke.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Nabroji sve opcije.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Iščitaj vrijednost opcije.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPCIJA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Postavi vrijednost opcije.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VRIJEDNOST</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Evaluiraj skript.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SKRIPTA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Pokreće ili povezuje primjerak programa sa zadanim imenom sesije.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESIJA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Ispiši pomoć za NAREDBU ili sve naredbe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Ispiši verziju programa i biblioteka.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Pokreni testove programa (dodaj argument --help za dobivanje više informacija).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Pokreni poslužitelja u pozadini prije pokretanja naredbe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Upotreba: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Pokreće poslužitelja, ako nijedna naredba nije određena.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  NAREDBE:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NAPOMENE:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Koristi argument (-) za čitanje podataka iz standardnog unosa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Koristi argument s dvije crtice (--) za čitanje sljedećih argumenata, bez\n    širenja izlaznog niza (kao što su \\n, \\t i ostali).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Koristi upitnik (?) za MIME za ispis dostupnih MIME vrsta (standardno je „text/plain”).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Neispravan broj argumenata!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Nije moguće spremiti datoteku „%1”!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Nije moguće uvesti datoteku „%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ upravljač međuspremnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Naredba nije pronađena!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Poslužitelj se prekida.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Neispravna opcija „%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Iznimka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Iznimka u %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Neuspjelo kopiranje u međuspremnik!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Kartica sa zadanim imenom ne postoji!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Ime kartice ne može biti prazno!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Kartica sa zadanim imenom već postoji!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Spremanje međuspremnika onemogućeno*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Dodaj prečac</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Novi prečac</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Pritisni bilo koju tipkovničku kombinaciju. Tipka &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; za prekid.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Ovdje pritisni mišem, zatim pritisni bilo koju tipkovničku kombinaciju</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Ukloni prečac</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Nađi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;Globalno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Globalni prečaci mogu se pokrenuti iz bilo kojeg programa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;Program</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Prečaci programa mogu se koristiti samo iz glavnog prozora.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Prečac već postoji!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Ime kartice ne smije biti prazno i mora biti jedinstveno. &lt;br /&gt;\nKartica &lt;b&gt;Napomene&lt;/b&gt; može se otvoriti pomoću &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nKoristi &lt;b&gt;/&lt;/b&gt; kao znak razdvajanja staza u stablastom prikazu kartica.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Naziv:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Nova kartica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Preimenuj karticu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Preimenuj grupu kartica</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Maksimalni broj elemenata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>standardno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Spremi elemente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Pritisni „/” za pretragu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Upiši za pretragu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Regularni izraz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Bez razlikovanja velikih/malih slova</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_hu.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"hu_HU\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Névjegy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Vágólapkezelő</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Készítő</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Adományozás</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation type=\"unfinished\">Művelet párbeszédpanel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation type=\"unfinished\">Parancs:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation type=\"unfinished\">Sztenderd bemenet:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation type=\"unfinished\">Sztenderd kimenet eltárolása:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation type=\"unfinished\">Új elemek elválasztása:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Kimenet &amp;tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Parancs elmentve</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Hiba: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Visszatérési kód: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Parancs %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Szűrés</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\">Kijelölt megszakítása</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Fő ablak megjelenítése/eltüntetése</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Tálca ikon megjelenítése</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation type=\"unfinished\">\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\">Kimenet &amp;tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"obsolete\">F2</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"obsolete\">Escape</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\">Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\">Hiba: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Web</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation type=\"unfinished\">F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\">Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation type=\"unfinished\">F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation type=\"unfinished\">F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation type=\"unfinished\">F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation type=\"unfinished\">F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_id.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"id_ID\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Tentang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Pengelola Clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Penulis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Surel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Donasi</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Dialog Aksi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Perintah:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Masukan standar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Simpan keluaran standar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Kirim data dari jenis media yang ditentukan ke masukan standar perintah (biarkan kosong untuk mematikan)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Buat item dari output standar program (biarkan kosong untuk menonaktifkan)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>Pemisah untuk item baru:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Ekspresi reguler untuk membagi output menjadi beberapa item.&lt;\\p&gt;\n&lt;p&gt;Gunakan &lt;b&gt;\\n&lt;/b&gt; untuk menyimpan setiap baris ke item terpisah.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Tab Keluaran:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Simpan item di tab dengan nama yang ditentukan (biarkan kosong untuk menyimpan di tab saat ini)</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Kesalahan: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Kode keluar: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Perintah %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Manajer Proses</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>Hentikan yang Terpilih</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Tambahkan Perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Tampilkan/sembunyikan jendela utama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Tampilkan menu tray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Tampilkan jendela utama di bawah kursor mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Edit clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Edit item pertama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Salin item kedua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Tampilkan dialog tindakan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Buat item baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Salin item berikutnya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Salin item sebelumnya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Tempelkan isi clipboard sebagai teks biasa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Nonaktifkan penyimpanan clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Aktifkan penyimpanan clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Salin dan tempel di bawah ini</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Salin dan tempel di bawah ini</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Ambil tangkapan layar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Salin tanggal dan waktu saat ini</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Perintah baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Abaikan item yang tidak memiliki karakter atau hanya satu karakter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Buka di Browser</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Salin sebagai Teks Biasa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Video otomatis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Salin URL (alamat web) ke tab lain</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Buat thumbnail (membutuhkan ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Buat Kode QR dari URL (membutuhkan qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tugas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Tambahkan ke tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Pindah ke tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Abaikan file yang disalin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Abaikan jendela *“Kata Sandi”*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Kata sandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Pindahkan ke Sampah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(sampah)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Bersihkan Tab Saat Ini</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Tidak dapat menambahkan item baru ke tab %1. Silakan hapus item secara manual untuk membuat ruang.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Apakah Anda ingin membatalkan perubahan?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Apakah Anda benar-benar ingin &lt;strong&gt;membatalkan perubahan&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Koneksi terputus!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Tidak dapat terhubung ke server! Jalankan server CopyQ terlebih dahulu.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Isi Clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>Format:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>Isi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Hapus Format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Isi Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Ukuran:&lt;/strong&gt; %1 byte</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Server CopyQ sudah berjalan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Batalkan Perintah Aktif</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Batalkan perintah yang aktif dan keluar?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Batalkan Keluar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Keluar Tetap</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Spasi</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Tentukan perintah baru yang dapat dijalankan secara otomatis saat ada konten baru di clipboard, atau oleh pengguna melalui menu, atau menggunakan pintasan sistem.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>Temukan:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>Perintah Pemuatan…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Simpan yang Terpilih…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Salin yang Terpilih</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Perintah Tempel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Perubahan yang Belum Disimpan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Dialog perintah memiliki perubahan yang belum disimpan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Buka Berkas dengan Perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Perintah (*.ini);; Konfigurasi CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Simpan Perintah yang Dipilih</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Perintah (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Simpan Perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Gagal menyimpan perintah ke berkas &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Perintah berisi daftar program beserta argumen yang akan dieksekusi. Contoh:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Argumen program %1 akan diganti dengan teks item.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Karakter %1 dapat digunakan untuk meneruskan keluaran standar ke program berikutnya.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Sintaks berikut dapat digunakan untuk meneruskan sisa perintah sebagai parameter tunggal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Ini memberikan output yang sama dengan %1 tetapi lebih berguna untuk perintah yang lebih panjang.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Fungsi-fungsi yang tercantum di bawah ini dapat digunakan seperti pada perintah-perintah berikut.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Tampilkan bantuan perintah (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>Nama:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Nama perintah yang ditampilkan di menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Jenis:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>Pintasan:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>Pintasan Global:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>Lanjutan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Jalankan perintah secara otomatis jika clipboard memiliki konten baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Otomatis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Tampilkan perintah di menu konteks item yang cocok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>Di Menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Pintasan Global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Naskah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Tampilkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Cocokkan Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>Isi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Melewati perintah jika teks masukan tidak cocok dengan ekspresi reguler ini (biarkan kosong untuk mencocokkan semua).\n\n%2 hingga %9 (atau argumen[1] dan seterusnya dalam skrip) di Perintah dan Filter akan diganti dengan teks yang ditangkap.\n\nContoh:\n\n- Cocokkan URL: ^(https?|ftp)://\n- Cocokkan nama file PDF: \\.pdf$\n- Cocokkan karakter tunggal: ^.$\n- Cocokkan multimedia jarak jauh: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>Jendela:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Gunakan perintah ini hanya untuk item yang disalin ke clipboard dari jendela dengan teks judul yang sesuai dengan ekspresi reguler ini (biarkan kosong untuk mencocokkan jendela apa pun). Di macOS, ini berisi nama aplikasi diikuti dengan tanda hubung (&amp;quot;-&amp;quot;) lalu judul jendela. Contoh: &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>Format:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Data dengan tipe MIME ini akan dikirim ke input standar perintah.\nBiarkan kosong untuk menonaktifkan ini.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>Filter:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Melewatkan perintah jika perintah filter gagal dengan kode keluar non-nol.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Tindakan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Salin ke tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Nama tab untuk menyalin item baru ke dalamnya (biarkan kosong jika tidak ingin menyalin)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Hapus item yang cocok\n\nCatatan: Jika ini diterapkan secara otomatis, perintah otomatis lainnya tidak akan dieksekusi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Hapus Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menu Aksi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Sembunyikan jendela setelah perintah diaktifkan dari menu konteks suatu item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>Sembunyikan jendela utama setelah diaktifkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Opsi perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Output:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Buat item dari output standar program (biarkan kosong untuk menonaktifkan)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>Pemisah:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Pemisah untuk membagi output menjadi beberapa item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Tab Keluaran:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Simpan item di tab dengan nama yang ditentukan (biarkan kosong untuk menyimpan di tab pertama)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Tampilkan dialog tindakan sebelum menjalankan perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>Tunggu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Ubah item, jangan buat item baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Transformasi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Tampilkan Lanjutan</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Latar Belakang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Tips alat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Ditemukan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Terpilih</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Nomor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Font</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternatif</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Latar depan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Pemberitahuan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Tampilkan Nomor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Tampilkan bilah gulir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Bilah gulir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Gunakan ikon dari lingkungan desktop sebanyak mungkin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Ikon Sistem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>Penghalusan tepi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Atur warna untuk tab, bilah alat, dan menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>Atur ulang Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>Muat Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>Simpan Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Edit tema saat ini di editor eksternal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Edit Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Pratinjau:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Buka Berkas Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Simpan Berkas Tema Sebagai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Tidak Ada Editor Eksternal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Atur perintah editor eksternal terlebih dahulu!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>String pencarian adalah %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Pilih item dan\ntekan F2 untuk mengedit.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Contoh item %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Catatan acak (Tekan Shift+F2 untuk mengedit)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>Bahasa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Pecah teks jika terlalu panjang untuk muat dalam satu baris</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Gulung teks panjang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Jaga agar jendela utama tetap berada di atas jendela lainnya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Selalu di Puncak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Tutup jendela utama saat aplikasi lain sedang aktif</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Tutup saat tidak difokuskan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Aktifkan untuk membuka jendela di layar saat ini. Nonaktifkan untuk membuka jendela di tempat terakhir kali ditutup</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Buka jendela pada layar saat ini</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Konfirmasi keluar dari aplikasi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Konfirmasi keluar dari aplikasi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Jalankan aplikasi saat sistem dimulai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>Mulai Otomatis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Mencegah penangkapan jendela aplikasi dalam tangkapan layar dan perekaman</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>Sembunyikan dari tangkapan layar dan perekaman</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Enkripsi data tab di disk (memerlukan kata sandi yang sudah diatur)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Enkripsi &amp;Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Gunakan penyimpanan kunci eksternal yang tersedia untuk kata sandi enkripsi (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Gunakan penyimpanan kunci eksternal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Ubah kata sandi yang digunakan untuk mengenkripsi data tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Ubah &amp;Kata Sandi Enkripsi...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Gaya navigasi / Peta tombol:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Dukungan untuk navigasi Vi (tombol H, J, K, L, /, dan lainnya) dan navigasi Emacs (Ctrl+N, P, V, dan lainnya)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Default</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Simpan dan pulihkan riwayat filter item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Simpan Riwayat Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Tampilkan popup secara otomatis untuk melengkapi nama fungsi, tipe, dan variabel dalam perintah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Perintah Otomatis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulasi Clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Izinkan untuk menempelkan konten yang disalin dengan cara yang sama seperti pemilihan dengan mouse (biasanya dengan menekan tombol mouse tengah)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(3) Tempelkan isi clipboard menggunakan mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Izinkan untuk menempelkan pilihan mouse menggunakan pintasan (biasanya Ctrl+V atau Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(4) Tempelkan pilihan mouse menggunakan keyboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Simpan clipboard ke riwayat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(1) Simpan clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Simpan teks yang dipilih dengan mouse (pilihan utama) dalam riwayat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(2) Simpan teks yang dipilih menggunakan mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(5) Jalankan perintah otomatis pada pilihan</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Jumlah maksimum item dalam riwayat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Jumlah maksimum item dalam setiap tab</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Buka tab setelah jeda dalam menit:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>&amp;Bongkar tab setelah jangka waktu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Bongkar setiap tab dari memori setelah jumlah menit tertentu tanpa aktivitas.\n\nAtur ke 0 untuk tidak membongkar tab.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Minta kata sandi setelah jangka waktu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Batas waktu dalam detik agar tab terenkripsi kembali meminta kata sandi.\n\nAtur ke 0 untuk menonaktifkan secara global.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Perintah editor eksternal (%&amp;1 adalah berkas yang akan diedit):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Perintah editor eksternal (%1 adalah file yang akan diedit).\n  Contoh:\ngedit %1\nnotepad %1\ngvim -f %1\nxterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Tab untuk menyimpan clipboard:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Nama tab yang akan secara otomatis menyimpan konten clipboard baru.\n\nBiarkan kosong untuk menonaktifkan penyimpanan otomatis.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Biarkan tidak dicentang agar tombol Return dapat menyimpan item yang diedit dan Ctrl+Return membuat baris baru.\n\nCatatan: Item yang diedit dapat disimpan dengan tombol F2 tanpa memperhatikan opsi ini.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Simpan item yang telah diedit dengan Ctrl+Return dan buat baris baru dengan tombol Return</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Tampilkan deskripsi satu baris untuk setiap item.\n\nGunakan Pratinjau Item untuk menampilkan seluruh item.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Tampilkan item sederhana</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Aktifkan pencarian angka, jika tidak, menekan tombol angka akan mengaktifkan item pada posisi tersebut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Cari angka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Aktifkan item dengan satu klik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Setelah item diaktifkan (klik ganda atau tombol Enter), salin ke clipboard dan ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Pindahkan item ke bagian atas daftar setelah item tersebut diaktifkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Pindahkan item ke bagian atas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Tutup jendela utama setelah item diaktifkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>Tutup jendela utama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Fokus pada jendela terakhir setelah item diaktifkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>Fokus pada jendela terakhir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Tempelkan ke jendela saat ini setelah item diaktifkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>Tempel ke jendela saat ini</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Tampilkan/Sembunyikan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Sembunyikan tab (tekan tombol Alt untuk menampilkan)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Sembunyikan tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Sembunyikan bilah alat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Sembunyikan bilah alat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Sembunyikan label bilah alat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Sembunyikan jendela utama saat ditutup</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Sembunyikan jendela utama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Tata Letak dan Transparansi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Tampilkan pohon dengan tab alih-alih bilah tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Pohon Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Transparansi yang terfokus:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparansi jendela utama jika difokuskan.\n\nCatatan: Fitur ini tidak didukung di semua sistem.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Transparansi yang tidak terfokus:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparansi jendela utama jika tidak difokuskan.\n\nCatatan: Fitur ini tidak didukung di semua sistem.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Tampilkan jumlah item di tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Tampilkan Jumlah Item</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Posisi pemberitahuan:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Posisi di layar untuk notifikasi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Atas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Bawah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Kanan Atas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Kanan Bawah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Kiri Bawah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Kiri Atas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Interval dalam detik untuk menampilkan notifikasi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Interval dalam detik untuk menampilkan notifikasi tentang konten clipboard baru atau jika item disalin ke clipboard (hanya jika jendela utama ditutup).\n\nAtur ke 0 untuk menonaktifkan ini.\n\nAtur ke -1 untuk tetap terlihat hingga diklik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Jumlah baris untuk pemberitahuan clipboard:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Jumlah baris yang ditampilkan untuk konten clipboard baru.\n\nAtur ke 0 untuk menonaktifkan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>Gunakan notifikasi bawaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geometri Pemberitahuan (dalam titik layar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Pergeseran horizontal:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Jarak pemberitahuan dari tepi layar kiri atau kanan dalam satuan titik layar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>Pergeseran vertikal:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Jarak pemberitahuan dari tepi atas atau bawah layar dalam satuan poin layar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Lebar maksimum:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Lebar maksimum untuk notifikasi dalam satuan poin layar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Tinggi maksimum:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Tinggi maksimum untuk pemberitahuan dalam poin layar</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Jangan tampilkan ikon tray; minimalkan jendela saat ditutup</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Nonaktifkan tray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Perintah untuk menampilkan isi clipboard saat ini di menu tray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Tampilkan perintah untuk isi clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Jumlah item dalam menu tray:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Jumlah item dalam menu tray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Tampilkan item dari tab saat ini di menu tray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Tampilkan tab saat ini di menu,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>atau pilih tab lain:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Nama tab yang akan ditampilkan di menu tray (kosong untuk tab pertama)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Tempelkan item ke jendela saat ini setelah memilihnya di menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>Tempelkan item yang diaktifkan ke jendela saat ini</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Tampilkan pratinjau gambar di samping item menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Tampilkan pratinjau gambar sebagai ikon item menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Umum</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Tata letak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Sejarah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Tray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Pemberitahuan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Pintasan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Penampilan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Nilai tidak valid untuk opsi “%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Atur ulang preferensi?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Aksi ini akan mengembalikan semua pengaturan Anda (di semua tab) ke nilai default.&lt;br /&gt;&lt;br /&gt;Apakah Anda benar-benar ingin &lt;strong&gt;mengembalikan semua pengaturan&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Perlu dijalankan ulang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Bahasa akan diubah setelah aplikasi dijalankan ulang.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Preferensi</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Gagal membuat direktori sinkronisasi “%1”!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Bawah</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Pilih ikon…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Pilih Ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Telusuri...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Buka berkas ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Berkas Gambar (*.png, *.jpg, *.jpeg, *.bmp, *.ico, *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>Semua</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>Tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Konfigurasi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Perintah</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Perintah editor gagal (lihat log)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Simpan</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Simpan Item (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Batal</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Batalkan Pengeditan dan Kembalikan Perubahan</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Redo</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Font</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Tebal</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Miring</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Garis Bawah</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Dicoret</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Latar depan</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Latar belakang</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Hapus Gaya</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Cari</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Enkripsi gagal!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Untuk berbagi item terenkripsi di komputer lain atau sesi lain, Anda memerlukan file kunci rahasia ini (simpanlah di tempat yang aman):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG harus diinstal untuk melihat tab yang dienkripsi.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Enkripsi (membutuhkan GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Dekripsi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Dekripsi dan Salin</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Dekripsi dan Tempel</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Masuk</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Gagal menghasilkan kunci.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Kesalahan: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Selesai</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Membuat kunci baru (ini mungkin memakan waktu beberapa menit)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Batalkan</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Mengatur kata sandi baru...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Kunci enkripsi &lt;strong&gt;harus dihasilkan&lt;/strong&gt; sebelum enkripsi item dapat digunakan.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Buat Kunci Baru...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Ubah Kata Sandi...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Dekripsi gagal!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Enkripsi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Enkripsi item dan tab.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Untuk mengenkripsi dan mendekripsi item, tambahkan perintah yang sesuai di bawah tab Perintah.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Berbagi Item dan Tab yang Dienskripsi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Tab Terenkripsi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Tentukan nama tab (satu per baris) yang akan dienkripsi dan didekripsi secara otomatis.&lt;/p&gt;\n&lt;p&gt;Atur interval pembongkaran tab di tab Riwayat untuk membongkar item yang telah didekripsi dari memori dengan aman.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Tab Rusak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Tidak semua item di tab &lt;strong&gt;%1&lt;/strong&gt; berhasil dimuat. Apakah Anda tetap ingin memuat tab ini dan berisiko kehilangan beberapa item?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Plugin FakeVim merupakan bagian dari Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Meniru editor Vim saat mengedit item.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Aktifkan FakeVim untuk Mengedit Item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Jalur ke Berkas Konfigurasi:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Gambar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Tampilkan gambar.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Lebar Gambar Maksimum:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Lebar maksimum gambar yang ditampilkan dalam riwayat (disetel ke nol untuk ukuran asli)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Tinggi Gambar Maksimum:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Tinggi maksimum gambar yang ditampilkan dalam riwayat (disetel ke nol untuk ukuran asli)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Perintah editor gambar:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Perintah editor untuk format gambar yang didukung selain SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Perintah editor SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Perintah editor untuk format gambar SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Catatan</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Tampilkan catatan untuk item.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Posisi Catatan</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>Di atas Item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Di bawah Item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Di samping Item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Tampilkan Tip Alat</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>Tambahkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Hapus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Naik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Pindah ke bawah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Pindah ke atas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Pindah ke bagian bawah</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Tidak dapat menghapus item yang disematkan</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Lepaskan pin terlebih dahulu untuk menghapus item tersebut.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Pin</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Lepaskan pin</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Item yang Dipasang</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Pin item untuk mengunci item tersebut di baris saat ini dan mencegah penghapusan (kecuali jika dilepas pin).&lt;/p&gt;&lt;p&gt;Menyediakan pintasan dan fungsi skrip.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Telusuri...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Buka Direktori untuk Sinkronisasi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Gagal membuat direktori sinkronisasi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sinkronisasi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Sinkronkan item dan catatan dengan direktori di disk.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Gagal menyinkronkan tab “%1” dengan direktori “%2”!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Hapus Item?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Apakah Anda benar-benar ingin &lt;strong&gt;menghapus item dan file terkait&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Tab dan Direktori Sinkronisasi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sinkronkan isi &lt;strong&gt;tab&lt;/strong&gt; dengan direktori yang memiliki &lt;strong&gt;path&lt;/strong&gt; yang ditentukan.&lt;/p&gt;\n&lt;p&gt;Atur &lt;strong&gt;path kosong&lt;/strong&gt; agar tidak menyimpan item di &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Nama Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Jalur</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Berkas ke Format Data Item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Atur jenis media menjadi &lt;strong&gt;-&lt;/strong&gt; (tanda minus) untuk mengabaikan file. Semua file yang tidak dikenal atau tersembunyi lainnya akan diabaikan.&lt;/p&gt;\n&lt;p&gt;Contoh: Muat ekstensi file &lt;strong&gt;txt&lt;/strong&gt; sebagai jenis media &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Perpanjangan</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Jenis Media Item</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Tambahkan Tag</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Hapus Tag</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Aktifkan/Nonaktifkan Tag %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Tidak dapat menghapus item dengan tag yang terkunci</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Lepaskan tag dari item terlebih dahulu untuk menghapusnya.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Penting</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Hapus semua tag</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Tag</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Tampilkan label untuk item.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Item menu untuk menambahkan dan menghapus tag kustom dapat ditambahkan dan disesuaikan di dialog Perintah.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Informasi lebih lanjut tersedia di &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;halaman wiki&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Nama Tag</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Cocok</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Lembar Gaya</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Warna</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Kunci</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Hindari menghapus item</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Teks</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Tampilkan teks biasa dan elemen HTML sederhana.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Simpan dan tampilkan HTML dan teks kaya</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Jumlah baris maksimum yang akan ditampilkan (0 untuk menampilkan semua):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Tinggi maksimum dalam piksel (0 untuk tanpa batas):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Gaya default:</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Catatan</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Item CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Enkripsi Tidak Tersedia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>Enkripsi tidak tersedia (lihat log untuk detail).\n\nData tab dapat dienkripsi dan didekripsi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Kata Sandi Impor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Masukkan kata sandi untuk impor:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Kata Sandi Ekspor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Masukkan kata sandi untuk ekspor (kosongkan jika tanpa enkripsi):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>Tampilkan/Sembunyikan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Keluar?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Apakah Anda ingin &lt;strong&gt;keluar&lt;/strong&gt; dari CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>Berkas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>Edit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>Bantuan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>Tab Baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Ubah Nama Grup %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Ubah Nama Tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Hapus Tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Hapus Grup %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Ubah Ikon Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>Papan Klip: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Opsi untuk Impor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Kesalahan CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Opsi Ekspor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Kesalahan Ekspor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Gagal mengekspor file %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Kesalahan Impor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Gagal mengimpor file %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Hapus Semua Tab dalam Grup?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Apakah Anda ingin menghapus &lt;strong&gt;semua tab&lt;/strong&gt; dalam grup &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Hapus Tab?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Apakah Anda ingin menghapus tab &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informasi</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;HIDDEN&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n baris)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;IMAGE&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ITEMS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;EMPTY&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Hapus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>Itam Baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>Impor...</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>Ekspor...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>Preferensi...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>Perintah...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Tampilkan Isi Clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Tampilkan Pratinjau</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Aktifkan Penyimpanan Clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Manajer Proses</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>Keluar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>Sortir Item yang Dipilih</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>Balikkan Item yang Terpilih</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Tempelkan Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>Salin Item yang Dipilih</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>Temukan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Simpan Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Batalkan Pengeditan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Melarikan diri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Batalkan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Ulangi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Font</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Tebal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Miring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Garis bawah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Garis miring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Latar depan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Latar Belakang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Hapus Gaya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Cari</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>Aktifkan Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Tampilkan Isi...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Hapus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>Edit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Catatan Edit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Edit dengan Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>Aksi...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Ke atas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Up</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Ke bawah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Down</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Pindah ke Atas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Pindah ke Bawah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>Tab Baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Ubah Nama Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Hapus Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Ubah Ikon Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Tab Berikutnya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Kanan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Tab Sebelumnya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Kiri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>Bantuan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Tampilkan Log</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>Tentang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Menu Konteks Item Terbuka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Tab %1 rusak atau beberapa plugin CopyQ hilang!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Nama sesi harus berisi paling banyak 16 karakter\nyang dapat berupa huruf, angka, &apos;-&apos; or &apos;_&apos;!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Teks yang disalin (%n baris)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Teks yang disalin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Data telah disalin</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Kata Sandi Enkripsi Tab Baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Masukkan kata sandi baru:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>Kata sandi tidak cocok. Silakan coba lagi (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Ubah Kata Sandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>Kata sandi baru tidak boleh kosong.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Penyiapan Kata Sandi Gagal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Jumlah maksimum percobaan kata sandi terlampaui.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Konfirmasi Kata Sandi Enkripsi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Masukkan ulang kata sandi untuk konfirmasi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Kata Sandi Enkripsi Tab Saat Ini</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Masukkan kata sandi saat ini untuk mengenkripsi data tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Kata sandi tidak valid. Silakan coba lagi (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Verifikasi Kata Sandi Gagal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Berkas Enkripsi Rusak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Berkas enkripsi hilang atau rusak. Mode ketat tidak dapat memulihkan tab terenkripsi secara otomatis.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Gagal Mengubah Kata Sandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Gagal mengubah kata sandi. Kata sandi lama Anda masih aktif. Silakan periksa log untuk detail.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Berhasil Mengubah Kata Sandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>Kata sandi berhasil diubah.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Sedang mengenkripsi ulang tab...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Batal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Sedang mengenkripsi ulang tab %1 dari %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Gagal mengenkripsi tab berikut:\n\n%1\n\nSilakan periksa log untuk detail.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Enkripsi Gagal</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Tampilkan jendela utama dan secara opsional buka tab dengan nama yang diberikan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAMA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Sembunyikan jendela utama.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Tampilkan atau sembunyikan jendela utama.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Buka menu konteks.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Keluar dari server.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Nonaktifkan atau aktifkan penyimpanan konten clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Cetak isi clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Cetak isi pilihan X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Tempelkan isi clipboard ke jendela saat ini\n(mungkin tidak berfungsi dengan beberapa aplikasi).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Salin ke clipboard dari jendela saat ini\n(mungkin tidak berfungsi dengan beberapa aplikasi).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Tetapkan teks clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEKS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Atur isi clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Cetak jumlah item di tab saat ini.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Salin item di baris ke clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>BARIS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Salin item berikutnya dari tab saat ini ke clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Salin item sebelumnya dari tab saat ini ke clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Tambahkan teks ke clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Masukkan teks ke dalam baris yang ditentukan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Hapus item pada baris yang ditentukan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>BARIS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Edit item atau buat item baru.\nNilai -1 digunakan untuk teks yang saat ini ada di clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Tetapkan pemisah untuk item pada output.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>PEMISAH</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Cetak data mentah dari clipboard atau item dalam baris.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Tulis data mentah ke baris yang ditentukan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Tampilkan dialog tindakan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Jalankan PROGRAM pada teks item di baris-baris.\nGunakan %1 dalam PROGRAM untuk meneruskan teks sebagai argumen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Tampilkan pesan popup tray selama TIME milidetik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>JUDUL</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>PESAN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>WAKTU</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Daftar nama tab yang tersedia.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Jalankan perintah pada tab dengan nama yang ditentukan.\nTab akan dibuat jika tidak ada.\nTab default adalah tab pertama.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>PERINTAH</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Hapus tab.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Ubah nama tab.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NAMA_BARU</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Ekspor item ke file.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>NAMA_BERKAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Impor item dari file.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Daftar semua opsi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Mendapatkan nilai opsi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>PILIHAN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Atur nilai opsi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>NILAI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Evaluasi skrip.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SKENARIO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMEN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Memulai atau terhubung ke instance aplikasi dengan nama sesi yang diberikan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Cetak bantuan untuk perintah COMMAND atau semua perintah.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Versi cetak program dan perpustakaan.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Jalankan uji aplikasi (tambahkan argumen --help untuk informasi lebih lanjut).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Jalankan server di latar belakang sebelum menjalankan perintah.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Penggunaan: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Memulai server jika tidak ada perintah yang ditentukan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  PERINTAH:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>CATATAN:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Gunakan argumen tanda hubung (-) untuk membaca data dari masukan standar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Gunakan argumen ganda (--) untuk membaca semua argumen berikutnya tanpa\n    mengembangakan urutan pelarian (misalnya \\n, \\t, dan lainnya).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Gunakan ? untuk MIME untuk menampilkan jenis MIME yang tersedia (default adalah “text/plain”).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Jumlah argumen tidak valid!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Gagal mengekspor berkas &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Gagal mengimpor berkas &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Tidak dapat menyimpan ke file &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Tidak dapat mengimpor file “%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Pengelola Clipboard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Perintah tidak ditemukan!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Menonaktifkan server.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Opsi tidak valid “%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Pengecualian</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Pengecualian di %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Gagal menyalin ke clipboard!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Tab dengan nama yang diberikan tidak ada!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Nama tab tidak boleh kosong!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Tab dengan nama yang sudah ada!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Penyimpanan Clipboard Dinonaktifkan*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Tambahkan pintasan</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Pintasan Baru</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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; Tekan kombinasi tombol apa pun. &lt;span style=&quot; font-weight:600;&quot;&gt; Escape&lt;/span&gt; untuk membatalkan. &lt;/p&gt; &lt;/body&gt; &lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Klik di sini dan tekan tombol apapun</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Hapus Pintasan</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>Temukan:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Pintasan global dapat diaktifkan dari aplikasi mana pun.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>Aplikasi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Pintasan aplikasi hanya dapat diaktifkan dari jendela utama.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Pintasan sudah ada!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Nama tab harus tidak kosong dan unik.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; dapat dibuka menggunakan &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nGunakan &lt;b&gt;/&lt;/b&gt; sebagai pemisah jalur dalam tata letak tab tampilan pohon.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>Nama:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Tab Baru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Ubah Nama Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Ubah Nama Grup Tab</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>Jumlah maksimum item:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>default</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>Simpan Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Minta kata sandi setelah jangka waktu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Batas waktu per tab dalam detik untuk kembali meminta kata sandi enkripsi.\n\nAtur ke 0 untuk menggunakan pengaturan global.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>global</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Tekan ‘/’ untuk mencari</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Ketik untuk mencari</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Ekspresi Reguler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Tidak peka huruf besar/kecil</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_it.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"it_IT\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Info programma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Gestore appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Sito web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Donazioni</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Finestra azione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>&amp;Input standard:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Memorizza o&amp;utput standard:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Co&amp;mando:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Invia i dati di un determinato tipo di supporto all&apos;input standard del comando (lascia vuoto per disattivare)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Crea elementi dall&apos;output standard del programma (lascia vuoto per disattivare)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Separatore per nuovi elementi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Espressione regolare per suddividere l&apos;output in più elementi.&lt;\\p&gt;\n&lt;p&gt;Per salvare ogni riga in un elemento separato usa &lt;b&gt;\\n&lt;/b&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Scheda &amp;output:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Salva gli elementi nella scheda con il nome specificato (lascia vuoto per salvare nella scheda attuale)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Comando salvato</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Il comando è stato salvato e può essere visualizzato dal menu dell&apos;elemento.\nPuoi impostare il comando nelle preferenze.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Errore: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Codice uscita: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Comando %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Gestore processi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Termina selezionati</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Aggiungi comandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Visualizza/nascondi finestra principale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Visualizza menu barra applicazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Visualizza finestra principale sotto al cursore del mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Modifica appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Modifica primo elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Copia secondo elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Visualizza finestra azione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Crea nuovo elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Copia elemento successivo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Copia elemento precedente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Incolla appunti come testo semplice</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Disabilita memorizzazione appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Abilita memorizzazione appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Incolla e copia successivo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Incolla e copia precedente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Cattura una schermata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Incolla data e ora attuali</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nuovo comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignora elementi senza carattere o con un solo carattere</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Apri nel &amp;browser</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Incolla come testo semplice</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Riproduzione automatica video</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Copia URL (indirizzo web) in un&apos;altra scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Crea miniatura (è necessario ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Crea codice QR dall&apos;URL (è necessario qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Attività</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Aggiungi alla scheda %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Sposta nella scheda %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignora file copiati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignora finestra *&quot;Password&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Password</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Sposta nel cestino</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(cestino)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Svuota scheda attuale</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Impossibile aggiungere nuovi elementi</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Scheda piena. Impossibile rimuovere qualsiasi elemento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Impossibile aggiungere nuovi elementi alla scheda %1. Rimuovi gli elementi manualmente per fare spazio.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Vuoi uscire senza salvare?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Vuoi &lt;strong&gt;uscire senza salvare&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Impossibile connettersi al server! Avvia prima il server CopyQ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Connessione persa!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Contenuto appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formati:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>C&amp;ontenuto:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Rimuovi formato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Contenuto elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Dimensione:&lt;/strong&gt; %1 byte</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Dimensione:&lt;/strong&gt; %1 byte</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Il server CopyQ è già in esecuzione.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Annulla comandi attivi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Vuoi annullare i comandi attivi ed uscire?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Annulla uscita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Esci comunque</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Spazio</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Comandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definisci nuovi comandi che possono essere eseguiti automaticamente quando viene copiato un nuovo contenuto negli appunti oppure manualmente dall&apos;utente tramite un menu o una scorciatoia di sistema.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Trova:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Carica comandi…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Sal&amp;va selezionati…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Copia selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Incolla comandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Modifiche non salvate</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>La finestra del comando ha modifiche non salvate.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Apri file con comandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Comandi (*.ini);; Configurazione CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Salva comandi selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Comandi (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Salva comandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Impossibile salvare i comandi nel file &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Visualizza Guida comandi (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Il comando contiene l&apos;elenco dei programmi con argomenti che verranno eseguiti. Per esempio:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Il parametro %1 verrà sostituito dall&apos;elemento testo, e da %2 fino %9 per i testi catturati da espressioni regolari.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>L&apos;argomento %1 del programma verrà sostituito dal testo dell&apos;elemento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Il carattere %1 può essere usato per passare l&apos;output standard al programma successivo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>La seguente sintassi può essere usata per passare il resto del comando come parametro singolo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Fornisce lo stesso output di %1 ma è più utile per comandi più lunghi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Le funzioni elencate di seguito possono essere usate come nei seguenti comandi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;appunti</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nome:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Nome comando visualizzato nel menu</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Tipo azione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Esegui comando automaticamente se gli appunti hanno nuovi contenuti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Visualizza comando nel menu contestuale elementi corrispondenti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>Nel m&amp;enu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Scorciatoia globale:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Scorciatoia globale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Abbina elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Usa il comando solo per gli elementi copiati negli appunti dalla finestra con il testo del titolo che corrisponde a questa espressione regolare (lascia vuoto per abbinare a qualsiasi finestra). In macOS, contiene il nome dell&apos;applicazione seguito da un trattino (&quot;-&quot;) quindi il titolo della finestra. Esempio. &quot;Safari - GitHub&quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>I dati di questo tipo di MIME verranno inviati all&apos; input standard del comando.\nLascia vuoto per disabilitarlo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Coman&amp;do</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Nascondi finestra dopo l&apos;attivazione del comando dal menu contestuale di un elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Modifica elemento, non creare nuovi elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;asforma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Crea elementi dall&apos;output standard del programma (lascia vuoto per disabilitare)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Finestra:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Usa il comando solo per gli elementi in cui il testo corrisponde con l&apos;espressione regolare (lascialo vuoto per la corrispondenza con tutto).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Esempi:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Corrispondenza URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Corrispondenza nomi file PDF    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Corrispondenza singolo carattere    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Corrispondenza multimedia remoto    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Contenuto:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avanzate</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Script</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Visualizzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtro:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Usa i comandi se il comando filtro corrisponde.&lt;/p&gt;\n\n&lt;p&gt;L&apos;elemento testo è passato all&apos;&lt;b&gt;input standard&lt;/b&gt; del comando filtro. L&apos;elemento &lt;b&gt;corrisponde solo se il codice di uscita del comando filtro è 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Usa &lt;b&gt;%1&lt;/b&gt; per l&apos;elemento passato come parametro e da &lt;b&gt;%2&lt;/b&gt; a &lt;b&gt;%9&lt;/b&gt; per i parametri catturati da un&apos;espressione regolare (parti incluse tra parentesi).&lt;/p&gt;\n\n&lt;p&gt;Usa &lt;b&gt;|&lt;/b&gt; per collegare i comandi (passa l&apos;output standard al comando successivo).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;mato:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Tipo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Se il testo di input non corrisponde a questa espressione regolare (lascia vuoto per far corrispondere tutto) salta il comando .\n\nDa %2 a %9 (o argomento[1] e oltre nello script) in Comando e Filtro saranno sostituiti con i testi catturati.\n\nEsempi:\n\n- Corrispondenza URL: ^(https?|ftp)://\n- Corrispondenza nomi file PDF: \\.pdf$\n- Corrispondenza singolo carattere: ^.$\n- Corrispondenza multimediale remoto: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Salta comando se il comando filtro restituisce un codice diverso da zero.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Azione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Copia nella sc&amp;heda:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Nome della scheda in cui copiare i nuovi elementi (lascia vuoto per non copiare)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Rimuovi elemento corrispondente\n\nNota: se viene applicato automaticamente, non verranno eseguiti altri comandi automatici.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Rimuovi elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Azione del menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Nascondi finestra principale dopo l&apos;attivazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Visualizza opzioni avanzate</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Scorciatoia:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Opzioni di comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Visualizza finestra azione prima di eseguire il comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Attendi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>O&amp;utput:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Salta il comando se il testo di input non corrisponde a questa espressione regolare (lascia vuoto per far corrispondere tutto).\n\nDa %2 a %9 in comando e filtro verranno sostituiti con i testi acquisiti.\n\nEsempi:\n\n- Corrispondenza URL: ^(https?|ftp)://\n- Corrispondenza nomi file PDF: \\.pdf$\n- Corrispondenza singolo carattere: ^.$\n- Corrispondenza file multimediale remoto: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Separatore:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Separatore da abbinare per dividere l&apos;output in più elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Scheda ou&amp;tput:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Salva elementi nella scheda con il nome specificato (lascia vuoto per salvare nella prima scheda)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Sfondo</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Note</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Trovato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Numero</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Carattere</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Primo piano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Notifica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Visualizza &amp;numero</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Visualizza barre scorrimento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Barre di s&amp;corrimento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Usa quando possibile icone dell&apos;ambiente desktop</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Imposta colori per sch&amp;ede, barra strumenti e menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Icone di &amp;sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Suggerimenti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Antialias</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Ripristina tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Carica tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Salva tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Modifica tema attuale nell&apos;editor esterno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Mo&amp;difica tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Anteprima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>La stringa di ricerca è %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Seleziona un elemento e\npremi F2 per modificare.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Esempio elemento %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Alcune note casuali (Maiusc+F2 per modificare)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Apri file del tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Salva file del tema come</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Nessun editor esterno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Prima imposta il comando dell&apos;editor esterno!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Lingua interfaccia:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Testo a capo se troppo lungo per una linea</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>A cap&amp;o automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Mantieni finestra principale sempre in primo piano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Sempre in &amp;primo piano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Chiudi finestra principale quando altre applicazioni sono in primo piano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Chiudi quando non è in primo piano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Abilita l&apos;apertura delle finestre sulla schermata attuale. Disabilita l&apos;apertura delle finestre nel punto in cui sono state chiuse l&apos;ultima volta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>A&amp;pri finestra nella schermata attuale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Conferma uscita dall&apos;applicazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Conferma &amp;uscita dall&apos;applicazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Esegui applicazione all&apos;avvio del sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Avvio automatico</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Supporto tasti navigazione Vi (H, J, K, L e altri), tasto barra (/) per ricerca</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Navigazione in stile &amp;Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Nella cattura schermate/registrazioni impedisci l&apos;acquisizione da app Windows</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Nascondi in cattura schermate/registrazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Crittografa i dati della scheda nel disco (richiede l&apos;impostazione della password)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Cri&amp;ttografa schede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Usa un archivio chiavi esterno disponibile per la password crittografia (archivio credenziali Windows, portachiavi macOS, portachiavi GNOME, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Usa archivio chiavi esterno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Cambia la password usata per crittografare i dati della scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Modifica &amp;password crittografia...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Stile di navigazione / Mappa dei tasti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Supporto per la navigazione Vi (tasti H, J, K, L, / e altri) e la navigazione Emacs (Ctrl+N, P, V e altri)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Predefinito</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Salva e ripristina cronologia elementi filtrati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Salva cronologia filtri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Visualizza automaticamente popup per completare la funzione, tipo e nomi delle variabili nei comandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Completamento automatico comandi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipolazione appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Consenti di incollare il contenuto copiato allo stesso modo delle selezioni del mouse (di solito premendo il pulsante centrale del mouse)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Incolla appunti con il mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Consenti di incollare le selezioni del mouse usando un combinazione tasti (solitamente Ctrl+V o Maiusc+Ins)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Incolla selezione mouse con la tastiera</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Salva appunti nella cronologia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Memorizza appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Salva testo selezionato con il mouse (selezione primaria) nella cronologia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Memorizza testo selezionato usando il mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Esegui comandi automatici sulla selezione</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Numero massimo elementi cronologia:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Numero massimo elementi in ogni scheda</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Scarica scheda dopo un intervallo di min&amp;uti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>Chi&amp;udi scheda dopo un intervallo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Scarica ciascuna scheda dalla memoria dopo il numero specificato di minuti di inattività.\n\nImposta su 0 per non scaricare le schede.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Richiedi password dopo un intervallo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Timeout in secondi affinché le schede crittografate richiedano nuovamente la password.\n\nImposta a 0 per disabilitare globalmente.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Comando editor esterno (%&amp;1 è il file da modificare):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Comando dell&apos;editor esterno (%1 è il file da modificare).\n  Esempi:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Sc&amp;heda per archiviare gli appunti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Nome della scheda che memorizzerà automaticamente il nuovo contenuto degli appunti.\n\nLascia vuoto per disabilitare la memorizzazione automatica.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Lascia deselezionato il tasto Invio per salvare l&apos;elemento modificato e Ctrl+Invio per creare una nuova riga.\n\nNota: gli elementi modificati possono essere salvati con F2 ignorando questa opzione.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Sal&amp;va elemento modificato con Ctrl+Invio e crea una nuova riga con il tasto Invio</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Visualizza descrizione a riga singola per ciascun elemento.\n\nPer visualizzare interi elementi usa anteprima elemento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>&amp;Visualizza elementi semplici</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Abilita ricerca dei numeri, altrimenti premendo un tasto numerico si attiva l&apos;elemento in quella posizione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Ric&amp;erca numeri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Attiva elemento con un solo clic</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Dopo aver attivato l&apos;elemento (con doppio clic o tasto Invio), copialo negli appunti e...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Sposta elemento in cima all&apos;elenco dopo averlo attivato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Sp&amp;osta elemento in alto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Chiudi finestra principale dopo l&apos;attivazione dell&apos;elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Chiudi finestra principale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Metti in primo piano l&apos;ultima finestra dopo l&apos;attivazione dell&apos;elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>Ultima &amp;finestra in primo piano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Incolla nella finestra attuale dopo l&apos;attivazione dell&apos;elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Incolla nella finestra attuale</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Visualizza/nascondi finestra CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Nascondi schede (premi Alt per visualizzarle)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Nascon&amp;di schede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Nascondi barra strumenti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>&amp;Nascondi barra strumenti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Nascondi etichette &amp;barra strumenti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Nascondi finestra principale quando chiusa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Nascondi &amp;finestra principale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Disposizione e trasparenza</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Visualizza struttura ad albero con schede invece della barra schede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>St&amp;ruttura scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Trasparenza in primo piano:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Trasparenza della finestra principale se in primo piano.\n\nNota: questo non è supportato su tutti i sistemi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Trasparenza non in primo piano:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Trasparenza della finestra principale se non in primo piano.\n\nNota: questo non è supportato su tutti i sistemi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Visualizza numero nelle schede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>&amp;Visualizza numero elementi</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Posizione &amp;notifiche:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Posizione delle notifiche sullo schermo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>In alto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>In basso</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>In alto a destra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>In basso a destra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>In basso a sinistra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>In alto a sinistra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Int&amp;ervallo in secondi per visualizzare le notifiche:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Intervallo in secondi per visualizzare la notifica per il nuovo contenuto degli appunti o se l&apos;elemento viene copiato negli appunti (solo se la finestra principale è chiusa).\n\nImposta su 0 per disabilitarlo\n\nImposta su -1 per rimanere visibile finché non si fa clic.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Numero di righe per la notifica negli appunti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Numero righe da visualizzare per il nuovo contenuto appunti.\n\nImposta a 0 per disabilitare.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Usa notifiche native</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geometria notifica (in punti sullo schermo)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Offset ori&amp;zzontale:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Distanza di notifica dal bordo sinistro o destro dello schermo in punti dello schermo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>Offset &amp;verticale:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Distanza di notifica dal bordo superiore o inferiore dello schermo in punti dello schermo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Larg&amp;hezza massima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Larghezza massima per le notifiche in punti dello schermo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Altezza &amp;massima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Altezza massima per le notifiche in punti dello schermo</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Non visualizzare icona nella barra applicazioni; minimizza finestra quando è chiusa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Disabilita icona n&amp;ella barra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Visualizza nel menu barra applicazioni il comando per il contenuto attuale degli appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Mos&amp;tra comandi per contenuto degli appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>N&amp;umero elementi nel menu barra applicazioni:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Numero elementi nel menu barra applicazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Visualizza nel menu della barra applicazioni gli elementi scheda attuale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Visualizza nel menu la sc&amp;heda attuale,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>o s&amp;cegli un&apos;altra scheda:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Nome scheda da visualizzare nel menu della barra applicazioni (vuoto per la prima scheda)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Incolla elemento nella finestra attuale dopo averlo selezionato nel menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Incolla elemento attivato nella finestra attuale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Visualizza anteprima immagine accanto agli elementi del menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Visualizza anteprima immagine come icona della voce menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Generale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Disposizione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Cronologia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Barra applicazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Notifiche</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Schede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Tasti rapidi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Aspetto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Valore non valido per l&apos;opzione &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Vuoi ripristinare le preferenze?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Questa azione ripristinerà tutte le preferenze (in tutte le schede) ai valori predefiniti.&lt;br /&gt;&lt;br /&gt;Vuoi &lt;strong&gt;ripristinare tutte le preferenze&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Riavvio richiesto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>La lingua verrà modificata dopo il riavvio dell&apos;applicazione.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Preferenze</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Impossibile creare la directory di sincronizzazione &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Giù</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Seleziona Icona…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Seleziona icona</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Sfoglia...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>April file icona</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>File immagine (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Tutti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>Sc&amp;hede:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Co&amp;nfigurazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Co&amp;mandi</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">coodice uscita editor: %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Coamndo editor: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Comando dell&apos;editor non riuscito (vedi registri)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Salva</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Salva elemento (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Annulla</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Annulla modifica e inverti modifiche</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Font</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Grassetto</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Corsivo</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Sottolineato</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Ribattuto</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">In primo piano</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Sfondo</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Elimina stile</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Cerca</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Annulla azione</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Ripeti azione</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Per condividere elementi criptati in altri computer o sessioni, sono necessari i file chiave pubblico e segreto:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(mantieni la chiave segreta in un posto sicuro.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG deve essere installato per visualizzare le schede crittografate.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Crittografa (richiede GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Decripta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Decripta e copia</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Maiusc+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Decripta e incolla</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Invio</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Errore: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Impossibile generare le chiavi.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Per condividere elementi crittografati su un altro computer o sessione, avrai bisogno di questi file con chiave segreta (conservali in un luogo sicuro):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Fatto</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Creazione nuove chiavi (l&apos;operazione potrebbe richiedere alcuni minuti)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Annulla</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Impostazione nuova password...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Prima di poter usare la crittografia &lt;strong&gt;è necessario generare&lt;/strong&gt; le chiavi crittografia .</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Genera nuove chiavi...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Cambia password...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Crittografia fallita!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Decrittazione fallita!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Crittografia</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Cripta elementi e schede.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Per crittografare e decrittografare gli elementi, aggiungi i comandi appropriati nella scheda Comandi.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Condivisione di elementi e schede crittografati</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Schede crittografate</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Specifica i nomi delle schede (una per riga) che verranno automaticamente crittografate e decrittografate.&lt;/p&gt;\n&lt;p&gt;Imposta l&apos;intervallo di scaricamento della scheda nella scheda Cronologia per scaricare in modo sicuro gli elementi decrittografati dalla memoria.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Scheda danneggiata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Non tutti gli elementi nella scheda &lt;strong&gt;%1&lt;/strong&gt; sono stati caricati correttamente. Vuoi comunque caricare la scheda e potenzialmente perdere alcuni elementi?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Il plugin FakeVim fa parte di Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emula editor Vim durante la modifica degli elementi.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Abilita FakeVim per modifica elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Percorso file configurazione:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Immagini</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Visualizza immagini.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Larg&amp;hezza massima immagine:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Larghezza massima immagine visualizzata nella cronologia (0 per dimensione originale)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Altezza &amp;massima immagine:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Altezza massima immagine visualizzata nella cronologia (0 per dimensione originale)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Comando ed&amp;itor immagini:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Comando dell&apos;editor per formati immagine supportati diversi da SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Comando editor &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Comando dell&apos;editor per il formato immagine SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Note</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Visualizza note degli elementi.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Posizione note</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>&amp;Sopra l&apos;elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Sotto l&apos;ele&amp;mento</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Accanto all&apos;ele&amp;mento</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Visualizza su&amp;ggerimenti</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Aggiungi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Sposta su</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Sposta giù</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Sposta in alto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Sposta in basso</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Su</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Giù</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Impossibile rimuovere elementi bloccati</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Sblocca elementi prima di rimuoverli.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Blocca</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Sblocca</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Elementi bloccati</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Blocca gli elementi nella riga attuale e ne previene la cancellazione fino allo sblocco.&lt;/p&gt;&lt;p&gt;Fornisce tasti rapidi e funzionalità di scripting.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Sfoglia...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Apri cartella per sincronizzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Impossibile creare la cartella di sincronizzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sincronizzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Sincronizza elementi e note con una cartella sul disco.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Impossibile sincronizzare la scheda &quot;%1&quot; con la cartella &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Vuoi rimuovere gli elementi?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Vuoi &lt;strong&gt;rimuovere gli elementi e i file associati&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Sincronizzazione schede e cartelle</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sincronizza contenuto della &lt;strong&gt;scheda&lt;/strong&gt; con la cartella con il &lt;strong&gt;percorso&lt;/strong&gt; indicato.&lt;/p&gt;\n&lt;p&gt;Imposta un &lt;strong&gt;percorso vuoto&lt;/strong&gt; per non salvare gli elementi nella &lt;strong&gt;scheda&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Nome scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Percorso</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>File in formati di dati per elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Imposta il tipo di supporto su &lt;strong&gt;-&lt;/strong&gt; (carattere meno) per ignorare i file. Qualsiasi altro file sconosciuto o nascosto viene ignorato.&lt;/p&gt;\n&lt;p&gt;Esempio: carica l&apos;estensione del file &lt;strong&gt;txt&lt;/strong&gt; come tipo di supporto &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Tipo di supporto dell&apos;elemento</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Imposta tipo MIME a &lt;strong&gt;-&lt;/strong&gt; (lineetta) per ignorare i file. Qualsiasi altro file sconosciuto o nascosto sarà ignorato.&lt;/p&gt;\n&lt;p&gt;Esempio: Carica estensione file &lt;strong&gt;txt&lt;/strong&gt; come tipo MIME &lt;strong&gt;testo/semplice&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Estensioni</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">Tipo elemento MIME</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Aggiungi una etichetta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Rimuovi una etichetta</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Marca come %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Rimuovi etichetta %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Commuta etichetta in %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Impossibile rimuovere elementi con un&apos;etichetta bloccata</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Deseleziona prima gli elementi per rimuoverli.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Svuota tutte le etichette</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Etichette</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Visualizza etichette per elementi.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Le voci di menu per l&apos;aggiunta e la rimozione di etichette personalizzate possono essere aggiunte e personalizzate nella finestra di dialogo Comandi.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Maggiori informazioni sono disponibili nella &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;pagina wiki&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Nome etichetta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Corrispondenza</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Foglio di stile</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Colore</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Icona</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Blocca</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Impedisci rimozione oggetti</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Testo</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Visualizza testo semplice ed elementi HTML semplici.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Salva e visualizza HTML e rich text</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Numero massimo righe visualizzate (0 visualizza tutte):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Altezza massima in pixel (0 nessun limite):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Foglio di stile predefinito:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Sito web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Visualizza pagine Web.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Altezza max in pixel (0 per nessun limite):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Registro</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Confermi uscita dal programma?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Vuoi &lt;strong&gt;uscire&lt;/strong&gt; da CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;File</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>Sc&amp;hede</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Aiuto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Opzioni per importazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>Mo&amp;stra/nascondi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Opzioni per esportazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Errore di esportazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Impossibile esportare il file %1!</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">Abili&amp;ta cronologia Appunti</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Disabilita cronologia Appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Errore di CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nuova scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Crittografia non disponibile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>La crittografia non è disponibile (per i dettagli consulta il registro).\n\nSarà possibile crittografare e decrittografare i dati delle schede.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Password importazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Inserisci la password per l&apos;importazione:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Password esportazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Inserisci la password per l&apos;esportazione (vuota per nessuna crittografia):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Rinomina &amp;gruppo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Rinomi&amp;na scheda %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Ri&amp;muovi scheda %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Rimuovi gruppo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Modifi&amp;ca icona scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Appunti: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Elementi CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Errore di importazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Impossibile importare il file %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Vuoi rimuovere tutte le schede nel gruppo?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vuoi rimuovere &lt;strong&gt;tutte le schede&lt;/strong&gt; nel gruppo &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Vuoi rimuovere la scheda?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vuoi rimuovere la scheda &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informazione</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;NASCOSTO&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n riga)</numerusform>\n            <numerusform>%1 (%n righe)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;IMMAGINE&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ELEMENTI&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;VUOTO&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATI&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Indietro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Elimina</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linea &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linee &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Il nome della sessione deve contenere al massimo 16 caratteri\nche possono essere lettere, cifre, &apos;-&apos; o &apos;_&apos;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nuovo elemento</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importa...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Esporta...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Preferenze...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">C&amp;omandi/scorciatoie globali...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>C&amp;omandi...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Visualizza &amp;contenuto appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Maiusc+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>A&amp;ttiva/disattiva memorizzazione appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Maiusc+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Gestore p&amp;rocessi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Maiusc+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Esci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>Ordina elementi &amp;selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Maiusc+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>Inve&amp;rti ordine elementi selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Maiusc+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Inco&amp;lla elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Copia elementi selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Trova</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Sposta ne&amp;gli Appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Mo&amp;stra contenuto...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Mo&amp;stra anteprima</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Sposta ne&amp;gli Appunti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Modifica &amp;note</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Maiusc+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Mo&amp;difica con l&apos;editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Azione...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Sposta su</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Su</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Sposta giù</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Giù</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Sposta in alto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Sposta in basso</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nuova scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>&amp;Rinomina scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Ri&amp;muovi scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Modifi&amp;ca icona scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Maiusc+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Sc&amp;heda successiva</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Destra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Sinistra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Apri menu contestuale dell&apos;elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Maiusc+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Scheda &amp;precedente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Maiusc+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Salva elemento</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Annulla modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Annulla azione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Ripeti azione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Carattere</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Grassetto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Corsivo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Sottolineato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Barrato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Primo piano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Sfondo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Elimina stile</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Ricerca</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;ttiva elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Mo&amp;difica con editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Mo&amp;stra registro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>Inform&amp;azioni su</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Aiuto</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>La scheda %1 è danneggiata o mancano alcuni plugin di CopyQ!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Testo copiato (%n linea)</numerusform>\n            <numerusform>Testo copiato (%n linee)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Testo copiato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Dati copiati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Nuova password crittografia scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Inserisci la nuova password:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>Le password non corrispondevano. Riprova (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Modifica password</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>La nuova password non può essere vuota.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Impostazione password non riuscita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>È stato superato il numero massimo di tentativi per la password.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Conferma password crittografia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Per confermare re-inserisci la password:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Password crittografia scheda attuale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Inserisci la password attuale per crittografare i dati della scheda:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Password non valida. Riprova (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Verifica password non riuscita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>File crittografia danneggiati</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>I file di crittografia mancano o sono danneggiati. La modalità rigorosa non può ripristinare automaticamente le schede crittografate.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Modifica password non riuscita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Impossibile modificare la password. La vecchia password è ancora attiva. Per i dettagli consulta i registri.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Modifica password completata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>La password è stata correttamente modificata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Ri-criptazione schede...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Annulla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Ri-criptazione scheda %1 di %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Impossibile crittografare le seguenti schede:\n\n%1\n\nPer i dettagli consulta i registri.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Crittografia non riuscita</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Nascondi finestra principale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Visualizza/nascondi finestra principale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Apri menu contestuale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Esci dal server.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Disabilita o abilita la memorizzazione del contenuto degli appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Stampa contenuto appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Stampa contenuto selezione X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Incolla gli appunti nella finestra attuale\n(potrebbe non funzionare con alcune applicazioni).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Imposta testo appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TESTO</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nImposta contenuto Appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Copia elemento della riga negli appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>RIGA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Copia elemento successivo dalla scheda attuale agli appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Copia elemento precedente dalla scheda attuale agli appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Aggiungi testo agli appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Inserisci testo nella riga specificata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Rimuovi elementi in determinate righe.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>RIGHE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Modifica elementi o modificane uno nuovo.\nIl valore -1 è per il testo attuale negli appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Imposta il separatore per elementi in output.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATORE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Stampa dati grezzi degli appunti o dell&apos;elemento nella riga.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nScrivi dati RAW nella colonna indicata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Visualizza finestra azione.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nEsegui PROGRAMMA su elemento testo nelle colonne.\nUsa %1 in PROGRAMMA per passare il testo come argomento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAMMA</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nVisualizza popup barra sistema per TEMPO in millisecondi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITOLO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESSAGGIO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>ORA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Elenca nomi schede disponibili.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Esegui il comando sulla scheda con il nome specificato.\nSe non esiste la scheda verrà creata.\nL&apos;impostazione predefinita è la prima scheda.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nValuta il programma ECMAScript.\nGli argomenti sono accessibili usando con &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Esegui test applicazione (aggiungi --help per maggiori informazioni).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NOME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Visualizza finestra principale e facoltativamente apri la scheda con il nome specificato.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Copia gli appunti dalla finestra attuale\n(potrebbe non funzionare con alcune applicazioni).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Imposta contenuto appunti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Stampa quantità di elementi nella scheda attuale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Scrivi dati grezzi nella riga specificata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Esegui PROGRAMMA sul testo dell&apos;elemento nelle righe.\nUsa %1 in PROGRAMMA per inviare il testo come argomento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Visualizza messaggio popup nella barra applicazioni per TIME millisecondi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMANDO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Rimuovi scheda.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Rinomina scheda.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NUOVO_NOME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Esporta elementi in un file.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>NOME_FILE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importa elementi dal file.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Elenca tutte le opzioni.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Ottieni valore opzione.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPZIONE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Imposta valore opzione.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALORE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Valuta script.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGOMENTI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Avvia o si connette all&apos;istanza dell&apos;applicazione con il nome di sessione specificato.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Stampa la guida per COMANDO o tutti i comandi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Stampa versione del programma e delle librerie.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Avvia server in background prima di eseguire un comando.</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nAvvia o connetti all&apos;istanza applicazione con nome sessione indicato.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSIONE</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nVisualizza COMANDI o tutti i comandi.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nVisualizza programma e librerie.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Uso: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Avvia server se non viene specificato alcun comando.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  COMANDI:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTE:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Usa l&apos;argomento con doppio trattino (--) per leggere tutti gli argomenti successivi\n    senza espandere le sequenze di escape (per esempio \\n, \\t e altri).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Usa ? per MIME per stampare i tipi MIME disponibili (l&apos;impostazione predefinita è &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Numero di argomenti non valido!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Impossibile esportare il file &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Impossibile importare il file &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>Gestore di appunti CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Comando non trovato!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Chiusura server.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Eccezione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Eccezione in %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Impossibile copiare negli appunti!</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Impossibile salvare nel file &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Usa l&apos;argomento trattino (-) per leggere i dati dall&apos;input standard.</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Impossibile importare il file &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Opzione &quot;%1&quot; non valida!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>La scheda con il nome specificato non esiste!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Il nome della scheda non può essere vuoto!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>La scheda con il nome specificato esiste già!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Memorizzazione appunti disabilitata*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Aggiungi scorciatoia</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Nuova scorciatoia</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Premi qualsiasi combinazione tasti. &lt;span style=&quot; font-weight:600;&quot;&gt;Esc&lt;/span&gt; per annullare.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Fai clic qui e premi qualsiasi combinazione tasti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Rimuovi scorciatoia</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Trova:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Gl&amp;obale</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>I tasti rapidi globali possono essere attivati da qualsiasi applicazione.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>A&amp;pplicazione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>I collegamenti alle applicazioni possono essere attivati solo dalla finestra principale.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">I collegamenti alle applicazioni possono essere attivati solo dalla finestra principale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>La scorciatoia esiste già!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Il nome scheda non deve essere vuoto e deve essere univoco.in secondi.&lt;br /&gt;\nLa scheda &lt;b&gt;No&amp;amp;te&lt;/b&gt; può essere aperta usando &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUsa &lt;b&gt;/&lt;/b&gt; come separatore di percorso nella visualizzazione struttura della scheda.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nome:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Nuova scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Rinomina scheda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Rinomina gruppo schede</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>Numero &amp;massimo elementi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>predefinito</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Salva elementi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Richiedi password dopo un intervallo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Timeout (in secondi) scheda per richiedere nuovamente la password di crittografia.\n\nImposta a 0 per usare l&apos;impostazione globale.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>globale</translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;Negozio Articoli</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Premi &apos;/&apos; per la cercare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Digita per cercare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Espressione regolare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Senza distinzione tra maiuscole e minuscole</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_ja.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ja_JP\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>情報</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>クリップボードマネージャー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>作者</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>メール</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>ウェブ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>寄付</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>アクションダイアログ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>標準入力(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>記録する標準出力(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>コマンド(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>指定したメディア形式のデータをコマンドの標準入力へ送信します (空のままにすると無効になります)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>プログラムの標準出力からアイテムを作成します (空のままにすると無効になります)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>新しいアイテムのセパレータ(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;出力を複数のアイテムに分割する時に使用する正規表現を設定。&lt;\\p&gt;\n&lt;p&gt;それぞれの行でアイテムを分割する場合は &lt;b&gt;\\n&lt;/b&gt; を使います。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>出力タブ(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>入力された名前のタブにアイテムを保存します (現在のタブに保存する場合は空にしてください)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">コマンドを保存しました</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">保存されたコマンドは、アイテムメニューからアクセスできます。\n設定画面でコマンドを設定できます。</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>エラー: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>終了コード: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>コマンド %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>プロセスマネージャー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>フィルター</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>選択項目を終了(&amp;T)</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>コマンドを追加</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>メインウィンドウの表示切り替え</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>トレイメニューを表示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>マウスカーソルの下にメインウィンドウを表示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>クリップボードを編集</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>最初のアイテムを編集</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>2つ目のアイテムをコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>アクションダイアログを表示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>新しいアイテムを作成</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>次のアイテムをコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>前のアイテムをコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>プレーンテキストとしてクリップボードを貼り付け</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>クリップボードの記録を無効化</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>クリップボードの記録を有効化</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>貼り付けて次のアイテムをコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>貼り付けて前のアイテムをコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>スクリーンショットを撮影</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>現在の日時を貼り付け</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>新しいコマンド</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>1文字以下のアイテムを無視</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>ブラウザーで開く(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>プレーンテキストとして貼り付け</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>動画を自動再生</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>URL (ウェブアドレス) を別のタブにコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>サムネイルを作成 (要 ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>URL から QR コードを作成 (要 qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>タスク</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>%1 タブに追加</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>%1 タブに移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>コピーしたファイルを無視</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>タイトルに *&quot;Password&quot;* が含まれるウィンドウを無視</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Password</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>ゴミ箱へ移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(ゴミ箱)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>現在のタブをクリア</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">新しいアイテムを追加できません</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">タブが一杯です。アイテムの削除に失敗しました。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>タブ %1 に新しいアイテムを追加できません。手動でアイテムを削除して空きを確保してください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>変更を破棄しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>本当に&lt;strong&gt;変更を破棄&lt;/strong&gt;しますか?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>サーバーに接続できません! 最初に CopyQ サーバーを起動してください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>接続が切れました!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>クリップボードの内容</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>フォーマット(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>内容(&amp;O):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>フォーマットを削除</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>アイテムの内容</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;サイズ:&lt;/strong&gt; %1 バイト</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;サイズ:&lt;/strong&gt; %1 バイト</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ サーバーは既に稼働中です。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>動作中のコマンドをキャンセル</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>動作中のコマンドをキャンセルして終了しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>終了をキャンセル</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>終了を実行</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Space</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>コマンド</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>クリップボードの内容が新しくなった際に自動的に呼び出す、またはメニューからユーザーが呼び出す、もしくはシステムのショートカットから使用するコマンドを定義します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>検索(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>コマンドを読み込む(&amp;L)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>選択したコマンドを保存(&amp;V)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>選択したコマンドをコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>コマンドを貼り付け</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>未保存の変更</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>コマンドダイアログに未保存の変更があります。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>コマンド設定ファイルを開く</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>コマンド (*.ini);; CopyQ 設定 (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>選択したコマンドを保存</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>コマンド (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>コマンドのヘルプを表示 (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>このコマンドには、引数付きで実行されるプログラムの一覧が入っています。例:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">プログラムの引数 %1 はアイテムのテキストに、%2 から %9 は正規表現によりキャプチャされたテキストに置換されます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>プログラムの引数 %1 はアイテムの文字列に置き換えられます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>文字 %1 を使うと標準出力を次のプログラムに渡すことができます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>下記の構文では、コマンドの残りをひとつの引数として渡すことができます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>これは下記と同じ出力になります。%1長いコマンドの場合この方が便利です。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>下記に一覧化した機能もコマンドとして使うことができます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>クリップボード(&amp;C)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>名前(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>メニューに表示されるコマンドの名前</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>高度(&amp;A)</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">アクションのタイプ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>クリップボードの内容が新しくなった際に自動でコマンドを実行します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>自動(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>一致したアイテムのコンテキストメニューにコマンドを表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>メニュー内(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>グローバルショートカット(&amp;G):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>グローバルショートカット</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>スクリプト</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>表示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>一致するアイテム</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>入力文字列がこの正規表現に一致しない場合、コマンドをスキップします。(空ならすべてに一致)\n\nコマンドとフィルターの %2 から %9 (スクリプトでは引数[1]以上) は、一致する文字列に置換されます。\n\n例:\n\n- URL に一致: ^(https?|ftp)://\n- PDFファイルに一致: \\.pdf$に一致\n- 1文字に一致: ^.$\n- メディアファイルに一致: http://.*.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>フォーマット(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>ここで設定した MIME タイプのデータをコマンドの標準入力に送ります。\n無効にする場合は空にしてください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>コマンド(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>アイテムのコンテキストメニューからコマンドを実行した後メインウィンドウを隠します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>アイテムを変更し、新しくアイテムを作成しません</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>変換(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>プログラムの標準出力からアイテムを作成します (無効にする場合は空にしてください)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>詳細を表示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>ウィンドウ(&amp;W):</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;設定した正規表現にマッチするテキストを持つアイテムに対してのみコマンドを使用します (全てにマッチさせるには空にしてください)。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;例:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;   URL にマッチ    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  PDF ファイル名にマッチ    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  1個の文字にマッチ    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  リモートのマルチメディアにマッチ    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>内容(&amp;C):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>タイプ：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>フィルター(&amp;F):</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;フィルターコマンドが成功したアイテムにのみコマンドを使用します。&lt;/p&gt;\n\n&lt;p&gt;アイテムのテキストはフィルターコマンドに&lt;b&gt;標準入力&lt;/b&gt;として渡されます。このアイテムに対し、&lt;b&gt;フィルターコマンドの終了コードが 0 になった場合にのみマッチします&lt;/b&gt;。&lt;/p&gt;\n\n&lt;p&gt;コマンドの引数として渡すアイテムのテキストには &lt;b&gt;%1&lt;/b&gt; を、正規表現によってキャプチャされる文字列を表す引数 (括弧でくくった部分) には &lt;b&gt;%2&lt;/b&gt; から &lt;b&gt;%9&lt;/b&gt; までを使用します。&lt;/p&gt;\n\n&lt;p&gt;コマンドをパイプで繋げる (標準出力を次のコマンドに渡す) には &lt;b&gt;|&lt;/b&gt; を使用します。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>アクション</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>新しいアイテムをコピーするタブ名を設定 (無効にする場合は空にしてください)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>一致したアイテムを削除します\n\n注意: この動作が自動的に適用された場合、その他の自動コマンドは実行されません。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>アイテムを削除(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>メニューアクション</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>実行後にメインウィンドウを隠す(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>ショートカット(&amp;S):</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">入力された文字列がこの正規表現に一致しないなら、コマンド実行を省略します (空ですべてに一致)。\n\nCommand と Filter 内の %2 から %9 は、参照された文字列に置換されます。\n\n例:\n\n- URL に一致: ^(https?|ftp)://\n- PDF のファイル名: \\.pdf$\n- 1文字: ^.$\n- オンラインのマルチメディア: ^https://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;この正規表現に一致するタイトルのウィンドウからクリップボードにコピーされたアイテムにのみ、コマンドを使用します (空のままにすると任意のウィンドウが対象になります)。macOS では、ウィンドウタイトルの内容は、アプリ名、ダッシュ (&amp;quot;-&amp;quot;)、ウィンドウタイトル、の順になっています (例: &amp;quot;Safari - GitHub&amp;quot;)。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>filter コマンドが 0 以外の終了コードで失敗した場合は、コマンドをスキップします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>タブにコピー(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>コマンドオプション</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>コマンドが実行される前にアクションダイアログを表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>待機(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>出力(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>セパレータ(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>出力を複数のアイテムに分割する際にマッチさせるセパレータです</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>出力タブ(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>入力された名前のタブにアイテムを保存します (最初のタブに保存する場合は空にしてください)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>背景色</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">ノート</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>検索語句</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>選択状態</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>番号</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>通常</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>エディター</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>フォント</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>別背景色</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>文字色</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>通知</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>番号表示(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>スクロールバーを表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>スクロールバー(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>可能な場合はデスクトップ環境のアイコンを使用します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>タブ、ツールバー、メニューに色設定を反映(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>システムアイコン(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>ヒント</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>アンチエイリアス(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>テーマをリセット(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>テーマ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>テーマを読み込み(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>テーマを保存(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>外部エディターで現在のテーマを編集します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>テーマを編集(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>プレビュー:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>アイテム</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>検索文字列は %1 です。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>アイテムを選択し、\nF2 キーを押すと編集できます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>アイテム例 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>適当なメモ (Shift+F2 で編集)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>テーマファイルを開く</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>テーマファイルを保存</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>外部エディターが設定されていません</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>外部エディターコマンドを最初に設定してください!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Aa あ</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>言語(&amp;L):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>行に収まりきらない場合にテキストを折り返します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>長い文字列を折り返す(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>メインウィンドウを他のウィンドウの前面に表示し続けます</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>常に最前面に表示(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>他のアプリにフォーカスが移ればメインウィンドウを閉じます</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>フォーカスがなくなれば閉じる</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>有効にすると現在のスクリーンにウィンドウを開きます。\n無効にすると最後にウィンドウを閉じたスクリーンにウィンドウを開きます</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>現在のスクリーンにウィンドウを開く(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>アプリ終了時に確認します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>終了時に確認(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>システム起動時にアプリを実行します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>自動的に起動(&amp;A)</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Vi のナビゲーションキー (H, J, K, L など) や、検索に使うスラッシュ (/) キーに対応します</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Vi 風のナビゲーション(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>スクリーンショットや録画にアプリのウィンドウが写らないようにする</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>スクリーンショットや録画に写らない(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>ナビゲーション方法 / キー割当:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Vi 風 (キー H J K L / など) 、Emacs 風 (Ctrl+N P V など) に対応</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>標準</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>アイテムフィルターの履歴を保存/復元します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>フィルターの履歴を保存</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>コマンドの関数、型、変数名を補完するポップアップを自動的に表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>コマンドを自動的に補完</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>クリップボードの操作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>マウスで選択するのと同様の方法でコピーした内容を貼り付けます (大抵の場合マウスの中クリック)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) マウスを使ってクリップボードを貼り付け</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>ショートカット (Ctrl + V や Shift + Insert など) を使ってマウスで選択した部分に貼り付けます</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) マウスで選択したところにキーボードで貼り付け</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>履歴にクリップボードを保存します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) クリップボードを記録</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>マウスで選択したテキスト (プライマリーセレクション) を履歴に保存します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) マウスで選択したテキストを記録</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) 選択したら自動的にコマンドを実行</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>履歴内の最大アイテム数(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>各タブの最大アイテム数です</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">タブをメモリから開放する間隔 (分)(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>非アクティブ状態が指定時間継続したら各タブをメモリーから開放します。\n\n開放しない場合は値を 0 にしてください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>外部エディターコマンド (%1 は編集するファイル)(&amp;1):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>外部エディターコマンド (%1 は編集するファイル) です。\n  使用例:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>クリップボード記録用タブ(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>クリップボードの内容を自動的に記録するタブ名を指定します。\n\n自動記録を無効にする場合は空にしてください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Return (Enter) でアイテムを保存し Ctrl + Return (Enter) で改行したい場合は無効にしてください。\n\n注意: このオプションに関係なく、編集したアイテムは F2 で保存できます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Ctrl + Return でアイテムを保存し Return で改行する(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>各アイテムの内容を一行で表示します。\n\nアイテムの全内容を表示するにはアイテムのプレビューを使用します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>アイテムをシンプルに表示(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>番号による検索と数字キー押下による対象アイテムのアクティブ化を有効にします</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>番号の検索(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>シングルクリックでアイテムをアクティブにする</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>ダブルクリックまたは Enter キーでアイテムをクリップボードにコピーした後...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>アイテムを使用後に履歴リストの最上位へ移動します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>アイテムを最上位に移動(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>アイテムを使用後にメインウィンドウを閉じます</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>メインウィンドウを閉じる(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>アイテムを使用する際、直前に使用していたウィンドウにフォーカスを移動します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>直前のウィンドウにフォーカス(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>アイテムを使用する際、現在のウィンドウにアイテムを貼り付けます</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>現在のウィンドウに貼り付け(&amp;P)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>表示切り替え</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>タブを隠します (Alt キーで表示)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>タブを隠す(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>ツールバーを隠します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>ツールバーを隠す(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>ツールバーのラベルを隠す(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>閉じた時にメインウィンドウを隠します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>メインウィンドウを隠す(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>レイアウトと透過</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>タブバーの代わりにタブツリーを表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>タブツリー(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>フォーカス時の透過度(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>フォーカスがある場合のメインウィンドウの透過度です。\n\nメモ: この機能は環境によっては動作しません。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>非フォーカス時の透過度(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>フォーカスがない場合のメインウィンドウの透過度です。\n\nメモ: この機能は環境によっては動作しません。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>タブのアイテム数を表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>アイテム数を表示(&amp;W)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>通知の表示位置(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>通知を表示する画面上の位置を設定します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>下</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>右上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>右下</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>左下</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>左上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>通知の表示時間 (秒)(&amp;E):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>クリップボードの内容が新しくなった時、またはアイテムをクリップボードにコピーした時\n(ただしメインウィンドウが閉じている場合) に、通知を表示する時間を秒単位で指定します。\n\n無効にする場合は値を 0 にしてください。\n\nクリックするまで通知を表示したままにする場合は値を -1 にしてください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>クリップボード通知の行数(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>新しいクリップボードの内容を表示する行数です。\n\n無効にする場合は値を 0 にしてください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>OSの通知機能を使用(&amp;U)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>通知の配置</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>水平オフセット(&amp;Z):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>画面の右端または左端からの通知の距離です</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>垂直オフセット(&amp;V):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>画面の上部または下部からの通知の距離です</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>最大の幅(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>通知の最大横幅です</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>最大の高さ(&amp;X):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>通知の最大縦幅です</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>トレイ内にアイコンを表示しません。ウィンドウを閉じる代わりに最小化します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>トレイに表示しない(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>トレイメニューにクリップボードの内容を確認するコマンドを表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>クリップボードの内容を確認するコマンドを表示(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>トレイ内のメニューのアイテム数(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>トレイメニューに表示されるアイテムの数です</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>トレイメニューに現在のタブのアイテムを表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>メニューに現在のタブを表示(&amp;R)、</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>または他のタブを選択(&amp;C):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>トレイメニューに表示するタブ名です (最初のタブにしたい場合は空にしてください)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>メニューでアイテムを選択後、現在のウィンドウにアイテムを貼り付けます</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>アクティブ化したアイテムを現在のウィンドウに貼り付け(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>メニューのアイテムの隣に画像プレビューを表示します</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>メニューアイテムのアイコンとして画像プレビューを表示(&amp;O)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">設定</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>全般</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>レイアウト</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>履歴</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>トレイ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>通知</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>タブ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>アイテム</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>ショートカット</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>外観</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>オプション &quot;%1&quot; の値が無効です</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>設定をリセットしますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>この操作によりすべての設定がデフォルト値にリセットされます。&lt;br /&gt;&lt;br /&gt;本当に&lt;strong&gt;すべての設定をリセット&lt;/strong&gt;しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>再起動が必要です</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>言語設定はアプリを再起動した後に変更されます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>設定</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>同期用ディレクトリ &quot;%1&quot; の作成に失敗しました!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Down</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>アイコンを選択…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>アイコンを選択</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>参照...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>アイコンファイルを開く</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>画像ファイル (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>すべて(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>タブ(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>設定(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>コマンド(&amp;M)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">エディターの終了コードは %1 です</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">エディターコマンド: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>エディターコマンドに失敗しました (ログを確認してください)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">保存</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">アイテムを保存します (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">キャンセル</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">編集をキャンセルし変更を取り消します</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Escape</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">フォント</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">太字</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">斜体</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">下線</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">取り消し線</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">前景</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">背景</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">装飾を消去</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">検索</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">元に戻す</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">やり直す</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">暗号化されたアイテムを他のコンピューターやセッションと共有するには、公開鍵と秘密鍵が必要です:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(この秘密鍵は安全な場所に保管してください。)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>暗号化されたタブを見るには GnuPG のインストールが必要です。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>暗号化 (要 GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>復号化</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>復号化してコピー</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>復号と貼り付け</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>エラー: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>鍵の生成に失敗。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>暗号化された項目を他のパソコンやセッションに共有するには、これらの秘密鍵ファイルが必要です (安全な場所に保管してください):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>完了</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>新しい鍵を作成中 (数分かかる場合があります)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>キャンセル</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>新しいパスワードを設定...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>アイテムの暗号化を行う前に暗号化の鍵の&lt;strong&gt;生成が必要です&lt;/strong&gt;。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>新しい鍵を生成...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>パスワードを変更...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>暗号化に失敗!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>復号化に失敗!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>暗号化</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>アイテムとタブを暗号化します。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>アイテムを暗号化・復号化するには設定のコマンドタブで適切なコマンドを追加してください。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>暗号化アイテムとタブの共有</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>暗号化タブ</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;自動的に暗号化・復号化したいタブの名前を (1行につき1個ずつ) 指定してください。&lt;/p&gt;\n&lt;p&gt;復号化したアイテムをメモリから安全に解放するため、それらのタブは履歴タブからメモリー開放用タブへと切り分けられます。&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>破損したタブ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>タブ「 &lt;strong&gt;%1&lt;/strong&gt; 」は正常に読み込まれていません。一部のアイテムがなくなる可能性がありますが、タブを読み込みますか?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim プラグイン は Qt Creator の機能の一部です</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>アイテムの編集中は Vim エディタ風にします。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>アイテム編集に FakeVim を使用</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>設定ファイルのパス:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>画像</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>画像の表示を設定します。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>画像の最大の幅(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>履歴に表示される画像の最大幅です (元のサイズで表示する場合は0にしてください)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>画像の最大の高さ(&amp;H):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>履歴に表示される画像の最大縦幅です (元のサイズで表示する場合は0にしてください)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>画像エディターコマンド(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>SVG 以外の画像フォーマットをサポートするエディターコマンドを入力してください。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>SVG エディターコマンド(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>SVG 画像フォーマット用のエディターコマンドを入力してください。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>メモ</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>アイテムのメモを表示します。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>メモの位置</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>アイテムの上(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>アイテムの下(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>アイテムの横(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>ツールチップを表示する(&amp;L)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>追加(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>削除(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>上に移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>下に移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>一番上に移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>一番下に移動</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">上へ(&amp;U)</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">下へ(&amp;D)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>ピン留めされたアイテムを削除できません</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>アイテムのピン留めを外してから削除します。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>ピン留め</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>ピン留めを外す</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>ピン留めされたアイテム</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;アイテムを現在の行にピン留めして固定し、ピン留めを外すまで削除しないようにします。&lt;/p&gt;&lt;p&gt;スクリプト機能とショートカットを提供します。&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>参照...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>同期用のディレクトリを開く</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>同期ディレクトリの作成に失敗しました</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>同期</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>アイテムとメモをディスク上のディレクトリへと同期します。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>タブ &quot;%1&quot; のディレクトリ &quot;%2&quot; への同期に失敗しました!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>アイテムを削除しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>本当に&lt;strong&gt;アイテムと関連付けたファイルを削除&lt;/strong&gt;しますか?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>タブとディレクトリの同期</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;&lt;strong&gt;タブ&lt;/strong&gt;の内容を、入力された&lt;strong&gt;パス&lt;/strong&gt;のディレクトリに同期します。&lt;/p&gt;\n&lt;p&gt;&lt;strong&gt;タブ&lt;/strong&gt;のアイテムを保存したくない時は&lt;strong&gt;パスを空に&lt;/strong&gt;設定してください。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>タブ名</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>パス</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>拡張子とデータフォーマットの関連付け</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;メディア形式に &lt;strong&gt;-&lt;/strong&gt; (マイナス文字) を設定するとファイルを無視します。不明なファイル形式や隠しファイルも無視します。&lt;/p&gt;\n&lt;p&gt;例: 拡張子が &lt;strong&gt;txt&lt;/strong&gt; のファイルを &lt;strong&gt;text/plain&lt;/strong&gt; メディア形式として読み込みます。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>アイテムのメディア形式</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;MIME タイプに &lt;strong&gt;-&lt;/strong&gt; (マイナス文字) を設定するとファイルを無視します。不明なファイル形式や隠しファイルも無視します。&lt;/p&gt;\n&lt;p&gt;例: 拡張子が &lt;strong&gt;txt&lt;/strong&gt; のファイルを &lt;strong&gt;text/plain&lt;/strong&gt; MIME タイプとして読み込みます。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;ファイルを無視する場合は MIME タイプに &lt;strong&gt;-&lt;/strong&gt; (ダッシュ) を設定してください。 隠しファイル、その他不明なファイルは無視されます。&lt;/p&gt;\n&lt;p&gt;例: 拡張子が &lt;strong&gt;txt&lt;/strong&gt; のファイルを &lt;strong&gt;text/plain&lt;/strong&gt; MIME タイプとして読み込みます。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>拡張子</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">アイテムの MIME タイプ</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>タグを追加</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>タグを削除</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">%1 としてタグ付け</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">タグ %1 を削除</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>以下のタグを切り替え %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>タグがロックされたアイテムは削除できません</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>削除するには先にタグを外してください。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>重要</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>すべてのタグをクリア</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>タグ</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>アイテムタグを表示します。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>タグを追加、削除するためのメニュー項目はコマンドダイアログから追加、設定できます。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>より詳しい情報は &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;Wiki ページ&lt;/a&gt; をご覧ください。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>タグ名</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>一致</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>スタイルシート</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>色</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>アイコン</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>ロック</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>アイテムの削除を防止</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>テキスト</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>プレーンテキストやシンプルな HTML アイテムの表示を設定します。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>HTML とリッチテキストを保存、表示する</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>表示する最大行数 (0ですべて表示):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>表示最大幅をピクセル指定 (0で無制限):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>標準のスタイルシート:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">ウェブ</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">ウェブページを表示します。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">表示最大幅をピクセル指定 (0で無制限):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>ログ</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>終了しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>CopyQ を&lt;strong&gt;終了&lt;/strong&gt;しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>ファイル(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>編集(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>アイテム(&amp;I)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>タブ(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>ヘルプ(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>表示切り替え(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>新しいタブ(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>グループ %1 の名前を変更(&amp;G)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>タブ %1 の名前を変更(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>タブ %1 を削除(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>グループ %1 を削除</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>タブのアイコン変更(&amp;C)</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">クリップボードの記録を有効化(&amp;E)</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">クリップボードの記録を無効化(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>インポートオプション</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ エラー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>エクスポートオプション</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>エクスポートエラー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>ファイル %1 へのエクスポートに失敗しました!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>インポートエラー</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>ファイル %1 のインポートに失敗しました!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>クリップボード(&amp;C): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ アイテム (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>グループのすべてのタブを削除しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>グループ &lt;strong&gt;%1&lt;/strong&gt; の &lt;strong&gt;すべてのタブ&lt;/strong&gt; を削除しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>タブを削除しますか?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>タブ &lt;strong&gt;%1&lt;/strong&gt; を削除しますか?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>情報</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;非表示&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n 行)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;画像&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;アイテム&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;空&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;データ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n 行 &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>セッション名は文字、数字、&apos;-&apos; 、 &apos;_&apos; を含む\n最大でも16文字の文字列である必要があります!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>クリップボード(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>新しいアイテム(&amp;N)</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>インポート(&amp;I)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>エクスポート(&amp;E)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>設定(&amp;P)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">コマンド/グローバルショートカット(&amp;O)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>コマンド(&amp;O)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>クリップボードの内容を表示(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>クリップボードの記録を切り替え(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>プロセスマネージャー(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>終了(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>選択アイテムを昇順ソート(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>選択アイテムを降順ソート(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>アイテムを貼り付け(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>選択アイテムをコピー(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>検索(&amp;F)</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">クリップボードに移動(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>内容を表示(&amp;S)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>プレビューを表示(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">クリップボードに移動(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>削除(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>編集(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>メモを編集(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">エディターで編集(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>アクション(&amp;A)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>上に移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Up</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>下に移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Down</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>一番上に移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>一番下に移動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>新しいタブ(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>タブ名を変更(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>タブを削除(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>タブのアイコン変更(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>次のタブ(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Right</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Left</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>アイテムのコンテキストメニューを開く</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>前のタブ(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>アイテムの保存</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>編集をキャンセル</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>元に戻す</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>やり直し</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>フォント</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>太字強調</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>斜体</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>下線</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>打ち消し線</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>文字色</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>背景色</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>装飾を消去</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>検索</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>アイテムをアクティブに(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>エディターで編集(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>ログを表示(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>CopyQ について(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>ヘルプ(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>タブ %1 が破損しているか、または CopyQ のプラグインがありません!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>文字列をコピーしました (%n行)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>文字列をコピーしました</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>データをコピーしました</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">キャンセル</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>メインウィンドウを隠します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>メインウィンドウの表示を切り替えます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>コンテキストメニューを開きます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>サーバーを終了します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>クリップボードの内容の記録を有効/無効にします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>クリップボードの内容を出力します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>X11 セレクションの内容を出力します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>現在のウィンドウにクリップボードを貼り付けます\n(アプリによっては動作しない場合があります)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>クリップボードにテキストを登録します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXT</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\n内容をクリップボードに登録します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>指定した履歴番号のアイテムをクリップボードにコピーします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ROW</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>現在のタブの次のアイテムをクリップボードにコピーします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>現在のタブの前のアイテムをクリップボードにコピーします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>テキストをクリップボードに追加します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>指定された履歴番号にテキストを挿入します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>指定された履歴番号のアイテムを削除します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ROWS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>アイテムを編集、またはアイテムを新規作成します。\n-1 を指定すると現在クリップボード内にあるテキストを編集します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>出力するアイテムのセパレータを設定します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>クリップボードか指定した履歴番号のアイテムの生のデータを出力します。</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\n指定した履歴番号にデータを書き込みます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>アクションダイアログを表示します。</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\n指定した履歴番号のアイテムテキストでプログラムを実行します。\nテキストを引数としてプログラムに渡すには %1 を使用してください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nTIME で指定したミリ秒間トレイポップアップメッセージを表示します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITLE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESSAGE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>利用可能なタブ名のリストを表示します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>指定した名前のタブでコマンドを実行します。\nタブが存在しない時は新規作成します。\nデフォルトは最初のタブです。</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nECMAScript プログラムを診断します。\n引数には &quot;arguments[0..N]&quot; を使用してアクセスします。</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">アプリのテストを実行します (詳細を知りたい場合はコマンド引数に --help を追加してください)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>メインウィンドウを表示し、オプションとしてタブ名を指定するとそのタブを開きます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>現在のウィンドウからクリップボードにコピーします\n(アプリによっては動作しない可能性があります)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>クリップボードの内容をセットします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>現在のタブのアイテム数を出力します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>指定した履歴番号に生のデータを書き込みます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>履歴番号のアイテムのテキストで PROGRAM を実行します。\nPROGRAM に引数としてテキストを渡す場合は %1 を使用します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>トレイポップアップメッセージを TIME ミリ秒間表示します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMMAND</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>タブを削除します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>タブ名を変更します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NEW_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>アイテムをファイルにエクスポートします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILE_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>ファイルからアイテムをインポートします。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>すべてのオブションリストを表示します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>オプションの設定値を取得します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>オプションを設定します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALUE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>スクリプトを審査します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>指定したセッション名でアプリのインスタンスを起動、または接続します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>COMMAND またはすべてのコマンドのヘルプを表示します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>プログラムとライブラリのバージョンを表示します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>コマンドの実行前に、バックグラウンドでサーバーを開始します。</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\n設定したセッション名でアプリケーションを開始、あるいは接続します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSION</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nコマンドのヘルプ、または全てのコマンドを表示します。</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nプログラムとライブラリーのバージョンを表示します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>使用法: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>コマンドを指定しない場合、サーバーを起動します。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  コマンド:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>注意:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - エスケープ文字列 (例えば \\n や \\t など) を展開せずにすべての引数を読み込むには\n    ダブルダッシュ (--) を使用してください。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - 利用可能な MIME タイプを表示するには ? を使用してください (デフォルトは &quot;text/plain&quot;)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>引数の個数が無効です!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ クリップボード管理</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>例外</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>クリップボードへのコピーに失敗しました!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>コマンドが見つかりません!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>サーバーを終了中。\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>%1 の例外</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">ファイル &quot;%1&quot; を保存できません!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - 標準入力からデータを読み込むには引数にダッシュ (-) を使用してください。</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">ファイル &quot;%1&quot; をインポートできません!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>&quot;%1&quot; は無効なオプションです!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>そのような名前のタブは存在しません!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>名前のないタブは作成できません!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>その名前のタブは既に存在します!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*クリップボードの保存無効中*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>ショートカットを追加</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>新しいショートカット</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; でキャンセルできます。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">ここにキーを入力</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>ショートカットを削除</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>検索(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>グローバル(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>グローバルショートカットは、すべてのアプリ上で使用できます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>アプリ(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>アプリのショートカットは、メインウィンドウがアクティブな場合のみ使用できます。</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">アプリケーションショートカットはメインウィンドウがアクティブな場合に使用できます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>ショートカットは既に存在します!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>タブ名は1字以上の重複しない名前にしてください。&lt;br /&gt;\n&lt;b&gt;Alt+T&lt;/b&gt;でタブ用の&lt;b&gt;メニュー&lt;/b&gt;を開きます。&lt;br /&gt;\nレイアウトがタブツリーの場合、&lt;b&gt;/&lt;/b&gt; でパスの階層を構築できます。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>タブ名(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>新しいタブ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>タブ名を変更</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>タブグループ名を変更</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>アイテムの最大数(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>デフォルト</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>アイテムを保存(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">アイテムを復元(&amp;S)</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>&apos;/&apos; を押すと検索を開始</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>キー入力で検索を開始</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>正規表現</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>大文字と小文字を区別しない</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_kab.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"kab_DZ\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"></location>\n        <source>About</source>\n        <translation>Ɣef</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"84\"></location>\n        <source>Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"91\"></location>\n        <source>Author</source>\n        <translation>Ameskar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"92\"></location>\n        <source>E-mail</source>\n        <translation>Imayl</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"93\"></location>\n        <source>Web</source>\n        <translation>Aswel Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"></location>\n        <source>Donate</source>\n        <translation>Mudd tawsa</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"></location>\n        <source>Action Dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"></location>\n        <source>Co&amp;mmand:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"></location>\n        <source>Standard &amp;input:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"></location>\n        <source>Store standard o&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"></location>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"></location>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"></location>\n        <source>&amp;Separator for new items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"></location>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"></location>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"></location>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"></location>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"118\"></location>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"128\"></location>\n        <source>Exit code: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"158\"></location>\n        <source>Command %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"></location>\n        <source>Process Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"></location>\n        <source>Filter</source>\n        <translation>Imsizdeg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"></location>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"></location>\n        <source>Add Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"></location>\n        <source>Show/hide main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"></location>\n        <source>Show the tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"></location>\n        <source>Show main window under mouse cursor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"></location>\n        <source>Edit clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"></location>\n        <source>Edit first item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"></location>\n        <source>Copy second item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"></location>\n        <source>Show action dialog</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"></location>\n        <source>Create new item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"></location>\n        <source>Copy next item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"></location>\n        <source>Copy previous item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"></location>\n        <source>Paste clipboard as plain text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"></location>\n        <source>Disable clipboard storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"></location>\n        <source>Enable clipboard storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"></location>\n        <source>Paste and copy next</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"></location>\n        <source>Paste and copy previous</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"></location>\n        <source>Take screenshot</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"></location>\n        <source>Paste current date and time</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"></location>\n        <source>New command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"></location>\n        <source>Ignore items with no or single character</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"></location>\n        <source>Open in &amp;Browser</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"></location>\n        <source>Paste as Plain Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"></location>\n        <source>Autoplay videos</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"></location>\n        <source>Copy URL (web address) to other tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"></location>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"></location>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"></location>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tiwura</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"></location>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"></location>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"></location>\n        <source>Ignore copied files</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"></location>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"></location>\n        <source>Password</source>\n        <translation>Awal n uɛeddi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"></location>\n        <source>Move to Trash</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"></location>\n        <source>(trash)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"></location>\n        <source>Clear Current Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1587\"></location>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1906\"></location>\n        <source>Discard Changes?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1907\"></location>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"101\"></location>\n        <source>Connection lost!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"108\"></location>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"></location>\n        <source>Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"></location>\n        <source>&amp;Formats:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"></location>\n        <source>C&amp;ontent:</source>\n        <translation>Agb&amp;ur:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"></location>\n        <source>Remove Format</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"82\"></location>\n        <source>Item Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"151\"></location>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"105\"></location>\n        <source>CopyQ server is already running.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"369\"></location>\n        <source>Cancel Active Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"370\"></location>\n        <source>Cancel active commands and exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"373\"></location>\n        <source>Cancel Exiting</source>\n        <translation>Semmet tuffɣa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"374\"></location>\n        <source>Exit Anyway</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"></location>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Tallunt</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"></location>\n        <source>Commands</source>\n        <translation>Inezḍayen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"></location>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"></location>\n        <source>&amp;Find:</source>\n        <translation>A&amp;f-d:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"></location>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"></location>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"></location>\n        <source>Copy Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"></location>\n        <source>Paste Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"></location>\n        <source>Unsaved Changes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"></location>\n        <source>Command dialog has unsaved changes.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"></location>\n        <source>Open Files with Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"></location>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"></location>\n        <source>Save Selected Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"></location>\n        <source>Commands (*.ini)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"></location>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"></location>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"></location>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"></location>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"></location>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"></location>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"></location>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>ta&amp;cfawit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"></location>\n        <source>Show command help (F1)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"></location>\n        <source>&amp;Name:</source>\n        <translation>&amp;Isem:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"></location>\n        <source>Command name shown in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"></location>\n        <source>Type:</source>\n        <translation>Anaw&#xa0;:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"></location>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"></location>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Awur&amp;man</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"></location>\n        <source>Show command in context menu of matching items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"></location>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"></location>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"></location>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Askript</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"></location>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Sken-d</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"></location>\n        <source>&amp;Shortcut:</source>\n        <translation>Ane&amp;gzum:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"></location>\n        <source>&amp;Global Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"></location>\n        <source>Comman&amp;d</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"></location>\n        <source>&amp;Advanced</source>\n        <translation>T&amp;alqayt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"></location>\n        <source>Match Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"></location>\n        <source>&amp;Content:</source>\n        <translation>Agb&amp;ur:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"></location>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"></location>\n        <source>&amp;Window:</source>\n        <translation>Asfa&amp;ylu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"></location>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"></location>\n        <source>For&amp;mat:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"></location>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"></location>\n        <source>&amp;Filter:</source>\n        <translation>A&amp;msizdeg:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"></location>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"></location>\n        <source>Action</source>\n        <translation>Tigawt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"></location>\n        <source>Cop&amp;y to tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"></location>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"></location>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"></location>\n        <source>&amp;Remove Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"></location>\n        <source>Menu Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"></location>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"></location>\n        <source>&amp;Hide main window after activation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"></location>\n        <source>Command options</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"></location>\n        <source>O&amp;utput:</source>\n        <translation>T&amp;uffɣa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"></location>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"></location>\n        <source>&amp;Separator:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"></location>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"></location>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"></location>\n        <source>Output &amp;tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"></location>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"></location>\n        <source>Show action dialog before executing the command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"></location>\n        <source>&amp;Wait</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"></location>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"></location>\n        <source>Tr&amp;ansform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"></location>\n        <source>Show Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"></location>\n        <source>Background</source>\n        <translation>Agilal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"></location>\n        <source>Tooltips</source>\n        <translation>Tilillac n telɣut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"></location>\n        <source>Found</source>\n        <translation>Yettwaf</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"></location>\n        <source>Selected</source>\n        <translation>Yettwafren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"></location>\n        <source>Number</source>\n        <translation>Amḍan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"></location>\n        <source>Normal</source>\n        <translation>Amagnu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"></location>\n        <source>Editor</source>\n        <translation>Amaẓrag</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"></location>\n        <source>Font</source>\n        <translation>Tasefsit</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"></location>\n        <source>Alternate</source>\n        <translation>Awliwal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"></location>\n        <source>Foreground</source>\n        <translation>Aɣawas amezwaru</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"></location>\n        <source>Notification</source>\n        <translation>Alɣu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"></location>\n        <source>Show &amp;Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"></location>\n        <source>Show scrollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"></location>\n        <source>S&amp;crollbars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"></location>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"></location>\n        <source>S&amp;ystem Icons</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"></location>\n        <source>&amp;Antialias</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"></location>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"></location>\n        <source>&amp;Reset Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"></location>\n        <source>Theme:</source>\n        <translation>Asentel:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"></location>\n        <source>&amp;Load Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"></location>\n        <source>&amp;Save Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"></location>\n        <source>Edit current theme in external editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"></location>\n        <source>E&amp;dit Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"></location>\n        <source>Preview:</source>\n        <translation>Taskant:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"164\"></location>\n        <source>Open Theme File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"174\"></location>\n        <source>Save Theme File As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"193\"></location>\n        <source>No External Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"194\"></location>\n        <source>Set external editor command first!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"394\"></location>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"476\"></location>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>aferdis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"478\"></location>\n        <source>Search string is %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"479\"></location>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"481\"></location>\n        <source>Example item %1</source>\n        <translation>Amedya n uferdis %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"486\"></location>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"></location>\n        <source>&amp;Language:</source>\n        <translation>Tut&amp;layt:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"></location>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"></location>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"></location>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"></location>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"></location>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"></location>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"></location>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"></location>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"></location>\n        <source>Confirm application exit</source>\n        <translation>Sentem tuffɣa n usnas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"></location>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Sentem &amp;tuffɣa n usnas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"></location>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"></location>\n        <source>&amp;Autostart</source>\n        <translation>Asekker awurman</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"161\"></location>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"171\"></location>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"175\"></location>\n        <source>Default</source>\n        <translation>Amezwer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"180\"></location>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"185\"></location>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"208\"></location>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"211\"></location>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"218\"></location>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"221\"></location>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"228\"></location>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"240\"></location>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"243\"></location>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"250\"></location>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"></location>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"260\"></location>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"263\"></location>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"273\"></location>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"276\"></location>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"283\"></location>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"></location>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"></location>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"></location>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"></location>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"144\"></location>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"154\"></location>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"169\"></location>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"179\"></location>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"193\"></location>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"198\"></location>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"205\"></location>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"210\"></location>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"217\"></location>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"220\"></location>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"230\"></location>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"237\"></location>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"></location>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"246\"></location>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"253\"></location>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"256\"></location>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"263\"></location>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"266\"></location>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"273\"></location>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"276\"></location>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"></location>\n        <source>Show/Hide</source>\n        <translation>Senk-d/Ffer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"></location>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"></location>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"></location>\n        <source>Hide toolbar</source>\n        <translation>Ffer afeggag n ifecka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"></location>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"></location>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"></location>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"></location>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"></location>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"></location>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"></location>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"></location>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"></location>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"></location>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"></location>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"></location>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"></location>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"></location>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"></location>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"></location>\n        <source>Top</source>\n        <translation>D asawen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"></location>\n        <source>Bottom</source>\n        <translation>D akessar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"></location>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"></location>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"></location>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"></location>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"></location>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"></location>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"></location>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"></location>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"></location>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"></location>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"></location>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"></location>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"></location>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"></location>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"></location>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"></location>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"></location>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"></location>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"></location>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"></location>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"></location>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"></location>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"></location>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"></location>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"></location>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"></location>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"></location>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"></location>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"></location>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"></location>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"></location>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"></location>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"></location>\n        <source>Preferences</source>\n        <translation>Imenyafen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"159\"></location>\n        <source>General</source>\n        <translation>Amatu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"160\"></location>\n        <source>Layout</source>\n        <translation>Tamudemt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"161\"></location>\n        <source>History</source>\n        <translation>Amazray</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"></location>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"></location>\n        <source>Notifications</source>\n        <translation>Ilɣa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"></location>\n        <source>Tabs</source>\n        <translation>Accaren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"></location>\n        <source>Items</source>\n        <translation>Iferdisen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"></location>\n        <source>Shortcuts</source>\n        <translation>Inegzumen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"></location>\n        <source>Appearance</source>\n        <translation>Agrudem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"448\"></location>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"493\"></location>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"494\"></location>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"596\"></location>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"597\"></location>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"574\"></location>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"></location>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"></location>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"></location>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"151\"></location>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"158\"></location>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"></location>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"205\"></location>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"></location>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"></location>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"></location>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"></location>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"139\"></location>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"404\"></location>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"682\"></location>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"757\"></location>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"></location>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"868\"></location>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"879\"></location>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"873\"></location>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"884\"></location>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"889\"></location>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"894\"></location>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"899\"></location>\n        <source>Enter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"956\"></location>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"></location>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"></location>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"989\"></location>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"990\"></location>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"993\"></location>\n        <source>Cancel</source>\n        <translation>Semmet</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"992\"></location>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"995\"></location>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"998\"></location>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"1000\"></location>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"1006\"></location>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"></location>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"></location>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"></location>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"></location>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"></location>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"></location>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"75\"></location>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"76\"></location>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"></location>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"></location>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"></location>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"></location>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"></location>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"></location>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"></location>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"></location>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"></location>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"></location>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"></location>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"></location>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"></location>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"></location>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"></location>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"></location>\n        <source>Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"></location>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"></location>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"></location>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"></location>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"></location>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"></location>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"></location>\n        <source>&amp;Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"></location>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"></location>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"></location>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"></location>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"></location>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"183\"></location>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"184\"></location>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"348\"></location>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"356\"></location>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"></location>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"></location>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"112\"></location>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"763\"></location>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"777\"></location>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"></location>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"></location>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"428\"></location>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"463\"></location>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"464\"></location>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"></location>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"></location>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"></location>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"></location>\n        <source>Path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"></location>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"></location>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"></location>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"></location>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"146\"></location>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"151\"></location>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"172\"></location>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"606\"></location>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"607\"></location>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"743\"></location>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"773\"></location>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"></location>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"></location>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"></location>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"></location>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"></location>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"></location>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"></location>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"></location>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"></location>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"></location>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"></location>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"></location>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"></location>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"></location>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"></location>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"></location>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"></location>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"></location>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"293\"></location>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"669\"></location>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"707\"></location>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"708\"></location>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"772\"></location>\n        <source>&amp;File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"818\"></location>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"842\"></location>\n        <source>&amp;Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"846\"></location>\n        <source>&amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"871\"></location>\n        <source>&amp;Help</source>\n        <translation>&amp;Tallalt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"></location>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"898\"></location>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"900\"></location>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"902\"></location>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"904\"></location>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"906\"></location>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"949\"></location>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2108\"></location>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2230\"></location>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2518\"></location>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"3924\"></location>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"3945\"></location>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"3946\"></location>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4038\"></location>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4039\"></location>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4224\"></location>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4225\"></location>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4272\"></location>\n        <source>Remove Tab?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4273\"></location>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"519\"></location>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"></location>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"418\"></location>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"424\"></location>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"></location>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"></location>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"438\"></location>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"440\"></location>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"></location>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"></location>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"></location>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"></location>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"></location>\n        <source>Ctrl+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"></location>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"></location>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"></location>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"></location>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"></location>\n        <source>F6</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"></location>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"></location>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"></location>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"></location>\n        <source>F7</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"></location>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"></location>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"></location>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"></location>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"></location>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"></location>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"></location>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"></location>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"></location>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"></location>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"></location>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"></location>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"></location>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"></location>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"></location>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"></location>\n        <source>Cancel Editing</source>\n        <translation>Semmet aseẓreg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"></location>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"></location>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"></location>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"></location>\n        <source>Font</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"></location>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"></location>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"></location>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"></location>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"></location>\n        <source>Foreground</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"></location>\n        <source>Background</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"></location>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"></location>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"></location>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"></location>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"></location>\n        <source>F4</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"></location>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"></location>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"></location>\n        <source>F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"></location>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"></location>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"></location>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"></location>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"></location>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"></location>\n        <source>F5</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"></location>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"></location>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"></location>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"></location>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"></location>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"></location>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"></location>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"></location>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"></location>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"></location>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"></location>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"></location>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"></location>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"></location>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"></location>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"></location>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"></location>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"></location>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"></location>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"></location>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"></location>\n        <source>&amp;Help</source>\n        <translation>&amp;Tallalt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"></location>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"></location>\n        <source>F12</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"></location>\n        <source>&amp;About</source>\n        <translation>Ɣ&amp;ef</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"></location>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"></location>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"437\"></location>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"227\"></location>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2479\"></location>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2482\"></location>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2498\"></location>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"></location>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"></location>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"></location>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"></location>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"></location>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"></location>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"></location>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"></location>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"></location>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"></location>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"></location>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"></location>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"></location>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"></location>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"></location>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"></location>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"></location>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"></location>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"></location>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"></location>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"></location>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"></location>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"></location>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"></location>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"></location>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"></location>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"></location>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"></location>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"></location>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"></location>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"></location>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"></location>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"></location>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"></location>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"></location>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"></location>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"></location>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"></location>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"></location>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"188\"></location>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"113\"></location>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"></location>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"></location>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"></location>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"></location>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"></location>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"></location>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"></location>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"></location>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"></location>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"></location>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"></location>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"></location>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"></location>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"></location>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"></location>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"></location>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"></location>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"></location>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"></location>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"></location>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"187\"></location>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"113\"></location>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"114\"></location>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"></location>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"120\"></location>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"121\"></location>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"></location>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"></location>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"129\"></location>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"577\"></location>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"582\"></location>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"719\"></location>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"754\"></location>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"766\"></location>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"865\"></location>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1429\"></location>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2942\"></location>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2943\"></location>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3053\"></location>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"646\"></location>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"651\"></location>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"1181\"></location>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2417\"></location>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"></location>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"></location>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"></location>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"></location>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"></location>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"></location>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"></location>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"></location>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"></location>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"></location>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"></location>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"></location>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"></location>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"></location>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"></location>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"></location>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"></location>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"></location>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"></location>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"></location>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"375\"></location>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"378\"></location>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_ko.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ko_KR\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>정보 및 번역: 비너스걸</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>클립보드 관리자</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>저자</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>이메일</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>웹</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>기부</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>작업 대화창</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>명령(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>표준 입력(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>표준 출력 저장(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>지정된 미디어 유형의 데이터를 표준 명령 입력으로 전송 (끄려면 비워 두세요)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>프로그램의 표준 출력에서 항목 만들기 (끄려면 비워 두세요)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>새 항목에 대한 구분자(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;출력을 여러 항목으로 분할하기 위한 정규식입니다.&lt;\\p&gt;\n&lt;p&gt;각 줄을 별도의 항목으로 저장하려면 &lt;b&gt;\\n&lt;/b&gt;를 사용합니다.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>출력 탭(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>지정된 이름으로 탭에 항목 저장 (현재 탭에 저장하려면 비워 두세요)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">명령 저장됨</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">명령이 저장 되었으며 항목 메뉴에서 접근할수 있습니다.\n환경설정에서 명령을 설정할 수 있습니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>오류: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>종료 코드: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>명령 %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>프로세스 관리자</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>필터</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>선택한 항목 종료(&amp;T)</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>명령 추가</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>기본 창 표시/숨기기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>트레이 메뉴 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>마우스 커서 아래에 기본 창 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>클립보드 편집</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>첫 번째 항목 편집</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>두 번째 항목 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>작업 대화창 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>새 항목 만들기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>다음 항목 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>이전 항목 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>클립보드를 일반 텍스트로 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>클립보드 저장 사용 안 함</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>클립보드 저장 사용</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>붙여넣고 다음 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>붙여넣고 이전 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>스크린샷 찍기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>현재 날짜 및 시간 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>새 명령</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>문자가 없거나 단일인 항목 무시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>브라우저에서 열기(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>일반 텍스트로 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>비디오 자동 재생</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>URL (웹 주소)을 다른 탭으로 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>미리보기 만들기 (ImageMagick 필요)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>URL에서 QR 코드 생성 (qrencode 필요)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>작업</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>%1 탭에 추가</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>%1 탭으로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>복사된 파일 무시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>*&quot;암호&quot;* 창 무시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>암호</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>휴지통으로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(휴지통)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>현재 탭 지우기</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>%1 탭에 새 항목을 추가할 수 없습니다. 공간을 확보하려면 항목을 수동으로 제거하세요.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>변경 사항을 폐기하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>&lt;strong&gt;변경 사항을 폐기&lt;/strong&gt;하시겠습니까?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>연결이 끊어졌습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>서버에 연결할 수 없습니다! 먼저 CopyQ 서버를 시작합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>클립보드 내용</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>형식(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>내용(&amp;O):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>형식 제거</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>항목 내용</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;크기:&lt;/strong&gt; %1 바이트</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ 서버가 이미 실행중입니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>활성 명령 취소</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>활성 명령을 취소하고 종료하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>종료 취소</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>무조건 종료</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translatorcomment>완료 메뉴를 표시하는 바로가기</translatorcomment>\n        <translation>Ctrl+스페이스</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>명령</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>새 클립보드 내용이나 메뉴에서 사용자가 또는 시스템 바로가기를 사용하여 자동으로 호출할 수 있는 새 명령을 정의합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>찾기(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>명령 불러오기(&amp;L)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>선택한 항목 저장(&amp;V)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>선택한 항목 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>명령 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>저장되지 않은 변경 사항</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>명령 대화 상자에 저장되지 않은 변경 사항이 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>명령으로 파일 열기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>명령 (*.ini);; CopyQ 구성 (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>선택된 명령 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>명령 (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>명령 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>명령을 파일 &quot;%1&quot;에 저장하는 데 실패했습니다: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>명령에는 실행될 인수가 있는 프로그램 목록이 포함되어 있습니다. 예:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>%1 프로그램 인수가 항목 텍스트로 대체됩니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>%1 문자를 사용하여 표준 출력을 다음 프로그램으로 전달할 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>다음 구문을 사용하여 명령의 나머지 부분을 단일 매개 변수로 전달할 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>이것은 %1과 동일한 출력을 제공하지만 더 긴 명령에 더 유용합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>아래 나열된 기능은 다음 명령과 같이 사용할 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>클립보드(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>명령 도움말 표시(F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>이름(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>메뉴에 표시된 명령 이름</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>유형:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>바로가기(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>전역 바로가기(&amp;G):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>명령(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>고급(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>클립보드에 새 내용이 있는 경우 자동으로 명령 실행</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translatorcomment>명령 유형. 클립보드가 변경될 때마다 트리거됩니다</translatorcomment>\n        <translation>자동(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>일치하는 항목의 상황에 맞는 메뉴에 명령 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translatorcomment>명령 유형. 사용자 지정 응용 프로그램 바로 가기에 의해 트리거됩니다</translatorcomment>\n        <translation>메뉴에서(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translatorcomment>명령 유형. 사용자 지정 전역/시스템 바로가기에 의해 트리거됩니다</translatorcomment>\n        <translation>전역 바로가기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translatorcomment>명령 유형. 스크립트 기능을 확장할 수 있습니다</translatorcomment>\n        <translation>스크립트</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translatorcomment>명령 유형. 항목 표시 방법을 변경할 수 있습니다</translatorcomment>\n        <translation>표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>일치 항목</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>내용(&amp;C):</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">입력 텍스트가 이 정규식과 일치하지 않으면 명령을 건너뜁니다 (모든 것과 일치하려면 비워 두십시오).\n\n명령 및 필터의 %2 ~ %9이(가) 캡처된 텍스트로 대체됩니다.\n\n예:\n\n- URL:일치 ^(https?|ftp)://\n- PDF 파일 이름 일치 : \\.pdf$\n- 단일 문자 일치 : ^.$\n- 원격 멀티미디어 일치: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>입력 텍스트가 이 정규 표현식과 일치하지 않으면 명령을 건너뛸 수 있습니다 (모든 것을 일치시키려면 비워 둡니다).\n\n명령어와 필터의 %2에서 %9 (또는 스크립트에서 인수[1] 이상)는 캡처된 텍스트로 대체됩니다.\n\n예제:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>창(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;이 정규식과 일치하는 제목 텍스트가 있는 창에서 클립보드로 복사된 항목에 대해서만 명령을 사용합니다 (창과 일치하려면 비워 두세요). macOS에서는 응용 프로그램 이름 뒤에 대시 (&amp;quot;-&amp;quot;),가 있고 창 제목이 있습니다. 예: &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>형식(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>이 MIME 유형의 데이터는 표준 명령 입력으로 전송됩니다.\n이 기능을 사용하지 않으려면 비워 두세요.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>필터(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>종료 코드가 0이 아닌 경우 필터 명령이 실패하면 명령을 건너뜁니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>동작</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>탭으로 복사(&amp;Y):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>새 항목을 복사할 탭 이름 (복사하지 않으려면 비워 두세요)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>일치하는 항목 제거\n\n참고: 이 기능이 자동으로 적용되면 다른 자동 명령은 실행되지 않습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>항목 제거(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>메뉴 작업</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>항목의 상황에 맞는 메뉴에서 명령을 활성화한 후 창 숨기기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>활성화 후 기본 창 숨기기(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>명령 옵션</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>출력(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>프로그램의 표준 출력에서 항목 만들기 (사용 안 함으로 설정하려면 비워 두세요)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>구분기호(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>출력을 여러 항목으로 분할하기 위해 일치시킬 구분자</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>출력 탭(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>지정된 이름으로 탭에 항목 저장 (첫 번째 탭에 저장하려면 비워 두세요)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>명령을 실행하기 전에 작업 대화 상자 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>대기(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>항목 변경, 새 항목 생성 안 함</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>변환(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>고급 표시</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>배경</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">노트</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>도구팁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>찾음</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>선택됨</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>번호</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>일반</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>편집기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>글꼴</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>대체</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>전경</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>알림</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>번호 표시(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>스크롤 막대 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>스크롤 막대(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>가능할 때마다 데스크톱 환경의 아이콘 사용</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>시스템 아이콘(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>알리아스(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>탭, 도구 모음 및 메뉴의 색상 설정(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>테마 재설정(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>테마:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>테마 불러오기(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>테마 저장(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>외부 편집기에서 현재 테마 편집</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>테마 편집(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>미리보기:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>테마 파일 열기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>다음으로 테마 파일 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>외부 편집기 없음</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>외부 편집기 명령을 먼저 설정하세요!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translatorcomment>모양 대화상자에서 글꼴 설정에 대한 텍스트를 미리 봅니다</translatorcomment>\n        <translation>가나다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translatorcomment>모양 탭의 미리 보기에서 식을 검색합니다.</translatorcomment>\n        <translation>항목</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>검색 문자열은 %1 입니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>항목을 선택하고\nF2 키를 눌러 편집합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>예제 항목 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>일부 임의 노트 (편집하려면 Shift+F2)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>언어(&amp;L):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>텍스트가 너무 길어서 줄에 맞지 않을 경우 구분</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>긴 텍스트 줄 바꿈(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>기본 창을 다른 창 위에 유지</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>항상 맨 위에(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>다른 응용프로그램에 초점이 있을 때 기본 창 닫기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>초점을 해제하면 닫기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>현재 화면에서 창을 엽니다. 마지막으로 닫은 창을 열려면 사용 안 함</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>현재 화면에서 창 열기(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>응용 프로그램 종료 확인</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>응용 프로그램 종료 확인(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>시스템 시작 시 응용 프로그램 실행</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>자동 시작(&amp;A)</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Vi 탐색 키 (H, J, K, L 등), 슬래시 (/) 키를 지원하여 검색</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Vi 스타일 탐색(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>스크린샷 및 녹화에서 앱 창 캡처 방지</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>스크린샷 및 녹화에서 숨기기(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>디스크의 탭 데이터 암호화 (비밀번호를 설정해야 함)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>탭 암호화(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>암호화 비밀번호를 위해 사용 가능한 외부 키 저장소 (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)를 사용합니다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>외부 키 저장소 사용(&amp;U)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>탭 데이터를 암호화하는 데 사용되는 비밀번호 변경</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>암호화 비밀번호 변경(&amp;P)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>내비게이션 스타일 / 키맵:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Vi 내비게이션 (키 H, J, K, L, / 등) 및 Emacs 내비게이션 (Ctrl+N, P, V 등) 지원</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>기본값</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>항목 필터 기록 저장 및 복원</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>필터 기록 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>팝업을 자동으로 표시하여 명령에서 함수, 유형 및 변수 이름을 완료합니다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>자동 완성 명령</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>클립보드 조작</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>일반적으로 마우스 가운데 버튼을 눌러 복사한 내용을 마우스 선택과 동일한 방법으로 붙여넣을 수 있습니다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translatorcomment>(&amp;3) 마우스로 클립보드 붙여넣기</translatorcomment>\n        <translation>(&amp;3) 마우스로 클립보드 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>바로가기를 사용하여 마우스 선택 항목을 붙여넣을 수 있습니다 (일반적으로 Ctrl+V 또는 Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translatorcomment>(&amp;4) 키보드로 마우스 선택 항목 붙여넣기</translatorcomment>\n        <translation>(&amp;4) 키보드로 마우스 선택 항목 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>내역에 클립보드 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) 클립보드 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>마우스로 선택한 텍스트 (기본 선택)를 기록에 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) 마우스로 선택한 텍스트 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) 선택 시 자동 명령 실행</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>기록의 최대 항목 수(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>각 탭의 최대 항목 수</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">분 단위 간격 후 탭 언로드(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>일정 간격 후 탭을 언로드(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>지정된 시간 (분) 동안 비활성화된 후 각 탭을 메모리에서 언로드합니다.\n\n탭을 언로드하지 않으려면 0으로 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>일정 간격 후 비밀번호 필요:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>암호화된 탭이 다시 비밀번호를 요구할 때까지 몇 초 만에 시간이 초과됩니다.\n\n전역적으로 비활성화하려면 0으로 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>외부 편집기 명령 (%&amp;1은 편집할 파일):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>외부 편집기 명령 (%1은 편집할 파일)입니다.\n  예:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>클립보드를 저장하기 위한 탭(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>새 클립보드 내용을 자동으로 저장할 탭의 이름입니다.\n\n자동 저장을 사용하지 않으려면 비워 두세요.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Return 키를 선택하지 않고 편집한 항목을 저장하고 Ctrl+Return 새 줄 만들기를 선택합니다.\n\n참고: 편집한 항목은 이 옵션을 무시하고 F2로 저장할 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>편집한 항목을 Ctrl+Return으로 저장하고 Return 키로 새 줄 만들기(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>각 항목에 대한 한 줄의 설명을 표시합니다.\n\n항목 미리보기를 사용하여 전체 항목을 표시합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>단순 항목 표시(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>숫자 검색을 활성화합니다. 그렇지 않으면 숫자 키를 누르면 해당 위치에서 항목이 활성화됩니다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>번호 검색(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>클릭 한 번으로 항목 활성화</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>항목이 활성화된 후 (두 번 클릭 또는 Enter 키) 클립보드에 복사하고...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>항목이 활성화된 후 목록의 맨 위로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>항목을 맨 위로 이동(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>항목이 활성화된 후 기본 창 닫기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>기본 창 닫기(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>항목이 활성화된 후 마지막 창에 포커스를 맞춥니다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>마지막 창에 포커스를 맞춤(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>항목이 활성화된 후 현재 창에 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>현재 창에 붙여넣기(&amp;P)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>표시/숨기기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>탭 숨기기 (Alt 키를 눌러 표시)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>탭 숨기기(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>도구 모음 숨기기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>도구 모음 숨기기(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>도구 모음 레이블 숨기기(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>닫힐 때 기본 창 숨기기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>기본 창 숨기기(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>레이아웃 및 투명도</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>탭 표시줄 대신 탭으로 트리 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>탭 트리(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>초점 투명도(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>초점을 맞춘 경우 기본 창의 투명성입니다.\n\n참고: 일부 시스템에서는 지원되지 않습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translatorcomment>포커스가 해제된 경우 기본 창의 투명성입니다.\n\n참고: 일부 시스템에서는 지원되지 않습니다.</translatorcomment>\n        <translation>초점이 맞지 않는 투명성(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>초점이 해제된 경우 기본 창의 투명성입니다.\n\n참고: 일부 시스템에서는 지원되지 않습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>탭에 항목 수 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>항목 수 표시(&amp;W)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>알림 위치(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>알림을 위한 화면 위치</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>맨 위</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>맨 아래</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>오른쪽 위</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>오른쪽 아래</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>왼쪽 아래</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>왼쪽 위</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>알림을 표시할 간격 (초)(&amp;E):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>새 클립보드 내용에 대한 알림을 표시하거나 항목이 클립보드에 복사된 경우 (기본 창이 닫힌 경우에만 해당)의 간격 (초).\n\n이 기능을 사용하지 않으려면 0으로 설정합니다.\n\n클릭할 때까지 표시하려면 -1로 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>클립보드 알림 줄 수(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>새 클립보드 내용에 대해 표시할 줄 수입니다.\n\n사용하지 않으려면 0으로 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>기본 알림 사용(&amp;U)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>알림 지오메트리 (스크린 포인트)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>수평 오프셋(&amp;Z):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>화면 지점의 왼쪽 또는 오른쪽 화면 가장자리에서 알림 거리</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>수직 오프셋(&amp;V):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>화면 상단 또는 하단 화면 가장자리로부터의 알림 거리 (스크린 포인트)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>최대 너비(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>화면 지점의 알림에 대한 최대 너비</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>최대 높이(&amp;X):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>화면 지점의 알림에 대한 최대 높이</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>트레이 아이콘 표시 안 함, 창 닫았을 때 최소화</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>트레이 사용 안 함(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>트레이 메뉴에서 현재 클립보드 내용에 대한 명령 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>클립보드 내용에 대한 명령 표시(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>트레이 메뉴의 항목 수(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>트레이 메뉴의 항목 수</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>트레이 메뉴에서 현재 탭의 항목 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>메뉴에 현재 탭 표시(&amp;R),</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>또는 다른 탭을 선택(&amp;C):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>트레이 메뉴에 표시할 탭 이름 (첫 번째 탭에는 비어 있음)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>메뉴에서 항목을 선택한 후 현재 창에 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>활성화된 항목을 현재 창에 붙여넣기(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>메뉴 항목 옆에 이미지 미리 보기 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>이미지 미리보기를 메뉴 항목으로 표시 아이콘(&amp;O)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>일반</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>레이아웃</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>사용 기록</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>트레이</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>알림</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>탭</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>항목</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>바로가기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>모양</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>&quot;%1&quot; 옵션에 대한 값이 잘못되었습니다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>환경 설정을 재설정하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>이 작업을 수행하면 모든 탭의 모든 기본 설정이 기본값으로 재설정됩니다.&lt;br /&gt;&lt;br /&gt;모든 기본 설정을 &lt;strong&gt; 재설정하시겠습니까&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>재시작 필요</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>응용 프로그램을 다시 시작한 후 언어가 변경됩니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>환경 설정</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>동기화 디렉터리 &quot;%1&quot;을(를) 만들지 못했습니다!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Down</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>아이콘 선택…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>아이콘 선택</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>찾아보기...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>아이콘 파일 열기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>이미지 파일 (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>모두(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>탭(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>구성(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>명령(&amp;C)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>편집기 명령 실패 (로그 참조)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"obsolete\">취소</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"obsolete\">글꼴</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"obsolete\">배경</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>암호화에 실패했습니다!</translation>\n    </message>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">암호화된 항목을 다른 컴퓨터 또는 세션에서 공유하려면 다음과 같은 공용 및 비밀 키 파일이 필요합니다:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(이 비밀키는 안전한 곳에 보관하십시오)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>암호화된 항목을 다른 컴퓨터나 세션에서 공유하려면 다음과 같은 비밀 키 파일이 필요합니다 (안전한 장소에 보관):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>암호화된 탭을 보려면 GnuPG를 설치해야 합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>암호화 (GnuPG 필요)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>복호화</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>복호화 및 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>복화화 및 붙여넣기</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>키 생성 실패함.키를 생성하지 못했습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>오류: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>완료</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>새 키를 만드는 중 (몇 분 정도 걸릴 수 있음)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>취소</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>새 암호를 설정하는 중...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>항목 암호화를 사용하려면 먼저 암호화 키을 &lt;strong&gt;생성해야&lt;/strong&gt; 합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>새 키 생성...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>암호 변경...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>복호화에 실패했습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>암호화</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>항목 및 탭을 암호화합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>항목을 암호화하고 해독하려면 명령 탭에서 적절한 명령을 추가합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>암호화된 항목 및 탭 공유</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>암호화된 탭</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;자동으로 암호화 및 암호 해독될 탭 이름 (한 줄에 하나씩)을 지정합니다.&lt;/p&gt;\n&lt;p&gt;기록 탭에서 언로드 탭 간격을 설정하여 암호 해독된 항목을 메모리에서 안전하게 언로드합니다.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>손상된 탭</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>&lt;strong&gt;%1&lt;/strong&gt; 탭의 일부 항목이 로드되지 않았습니다. 여전히 탭을 로드하고 일부 항목을 손실하시겠습니까?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim 플러그인은 Qt Creator 의 일부 입니다</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>항목을 수정하는 동안 Vim 편집기를 에뮬레이트 합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>항목 편집을 위해 FakeVim 사용</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>구성 파일 경로:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>이미지</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>이미지를 표시합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>최대 이미지 너비(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>기록에 표시되는 이미지의 최대 너비 (원래 크기의 경우 0으로 설정)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>최대 이미지 높이(&amp;H):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>기록에 표시되는 이미지의 최대 높이 (원래 크기의 경우 0으로 설정)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>이미지 편집기 명령(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>SVG 이외의 지원되는 이미지 형식에 대한 편집기 명령입니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>SVG 편집기 명령(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>SVG 이미지 형식에 대한 편집기 명령입니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>노트</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>항목에 대한 노트를 표시합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>노트 위치</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>항목 위(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>항목 아래(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>항목 옆(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translatorcomment>도구 팁 표시(&amp;L)</translatorcomment>\n        <translation>도구 팁 표시(&amp;L)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>추가(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>제거(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translatorcomment>버튼을 누르면 현재 항목이 한 행 위로 이동합니다</translatorcomment>\n        <translation>위로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translatorcomment>버튼은 현재 항목을 한 행 아래로 이동합니다</translatorcomment>\n        <translation>아래로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translatorcomment>버튼을 누르면 현재 항목이 맨 위로 이동합니다</translatorcomment>\n        <translation>맨 위로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translatorcomment>버튼을 누르면 현재 항목이 아래로 이동합니다</translatorcomment>\n        <translation>맨 아래로 이동</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>고정된 항목을 제거할 수 없음</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>먼저 항목을 고정 해제하고 제거합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>고정</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>고정 해제</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>고정된 항목</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;항목을 고정하여 현재 행에서 잠그고 삭제하지 않도록 합니다 (고정 해제되지 않은 경우).&lt;/p&gt;&lt;p&gt;바로가기 및 스크립팅 기능을 제공합니다.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translatorcomment>파일 대화상자를 열어 동기화 디렉터리를 선택하기 위한 버튼 텍스트</translatorcomment>\n        <translation>찾아보기...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>동기화를 위한 디렉토리 열기</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>동기화 디렉터리를 만들지 못했습니다</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>동기화</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>항목 및 노트를 디스크의 디렉터리와 동기화합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>&quot;%1&quot; 탭을 &quot;%2&quot; 디렉터리와 동기화하지 못했습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>항목을 제거하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>&lt;strong&gt;항목 및 연결된 파일을 제거&lt;/strong&gt;하시겠습니까?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>동기화 탭 및 디렉터리</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;&lt;strong&gt;탭&lt;/strong&gt;의 내용을 &lt;strong&gt;경로&lt;/strong&gt;가 지정된 디렉터리와 동기화합니다.&lt;/p&gt;\n&lt;p&gt;&lt;strong&gt;탭&lt;/strong&gt;에 항목이 저장되지 않도록 &lt;strong&gt;빈 경로&lt;/strong&gt;를 설정합니다.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>탭 이름</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>경로</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>파일에서 항목 데이터 형식</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;파일을 무시하려면 미디어 유형을 &lt;strong&gt;-&lt;/strong&gt; (마이너스 문자)로 설정하세요. 다른 알 수 없거나 숨겨진 파일은 무시됩니다.&lt;/p&gt;\n&lt;p&gt;예: &lt;strong&gt;txt&lt;/strong&gt; 파일 확장명을 &lt;strong&gt;text/plain&lt;/strong&gt; 미디어 유형으로 로드합니다.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>확장자</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>항목 미디어 유형</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>태그 추가</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>태그 제거</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">%1 로 태그 지정</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">%1 태그 제거</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>태그 %1 전환</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>잠긴 태그가 있는 항목을 제거할 수 없음</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>먼저 항목의 태그를 해제하여 제거합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translatorcomment>예제 명령의 태그 이름</translatorcomment>\n        <translation>중요</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>모든 태그 지우기</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>태그</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>항목에 대한 태그를 표시합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>사용자 지정 태그를 추가 및 제거하기 위한 메뉴 항목은 명령 대화 상자에서 추가 및 사용자 지정할 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>자세한 내용은 &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;위키 페이지&lt;/a&gt;에서 확인할 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>탭 이름</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>일치</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>스타일 시트</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>색상</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>아이콘</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>잠금</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>항목 제거 방지</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>텍스트</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>일반 텍스트 및 단순 HTML 항목을 표시합니다.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>HTML 및 리치 텍스트 저장 및 표시</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>표시할 최대 줄 수 (모두 표시하려면 0):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>픽셀 단위의 최대 높이 (제한 없는 경우 0):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>기본 스타일 시트:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">웹</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>로그</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ 항목 (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>암호화 사용 불가</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>암호화는 사용할 수 없습니다 (자세한 내용은 로그 참조).\n\n탭 데이터를 암호화하고 해독하는 것이 가능할 것입니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>비밀번호 가져오기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>가져오기를 위한 비밀번호 입력:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>비밀번호 내보내기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>내보낼 비밀번호 입력 (암호화하지 않을 경우 비어 있음):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>표시/숨기기(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>종료?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>CopyQ를 &lt;strong&gt;종료&lt;/strong&gt;하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>파일(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>편집(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>항목(&amp;I)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>탭(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>도움말(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>새 탭(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>그룹 %1 이름 바꾸기(&amp;G)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>탭 %1 이름 바꾸기(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>%1 탭 제거(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>그룹 %1 제거</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>탭 아이콘 변경(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translatorcomment>트레이 메뉴 클립보드 항목 형식</translatorcomment>\n        <translation>클립보드: %1(&amp;C)</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">클립보드 저장 사용(&amp;E)</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">클립보드 저장 사용 안 함(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>가져오기 옵션</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translatorcomment>알림 오류 메시지 제목</translatorcomment>\n        <translation>CopyQ 오류</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>내보내기 옵션</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>내보내기 오류</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>%1 파일을 내보내지 못했습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>가져오기 오류</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>%1 파일을 가져오지 못했습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>그룹의 모든 탭을 제거하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>그룹 &lt;strong&gt;%1&lt;/strong&gt;에서 &lt;strong&gt;모든 탭&lt;/strong&gt;을 제거하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>탭을 제거하시겠습니까?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>탭 &lt;strong&gt;%1&lt;/strong&gt;을(를) 제거하시겠습니까?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>정보</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translatorcomment>새 클립보드 내용을 자동으로 저장하는 탭의 기본 이름</translatorcomment>\n        <translation>클립보드(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;숨김&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translatorcomment>클립보드의 다중 줄 텍스트 레이블</translatorcomment>\n        <translation>\n            <numerusform>%1 (%n 줄)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;이미지&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;항목&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;비어있음&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;데이터&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translatorcomment>OS X에서 항목 또는 MIME을 제거하는 키</translatorcomment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translatorcomment>항목 또는 MIME을 제거하는 키</translatorcomment>\n        <translation>삭제</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>새 항목(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>가져오기(&amp;I)...</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>내보내가(&amp;E)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>환경 설정((&amp;P)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">명령/전역 바로가기(&amp;O)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>명령(&amp;C)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>클립보드 내용 표시(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>미리 보기 표시(&amp;)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>클립보드 저장 전환(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>프로세스 관리자(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>종료(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>선택한 항목 정렬(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>선택한 항목 역순(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>항목 붙여넣기(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>선택한 항목 복사(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>찾기(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>항목 저장</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>편집 취소</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translatorcomment>항목 편집기 변경 내용을 되돌리는 바로가기</translatorcomment>\n        <translation>Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>실행 취소</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>다시 실행</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>글꼴</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>굵게</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>기을임꼴</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>밑줄</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>취소선</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>전경</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>배경</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>스타일 지우기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>검색</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translatorcomment>선택한 항목을 클립보드에 복사하고 맨 위로 이동합니다 (설정에 따라)</translatorcomment>\n        <translation>항목 활성화(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>내용 표시(&amp;S)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>제거(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>편집(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>노트 편집(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>편집기로 편집(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>동작(&amp;A)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>위로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Up</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>아래로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Down</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>맨 위로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>맨 아래로 이동</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>새 탭((&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>탭 이름 바꾸기(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>탭 제거(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>탭 아이콘 변경(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>다음 탭(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translatorcomment>다음 탭에 초점을 맞추는 기본 바로가기</translatorcomment>\n        <translation>오른쪽</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>이전 탭(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translatorcomment>이전 탭에 초점을 맞추는 기본 바로가기</translatorcomment>\n        <translation>왼쪽</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>도움말(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>로그 표시(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>정보(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>항목 상황에 맞는 메뉴</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translatorcomment>항목 상황에 맞는 메뉴를 여는 기본 바로가기</translatorcomment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>%1 탭이 손상되었거나 일부 CopyQ 플러그인이 없습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>세션 이름은 최대 16자를 포함해야 합니다\n문자, 숫자, &apos;-&apos; 또는 &apos;_&apos;일 수 있습니다!</translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translatorcomment>클립보드의 다중 줄 텍스트에 대한 알림 제목</translatorcomment>\n        <translation>\n            <numerusform>텍스트 복사됨 (%n줄)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translatorcomment>클립보드의 한 줄 텍스트에 대한 알림 제목</translatorcomment>\n        <translation>텍스트 복사</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translatorcomment>클립보드의 복사된 데이터에 대한 통지 제목</translatorcomment>\n        <translation>데이터 복사됨</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>새 탭 암호화 비밀번호</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>새 비밀번호 입력:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>비밀번호가 일치하지 않았습니다. 다시 시도해 주세요 (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>비밀번호 변경</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>새 비밀번호는 비워둘 수 없습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>비밀번호 설정 실패</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>최대 비밀번호 시도 횟수가 초과되었습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>암호화 비밀번호 확인</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>비밀번호를 다시 입력하여 확인:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>현재 탭 암호화 비밀번호</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>탭 데이터를 암호화하기 위한 현재 비밀번호 입력:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>잘못된 비밀번호입니다. 다시 시도해 주세요 (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>비밀번호 검증 실패</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>암호화 파일 손상</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>암호화 파일이 누락되었거나 손상되었습니다. 엄격한 모드에서는 암호화된 탭을 자동으로 복구할 수 없습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>비밀번호 변경 실패</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>비밀번호를 변경하지 못했습니다. 이전 비밀번호는 여전히 활성화되어 있습니다. 자세한 내용은 로그를 확인해 주세요.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>비밀번호 변경 성공</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>비밀번호가 성공적으로 변경되었습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>탭을 다시 암호화하는 중...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>취소</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>%2의 %1 탭 재암호화: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>다음 탭을 암호화하지 못했습니다:\n\n%1\n\n자세한 내용은 로그를 확인해 주세요.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>암호화 실패</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>기본 창을 표시하고 지정된 이름으로 탭을 선택적으로 엽니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>기본 창을 숨깁니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>기본 창을 표시하거나 숨깁니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>상황에 맞는 메뉴를 엽니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>서버를 종료합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>클립보드 내용 저장을 비활성화하거나 활성화합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>클립보드 내용을 인쇄합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>X11 선택 내용을 인쇄합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>현재 창에 클립보드 붙여넣기\n일부 응용 프로그램에서는 작동하지 않을 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>현재 창에서 클립보드를 복사합니다\n(일부 응용 프로그램에서는 작동하지 않을 수 있습니다).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>클립보드 텍스트를 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>클립보드 내용을 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>데이터</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>현재 탭의 항목 양을 인쇄합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>행의 항목을 클립보드에 복사합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ROW</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>다음 항목을 현재 탭에서 클립보드로 복사합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>현재 탭에서 클립보드로 이전 항목을 복사합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>클립보드에 텍스트를 추가합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>지정된 행에 텍스트를 삽입합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>지정된 행의 항목을 제거합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ROWS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>항목을 편집하거나 새 항목을 편집합니다.\n값 -1은 클립보드의 현재 텍스트에 대한 값입니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>출력되는 항목에 대한 구분 기호를 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>클립보드 또는 행에 있는 항목의 원시 데이터를 인쇄합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>원시 데이터를 지정된 행에 씁니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>작업 대화 상자를 표시합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>행의 항목 텍스트에 대해 프로그램을 실행합니다.\nPROGRAM에서 %1을 사용하여 인수로 텍스트를 전달합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>트레이 팝업 메시지를 시간 (밀리초) 동안 표시합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITLE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESSAGE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>사용 가능한 탭 이름을 나열합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>지정된 이름의 탭에서 명령을 실행합니다.\n탭이 없는 경우 생성됩니다.\n기본값은 첫 번째 탭입니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>명령</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>탭을 제거합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>탭 이름을 바꿉니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NEW_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>항목을 파일로 내보냅니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILE_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>파일에서 항목을 가져옵니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>모든 옵션을 나열합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>옵션 값을 가져옵니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>옵션 값을 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALUE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>스크립트를 평가합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>지정된 세션 이름으로 응용 프로그램 인스턴스를 시작하거나 연결합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>COMMAND 또는 모든 명령에 대한 도움말을 인쇄합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>프로그램 및 라이브러리의 인쇄 버전입니다.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">응용프로그램 테스트를 실행합니다 (자세한 내용은 --help 인수 추가).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>명령을 실행하기 전에 백그라운드에서 서버를 시작합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>사용량: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>명령이 지정되지 않은 경우 서버를 시작합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  명령:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>노트:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - 표준 입력에서 데이터를 읽으려면 대시 인수(-)를 사용합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - 이스케이프 시퀀스 (즉, \\n, \\t 및 기타)를 확장하지 않고\n    모든 다음 인수를 읽으려면 이중 대시 인수(--)를 사용합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - MIME에서 사용 가능한 MIME 유형 (기본값은 &quot;text/plain&quot;)을 인쇄하려면 ?를 사용합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>잘못된 인수 개수입니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>파일 &quot;%1&quot;을 내보내지 못했습니다</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>파일 &quot;%1&quot;을 가져오지 못했습니다</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">%1 파일에 저장할 수 없습니다!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">%1 파일을 가져올 수 없습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ 클립보드 관리자</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>명령을 찾을 수 없습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>서버를 종료하는 중입니다.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>&quot;%1&quot; 옵션이 잘못되었습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>예외</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>%1의 예외</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>클립보드에 복사하지 못했습니다!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>지정한 이름의 탭이 없습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>탭 이름은 비워 둘 수 없습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>지정한 이름의 탭이 이미 있습니다!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*클립보드 저장 사용 안 함*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>바로가기 추가</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>새 바로가기</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;span style=&quot; font-weight:600;&quot;&gt;ESC&lt;/span&gt;를 누릅니다.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">여기를 클릭하고 아무 키 조합이나 누르십시오</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>바로가기 제거</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>찾기(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>전역(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>전역 바로가기는 모든 응용프로그램에서 트리거될 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>응용 프로그램(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>응용 프로그램 바로가기는 기본 창에서만 트리거할 수 있습니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>바로가기가 이미 있습니다!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>탭 이름은 비어있지 않아야 하며 고유해야 합니다.&lt;br /&gt;\n&lt;b&gt;아니요&amp;amp;tes&lt;/b&gt; 탭은 &lt;b&gt;Alt+T&lt;/b&gt;를 사용하여 열 수 있습니다.&lt;br/&gt;\n트리 보기 탭 레이아웃에서 경로 구분 기호로 &lt;b&gt;/&lt;/b&gt;를 사용합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>이름(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>새 탭</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>탭 이름 바꾸기</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>탭 그룹 이름 바꾸기</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>최대 항목 수(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>기본값</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>항목 저장(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>일정 간격 후 비밀번호 필요:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>암호화 비밀번호를 다시 요구할 때 탭당 시간 초과 시간 (초).\n\n전역 설정을 사용하려면 0으로 설정합니다.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>전역</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>검색하려면 &apos;/&apos;를 누르세요</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>검색할 유형</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translatorcomment>트레이 메뉴의 항목에 대한 키 힌트 (숫자 바로가기) (%1은 숫자, %2은 항목 레이블)</translatorcomment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>정규 표현식</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>대소문자 구분 안 함</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_lt.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"lt_LT\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Apie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Iškarpinės tvarkyklė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autorius</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>El. paštas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Svetainė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Paremti</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Veiksmų langas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Ko&amp;manda:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standartinė į&amp;vestis:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Sa&amp;ugoti standartinę išvestį:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Siųsti nurodyto tipo duomenis į standartinę komandos įvestį (jei norite išjungti, palikite tuščią langelį)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Kurti įrašus pagal standartinę programos išvestį (jei norite išjungti, palikite tuščią langelį)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>Naujų įrašų &amp;skirtukas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Reguliarioji išraiška išvesties skaidymui į kelis elementus.&lt;\\p&gt;\n&lt;p&gt;Norėdami kiekvieną eilutę įrašyti kaip atskirą įrašą, naudokite &lt;b&gt;\\n&lt;/b&gt;.&lt;\\p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Išvedimo &amp;kortelė:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Išsaugoti įrašus kortelėje nurodytu pavadinimu (jei norite išsaugoti dabartinėje kortelėje, palikite tuščią langelį)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Komanda išsaugota</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Klaida: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Išėjimo kodas: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Komanda %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Veiklų tvarkyklė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Atrinkti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Rodyti / slėpti pagrindinį langą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Rodyti dėklo meniu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Pagrindinį langą rodyti po pelės žymekliu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Iškarpinės taisa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Keisti pirmąjį įrašą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Kopijuoti antrąjį įrašą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Rodyti veiksmų langą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Sukurti naują įrašą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Kopijuoti kitą įrašą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Kopijuoti ankstesnį įrašą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Įdėti iškarpinę kaip paprastą tekstą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Išjungti iškarpinės saugyklą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Įgalinti iškarpinės saugyklą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Įdėti ir kopijuoti kitą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Įdėti ir kopijuoti ankstesnį</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Sukurti ekrano kopiją</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Įdėti datą ir dabartinį laiką</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nauja komanda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Nepaisyti tuščių įrašų ir tų, kuriuose yra tik vienas simbolis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Atverti &amp;naršyklėje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Įdėti kaip paprastą tekstą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Automatiškai paleisti vaizdo įrašus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Kopijuoti URL (žiniatinklio adresą) į kitą kortelę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Sukurti miniatiūrą (reikalinga „ImageMagick“)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Iš URL adreso sukurti QR kodą (reikalinga qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Užduotys</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Pridėti prie %1 kortelės</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Perkelti į %1 kortelę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Nepaisyti nukopijuotų rinkmenų</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Nepaisyti *&quot;Slaptažodžio&quot;* lango</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Slaptažodis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Perkelti į šiukšlinę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(šiukšlinė)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Išvalyti dabartinę kortelę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Pridėti komandas</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>Turinys:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Pašalinti formatą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Ieškoti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Įdėti komandas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Neišsaugoti pakeitimai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation type=\"unfinished\">&amp;iškarpinė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Pavadinimas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Komandos pavadinimas, rodytinas per meniu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matiškai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Langas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Scenarijus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Rodyti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Turinys:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Atranka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Komand&amp;a</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Tipas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Veiksmas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Laukti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;matas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>&amp;Kopijuoti į kortelę:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Skirtukas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>išvedim&amp;o kortelė:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Sudėtingesnės parinktys</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Fonas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Paaiškinimai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Skaičius</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\">Šriftas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Priekinis planas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Pranešimai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Rodyti slinkties juostas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Slinkties juostos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Sistemos žen&amp;kliukai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Apipavidalinimas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>Į&amp;kelti apipavidalinimą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>Į&amp;rašyti apipavidalinimą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Peržiūra:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>įrašas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Atverti apipavidalinimo rinkmeną</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Kalba:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>&amp;Visada viršuje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Patvirtinti programos išjungimą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Pa&amp;tvirtinti programos išjungimą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Paleisti kartu su sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>Paleisti &amp;automatiškai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Automatiškai užbaigti komandas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Iškarpinės valdymas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Rodyti / slėpti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Įrašai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Išvaizda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Parinktys</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Naršyti...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Kortelės:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Ko&amp;nfigūracija</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Ko&amp;mandos</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"obsolete\">F2</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Escape</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Vald+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Vald+Lyg2+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Įvestis</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Klaida: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Atlikta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Atsisakyti</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Pakeisti slaptažodį...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Šifravimas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Sugadinta kortelė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Paveikslai</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Rodyti paveikslus.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Pastabos</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Pastabų padėtis</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Pridėti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Paša&amp;linti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Pakelti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Nuleisti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Į patį viršų</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Į pačią apačią</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Prisegti</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Atsegti</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Naršyti...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sinchronizavimas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Pašalinti įrašus?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Kortelės pavadinimas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Kelias</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Pridėti gairę</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Pašalinti gairę</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Svarbu</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Gairės</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ženkliukas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Tekstas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Svetainė</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Žurnalas</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Išeiti?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Rinkmena</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Taisa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>Įraša&amp;s</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Kortelės</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Pagalba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nauja kortelė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Per&amp;vadinti grupę %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Pervadinti &amp;kortelę %2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Pašalinti kortelę %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Pašalinti grupę %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ klaida</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Rodyti / slėpti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Iškarpinė: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Pašalinti visas grupės korteles?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Pašalinti kortelę?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informacija</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;iškarpinė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;PASLĖPTA&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;PAVEIKSLAS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ĮRAŠAI&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;TUŠČIA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DUOMENYS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Naikinti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Šalinti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Naujas įrašas</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Vald+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importuoti...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Parinktys...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Vald+P</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>Ko&amp;mandos...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>Iš&amp;eiti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Įklijuoti elementus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Ieškoti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Gr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Šriftas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Pastorintas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Pasviras</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Pabrauktas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Perbrauktas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\">Priekinis planas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\">Fonas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Ieškoti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;Rodyti turinį...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Rodyti peržiūrą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Pašalinti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Taisa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Veiksmas...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nauja kortelė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Pervadinti kortelę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Pašalinti kortelę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>&amp;Kita kortelė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\">Dešinė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\">Kairė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Ankstesnė kortelė</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Rodyti žurnalą</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Pagalba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Tekstas nukopijuotas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Duomenys nukopijuoti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Atsisakyti</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>VARDAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEKSTAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DUOMENYS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>EILUTĖ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>EILUTĖS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SKIRTUKAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAMA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>LAIKAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>KOMANDA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>PASTABOS:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation type=\"unfinished\">&amp;Ieškoti:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation type=\"unfinished\">&amp;Pavadinimas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_nb.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"nb_NO\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Clipboard Manager</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Forfatter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-post</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Donere</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Handlingsdialog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Ko&amp;mmando:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standard &amp;inndata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Lagre standard &amp;utdata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation type=\"unfinished\">Send data for gitt mediatype til standardinndata for kommando (la stå tom for å skru av)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation type=\"unfinished\">Opprett elementer fra standardutdata for programmet (la stå tom for å skru av)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Separator for nye elementer:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Regulært uttrykk (RegEx) for å dele utdata opp i flere elementer.&lt;\\p&gt;\n&lt;p&gt;Bruk &lt;b&gt;\\n&lt;/b&gt; for å lagre hver linje som separate elemeter.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Fane for u&amp;tdata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Lagre elementer i fane med oppgitt navn (lagrer i nåværende fane hvis tom)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Kommando lagret</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Kommandoen ble lagret og kan åpnes fra element-menyen.\nDu kan sette opp kommandoen i innstillinger.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Feil: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Avsluttningskode: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Kommando %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Prosessbehandler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Terminer valgte</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Legg til kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Vis/skjul hovedvindu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Vis systemstatusfelt-menyen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Vis hovedvindu under musepeker</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Rediger utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Rediger første element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Kopier element to</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Vis handlingsdialogen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Opprett nytt element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Kopier neste element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Kopier forrige element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Lim inn fra utklippstavlen som ren tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Deaktiver lagring på utklippstavlen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Aktiver lagring på utklippstavlen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Lim inn og kopier neste</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Lim inn og kopier forrige</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Utfør skjermavbildning</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Lim inn aktuell dato og tid</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Ny kommando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorer elementer med kun ett eller ingen tegn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Åpne i nettleser</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Lim inn som Ren Tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Autoavspilling av videoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Kopier URL (webadresse) til annen fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Opprett miniatyrbilde (trenger ImageMagic)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Opprett QR-kode fra URL (trenger qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Gjøremål</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Legg til på %1-fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Flytt til %1-fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorer kopierte filer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorer *&quot;Passord&quot;* vindu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Passord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Flytt til papirkurven</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(papirkurv)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Tøm nåværende fane</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Kan ikke legge til nye elementer</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Fanen er full. Kan ikke fjerne noen elementer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Kan ikke legge til nye elementer i fane %1. Fjern elementer manuelt for å frigjøre plass.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Forkaste Endringer?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Ønsker du virkelig å &lt;strong&gt;forkaste endringer&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Mistet forbindelsen!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Kan ikke koble til tjener! Start CopyQ-tjener først.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation type=\"unfinished\">Utklippstavle-innhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formater:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>Innh&amp;old:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Fjern Format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation type=\"unfinished\">Element-innhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Størrelse:&lt;/strong&gt; %1 byte</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Størrelse:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ-tjeneren kjører allerede.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Avbryt aktive kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Avbryt aktive kommandoer og avslutt?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Avbryt avslutting</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Avslutt likevel</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+mellomrom</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation type=\"unfinished\">-kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definer nye kommandoer som enten kan aktiveres automatisk ved nytt innhold på utklippstavlen, eller av bruker fra menyen eller system-snarvei.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Finn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Last inn kommandoer …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>L&amp;gre valgte…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopier valgte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Lim inn Kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Ulagrede Endringer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Kommandodialogen har ulagrede endringer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Åpne Filer med Kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Kommandoer (*.ini);; CopyQ Konfigurasjon (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Lagre Valgte Kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Kommandoer (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Kommandofeltet inneholder liste over programmer med argumenter som vil bli utført. For eksempel:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Program-argument %1 blir erstattet av element-teksten, og %2 t.o.m %9 av tekst avledet av regulært uttrykk.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Programargument %1 vil bli erstattet med elementtekst.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Tegnet %1 kan brukes til å sende standard uttdata til neste program.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Følgende syntaks kan brukes til å sende resten av kommandoen som en enkelt parameter.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Dette gir samme utdata som %1men er mer nyttig for lengre kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Funksjonene i listen nedenfor kan brukes i følgende kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Vis kommando-hjelp (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Navn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Kommandonavnet som vises i menyen</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Handlingstype</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Kjør kommandoen automatisk hvis utklippstavlen har nytt innhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matisk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Vis kommando i kontekstmenyen til samsvarende elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>I M&amp;eny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Snarvei:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Global Snarvei:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation type=\"unfinished\">Global snarvei</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Element Må Samsvare Med</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Bruk kommando kun for elementer kopiert til utklippstavle fra vindu med titteltekst som samsvarer med regulært uttrykk (la stå tomt for å samsvare med vilkårlig vindu). På macOS, inneholder dette programnavnet etterfulgt av en bindestrek (&amp;quot;-&amp;quot;) og så vindustittelen. F.eks. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Data av denne MIME-typen vil bli sendt til kommandoens standard inndata\n(tom for å deaktivere).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Vindu:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Bruk kommandoen kun for elementer hvis tekst samsvarer med dette regulære uttrykket (tomt for å samsvare med alt).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Eksempler:&lt;/span&gt; &lt;/p&gt; &lt;p&gt;   Samsvar med URL    &lt;span style=&quot; font-weight:600;&quot;&gt; ^(https?|ftp)://&lt;/span&gt; &lt;/p&gt; &lt;p&gt;  Samsvar med PDF filnavn    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Samsvar med enkelt tegn    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Samsvar med ekstern multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>Innhold:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filter:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Bruk kommandoer bare hvis filterkommandoen lykkes.&lt;/p&gt;\n\n&lt;p&gt;Elementtekst sendes til &lt;b&gt;standard inndata&lt;/b&gt; for filterkommandoen. Elementet &lt;b&gt;samsvares bare hvis filterkommandoens avslutningskode er 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Bruk &lt;b&gt;%1&lt;/b&gt; for elementtekst sendt som et argument og &lt;b&gt;%2&lt;/b&gt; til &lt;b&gt;%9&lt;/b&gt; for argumenter avledet av regulære uttrykk (deler omsluttet av paranteser).&lt;/p&gt;\n\n&lt;p&gt;Bruk &lt;b&gt;|&lt;/b&gt; for å lenke kommandoer (send standard uttdata til neste kommando).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Komman&amp;do</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Type:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the catured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Hopper over kommando hvis inndatatekst ikke samsvarer dette regulære uttrykket (la stå tomt for å samsvare med alt).\n\n%2 tilogmed %9 i kommando og filter vil erstattes med fangede tekster.\n\nEksempler:\n\n- Jamfør mot nettadresse: ^(https?|ftp)://\n- Jamfør mot PDF-filnavn: \\.pdf$\n- Jamfør mot enkelt bokstav: ^.$\n- Jamfør mot multimedia annensteds fra: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Hopper over kommandoen hvis filterkommandoen mislykkes med ikke-null-avsluttningskode.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Handling</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Navn på fane som nye elementer skal kopieres til (la være tom for ikke å kopiere)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Fjern samsvarende elementer\n\nMerk: Hvis dette påføres automatisk, vil ingen andre automatiske kommandoer eksekveres.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Fje&amp;rn Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menyhandling</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Skjul vindu etter at kommando er aktivert fra kontekstmenyen til et element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>Skjul &amp;hovedvinduet etter aktivering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Kommandoinnstillinger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Vis handlingsdialog før eksekvering av kommandoen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>Vent</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Endre element, ikke opprett nye elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>&amp;Utdata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avansert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skript</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation type=\"unfinished\">Vis</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Hopper over kommandoen hvis inndatatekst ikke stemmer med dette regulære uttrykket (la stå tomt for å overensstemme med alt).\n\n%2 tilogmed %9 i kommando vil bli erstattet av innhentede tekster.\n\nEksempler:\n\n- Jamfør nettadresse: ^(https?|ftp)://\n- Jamfør PDF-filnavn: \\.pdf$\n- Jamfør enkelt tegn: ^.$\n- Jamfør mot multimedia annensteds hen: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>F&amp;ormat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Ko&amp;pier til fane:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Opprett elementer fra programmets standard utdata (tom for å deaktivere)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Separator:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Separator som skal samsvares for å splitte utdata i flere elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Fane for u&amp;tdata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Lagre elementer i fane med oppgitt navn (inget for å lagre i første fane)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Vis avanserte valg</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Bakgrunn</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notater</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Verktøytips</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Funnet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Valgte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Redigeringsprogram</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Skrifttype</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternere</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Forgrunn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Melding</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Vis &amp;Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Vis rullefelt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Rullefelt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Bruk ikoner fra skrivebordsmiljøet hvis mulig</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>S&amp;ystemikoner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Antialias</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Bruk farger for faner, verktøyslinjen og menyer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>Tilbakestill Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>Last Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>Lagre Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Rediger nåværende tema i eksternt redigeringsprogram</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Re&amp;diger Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Forhåndsvisning:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Søkestrengen er %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Velg et element og\ntrykk F2 for å redigere.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Eksempel-element %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Noen tilfeldige notater (Shift+F2 for å redigere)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Åpne Tema-fil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Lagre Tema-fil Som</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Inget Eksternt Redigeringsprogram</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Oppgi eksternt redigeringsprogram først!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Språk:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation type=\"unfinished\">Bryt teksten hvis den er for å lang til å passe på linjen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\">Tekstbryting</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation type=\"unfinished\">Behold hovedvinduet over andre vinduer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Alltid &amp;øverst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\">Lukk hovedvindu når et annet program er i fokus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\">Lukk når ute av fokus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\">Aktiver for å åpne vinduer på skjerm med fokus. Deaktiver for å åpne vinduer der de ble lukket sist</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\">Å&amp;pne vinduer på skjerm med fokus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\">Bekreft avslutning av programmet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Bekreft &amp;avslutning av programmet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\">Starter programmet ved systemstart</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\">&amp;Autostart</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"obsolete\">Støtte for Vi navigasjons-taster (H, J, K og flere), skråstrek (/) for å søke</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"obsolete\">Naviger i &amp;Vi stil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\">Lagrings- og opprettingshistorikk for elementfiltre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Lagre filterhistorikk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\">Vis et oppsprettsvindu automatisk for fullførelse av funksjon, type og variabelnavn i kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\">Auto-fullfør kommandoer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulasjon av utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\">Tillat å lime inn kopiert innhold på samme måte som musemarkeringer (vanligvis med å trykke på midtre museknapp)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\">(&amp;3) Lim inn uklippstavle med musen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\">Tillater å lime inn musemarkeringer ved hjelp av snarveier (vanligvis Ctrl+V eller Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\">(&amp;4) Lim inn musemarkeringer med tastaturet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\">Lagre utklippstavlen i historikk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\">(&amp;1) Lagre utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\">Lagre tekst markert med musen (primærvalg) i historikken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\">(&amp;2) Lagre tekst markert med musen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Kjør automatisk kommandoer ved utvalg</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\">Maksimalt antall elementer i historikk:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\">Makimalt antall elementer i hver fane</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"obsolete\">L&amp;ukk fane etter et intervall i minutter:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\">Fjern hver fane fra minnet etter et spesifisert antall minutter med inaktivitet.\n\nSett til 0 for ikke å fjerne faner.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\">Ekstern tekstbehandlerkommando (%1&amp;1 er filen å redigere):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\">Kommando for eksternt redigeringsprogram -\n (%1 er filen som skal redigeres).\n  Eksempler:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\">Fane for lagring av utklippstavle:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\">Navn på fane som automatisk lagrer nytt utklippstavle-innhold.\n\nLa være tom for å deaktivere automatisk lagring.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\">La være umarkert for å la Enter-tasten lagre redigerte elementer og Ctrl+Enter opprette ny linje.\n\nMerk: Redigerte elementer kan lagres med F2 uansett.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\">Lagre redigerte elementer med Ctrl+Enter og opprett ny linje med Enter-tasten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\">Vis beskrivelse på enkeltlinje for hvert element.\n\nBruk Forhåndsvisning av Element for å vise hele elementer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Vis e&amp;nkle elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\">Skru på søk etter nummer, ellers vil det å trykke en tall-tast aktivere enheten på den posisjonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\">S&amp;øk etter nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Aktiver element med ett klikk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\">Etter element er aktivert (dobbelklikk eller Enter-tast), kopier til utklippstavle og...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\">Flytt element til toppen av listen etter at det er aktivert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\">Flytt element til t&amp;oppen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\">Lukk hovedvinduet etter at element er aktivert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\">Lukk hovedvinduet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\">Sett fokus på siste vindu etter at element er aktivert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\">&amp;Fokus på siste vindu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\">Lim inn i vindu med fokus etter at element er aktivert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\">Lim inn i vindu med fokus</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\">Vis/Skjul</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\">Skjul faner (trykk Alt-tasten for å vise)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\">Skjul faner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\">Skjul verktøyslinjen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\">Skju&amp;l verktøyslinjen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\">Skjul tekst på verktøyslinjen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\">Skjul hovedvinduet når lukket</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\">Skjul &amp;hovedvinduet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\">Oppsett og Gjennomsiktighet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\">Vis tre med faner i stedet for fanelinje</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\">Fanet&amp;re</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\">Gjennomsiktighet ved &amp;fokus:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\">Gjennomsiktighet for hovedvinduet, hvis i fokus.\n\nMerk: Dette støttes ikke på alle systemer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\">Gjennomsiktighet &amp;uten fokus:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\">Gjennomsiktighet for hovedvinduet, hvis ute av fokus.\n\nMerk: Dette støttes ikke på alle systemer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\">Vis antall elementer i faner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Vis antall &amp;elementer</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\">Plassering av meldi&amp;nger:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\">Skjermposisjon for meldinger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\">Topp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\">Bunn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Oppe til høyre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Nede til høyre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Nede til venstre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Oppe til venstre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\">Int&amp;ervall i sekunder for visning av meldinger:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\">Intervall i sekunder for visning av melding om nytt innhold i utklippstavlen eller hvis element er kopiert til utklippstavlen\n(bare hvis hovedvindu er lukket).\n\nSettes til 0 for å deaktivere.\n\nSettes til -1 for å vises til den klikkes på.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\">Antall linjer i melding for utklippstavle:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\">Antall linjer som vises for nytt innhold i utklippstavlen.\n\nSettes til 0 for å deaktivere.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Bruk systemspesifikke merknader</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\">Meldingsgeometri (i skjermpunkter)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\">Vann&amp;rett forskyvning:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\">Meldingens avstand til skjermens høyre eller venstre kant oppgitt i skjermpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Loddrett forskyvning:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\">Meldingens avstand til skjermens topp eller bunn oppgitt i skjermpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\">Maksimal bredde:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\">Maksimal bredde for meldingen oppgitt i skjermpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\">Maksimal høyde:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\">Maksimal høyde for meldingen oppgitt i skjermpunkter</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\">Ikke vis ikon i systemstatusfeltet; minimer vindu når lukket</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\">Deaktiv&amp;er i systemstatusfelt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\">Vis kommando for nåværende utklippstavle-innhold i systemstatusfelt-menyen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\">Vis kommandoer for utklippstavle-innhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\">Antall elementer i systemstat&amp;usfelt-menyen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\">Antall elementer i systemstatusfelt-menyen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\">Vis elementer fra aktiv fane i systemstatusfelt-menyen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\">Vis aktiv fane i menyen,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\">eller velg en annen fane:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\">Navn på fane som skal vises i systemstatusfelt-meny (tomt for første fane)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\">Lim inn element i vindu med fokus etter å ha valgt det i menyen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\">Lim inn aktivert element i vindu med fokus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\">Forhåndsvisning av bilder ved siden av meny-elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\">Forhåndsvis bilder som menyelement-ikon</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"obsolete\">Konfigurasjon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Generelt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Oppsett</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Historikk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Systemkurv</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Merknader</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\">Faner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Snarveier</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Utseende</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Ugyldig verdi for valget &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Tilbakestill innstillinger?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Denne handlingen vil tilbakestille alle dine innstillinger (i alle faner) til standardverdier.&lt;br/&gt;&lt;br/&gt;Ønsker du virkelig å &lt;strong&gt;tilbakestille alle innstillinger&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Omstart Påkrevd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Språk vil bli endret etter at programmet er startet på nytt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Innstillinger</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Kunne ikke opprette synkroniseringsmappen &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Ned</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Velg ikon…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>…</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Velg ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Bla gjennom...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Åpne Ikonfil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Bildefiler (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Faner:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>&amp;Oppsett</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Ko&amp;mmandoer</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">Redigeringsprogrammets avslutningskode er %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Redigeringskommando: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\">Redigerer-kommando mislyktes (sjekk loggen)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Lagre</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Lagre element (&lt;strong&gt;F2&lt;/strong&gt;</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Avbryt</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Avbryt Redigering og Tilbakestill Endringer</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Skrift</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Fet</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Kursiv</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Understreket</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Gjennomstreket</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Forgrunn</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Bakgrunn</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"obsolete\">Korrigeringsstil</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Søk</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Tilbakestill</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Gjør Om</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">For å dele krypterte elementer til andre datamaskiner eller sesjoner trenger du offentlige og private nøkkelfiler:&lt;ul&gt;&lt;li&gt; %1&lt;/li&gt;&lt;li&gt; %2&lt;br /&gt; (Ta vare på den hemmelige nøkkelen på et trygt sted.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG må være installert for å se krypterte faner.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Krypter (krever GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Dekrypter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Dekrypter og Kopier</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Dekrypter og lim inn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\">Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Feil: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Kunne ikke generere nøkler.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Ferdig</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Opretter nye nøkler (kan ta et par minutter)…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Avbryt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Oppretter nytt passord...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Krypteringsnøkler &lt;strong&gt;må genereres&lt;/strong&gt; før elementkryptering kan brukes.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Opprett nye nøkler...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Endre Passord...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Kryptering mislyktes!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Dekryptering mislyktes!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Kryptering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Krypter elementer og faner.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>For å kryptere og dekryptere elementer tilføy relevante kommandoer under fanen Kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Deling av Krypterte Elementer og Faner</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Krypterte Faner</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Speisifiser navn på faner (en per linje) som vil bli automatisk kryptert og dekryptert.&lt;/p&gt;\n&lt;p&gt;Sett intervall for lukking av faner i Historikk-fanen for å trygt laste krypterte elementer ut av minnet.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Skadet fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\">Ikke alle elementer i fanen &lt;strong&gt;%1&lt;/strong&gt; ble innlastet rett. Vil du laste inn fanen og antagelig miste noen elementer?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim udvidelsen er en del av Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emuler Vim-redigeringsprogrammet ved redigering av elementer.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Aktiver FakeVim for redigering av elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Sti til Konfigurasjonsfilen:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Bilder</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Vis bilder.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Maksimal Bildebredde:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Maksimum bredde på bilder vist i historikk (sett til 0 for original størrelse)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Maksimal Bilde&amp;høyde:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Maksimum høyde på bilder vist i historikk (sett til 0 for original størrelse)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Kommando for b&amp;ilderedigering:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Redigeringskommando for støttede billdeformater bortset fra SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG redigeringskommando:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Redigeringskommando for SVG-billdeformat.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Notater</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Vis notater for elementer.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Plassering av Notater</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>O&amp;ver element</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Nedenfor ele&amp;ment</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Ved siden av ele&amp;ment</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Vis Verktøytips</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>Legg Til</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Fje&amp;rn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Flytt oppover</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Flytt nedover</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Flytt til toppen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Flytt til bunnen</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">Opp</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">Ne&amp;d</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Kan ikke fjerne festede elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Løsne elementer først for å fjerne dem.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Fest</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Løsne</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Festede elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Fest elementer for å låse dem i nåværende rad og unngå sletting (med mindre de avhektes).&lt;/p&gt;&lt;p&gt;Medfører snarveis- og skriptings-funksjonalitet.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Bla Gjennom...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Åpne mappe for synkronisering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Kunne ikke opprette synkroniseringskatalog</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synkroniser</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Synkroniser elementer og notater med en mappe på disken.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Kunne ikke synkronisere fanen «%1» med mappen «%2».</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Fjern elementer?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Ønsker du virkelig å &lt;strong&gt;fjerne elementer og tilhørende filer&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Synkronisering av Faner og Kataloger</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Synkroniser innholdet av &lt;strong&gt;fane&lt;/strong&gt; med mappe med oppgitt &lt;strong&gt;sti&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Sett sti til &lt;strong&gt;tom&lt;/strong&gt; for å ikke lagre elementer i &lt;strong&gt;fanen&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Fanenavn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Sti</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Dataformat for Fil til Element</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sett mediatype til &lt;strong&gt;-&lt;/strong&gt; (minus tegn) for å ignorere filer. Alle andre ukjente eller skjulte filer ignoreres.&lt;/p&gt;\n&lt;p&gt;Eksempel: Last inn &lt;strong&gt;txt&lt;/strong&gt;-filendelse som &lt;strong&gt;text/plain&lt;/strong&gt;-mediatype.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Element-mediatype</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Angi MIME -typen som &lt;strong&gt;-&lt;/strong&gt; (bindestrek) for å ignorere filer. Alle andre ukjente eller skjulte filer blir ignorert.&lt;/p&gt;\n&lt;p&gt;Eksempel: Les &lt;strong&gt;txt&lt;/strong&gt; -filtype som &lt;strong&gt;text/plain&lt;/strong&gt; MIME-type.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Utvidelser</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">MIME-type for Element</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Legg til Etikett</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Fjern en Etikett</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Angi etiketten %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Fjern etiketten %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\">Kan ikke fjerne elementer med en låst etikett</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Fjern etiketter fra elementer først for å fjerne dem.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Viktig</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Fjern alle etiketter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Etiketter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Vis etiketten til elementer.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Menyelementene for å legge til og fjerne brukerdefinerte etiketter kan legges til og tilpasses i Kommandodialogen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Mere info er tilgjengelig på &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki-side&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Navn på Etikett</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Samsvar med</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Stilark</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Farge</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Lås</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Unngå fjerning av element</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Vis klartekst og enkle HTML-elementer.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Lagre og vis HTML og rikt tekstformat (RTF)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Maksimalt antall linjer som skal vises (0 for å vise alle):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Maksimal høyde i piksler (0 for ubegrenset):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Forvalgt stilsett:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Vis nettsider.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"obsolete\">Maksimal høyde i piksler (0 for ubegrenset):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\">Logg</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Avslutte?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Vil du &lt;strong&gt;avslutte&lt;/strong&gt; CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Fil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>R&amp;ediger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>Faner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hjelp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Ny Fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Gi Nytt navn til &amp;Gruppe %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Gi Nytt Navn til Fane %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Fjern Fane %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Fjern Gruppe %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Endre Faneikon</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">Aktiv&amp;er Lagring av Utklippstavle</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">Deaktiv&amp;er Lagring av Utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\">-innstillinger for import</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ Feil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>Vi&amp;s/Skjul</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\">-alternativ for eksport</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\">-eksportfeil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Klarte ikke å eksportere fila %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\">-importfeil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Klarte ikke å importere fila %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>Utklippstavle: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ Elementer (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Fjerne alle faner i gruppen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vil du fjerne &lt;strong&gt;alle faner&lt;/strong&gt; i gruppen &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Fjern Fane?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vil du fjerne fanen &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informasjon</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;SKJULT&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n linje)</numerusform>\n            <numerusform>%1 (%n linjer)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;BILDE&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;UTKLIPP&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;TOM&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Tilbaketast</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Slett</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nytt Element</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importer…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Eksporter…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Innstillinger...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">K&amp;ommandoer/Globale Snarveier...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>K&amp;ommandoer...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Vis Utlippstavlens Innhold</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Veksle Utklipps&amp;tavle-lagring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>P&amp;rosessmanager</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>Avslutt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Sorter Valgte Elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Reverser Valgte Elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Lim Inn Elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>Kopier Valgte Elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Finn</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Flytt til Utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Vi&amp;s Innhold...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Forhånd&amp;svis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"obsolete\">Flytt til Utklippstavle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Fje&amp;rn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>R&amp;ediger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Rediger &amp;Notater</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">R&amp;ediger med redigeringsprogram</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>H&amp;andling...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Flytt Opp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Opp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Flytt Ned</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Ned</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Flytt til Toppen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Flytt til Bunnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Ny Fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Gi Fan&amp;e Nytt Navn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Fjern Fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Endre Faneikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Neste Fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\">Høyre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\">Venstre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Åpne elementsbindeleddsmeny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\">Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Fo&amp;rrige Fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Lagre element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Avbryt redigering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\">Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\">Tilbakestill</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\">Gjør Om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Skrift</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\">Fet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\">Kursiv</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\">Understreket</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\">Gjennomstreket</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\">Forgrunn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\">Bakgrunn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\">Korrigeringsstil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\">Søk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;ktiver elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\">R&amp;ediger med tekstbehandler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Vi&amp;s Logg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hjelp</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linje &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linjer &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Sesjonsnavnet må inneholde høyst 16 tegn\nsom kan bestå av bokstaver, tall, &apos;-&apos; eeler &apos;_&apos;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\">Fanen %1 er skadet, eller så mangler noen CopyQ-programtillegg!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform>Tekst kopiert (%n linjer)</numerusform>\n            <numerusform>Tekst kopier (%n linjer)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Tekst kopiert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Data kopiert</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Avbryt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Vis hovedvinduet og eventuelt åpne fanen med oppgitt navn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAVN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Skjul hovedvindu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Veksler visning av hovedvindu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Åpne kontekstmeny.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Avslutt tjener.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Deaktiver eller aktiver lagring av utklippstavlens innhold.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Skriv ut utklippstavlens innhold.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Skriv ut innhold fra X11-markering.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Lim inn utklippstavle til vindu med fokus\n(virker kanskje ikke med noen programmer).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\">Kopier utklippstavle fra nåværende vindu\n(trenger ikke å fungere i alle programmer).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Sett utklippstavle-tekst.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEKST</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nAngi utklippstavle-innhold.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Skriv ut antall elementer i åpen fane.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Kopier elementer i raden til utklippstavle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>RAD</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Kopier neste element fra åpen fane til utklippstavle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Kopier forrige element fra åpen fane til utklippstavle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Legg tekst til utklippstavle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Sett tekst inn i gitt rad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Fjern elementer i gitt rad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>RADER</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Rediger elementer eller rediger et nytt.\nVerdien -1 er for nåværende tekst i utklippstavle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Angi separator for elementer i utdata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Skriv ut rådata fra utklippstavle eller element i rad.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nSkriv rådata til gitt rad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Vis handlingsdialog.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nKjør PROGRAM på element-tekst i radene.\nBruk %1 i PROGRAM for å sende tekst som argument.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nVis systemstatusfelt-melding i TIME milisekunder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Sett utklippstavleinnhold.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Skriv rådata til angitt rad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Kjøpr PROGRAM på elementtekst i radene.\nBruk %1 i PROGRAM for å sende tekst som argument.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Vis oppsprettsmelding i systemkurven for TID i millisekunder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITTEL</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MELDING</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TID</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>List opp tilgjengelige fanenavn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Kjør kommandoen på fanen med oppgitt navn.\nFanen opprettes hvis den ikke eksisterer.\nStandard er første fane.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>KOMMANDO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Fjern fanen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Gi fanen nytt navn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NYTT_NAVN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Eksporter elementer til fil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FIL_NAVN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importer elementer fra fil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>List opp parametre.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Hent parameterverdi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>VALG</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Angi parameterverdi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VERDI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Evaluer skript.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Starter eller kobler til en programinstans med gitt brukernavn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Skriver ut hjelp for KOMMANDO, eller alle kommandoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Skriv ut versjonsinfo for program og bibliotek.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Start tjener i bakgrunnen før kjøring av kommando.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nEvaluer program for ECMAScript.\nArgumenter er tilgjengelige via &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTER</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nStarter eller kobler til programforekomst med gitt sesjonsnavn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESJON</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nSkriv ut hjelp for KOMMANDO eller alle kommandoer.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nSkriv ut programversjon og biblioteker.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Kjør programtest (tilføy --hjelp argumentet for mere info).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Bruk: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Start tjener hvis ingen kommando er spesifisert.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  KOMMANDOer:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTATER:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Bruk dobbelt bindestrek-argument (--) for å lese alle etterfølgende argumenter uten\n     ekspanderende escape-sekvenser (som \\n, \\t og andre).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Bruk ? for MIME til å skrive ut tilgjengelige MIME-typer (standard er &quot;text\\plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Ugyldig antall argumenter!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ-utklippstavlebehandler.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Unntak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Klarte ikke å kopiere til utklippstavle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Bruk bindestrek-argument (-) for å lese data fra standard inndata.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Kommandoen ble ikke funnet!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Avslutter tjeneren.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Kan ikke lagre til filen &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Kan ikke importere filen &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Ugyldig parameter &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Unntak i %1</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\">Fanen med oppgitt navn eksisterer ikke!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\">Fanenavnet kan ikke være tomt!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\">Fane med angitt navn eksisterer allerede!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Legg til snarvei</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Ny snarvei</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Trykk hvilken som helst tastekombinasjon. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; for å avbryte.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Klikk her og trykk hvilken som helst tastekombinasjon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Fjern Snarvei</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Finn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\">Global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\">Globale snarveier kan utløses fra ethvert program.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>P&amp;rogram</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Programsnarveier kan kun utløses fra hovedvinduet.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Programsvarveier kan kun utløses fra hovedvinduet.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Snarveien finnes allerede!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Fanenavn skal være unike og ikke tomme.&lt;br/&gt;\nFanen &lt;b&gt;No&amp;amp;tater&lt;/b&gt;&amp;amp; kan åpnes ved hjelp av &lt;b&gt;Alt+T&lt;/b&gt;&lt;br/&gt;\nBruk &lt;b&gt;/&lt;/b&gt; som sti-separator i faneoppsett med trevisning.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Navn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Ny fane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Gi fane nytt navn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Gi fanegruppe nytt navn</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Maksimalt antall elementer:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>forvalg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Lagre elementer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;Lagre elementer</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Trykk &quot;/&quot; for å søke</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Skriv for å søke</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Regulært Uttrykk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Ikke skill mellom små og store bokstaver</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_nl.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"nl_NL\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Over</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Klembordbeheerder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Maker</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mailadres</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Website</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Doneren</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Actievenster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Op&amp;dracht:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standaard&amp;invoer:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Standaardui&amp;tvoer opslaan:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Verstuur data van een bepaald media type als standaard invoer voor het commando (leeg laten om de actie uit te schakelen)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Maak nieuwe items aan voor standaard uitvoer van het programma (leeg laten om de actie uit te schakelen)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Scheidingsteken voor nieuwe items:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Reguliere uitdrukking voor het splitsen van de uitvoer in meerdere items. &lt;\\p&gt;\n&lt;p&gt;Gebruik &lt;b&gt;\\n&lt;/b&gt; voor het opslaan van elke regel van een item.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Uitvoer&amp;tabblad:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Bewaar items op het tabblad met de opgegeven naam (laat leeg om te bewaren op het huidige tabblad)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">De opdracht is opgeslagen</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">De opdracht is opgeslagen en kan worden geopend vanuit het itemmenu.\nU kunt de opdracht instellen in het voorkeurenvenster.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Fout: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Afsluitcode: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Opdracht %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Procesbeheer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>Afslui&amp;ten geselecteerd</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Opdrachten toevoegen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Hoofdvenster tonen/verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Systeemvakmenu tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Hoofdvenster tonen onder muisaanwijzer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Klembord bewerken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Eerste item bewerken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Tweede item kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Actievenster tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Nieuw item aanmaken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Volgend item kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Vorig item kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Klembordinhoud plakken als platte tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Klembordopslag uitschakelen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Klembordopslag inschakelen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Plakken en volgende kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Plakken en vorige kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Schermfoto maken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Huidige datum en tijd plakken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nieuwe opdracht</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Items met geen of slechts één teken negeren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Openen in web&amp;browser</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Plakken als platte tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Video&apos;s automatisch afspelen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>URL (webadres) naar ander tabblad kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Miniatuurvoorbeeld samenstellen (vereist ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>QR-code samenstellen uit url (vereist qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Taken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Toevoegen aan tabblad %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Verplaatsen naar tabblad %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Gekopieerde bestanden negeren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>*&quot;Wachtwoord&quot;*venster negeren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Wachtwoord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Verplaatsen naar prullenbak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(prullenbak)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Huidig tabblad leegmaken</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Kan geen nieuwe items toevoegen</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Tabblad is vol; kan geen items verwijderen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Er kunnen geen nieuwe items worden toegevoegd aan tabblad %1. Verwijder items om ruimte te maken.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Wijzigingen verwerpen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Weet u zeker dat u de &lt;strong&gt;wijzigingen wilt verwerpen&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Het verbinden met de server is mislukt. Start de CopyQ-server.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Verbinding verbroken!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Klembordinhoud</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Opmaak:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>Inh&amp;oud:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Opmaak verwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Iteminhoud</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Grootte:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Grootte:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>De CopyQ-server draait al.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Actieve opdrachten afbreken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Wilt u de actieve opdrachten afbreken en afsluiten?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Afsluiten annuleren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Tóch afsluiten</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+spatiebalk</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Opdrachten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Geef nieuwe opdrachten op die óf automatisch kunnen worden opgeroepen bij nieuwe klembordinhoud óf door de gebruiker vanuit het menu of middels systeemsneltoets.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Zoeken:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>Opdrachten &amp;laden…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Sele&amp;ctie opslaan…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Selectie kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Opdrachten plakken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Niet-opgeslagen wijzigingen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Het opdrachtvenster bevat niet-opgeslagen wijzigingen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Bestanden openen met opdrachten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Opdrachten (*.ini);; CopyQ-configuratie (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Geselecteerde opdrachten opslaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Opdrachten (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>De opdracht bevat een lijst met programma&apos;s en aanvullende opties die zullen worden uitgevoerd. Voorbeeld:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">De aanvullende optie &apos;%1&apos; zal worden vervangen door itemtekst en %2 tot %9 door teksten die worden opgevangen door reguliere uitdrukkingen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>De optie ‘%1’ wordt vervangen door de itemtekst.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Het teken &apos;%1&apos; kan worden gebruikt om standaarduitvoer door te sturen naar het volgende programma.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>De volgende syntax kan worden gebruikt om de rest van de opdracht door te sturen als één aanvullende optie.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Dit geeft dezelfde uitvoer als %1, maar is handiger voor langere opdrachten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Onderstaande functies kunnen worden gebruikt in de volgende opdrachten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;klembord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Opdrachthulp tonen (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Naam:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Opdrachtnaam, zoals getoond in het menu</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Soort actie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Opdracht automatisch uitvoeren bij nieuwe klembordinhoud</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matisch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Opdracht tonen in rechtermuisknopmenu van overeenkomende items</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>In m&amp;enu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Sneltoets:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>Al&amp;gemene sneltoets:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Algemene sneltoets</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Items overeen laten komen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Gebruik de opdracht alleen bij items die gekopieerd zijn naar het venster met titeltekst die overeenkomt met deze reguliere uitdrukking (laat leeg om elk venster overeen te laten komen). Op macOS omvat dit de programmanaam, gevolgd door een streepje (&amp;quot;-&amp;quot;) en de venstertitel. Voorbeeld: &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Gegevens van dit mime-type zullen worden verstuurd naar de standaardinvoer van deze opdracht.\nLaat leeg om uit te schakelen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Venster:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt; Opdracht alleen gebruiken voor items wiens tekst overeenkomt met deze reguliere uitdrukking (laat leeg om alles overeen te komen).&lt;/p&gt; &lt;p&gt; &lt;span style=&quot; font-weight:600;&quot;&gt; Voorbeelden:&lt;/span&gt; &lt;/p&gt; &lt;p&gt;   URL-overeenkomst    &lt;span style=&quot; font-weight:600;&quot;&gt; ^(https?|ftp)://&lt;/span&gt; &lt;/p&gt; &lt;p&gt;  PDF-bestandsnaamovereenkomst    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Enkel teken-overeenkomst    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Externe multimedia-overeenkomst    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Inhoud:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filteren:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt; Gebruik opdrachten alleen als de filteropdracht slaagt.&lt;/p&gt; 2\n\n&lt;p&gt; Itemtekst wordt doorgegeven aan de &lt;b&gt; standaardinvoer&lt;/b&gt; van de filteropdracht. Het item wordt &lt;b&gt; alleen overeengekomen als de filteropdracht een afsluitcode van 0 heeft&lt;/b&gt; 7.&lt;/p&gt; 8\n\n&lt;p&gt; Gebruik &lt;b&gt;%1&lt;/b&gt; voor het doorgeven van de itemtekst als aanvullende optie en &lt;b&gt;%2&lt;/b&gt; naar &lt;b&gt;%9&lt;/b&gt; voor de voor argumenten opgepakt als een reguliere uitdrukking (onderdelen ingesloten tussen haakjes).&lt;/p&gt;\n\n&lt;p&gt;Gebruik &lt;b&gt;|&lt;/b&gt; om opdrachten in een keten te zetten (geeft de standaarduitvoer door aan de volgende opdracht).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Op&amp;dracht</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Soort:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the catured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Negeert de opdracht als de invoertekst niet overeenkomt met deze reguliere uitdrukking (laat leeg om alles overeen te laten komen).\n\n%2 tot %9 bij de opdracht en het filter worden vervangen door de vastgelegde teksten.\n\nVoorbeelden:\n\n- URL-overeenkomst: ^(https?|ftp)://\n- PDF-bestandsnaamovereenkomst: \\.pdf$\n- Eénteken-overeenkomst: ^.$\n- Externe multimedia-overeenkomst: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Negeert de opdracht als de filteropdracht mislukt met een afsluitcode hoger dan nul.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Actie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Naam van tabblad waar nieuwe items naar moeten worden gekopieerd (laat leeg om niet te kopiëren)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Overeenkomend item verwijderen\n\nLet op: als dit automatisch wordt toegepast, dan worden er verder geen automatische opdrachten uitgevoerd.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Item ve&amp;rwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menu-actie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Venster verbergen nadat de opdracht is geactiveerd met het item-rechtermuisknopmenu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>Hoofdvenster &amp;verbergen na activatie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Opdrachtopties</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Actievenster tonen voordat de opdracht wordt uitgevoerd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Wachten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Item wijzigen; geen nieuwe items aanmaken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformeren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>&amp;Uitvoer:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Geavanceerd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Script</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Weergave</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Negeert de opdracht als de invoertekst niet overeenkomt met deze reguliere uitdrukking (laat leeg om alles overeen te laten komen).\n\n%2 tot %9 bij de opdracht en het filter worden vervangen door de vastgelegde teksten.\n\nVoorbeelden:\n\n- URL-overeenkomst: ^(https?|ftp)://\n- PDF-bestandsnaamovereenkomst: \\.pdf$\n- Eénteken-overeenkomst: ^.$\n- Externe multimedia-overeenkomst: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>Op&amp;maak:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Ko&amp;piëren naar tabblad:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Items aanmaken uit standaarduitvoer van programma (laat leeg om uit te schakelen)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Scheidingsteken:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Overeen te komend scheidingsteken voor het splitsen van uitvoer naar meerdere items</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Uitvoer&amp;tabblad:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Items opslaan op tabblad met de volgende naam (laat leeg om op te slaan op eerste tabblad)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Geavanceerde opties tonen</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Achtergrond</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notities</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Hulpballonnen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Gevonden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Geselecteerd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normaal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Bewerker</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Lettertype</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Afwisselend</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Voorgrond</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Melding</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>&amp;Nummer tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Schuifbalken tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>S&amp;chuifbalken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Pictogrammen van werkomgeving gebruiken (indien mogelijk)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>S&amp;ysteempictogrammen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Anti-kartelvorming</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Kleuren in&amp;stellen van tabbladen, werkbalk en menu&apos;s</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>Standaa&amp;rdwaarden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Thema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>Thema &amp;laden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>Thema op&amp;slaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Huidig thema bewerken in externe tekstbewerker</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Thema b&amp;ewerken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Voorbeeld:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>De zoekopdracht is %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Selecteer een item en\ndruk op F2 om te bewerken.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Voorbeelditem %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Enkele willekeurige notities (Shift+F2 om te bewerken)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Themabestand openen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Themabestand opslaan als</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Geen externe tekstbewerker</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Stel de opdracht van de externe tekstbewerker in!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>Taa&amp;l:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Tekst afbreken als deze niet op één regel past</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Lange tekst &amp;afbreken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Hoofdvenster altijd boven andere vensters tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Alti&amp;jd bovenop</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Hoofdvenster sluiten als ander programma gefocust is</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Sluiten als venster focus verliest</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Schakel in om vensters te openen op het huidige scherm. Schakel uit om vensters te openen op het scherm waar ze het laatst gesloten zijn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Vensters o&amp;penen op huidig scherm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Afsluiten bevestigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>A&amp;fsluiten bevestigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Start CopyQ automatisch op na het inloggen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Automatisch opstarten</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Ondersteuning voor Vi-navigatietoetsen (H, J, K, L, enz.), schuine streep (/) om te zoeken</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Vi-navigatie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Sla geschiedenis van itemfilters op en herstel deze</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Filtergeschiedenis opslaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Toon automatisch een pop-up om functie, type en variabele namen op te geven en opdrachten te vervolledigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Opdrachten automatisch vervolledigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Klembordaanpassing</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Plak gekopieerde inhoud op dezelfde manier als muisselecties (doorgaans door de middelste muisknop te gebruiken)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Klembord plakken met muis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Plak muisselecties met een sneltoets (doorgaans Ctrl+V of Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Muisselectie plakken met toetsenbord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Bewaar het klembord in de geschiedenis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Klembord bewaren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Bewaar geselecteerde tekst (primaire selectie) in de geschiedenis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Geselecteerde tekst bewaren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Automatische opdrachten na selectie</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Maximaalaa&amp;ntal items in geschiedenis:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Maximumaantal items per tabblad</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Tabblad in slaapsta&amp;nd zetten na (in minuten):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Zet elk tabblad in de slaapstand na het opgegeven aantal minuten inactiviteit.\n\nStel in op 0 om tabbladen nooit in de slaapstand te zetten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Opdracht naar externe bewerker (%&amp;1 is het te bewerken bestand):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Opdracht naar externe tekstbewerker (%1 is het te bewerken bestand).\n  Voorbeelden:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Ta&amp;bblad waarop het klembord moet worden bewaard:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Naam van het tabblad dat automatisch nieuwe klembordinhoud bewaard.\n\nLaat leeg om automatische opslag uit te schakelen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Kruis niet aan om de Enter-toets in te stellen voor het opslaan van een bewerkt item en Ctrl+Enter voor het maken van een nieuwe regel.\n\nLet op: bewerkte items kunnen altijd worden opgeslagen met de F2-toets.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Ctrl+Enter gebruiken om bestanden op te slaan en Enter om nieuwe regel te maken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Toon een enkele regelomschrijving tonen bij elk item.\n\nGebruik Itemvoorbeeld om gehele items te tonen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Eenvoudige itemsomschrij&amp;vingen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Schakel zoeken naar getallen in, anders wordt het item op deze positie geactiveerd door op een cijfertoets te drukken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Z&amp;oeken naar getallen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Item activeren met enkele klik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Na het activeren van een item (dubbelklik of entertoets), kopieer het naar het klembord en ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Item naar bovenkant van de lijst verplaatsen na activeren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Item naar b&amp;ovenkant verplaatsen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Hoofdvenster sluiten na activeren van item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>Hoofdvenster &amp;sluiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Laatstgebruikte venster focussen na activeren van item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>Laatstgebruikte venster &amp;focussen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Plakken in huidig venster na activeren van item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Plakken in huidig venster</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Tonen/Verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Tabbladen verbergen (druk op de alt-toets om ze te tonen)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Tabbla&amp;den verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Werkbalk verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Werkba&amp;lk verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Werkba&amp;lktekst verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Hoofdvenster verbergen na sluiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Hoofdvenster &amp;verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Vormgeving en doorzichtigheid</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Boomstructuur met tabbladen tonen i.p.v. tabbladbalk</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Boomwee&amp;rgave</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Doorzichtigheid bij &amp;focus:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>De doorzichtigheid van het gefocuste hoofdvenster.\n\nLet op: niet alle systemen ondersteunen dit.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Doorzichtigheid bij ongefoc&amp;ust:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>De doorzichtigheid van het ongefocuste hoofdvenster.\n\nLet op: niet alle systemen ondersteunen dit.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Itemaantal tonen op tabbladen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Itemaantal &amp;tonen</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Meldingspositie:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Schermpositie van meldingen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Bovenaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Onderaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Rechtsboven</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Rechtsonder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Linksonder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Linksboven</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Het aantal seconden dat meldingen worden getoond:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Tussenpoos in seconden dat de een melding bij nieuwe klembordinhoud wordt getoond. (alleen als het hoofdscherm gesloten is.)\n\nStel in op 0 om uit te schakelen.\n\nStel in op -1 om zichtbaar te blijven tot er op wordt geklikt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Aantal regels tekst op klem&amp;bordmeldingen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Het aantal regels dat wordt getoond bij nieuwe klembordinhoud.\n\nStel in op 0 om uit te schakelen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>S&amp;ysteemmeldingen tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Meldingsafmetingen (in pixels)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Hori&amp;zontale afstand:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Afstand van rechter- tot linkerkant van scherm, in pixels</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Verticale afstand:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Afstand tussen boven- en onderkant van scherm, in pixels</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Maximum&amp;breedte:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Maximale meldingsbreedte, in pixels</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Ma&amp;ximumhoogte:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Maximale meldingshoogte, in pixels</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Systeemvakpictogram verbergen; minimaliseer venster na sluiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Systeemvakpictogram verberg&amp;en</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Opdracht voor huidige klembordinhoud tonen in systeemvakmenu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Opdrachten voor klembordinhoud &amp;tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Aa&amp;ntal items in systeemvakmenu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Aantal items in systeemvakmenu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Items van huidig tabblad tonen in systeemvakmenu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Huidig tabblad to&amp;nen in systeemvakmenu,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>of &amp;kies een ander tabblad:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Naam van het tabblad om in het systeemvakmenu te tonen (laat leeg voor eerste tabblad)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Plakken in het huidige venster na selectie in het menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>Geactiveerd item &amp;plakken in huidig venster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Afbeeldingsvoorbeeld naast menu-items tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Afbeeldingsvoorbeeld tonen als menupictogram</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Instellingen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Algemeen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Indeling</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Geschiedenis</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Systeemvak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Meldingen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Tabbladen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Items</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Sneltoetsen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Vormgeving</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Ongeldige waarde bij optie &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Voorkeuren herstellen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Deze actie zet al je voorkeuren (op alle tabbladen) terug naar de standaardwaarden.&lt;br /&gt;&lt;br /&gt;Weet je zeker dat je &lt;strong&gt;alle voorkeuren&lt;/strong&gt;wilt herstellen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Herstart vereist</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Herstart CopyQ om de nieuwe taal te gebruiken.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Instellingen</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Er kan geen synchronisatiemap &quot;%1&quot; worden aangemaakt!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+pijltje omlaag</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Pictogram kiezen…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Pictogram kiezen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Bladeren...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Pictogrambestand openen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Afbeeldingsbestanden (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Tabbladen:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>I&amp;nstellingen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Opdrachte&amp;n</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">De afsluitcode van de editor is : %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Editor commando: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Bewerkeropdracht mislukt (zie logboek)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Opslaan</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Item opslaan (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Annuleren</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Bewerken annuleren en wijzigingen herstellen</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Lettertype</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Vetgedrukt</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Cursief</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Onderstrepen</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Doorhalen</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Voorgrond</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Achtergrond</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Stijl wissen</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Zoeken</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Ongedaan maken</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Opnieuw</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Om versleutelde items op andere computers of tijdens een sessie te delen, heb je zowel een openbaar als geheim sleutelbestand nodig: &lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt; (bewaar de geheime sleutel op een veilige plaats)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Installeer GnuPG om versteutelde tabbladen te kunnen bekijken.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Versleuteling (vereist GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Ontsleutelen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Ontsleutelen en kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Ontsleutelen en plakken</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Fout: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Er kan geen sleutel worden aangemaakt.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Om versleutelde items te delen op een andere computer of sessie, heb je deze geheime sleutelbestanden nodig (bewaar ze op een veilige plek):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Klaar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Er worden nieuwe sleutels aangemaakt (dit kan een paar minuten duren)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Annuleren</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Bezig met instellen van nieuw wachtwoord...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Er moeten toegangssleutels &lt;strong&gt; worden gegenereerd&lt;/strong&gt; voordat versleuteling kan worden gebruikt.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Sleutels genereren...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Wachtwoord wijzigen...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Het versleutelen is mislukt!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Het ontsleutelen is mislukt!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Versleuteling</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Versleutel items en tabbladen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Om items te kunnen versleutelen en te ontsleutelen, dien je de juiste opdrachten toe te voegen op het tabblad &apos;Opdrachten&apos;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Versleutelde items en tabbladen delen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Versleutelde tabbladen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Geef de namen van tabbladen op (één per regel) die automatisch moeten worden ver- en ontsleuteld.&lt;/p&gt;2\n&lt;p&gt;Stel de tussenpoos in op het tabblad &apos;Geschiedenis&apos; om ontsleutelde items uit het geheugen te verwijderen.&lt;/p&gt;4</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Beschadigd tabblad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Niet alle items op het tabblad &lt;strong&gt;%1&lt;/strong&gt; kunnen worden geladen. Wil je het tabblad laden met het risico om enkele items kwijt te raken?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>De FakeVim-plug-in is onderdeel van Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emuleer Vim-bewerker tijdens het bewerken van items.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>FakeVim gebruiken tijdens het bewerken van Items</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Pad naar configuratiebestand:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Afbeeldingen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Toon afbeeldingen.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Maximale afbeeldings&amp;breedte:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>De maximale afbeeldingsbreedte in de geschiedenis (stel in op nul voor oorspronkelijke grootte)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Maximale afbeeldings&amp;hoogte:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>De maximale afbeeldingshoogte in de geschiedenis (stel in op nul voor oorspronkelijke grootte)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Opdracht naar afbeeld&amp;ingsbewerker:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Bewerkeropdracht voor ondersteunde afbeeldingssoorten, m.u.v. svg.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG-bewerkopdracht:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Bewerkopdracht voor svg-bestanden.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Aantekeningen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Toon aantekeningen bij items.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Aantekeningspositie</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>Bo&amp;ven item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Onder ite&amp;m</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Naast ite&amp;m</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Hulpba&amp;llon tonen</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Toevoegen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Ve&amp;rwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Omhoog verplaatsen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Omlaag verplaatsen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Naar bovenkant verplaatsen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Naar onderkant verplaatsen</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Omhoog</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Omlaag</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Kan vastgemaakte aantekeningen niet verwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Maak items los om ze te kunnen verwijderen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Vastmaken</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Losmaken</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Vastgemaakte items</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt; Maak items vast om ze in de huidige rij te vergrendelen en verwijdering te voorkomen (behalve als ze losgemaakt zijn).&lt;/p&gt;&lt;p&gt; Biedt sneltoets- en scriptfunctionaliteit.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Bladeren...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Synchronisatiemap openen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Er kan geen synchronisatiemap worden aangemaakt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synchroniseren</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Synchroniseer items en aantekeningen naar een lokale map.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Het tabblad kan niet worden gesynchroniseerd met &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Items verwijderen?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Weet je zeker dat je de &lt;strong&gt;items en bijbehorende bestanden&lt;/strong&gt; wilt verwijderen?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Tabbladen en mappen synchroniseren</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Synchroniseer de inhoud van het &lt;strong&gt;tabblad&lt;/strong&gt; naar een map op de opgegeven &lt;strong&gt;locatie&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Laat &lt;strong&gt;leeg&lt;/strong&gt; om items &lt;strong&gt;niet op te slaan &lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Tabbladnaam</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Locatie</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Bestanden aanpassen naar andere formaten</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Stel het soort media in op &lt;strong&gt;-&lt;/strong&gt; (minteken) om bestanden te negeren. Elk onbekend of verborgen bestand wordt genegeerd.&lt;/p&gt;\n&lt;p&gt;Voorbeeld: laad de &lt;strong&gt;txt&lt;/strong&gt;-bestandsextensie als &lt;strong&gt;text/plain&lt;/strong&gt;-media.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Soort media-item</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;stel  MIME typen in op &lt;strong&gt;-&lt;/strong&gt; (streepje) om deze bestanden te negeren. Alle andere onbekende of verborgen bestanden worden al genegeerd.&lt;/p&gt;\n&lt;p&gt;voorbeeld: Laad &lt;strong&gt;txt&lt;/strong&gt; bestandsextensie als &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Extensies</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">MIME type notitie</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Label toekennen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Label verwijderen</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Labelen als %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Label &quot;%1&quot; verwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Label %1 toekennen/verwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Items met het label &apos;Vergrendeld&apos; kunnen niet worden verwijderd</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Verwijder de labels alvorens de items te verwijderen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Belangrijk</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Alle labels wissen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Labels</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Toon labels bij items.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>In het venster &apos;Opdrachten&apos; kunnen menu-items voor het toevoegen en verwijderen van aangepaste labels worden toegevoegd en aangepast.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Meer informatie is te vinden op de &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki-pagina&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Labelnaam</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Overeenkomen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Stijlblad</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Kleur</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Pictogram</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Vergrendelen</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Voorkom verwijdering</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Toon platte tekst en eenvoudige html-items.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>HTML en opgemaakte tekst volledig tonen en opslaan</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Maximumaantal te tonen regels (stel in op 0 om alle regels te tonen):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Maximale hoogte, in pixels (0 = ongelimiteerd):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Standaard stijlblad:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Website</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"obsolete\">Maximale hoogte in pixels (0 voor geen limiet):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Logboek</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Afsluiten?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Weet je zeker dat je CopyQ wilt &lt;strong&gt;afsluiten&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Bestand</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>B&amp;ewerken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Tabbladen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hulp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nieuw tabblad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>&amp;Groepsnaam &quot;%1&quot; wijzigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Tabblad&amp;naam &quot;%1&quot; wijzigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Tabblad &quot;%1&quot; ver&amp;wijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Groep &quot;%1&quot; verwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Tabbladpi&amp;ctogram wijzigen</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">Klembordopslag inschak&amp;elen</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">Klembor&amp;dopslag uitschakelen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Importopties</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ-fout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Tonen/Verbergen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Exportopties</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Exportfout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Kan &quot;%1&quot; niet exporteren!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Klembord: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ-items (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Importfout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Kan &quot;%1&quot; niet importeren!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Alle tabbladen uit groep verwijderen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Weet je zeker dat je &lt;strong&gt;alle tabbladen&lt;/strong&gt; uit de groep &lt;strong&gt;%1&lt;/strong&gt; wilt verwijderen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Tabblad verwijderen?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Weet je zeker dat je het tabblad &lt;strong&gt;%1&lt;/strong&gt; wilt verwijderen?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informatie</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;VERBORGEN&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n regel)</numerusform>\n            <numerusform>%1 (%n regels)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;AFBEELDING&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ITEMS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;LEEG&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;GEGEVENS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Verwijderen</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n regel &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n regels &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>De sessienaam mag maximaal 16 tekens bevatten,\nbestaande uit letters, getallen, &apos;-&apos; of &apos;_&apos;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;klembord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nieuw item</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importeren...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Exporteren...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Instellingen...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">&amp;Opdrachten/Globale sneltoetsen...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>&amp;Opdrachten...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>&amp;Klembordinhoud tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Klembordopslag in-/uitschakelen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>P&amp;rocesbeheer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Afsluiten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>Selectie &amp;sorteren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>Sorteervolgorde omke&amp;ren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Items &amp;plakken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>Gesele&amp;cteerde items kopiëren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Zoeken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Item opslaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Bewerken afbreken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Ongedaan maken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Opnieuw</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Lettertype</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Vetgedrukt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Cursief</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Onderstrepen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Doorhalen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Voorgrond</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Achtergrond</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Stijl wissen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Zoeken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>Items a&amp;ctiveren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Inhoud &amp;bekijken...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Voorvertonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Verplaatsen naar &amp;klembord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Ve&amp;rwijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>B&amp;ewerken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Aanteke&amp;ningen bewerken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Be&amp;werken in bewerker</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Actie...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Omhoog Verplaatsen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+pijltje omlaag</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Omlaag verplaatsen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+pijltje omlaag</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Verplaatsen naar bovenkant</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Verplaatsen naar onderkant</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nieuw tabblad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Tabbladnaam &amp;wijzigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Tabblad verw&amp;ijderen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Tabbladpi&amp;ctogram wijzigen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Volgen&amp;d tabblad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Pijltje naar rechts</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Pijltje naar links</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Item-rechtermuisknopmenu tonen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Vori&amp;g tabblad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Bewerken in &amp;bewerker</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Logboek &amp;bekijken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Over</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hulp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Tabblad &quot;%1&quot; is beschadigd geraakt of er ontbreken CopyQ-plug-ins!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Tekst gekopieerd (%n regel)</numerusform>\n            <numerusform>Tekst gekopieerd (%n regels)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Tekst gekopieerd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Gegevens gekopieerd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Annuleren</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Toon het hoofdvenster en open een tabblad met de opgegeven naam (optioneel).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAAM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Verberg het hoofhvenster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Toon of verberg het hoofdvenster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Toon het rechtermuisknopmenu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Sluit de server af.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Schakel klembordopslag in of uit.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Toon de klembordinhoud.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Toon de X11-selectie-inhoud.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Plak de klemborditems in het huidige venster\n(werkt mogelijk niet in alle programma&apos;s).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Kopieer het klembord uit het huidige venster\n(werkt mogelijk niet in alle programma&apos;s).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Stel de klembordtekst in.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEKST</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>GEGEVENS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Toon het aantal items vanop het huidige tabblad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Kopieer het item in de rij naar het klembord.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>RIJ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Kopieer het volgende item van het huidige tabblad naar het klembord.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Kopieer het vorige item van het huidige tabblad naar het klembord.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Voeg tekst toe aan het klembord.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Voeg tekst toe in de opgegeven rij.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Verwijder items uit de opgegeven rijen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>RIJEN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Bewerk items of voeg nieuwe toe.\n-1 = huidige tekst op klembord.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Voeg scheidingstekens toe aan items in de uitvoer.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SCHEIDINGSTEKEN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Toon kale klembord- of itemgegevens in de rij.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Toon het actievenster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAMMA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Start de server op de achtergrond alvorens een opdracht uit te voeren.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Stel de klembordinhoud in.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Schrijf kale gegevens naar de opgegeven rij.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Voer PROGRAMMA uit op de itemtekst in de rijen.\nGebruik %1 in PROGRAMMA om tekst mee te geven als aanvullende optie.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Toon een systeemvakbericht voor TIJD milliseconden.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITEL</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>BERICHT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TIJD</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Toon de beschikbare tabbladnamen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Voer een opdracht uit op het tabblad met de opgegeven naam.\nIndien nodig wordt het tabblad aangemaakt.\nStandaard is dit het eerste tabblad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>OPDRACHT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Verwijder een tabblad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Wijzig een tabbladnaam.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NIEUWE_NAAM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Exporteer items naar een bestand.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>BESTANDSNAAM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importeer items uit een bestand.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Toon alle opties.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Toon een optiewaarde.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTIE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Stel een optiewaarde in.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>WAARDE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Evalueer een script.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Start of koppelt een programmaproces met de opgegeven sessienaam.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Toon de hulp bij een OPDRACHT of alle opdrachten.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Toon de programma- en bibliotheekversies.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nUitvoeren van ECMAScript-programma.\nArgumenten zijn toe te voegen door het gebruik van &quot;argumenten[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>AANVULLENDE OPTIES</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSIE</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Voer programmatests uit (ken --help toe voor meer informatie).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Gebruik: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Start de server als er geen opdracht is opgegeven.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  OPDRACHTEN:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>AANTEKENINGEN:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Gebruik een streepje (-) als aanvullende optie om gegevens uit de standaardinvoer uit te lezen.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Gebruik twee streepjes (--) als aanvullende optie om de volgende opties te gebruiken zonder\n    escape-sequenties (zoals \\n, \\t, etc.).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Gebruik ? i.c.m. MIME om alle beschikbare mimetypes te tonen (standaard: &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Ongeldig aantal aanvullende opties!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ-klembordbeheerder</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Opdracht niet gevonden!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>De server wordt afgesloten.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Kan &quot;%1&quot; niet opslaan!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Kan &quot;%1&quot; niet importeren!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Ongeldige optie &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Uitzondering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Uitzondering in %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Kan niet kopiëren naar klembord!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Het opgegeven tabblad bestaat niet!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Het tabblad moet een naam hebben!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Er is al een tabblad met deze naam!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Klembord opslaan uitgeschakeld*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Sneltoets toevoegen</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Nieuwe sneltoets</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Druk op een toetscombinatie. Druk op &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; om af te breken.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Klik hier en druk op een toetscombinatie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Sneltoets verwijderen</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Zoeken:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Gl&amp;obaal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Globale sneltoetsen kunnen vanuit elk programma worden gebruikt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;Programma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Programmasneltoetsen kunnen alleen worden gebruikt in het hoofdvenster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Sneltoets is al in gebruik!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>De tabbladnaam mag niet blanco en moet uniek zijn.&lt;br /&gt;\nTabblad&lt;b&gt;aan&amp;amp;tekeningen&lt;/b&gt; kunnen worden geopend met &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nGebruik &lt;b&gt;/&lt;/b&gt; als padscheiding in de boomweergave-indeling.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Naam:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Nieuwe Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Hernoem TAB</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Hernoem Tab Groep</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Maximaal aantal items:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>standaard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>Items op&amp;slaan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Druk &apos;/&apos; om het zoeken te starten</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Typ om te zoeken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Reguliere expressie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Niet hoofdlettergevoelig</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_pl.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pl_PL\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>O programie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Menedżer Schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Strona WWW</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Przekaż dotację</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Okno dialogowe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Polecenie:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Format wejściowy:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Format docelowy:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Wyślij dane danego typu nośnika na standardowe wejście polecenia (pozostaw puste, aby wyłączyć)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Utwórz obiekty ze standardowego wyjścia programu (zostaw puste, aby wyłączyć)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Separator nowych elementów:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Wyrażenie regularne dotyczące dzielenia danych wyjściowych na wiele elementów.&lt;\\p&gt;\n&lt;p&gt;Użyj &lt;b&gt;\\n&lt;/b&gt; do przechowywania każdej linii, aby oddzielić element.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Karta docelowa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Zapisz elementy w karcie z podaną nazwą (pozostaw puste, aby zapisać w bieżącej karcie)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Polecenie zapisane</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Polecenie zostało zapisane i można uzyskać do niego dostęp z menu elementów.\nMożesz je skonfigurować w Preferencjach.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Błąd: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Kod wyjścia: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Polecenie %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Menedżer procesów</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Zamknij wybrane</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Dodaj polecenia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Pokaż/ukryj okno główne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Pokaż menu zasobnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Pokaż okno główne pod kursorem myszki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Edytuj schowek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Edytuj pierwszy element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Kopiuj drugi element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Pokaż okno działania</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Utwórz nowy element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Kopiuj następny element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Kopiuj poprzedni element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Wklej zawartość schowka jako zwykły tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Wyłącz przechowywanie schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Włącz przechowywanie schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Wklej i skopiuj następny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Wklej i skopiuj poprzedni</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Zrób zrzut ekranu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Wklej obecną datę i godzinę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nowe polecenie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignoruj elementy bez/lub z pojedynczym znakiem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Otwórz w przeglądarce</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Wstaw jako Zwykły Tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Automatyczne odtwarzanie wideo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Kopiuj adres internetowy URL do innej karty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Stwórz miniaturę (wymagany ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Stwórz kod QR z adresu URL (wymagany qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Zadania</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Dodaj do karty %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Przenieś do karty %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignoruj skopiowane pliki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignoruj okno *&quot;Hasło&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Hasło</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Przenieś do Kosza</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(kosz)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Wyczyść Aktualną Kartę</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Nie Można Dodać Nowych Obiektów</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Karta jest pełna. Nie udało się&#xa0;usunąć żadnych elementów.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Nie można dodać nowych elementów do karty %1. Usuń elementy ręcznie, aby zwolnić miejsce.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Odrzucić Zmiany?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Czy na pewno chcesz &lt;strong&gt;odrzucić zmiany&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Nie można połączyć się z serwerem! Uruchom serwer CopyQ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Połączenie zostało utracone!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Zawartość Schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Format:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>Zawartość:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Usuń Format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Zawartość Elementu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Wielkość:&lt;/strong&gt; %1 bajt(y/ów)</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Wielkość:&lt;/strong&gt; %1 bajt(ów)</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Serwer CopyQ jest już uruchomiony.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Anuluj Aktywne Polecenia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Anulować aktywne polecenia oraz wyjść?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Anuluj Wyjście</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Wyjdź Mimo Wszystko</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Space</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Polecenia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Zdefiniuj nowe polecenia, które mogą być albo wywołane automatycznie w nowej zawartości schowka, albo przez użytkownika z menu lub używając skrótu systemowego.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Znajdź:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Załaduj polecenia…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Za&amp;pisz Wybrane…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopiuj Zaznaczone Elementy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Wklej Polecenia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Niezapisane Zmiany</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Okno dialogowe poleceń zawiera niezapisane zmiany.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Wczytaj Plik Poleceń</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Polecenia (*.ini);; CopyQ Konfiguracja (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Zapisz Zaznaczone Polecenia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Polecenia (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Zapisz Komendy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Pokaż pomoc dla poleceń (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Polecenia zawierają listę programów z argumentami, które zostaną wykonane. Na przykład:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Argument programu %1 zostanie zastąpiony tekstem elementu, podczas gdy %2 oraz %9 jako tekst przechwycony przez wyrażenie regularne.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Argument programu %1 zostanie zastąpiony tekstem elementu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Znak %1 może zostać użyty w celu przekazywania standardowego wyjścia do następnego programu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Poniższa składnia może zostać użyta w celu przekazania reszty polecenia jako pojedynczego parametru.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>To daje te same dane wyjściowe jak %1, ale jest bardziej użyteczne dla dłuższych poleceń.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Wymienione poniżej funkcje mogą zostać użyte w następujących poleceniach.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;schowek</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nazwa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Nazwa polecenia pokazywana w menu</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Rodzaj akcji</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Uruchom polecenie automatycznie, gdy w schowku jest nowa zawartość</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matycznie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Pokaż elementy pasujących pozycji w menu kontekstowym</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>W M&amp;enu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Skrót Globalny:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Dopasuj Elementy</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Pomija polecenie, jeśli tekst wejściowy nie pasuje do tego wyrażenia regularnego (pozostaw puste, aby pasował do wszystkiego).\n\n%2 do %9 w Poleceniu i Filtrze zostaną zastąpione przechwyconymi tekstami.\n\nPrzykłady:\n\n- Dopasuj URL: ^(https?|ftp)://\n- Dopasuj nazwy plików PDF: \\.pdf$\n- Dopasuj pojedynczy znak: ^.$\n- Dopasuj zdalne multimedia: ^http://.*.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Dane tego typu MIME zostaną wysłane do standardowego polecenia wejścia.\nPozostaw puste, aby wyłączyć.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Poleceni&amp;e</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Ukryj okno po aktywowaniu komendy danego elementu z menu kontekstowego</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Zmień element i nie twórz nowych elementów</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Prze$kształć</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Utwórz elementy ze standardowego wyjścia programu (pozostaw puste, aby wyłączyć)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Globalne Skróty Klawiszowe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Okno:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Użyj polecenia tylko dla elementów, których tekst pasuje do tego regularnego wyrażenia (pozostaw puste, aby dopasować wszystko).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt; Przykłady:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Dopasuj adresy URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Dopasuj nazwy plików PDF    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Dopasuj pojedyncze znaki    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Dopasuj zdalne multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Zaawansowane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skrypt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Ekran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Zawartość:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtr:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;mat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Typ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Akcja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Kopiuj do karty:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Nazwa karty, do której skopiować dany element (pozostaw puste, aby nie kopiować)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Usuń pasujące elementy\n\nUwaga: Jeżeli zaaplikowany automatycznie, żadne z automatycznych poleceń nie zostanie wykonane.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Usuń element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menu Akcji</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Ukryj główne okno po aktywacji</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Pokaż Zaawansowane</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Skrót:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Opcje polecenia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Pokaż okno makropoleceń przed wykonaniem polecenia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Czekaj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>W&amp;yjście:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Karta docelowa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Zapisz elementy w karcie z nadaną nazwą (pozostaw puste, aby zapisać w pierwszej karcie)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Tło</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notatki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Znalezione</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Zaznaczenie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Liczba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Zwykłe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Edytor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Czcionka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternatywny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Kolor czcionki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Powiadomienie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Numer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Paski przewijania</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Paski przewijania</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Użyj ikon systemowych, jeżeli to możliwe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Ustaw kolory dla kart, pasków narzędzi i menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Ikony Systemowe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Antyaliasing</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Motyw domyślny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Motyw:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Wczytaj motyw</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Zapisz motyw</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Edytuj motyw w zewnętrznym edytorze</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>E&amp;dytuj motyw</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Podgląd:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Ciągiem wyszukiwania jest %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Zaznacz element i\nnaciśnij klawisz F2, aby edytować.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Przykładowy element %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Parę losowych notatek (Shift+F2, aby edytować)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Otwórz Plik Motywu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Zapisz Plik Motywu Jako</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Brak Edytora Zewnętrznego</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Ustaw polecenie edytora zewnętrznego!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Język:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Podziel tekst, jeżeli jest zbyt długi, by zmieścić go w jednej linii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation type=\"unfinished\">Zwijaj długi tekst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Umieść okno główne nad pozostałymi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation type=\"unfinished\">Zawsze na Wierzchu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation type=\"unfinished\">Włącz, aby otworzyć okna na obecnym ekranie. Wyłącz, aby otworzyć okna tam, gdzie zostały one ostatnio zamknięte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation type=\"unfinished\">O&amp;twórz okna na obecnym ekranie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation type=\"unfinished\">Potwierdź wyjście z programu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation type=\"unfinished\">Potwierdź wyjście z programu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation type=\"unfinished\">Uruchom aplikację przy starcie systemu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation type=\"unfinished\">&amp;Automatyczne uruchamianie</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"obsolete\">Wsparcie dla klawiszy nawigacyjnych Vi (H, J, K, L i więcej), wciśnij &apos;/&apos;, by wyszukać</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"obsolete\">Styl nawigacyjny &amp;Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation type=\"unfinished\">Zapisywanie i przywracanie historii filtrów elementu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation type=\"unfinished\">Zapisz Historię Filtrowania</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation type=\"unfinished\">Automatycznie pokaż okno popup, aby uzupełnić funkcję, typ oraz zmienne nazwy w poleceniach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation type=\"unfinished\">Automatyczne Wypełnianie Poleceń</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation type=\"unfinished\">Manipulacja Schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation type=\"unfinished\">Pozwól na wklejenie skopiowanej zawartości w ten sam sposób jak zaznaczenia myszki (zazwyczaj za pomocą środkowego przycisku myszki)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation type=\"unfinished\">(&amp;3) Wklej schowek za pomocą myszki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation type=\"unfinished\">Pozwól na wklejanie zaznaczenia myszki za pomocą skrótu klawiszowego (zazwyczaj Ctrl+V lub Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation type=\"unfinished\">(&amp;4) Wklej zaznaczenie myszki za pomocą klawiatury</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation type=\"unfinished\">Zapisz schowek w historii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation type=\"unfinished\">(&amp;1) Przechowywanie schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation type=\"unfinished\">Zapisz tekst zaznaczony za pomocą myszki (zaznaczenia głównego) w historii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation type=\"unfinished\">(&amp;2) Przechowuj zaznaczony tekst, używając myszki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation type=\"unfinished\">Maksymalna liczba elementów w historii:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation type=\"unfinished\">Maksymalna liczba elementów w każdej karcie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation type=\"unfinished\">Polecenie uruchomienie edytora zewnętrznego (%1 - nazwa pliku).\n  Przykłady:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation type=\"unfinished\">Nazwa karty do przechowywania schowka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation type=\"unfinished\">Pokaż pojedynczy wiersz opisu każdego elementu.\n\nUżyj Podglądu, aby wyświetlić całe elementy.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation type=\"unfinished\">Pokaż pojedyncze elementy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation type=\"unfinished\">Po aktywowaniu elementu (przez podwójne kliknięcie lub Enter) kopiuj go do schowka i...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation type=\"unfinished\">Przenieś&#xa0;aktywowany element do górnej części listy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation type=\"unfinished\">Przenieś element na górę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation type=\"unfinished\">Zamknij główne okno, gdy element jest aktywny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation type=\"unfinished\">Zamknij główne okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation type=\"unfinished\">Zaznacz ostatnie okno, gdy element jest aktywny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation type=\"unfinished\">Aktywuj ostatnie okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation type=\"unfinished\">Wklej do obecnego okna, gdy element jest aktywny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation type=\"unfinished\">Wstaw do bieżącego okna</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation type=\"unfinished\">Pokaż/Ukryj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation type=\"unfinished\">Ukryj karty (naciśnij Alt, aby je pokazać)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation type=\"unfinished\">Ukryj karty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation type=\"unfinished\">Ukryj pasek narzędzi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation type=\"unfinished\">Ukryj pasek narzędzi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation type=\"unfinished\">Ukryj etykiety paska narzędzi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation type=\"unfinished\">Ukryj główne okno, kiedy zostanie zamknięte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation type=\"unfinished\">Ukryj główne okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation type=\"unfinished\">Układ i Przezroczystość</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation type=\"unfinished\">Pokaż drzewo z kartami zamiast paska kart</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation type=\"unfinished\">Drze&amp;wo Kart</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation type=\"unfinished\">&amp;Przezroczystość zaznaczonego okna:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation type=\"unfinished\">%Przezroczystość niezaznaczonego okna:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation type=\"unfinished\">Pokaż liczbę elementów w karcie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation type=\"unfinished\">Pokaż Liczbę Elementów</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation type=\"unfinished\">Położenie powiadomień:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation type=\"unfinished\">Położenie powiadomień na ekranie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\">Na górze</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\">Na dole</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\">U góry po prawej</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\">Na dole po prawej</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\">Na dole po lewej</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\">Na górze po lewej</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\">Czas wyświetlania powiadomień (w sekundach):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\">Umiejscowienie powiadomień na ekranie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\">Odległość powiadomienia od lewej lub prawej krawędzi ekranu w pikselach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\">Przesunięcie pionowe:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\">Odległość powiadomienia od górnej lub dolnej krawędzi ekranu w pikselach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\">Maksymalna szerokość:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\">Maksymalna szerokość powiadomienia w pikselach</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\">Maksymalna wysokość:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\">Maksymalna wysokość&#xa0;powiadomienia w pikselach</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\">Nie pokazuj ikony w tacce systemowej: minimalizuj zamknięte okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\">Dezaktywuj zasobnik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\">Pokaż komendę dla bieżącej zawartości schowka w menu zasobnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\">Pokaż polecenia dla zawartości schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\">Liczba elementów w menu zasobnika:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\">Liczba elementów w menu zasobnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\">Pokaż elementy z obecnej karty w menu zasobnika</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\">Pokaż bieżącą kartę w menu,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\">lub wybierz inną kartę:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\">Nazwa karty, która będzie pokazywana w menu zasobnika (pusta - dla pierwszej karty)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\">Wklej wybrany w menu element do obecnego okna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\">Wstaw aktywowany element do bieżącego okna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\">Pokaż podgląd obrazka obok elementów menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\">Pokaż podgląd obrazu jako ikonę elementu w menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"obsolete\">Konfiguracja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Wymagane ponowne uruchomienie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Język zostanie zmieniony po ponownym uruchomieniu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"obsolete\">F2</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Escape</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"obsolete\">Czcionka</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"obsolete\">Kolor czcionki</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"obsolete\">Tło</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\">Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\">Błąd: %1\n {1?}</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation type=\"unfinished\">Notatki</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Dodaj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Usuń</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Ścieżka</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Strona WWW</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Plik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>Edycja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Element</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Karty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Pomoc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\">&amp;Nowa karta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\">Zmień ikonę ka&amp;rty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Usunąć kartę?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Czy chcesz usunąć kartę &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation type=\"unfinished\">&amp;schowek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\">&amp;Nowy element</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"obsolete\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\">&amp;Preferencje...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\">Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"obsolete\">P&amp;olecenia/Skróty globalne...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\">P&amp;olecenia...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation type=\"unfinished\">F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\">Pokaż &amp;zawartość schowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\">Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\">Menedżer p&amp;rocesów</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\">Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\">&amp;Wyjście</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\">Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\">&amp;Sortuj zaznaczone elementy rosnąco</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\">Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\">So&amp;rtuj zaznaczone elementy malejąco</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\">Wst&amp;aw elementy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\">Kopiuj zaznaczone elementy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\">&amp;Znajdź</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"obsolete\">Przenieś do s&amp;chowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\">&amp;Pokaż zawartość...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation type=\"unfinished\">F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation type=\"unfinished\">F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"obsolete\">Przenieś do s&amp;chowka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\">&amp;Usuń</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\">Edycja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\">Edytuj notatki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"obsolete\">E&amp;dytuj w zewnętrznym edytorze</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\">Makropolecenia...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation type=\"unfinished\">F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\">&amp;Nowa karta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\">Zmi&amp;eń nazwę karty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\">Usuń &amp;kartę</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\">Zmień ikonę ka&amp;rty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\">F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\">Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\">Czcionka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\">Kolor czcionki</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\">Tło</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation type=\"unfinished\">F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\">&amp;Pomoc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Nieprawidłowa liczba argumentów!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Nie znaleziono polecenia!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Zamykanie serwera.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Nie można zapisać w pliku &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Nie można zaimportować z pliku &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Nie właściwa opcja &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\">Karta o podanej nazwie nie istnieje!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\">Nazwa karty nie może być pusta!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\">Karta o podanej nazwie już istnieje!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Dodaj skrót</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\">Nowy skrót</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Usuń skrót</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Znajdź:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Podany skrót już istnieje!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nazwa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\">Nowa karta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\">Zmiana nazwy karty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\">Zmień nazwę grupy kart</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Wciśnij &apos;/&apos;, by wyszukać</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Wpisz, by wyszukać</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Wyrażenie regularne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Rozróżnianie liter małych i wielkich</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_pt_BR.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"pt_BR\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Sobre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Gerenciador de área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Doar</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Diálogo de Ação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Co&amp;mando:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>&amp;Inserção padrão:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>G&amp;uardar saída padrão:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Envie os dados do tipo de mídia fornecido para a entrada padrão do comando (deixe vazio para desativar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Criar itens a partir da saída padrão do programa (deixe vazio para desativar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Separador para novos itens:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Expressão regular para dividir saída em múltiplos itens.&lt;\\p&gt;\n&lt;p&gt;Usar&lt;b&gt;\\n&lt;/b&gt;para guardar cada linha para itens separados.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Guia de saída:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Salve itens na aba com o nome dado (deixe em branco para economizar na aba atual)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Comando Salvo</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Comando foi salvo e pode ser acessado a partir do item menu.\nVocê pode configurar o comando nas preferências.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Erro: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Código de saída: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Comando %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Gerente de Processos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Encerrar os selecionados</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Adicionar Comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Mostrar/ocultar janela principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Mostrar o menu de notificações</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Mostrar janela principal sob o cursor do mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Editar área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Editar o primeiro item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Copiar o segundo item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Mostrar o diálogo de ação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Criar novo item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Copiar o próximo item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Copiar o item anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Colar área de transferência como texto simples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Desabilitar armazenamento de área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Habilitar armazenamento de área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Colar e copiar próxima</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Colar e copiar anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Tirar captura de tela</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Colar data e hora atual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Novo Comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorar itens com nenhum ou um único caractere</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>A&amp;brir no Navegador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Colar como texto sem formatação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Reproduzir vídeos automaticamente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Copiar URL (endereço web) para outra aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Criar thumbnail (precisa ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Criar QR Code de URL (precisa qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tarefas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Adicionar à aba %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Mover para aba %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorar arquivos copiados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorar janela * &quot;Senha&quot; *</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Mover para a Lixeira</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(Lixeira)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Limpar Aba Atual</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Não é possível adicionar novos itens</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Aba cheia. Falha ao remover itens.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Não é possível adicionar novos itens à guia % 1. Remova itens manualmente para liberar espaço.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Descartar as alterações?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Você realmente deseja &lt;strong&gt; descartar as alterações &lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Não é possível conectar ao servidor! Comece servidor CopyQ primeiro.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Conexão perdida!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Conteúdo da Área de Transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formatos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>C&amp;onteúdo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Remover Formatação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Teor dos itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Tamanho:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Tamanho:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>O Servidor CopyQ já está em execução.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Cancelar comandos ativos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Cancelar comandos ativos e saída?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Cancelar e Sair</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Sair assim mesmo</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Espaço</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definir novos comandos que podem ser invocadas ou automaticamente no novo índice da prancheta ou pelo usuário a partir do menu ou usando atalhos do sistema.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Localizar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Carregar os Comandos…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Sal&amp;var os Selecionados…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Copiar selecionado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Colar comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Alterações não salvas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Diálogo de comandos tem mudanças não salvas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Abrir arquivos com comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Comandos (* ini) ;; Configuração CopyQ (copyq.conf copyq - *. Conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Salve comandos selecionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Comandos (* ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Salvar comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Falha ao salvar comandos no arquivo &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Mostrar comando de ajuda (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Comando contém lista de programas com argumentos que serão executados. Por exemplo:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Programa argumento %1 será substituído por um item de texto, e %2 a %9 de textos capturados pela expressão regular.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>O argumento %1 do programa será substituído pelo texto do item.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Caractere %1 pode ser usada para passar a saída padrão para o próximo programa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Seguinte sintaxe pode ser usado para passar resto do comando como parâmetro único.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Isto dá mesma saída que %1, mas é mais útil para comandos mais longos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>As funções listadas abaixo pode ser utilizada como em comandos seguintes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>área de &amp;notificação</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nome:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Nome do comando mostradas no menu</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Tipo de Ação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Execute o comando automaticamente se prancheta tem novo conteúdo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;mático</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Mostrar comando no menu de contexto de itens correspondentes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>No m&amp;enu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>Atalho &amp;global:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Igualar Itens</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Ignora o comando se o texto de entrada não corresponder a esta expressão regular (deixe em branco para corresponder a tudo).\n\n%2 a %9 em Comando e Filtro serão substituídos pelos textos capturados.\n\nExemplos:\n\n- URL de correspondência: ^(https?|ftp)://\n- Corresponder nomes de arquivos PDF: \\.pdf$\n- Corresponde a um único caractere: ^.$\n- Corresponder multimídia remota: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Os dados deste tipo MIME será enviado para a entrada padrão de comando.\nDeixe em branco para desabilitar esta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Coman&amp;do</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Ocultar janela depois de comando é ativado a partir do menu de contexto de um item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Alterar item, não crie novos itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Criar itens da saída padrão do programa (deixar vazio para inativar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Atalho Global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Janela:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt; Use o comando apenas para itens cujo texto de um jogo de expressão regular (deixe em branco para combinar com qualquer coisa).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Exemplos:&lt;/span&gt;&lt;/p&gt;&lt;p&gt; Jogo URL &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt; nomes de arquivos PDF Jogo &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt; combinar o caráter único &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt; Jogo multimídia remotas &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avançado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Script</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Exibição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Conteúdo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtro:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt; Use comandos apenas se comando de filtro bem-sucedido. &lt;/p&gt;\n\n&lt;p&gt; item de texto é passado para &lt;b&gt; entrada padrão &lt;/b&gt; do comando de filtro. O item é &lt;b&gt; igualado apenas se o código de saída de comando do filtro é 0 &lt;/b&gt;. &lt;/p&gt;\n\n&lt;p&gt; Use &lt;b&gt;%1 &lt;/b&gt; para o item de texto passado como argumento e &lt;b&gt; %2 &lt;/b&gt; para &lt;b&gt;%9 &lt;/b&gt; para argumentos capturados por expressão regular (peças entre parênteses) &lt;/p&gt;\n\n&lt;p&gt; Use &lt;b&gt; |. &lt;/b&gt; a comandos de cadeia (passe de saída padrão para o próximo comando). &lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;mato:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Tipo:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the catured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Ignora o comando se o texto de entrada não corresponder a esta expressão regular (deixe em branco para corresponder a tudo).\n\n%2 através %9 em Comando e Filtrar será substituído pelos textos capturados.\n\nExemplos:\n\n- Corresponder URL: ^(https?|ftp)://\n- Corresponder nome de arquivos PDF: \\.pdf$\n- Corresponder um caractere: ^.$\n- Corresponder multimídia remota: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Ignora o comando se o comando de filtro falhar com código de saída diferente de zero.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Ação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Cop&amp;iar para o guia:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Nome de guia para copiar os novos itens em (deixe em branco para não copiar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Remover item correspondente\n\nNota: Se este é aplicado automaticamente, não serão executados outros comandos automáticos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Remover item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menu Ação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Ocultar janela principal após a ativação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Mostrar Avançado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Atalho:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>As opções de comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Mostrar diálogo ação antes de executar o comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Espere</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>&amp;Saída:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Ignora o comando se o texto de entrada não corresponder a essa expressão regular (deixe em branco para corresponder a tudo).\n\n%2 a %9 (ou argumento[1] e acima no script) em Command e Filter serão substituídos pelos textos capturados.\n\nExemplos:\n\n- Corresponder ao URL: ^(https?|ftp)://\n- Corresponder nomes de arquivos PDF: \\.pdf$\n- Corresponde a um único caractere: ^.$\n- Corresponde a multimídia remota: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Use o comando apenas para itens copiados para a área de transferência da janela com o texto do título que corresponde a esta expressão regular (deixe vazio para combinar com qualquer janela). No macOS, isso contém o nome do aplicativo seguido por um traço (&amp;quot;-&amp;quot;) em seguida, o título da janela. Por exemplo, &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Separador:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Separador a combinar para dividir a saída de vários itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>A&amp;ba de Saída:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Salve itens na aba com o nome dado (deixe em branco para economizar na primeira aba)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Fundo</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Encontrado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Selecionado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Fonte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Primeiro plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Notificação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Mostrar &amp;número</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Mostrar barras de rolagem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Barras de rolagem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Usar ícones do ambiente de trabalho sempre que possível</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>D&amp;efinir cores para abas, barra de ferramentas e menus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Ícones do s&amp;istema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Dicas de ferramentas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>Su&amp;avização</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Redefinir Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Carregar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Salvar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Editar tema atual no editor externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>E&amp;ditar Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Visualização:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>O termo de pesquisa é %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Selecione um item e\npressione F2 para editar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Produto Exemplo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Algumas notas aleatórias (Shift + F2 para editar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Abrir Arquivo de Tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Salvar Arquivo de Tema Como</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Nenhum editor externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Defina o comando do editor externo primeiro!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Idioma:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Insira uma quebra de linha caso o texto seja muito grande</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>&amp;Quebrar texto longo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Mantenha a janela principal acima das outras janelas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Sempre no &amp;Topo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Fechar a janela principal ao focalizar outro aplicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Fechar ao Perder Foco</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Ativar para abrir janelas na tela atual. Desativar para abrir janelas na posição onde elas foram fechadas pela última vez</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>A&amp;brir janelas na tela atual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Confirmar o encerramento do aplicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Confirmar o en&amp;cerramento do aplicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Executar o aplicativo durante a inicialização do sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>Iniciar &amp;automaticamente</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Compatibilidade para as teclas de navegação VI (H, J, K, L e mais), tecla de barra (/) para procurar</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Navegação estilo &amp;Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Prevenir capturar janelas de aplicativos em capturas de tela e gravações</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Ocultar de capturas de tela e gravações</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Criptografar dados de abas no disco (requer a definição de uma senha)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Crip&amp;tografar abas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Utilize um serviço de armazenamento de chaves externo disponível para a senha de criptografia (Armazenamento de Credenciais do Windows, Chaveiro do macOS, Chaveiro GNOME, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Usar armazenamento de chaves externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Alterar senha usada para criptografar dados de abas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Alterar senha de cri&amp;ptografia...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Estilo de navegação / mapa de teclado:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Suporte para navegação Vi (teclas H, J, K, L, / e outras) e navegação Emacs (Ctrl+N, P, V e outras)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Salve e restaure o histórico dos itens do filtros</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Salvar o histórico dos filtros</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Automaticamente exibir o popup para completar os nomes das funções, tipos e variáveis nos comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Autocompletar os Comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulação da Área de Transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Permitir colar o conteúdo copiado do mesmo modo que as seleções do mouse (geralmente ao pressionar o botão do meio do mouse)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Colar o conteúdo da área de transferência com o mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Permitir a colagem das seleções feitas pelo mouse usando um atalho (normalmente Ctrl+V ou Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Colar a seleção feita pelo mouse usando o teclado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Salvar a área de transferência no histórico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Armazenar a área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Salve o texto selecionado com o mouse (seleção principal) no histórico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Armazenar o texto selecionado usando o mouse</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Executar os comandos automaticamente nos itens selecionados</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Quantidade máxima de itens no histórico:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Quantidade máxima de itens em cada aba</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Es&amp;vaziar a aba após um intervalo em min&amp;utos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>Descarregar aba após &amp;um intervalo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Esvaziar cada aba da memória após uma determinada quantidade de minutos de inatividade.\n\nDefina como 0 para não esvaziar as abas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Exigir senha após um intervalo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Tempo limite em segundos para que as abas criptografadas exijam senha novamente.\n\nDefina como 0 para desativar globalmente.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Comando usando um editor externo (%&amp;1 é o arquivo a ser editado):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Comando do editor externo (%1 é o arquivo a ser editado).\n  Exemplos:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>A&amp;ba para armazenar a área de transferência:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Nome da aba que irá automaticamente armazenar os novos conteúdos da área de transferência.\n\nDeixe em branco para desativar o armazenamento automático.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Deixe desmarcado para salvar o item editado com a tecla Return e Ctrl+Return para criar uma nova linha.\n\nNota: Os itens editados podem ser salvos com F2 independente desta opção.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Sal&amp;var o item editado com Ctrl+Return e criar nova linha com a tecla Return</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Mostrar a descrição em uma linha para cada item.\n\nUse Prévia do Item para exibir os itens que estiverem completos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>&amp;Mostrar itens simples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Ativa a pesquisa por números, caso contrário ao pressionar uma tecla numérica ativa o item nessa posição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>P&amp;esquisar por números</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Ativar elemento com um único clique</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Após o item ser ativado (com clique duplo ou usando a tecla Enter), copie-o para a área de transferência e …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Mover o item para o topo da lista depois de ativado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Mover o item para o t&amp;opo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Fechar a janela principal depois que o item for ativado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>Fe&amp;char a janela principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Focar na última janela depois do item ser ativado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Focar na janela anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Colar para a janela atual depois que o item for ativado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Colar na janela atual</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Exibir/Ocultar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Esconder as abas (Aperte Alt para exibir)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Es&amp;conder os separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Ocultar a barra de ferramentas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Ocultar a barra de ferr&amp;amentas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Ocultar as etiquetas da barra de ferr&amp;amentas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Ocultar a tela principal ao ser fechada</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>&amp;Ocultar a janela principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Disposição e Transparência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Mostrar a árvore com as guias em vez da barra de abas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Á&amp;rvore de abas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Transparência &amp;focalizada:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparência da janela principal se focada.\n\nNota: Não há compatibilidade desta opção para todos os sistemas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Transparência &amp;não focada:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparência da janela principal se desfocada.\n\nNota: Não há compatibilidade desta opção para todos os sistemas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Mostra a quantidade de itens nas abas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Mostrar a &amp;quantidade de itens</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Posição das notificações:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Posição das notificações na tela</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Superior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Inferior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Superior Direito</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Inferior Direito</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Inferior Esquerdo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Superior Esquerdo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Int&amp;ervalo em segundos para a exibição de notificações:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Intervalo em segundos para a exibição de notificações de um novo conteúdo na área de transferência ou caso um item seja copiado para a área de transferência (apenas se a janela principal estiver fechada).\n\nDefina como 0 para desativar.\n\nDefina como 1 para a manter visível até que seja clicado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Quan&amp;tidade de linhas para as notificações da área de transferência:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Quantidade de linhas para exibir um novo conteúdo da área de transferência.\n\nDefina como 0 para desativar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Usar notificações nativas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geometria da notificação da tela (em pontos)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Deslocamento hori&amp;zontal:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Distância da notificação do canto esquerdo ou direito da tela em pontos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>Deslocamento &amp;vertical:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Distância da notificação do canto superior ou inferior da tela em pontos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>&amp;Largura máxima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Largura máxima da notificação da tela em pontos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Altura má&amp;xima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Altura máxima da notificação da tela em pontos</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Não mostrar o ícone na bandeja; minimizar a janela quando fechado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>D&amp;esabilitar a área de notificação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Mostrar o comando para o conteúdo atual da área de transferência no menu da área de notificação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>&amp;Mostrar os comandos para o conteúdo da área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Quantidade de itens no men&amp;u da área de notificação:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Quantidade de itens no menu da área de notificação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Mostrar os itens da aba atual no menu da área de notificação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Mostrar a aba atu&amp;al no menu,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>ou &amp;selecione outra aba:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Nome da aba para exibir no menu da área de notificação (vazio para a primeira aba)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Colar o item na janela atual depois de selecioná-lo no menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Colar o item ativado na janela atual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Mostrar a prévia da imagem próximo aos itens do menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>M&amp;ostrar a prévia da imagem como ícone do item do menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Configuração</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Geral</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Disposição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>História</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Notificações</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Guias</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Atalhos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Aparência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Valor inválido para a opção &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Redefinir preferências?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Esta ação irá redefinir todas as suas preferências (em todas as abas) para os seus valores padrão.&lt;br /&gt;&lt;br /&gt;Você deseja realmente &lt;strong&gt;redefinir todas as preferências&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Necessário Reiniciar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>O idioma será alterado após reiniciar o aplicativo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Preferências</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Falha ao criar a pasta de sincronização &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Seta para Baixo</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Selecione o ícone…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Ícone selecionado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Procurar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Abrir Ícone</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Arquivos de imagem (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Tudo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>A&amp;bas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Co&amp;nfiguração</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Co&amp;mandos</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">o código de saída do editor é %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Comando do editor: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Falha no comando do editor (ver logs)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Salvar</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Salvar Item (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Cancelar</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Cancelar edição e reverter alterações</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Fonte</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Negrito</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Itálico</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Sublinhado</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Riscado</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Primeiro plano</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Segundo plano</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Apagar estilo</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Pesquisar</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Desfazer</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Refazer</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Para compartilhar itens criptografados em outro computador ou sessão, você precisará dos arquivos de chave pública e secreta: &lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Mantenha esta chave secreta em um lugar seguro)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG deve ser instalado para ver abas criptografadas.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Criptografado (GnuPG necessário)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Descriptografar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Descriptografar e Copiar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Descriptografar e Colar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Entrar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Erro: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Falha ao gerar chaves.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Para compartilhar itens criptografados em outro computador ou sessão, você precisará desses arquivos de chave secreta (mantenha-os em um local seguro):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Concluído</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Criando novas chaves (isto pode levar alguns minutos)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Definindo nova senha...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>As chaves de criptografia &lt;strong&gt;devem ser geradas&lt;/strong&gt; antes da criptografia do item ser usado.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Gerar novas chaves...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Mudar senha...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Falha ao criptografar!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Falha ao descriptografar!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Criptografia</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Criptografar itens e abas.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Para criptografar e descriptografar itens, adicione os comandos apropriados sob a aba Comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Compartilhando Itens Criptografados e Abas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Abas Criptografadas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Especifique nomes de abas (uma por linha) que serão automaticamente criptoigrafadas e descriptografadas.&lt;/p&gt;\n&lt;p&gt;Defina o intervalo para descarregar abas no Histórico para descarregar com segurança itens descriptografados da memória.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Aba Corrompida</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Nem todos os itens na aba &lt;strong&gt;%1&lt;/strong&gt; foram carregados com sucesso. Você ainda deseja carregar a aba e potencialmente perder alguns itens?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>O plugin FakeVim é parte do Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emular editor Vim ao editar itens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Habilitar FakeVim para Editar Itens</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Caminho para Arquivo de Configuração:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Imagens</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Exibir imagens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>&amp;Largura máxima da imagem:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Largura máxima da imagem exibida no histórico (defina em zero para tamanho original)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>&amp;Altura máxima da imagem:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Altura máxima da imagem exibida no histórico (defina em zero para tamanho original)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Comando do editor de &amp;imagens:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Comando do editor para formatos de imagem suportados diferentes de SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Comando do editor &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Comando do editor para o formato de imagem SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Mostrar notas para itens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Posição das Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>Item a&amp;cima</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Ite&amp;m abaixo</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Ao lado de Ite&amp;m</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Mostrar dica de &amp;ferramenta</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Adicionar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Remover</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Mover para cima</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Mover para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Mover para o início</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Mover para o final</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">Para &amp;cima</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">Para &amp;baixo</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Não é possível remover os itens fixados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Primeiro desafixar itens para removê-los.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Fixar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Desafixar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Itens fixados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Fixe itens para bloqueá-los na linha atual e evitar a exclusão (a menos que não sejam desafixados).&lt;/p&gt;&lt;p&gt;Fornece atalhos e funcionalidade de scripting.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Procurar...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Abrir Pasta para Sincronização</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Falha ao criar pasta de sincronização</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sincronizar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Sincronizar itens e notas com uma pasta no disco.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Falha ao sincronizar a aba &quot;%1&quot; com a pasta &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Remover Itens?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Deseja realmente &lt;strong&gt;remover os itens e os arquivos associados&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Abas e Pastas de Sincronização</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sincronize o conteúdo da &lt;strong&gt;aba&lt;/strong&gt; com a pasta com o &lt;strong&gt;caminho&lt;/strong&gt; fornecido.&lt;/p&gt;\n&lt;p&gt;Defina como &lt;strong&gt;caminho vazio&lt;/strong&gt; para não salvar os itens da &lt;strong&gt;aba&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Nome da Aba</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Caminho</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Arquivos dos Formatos de Dados do Item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Defina o tipo da media para &lt;strong&gt;-&lt;/strong&gt; (caractere menos) para ignorar os arquivos. Quaisquer outros arquivos desconhecidos ou ocultos são ignorados.&lt;/p&gt;\n&lt;p&gt;Exemplo: Carregue a extensão de arquivo &lt;strong&gt;txt&lt;/strong&gt; como um tipo de &lt;strong&gt;texto/pleno&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Tipo de mídia do item</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt; Defina o tipo MIME como &lt;strong&gt; - &lt;/strong&gt; (caractere de menos) para ignorar arquivos.\nQualquer um dos outros arquivos desconhecidos ou ocultos são ignorados. &lt;/p&gt; &lt;p&gt; Exemplo: Carregue a extensão de arquivo &lt;strong&gt; txt &lt;/strong&gt; como o tipo MIME &lt;strong&gt; text / plain &lt;/strong&gt;. &lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Defina o tipo MIME para &lt;strong&gt;-&lt;/strong&gt; (traço) para ignorar arquivos. Quaisquer outros arquivos desconhecidos ou ocultos serão ignorados.&lt;/p&gt;\n&lt;p&gt;Exemplo: Carregue a extensão de arquivo &lt;strong&gt;txt&lt;/strong&gt; como tipo MIME &lt;strong&gt;texto/simples&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Extensões</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">Tipo MIME do item</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Adicionar Tag</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Remover Tag</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Definir tag %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Remover tag %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Alternar etiqueta %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Não é possível remover itens com uma tag bloqueada</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Remova a tag dos itens primeiro para removê-los.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Limpar todas as tags</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Tags</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Mostrar tags para os itens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Itens do menu para adicionar e remover tags personalizadas podem ser adicionados e personalizados no diálogo Comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Mais informações disponíveis &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;aqui&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Nome da Tag</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Corresponder</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Folha de estilos</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Cor</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ícone</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Bloquear</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Evitar remover item</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Mostrar itens de texto simples e HTML simples.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Salvar e mostrar HTML e Rich Text</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Número máximo de linhas para mostrar (0 para mostrar tudo):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Altura máxima em pixels (0 para sem limite):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Folha de estilo padrão:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Exibir páginas da web.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Altura máxima em pixels (0 para definir como sem limite):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Log</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Sair?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Deseja realmente &lt;strong&gt;sair&lt;/strong&gt; do CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Arquivo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>A&amp;bas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>A&amp;juda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>Mo&amp;strar/Ocultar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nova Aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Renomear &amp;Grupo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Re&amp;nomear Aba %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Re&amp;mover Aba %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Renomear Grupo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Alterar í&amp;cone da Aba</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">Habilitar Armaz&amp;enamento da Área de Transferência</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Desativar Armazenamento da Área de Transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Opções de Importação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Erro do CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Opções para Exportação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Erro de Exportação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Falha ao exportar arquivo %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>Área de &amp;Transferência: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Itens do CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Criptografia indisponível</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>A criptografia não está disponível (consulte os registros para obter detalhes).\n\nSerá possível criptografar e descriptografar os dados da aba.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Importar senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Digite a senha para importar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Exportar senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Digite a senha para exportar (vazio para sem criptografia):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Erro de Importação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Falha ao importar arquivo %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Remover todas as abas do grupo?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Deseja remover &lt;strong&gt;todas as abas&lt;/strong&gt; do grupo &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Remover aba?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Deseja remover a aba &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informação</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;OCULTO&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n linha)</numerusform>\n            <numerusform>%1 (%n linhas)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;IMAGEM&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ITEMS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;VAZIO&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DADOS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linha &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linhas &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>O nome da sessão deve conter no máximo 16 caracteres\nque podem ser letras, dígitos, &apos;-&apos; ou &apos;_&apos;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>área de &amp;notificação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Novo Item</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Exportar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Preferências...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">C&amp;omandos/Atalhos Globais...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>C&amp;omandos...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Mostrar &amp;conteúdo da área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Al&amp;ternar Armazenamento da Área de Transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Gerenciador de P&amp;rocessos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Sair</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>Cla&amp;ssificar itens selecionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>Inverte&amp;r itens selecionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Colar itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Copiar itens selecionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Localizar</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Mo&amp;ver para a área de transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Mo&amp;strar Conteúdo...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Mo&amp;strar Prévia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Mo&amp;ver Para a Área de Transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Remover</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Editar &amp;notas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">E&amp;ditar com o editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Ação...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Mover para cima</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl + seta para cima</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Mover para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl + seta para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Mover para o topo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Mover para baixo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Nova Aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>R&amp;enomear Aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Re&amp;mover Aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Alterar í&amp;cone da aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Pró&amp;xima aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Direita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Abrir menu de contexto do item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Aba An&amp;terior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Salvar item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Cancelar edição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Desfazer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Refazer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Fonte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Negrito</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Itálico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Sublinhado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Riscado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Primeiro plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Segundo plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Apagar estilo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Pesquisar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;tivar Itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>E&amp;ditar com Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Mo&amp;strar Log</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Sobre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>A&amp;juda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>A aba %1 está corrompida ou alguns plugins do CopyQ estão faltando!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Texto copiado (%n linha)</numerusform>\n            <numerusform>Texto copiado (%n linhas)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Texto copiado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Dados copiados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Nova senha de criptografia da aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Digite a nova senha:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>As senhas não são iguais. Tente novamente (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Alterar senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>A nova senha não pode estar vazia.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Falha ao definir a senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Número máximo de tentativas de senha excedido.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Confirmar senha de criptografia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Repita a senha para confirmar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Senha atual de criptografia de aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Digite a senha atual para criptografar dados da aba:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Senha inválida. Tente novamente (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Falha na verificação da senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Arquivos de criptografia corrompidos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Os arquivos de criptografia estão ausentes ou corrompidos. O modo estrito não consegue recuperar as abas criptografadas automaticamente.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Falha ao alterar a senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Falha ao alterar a senha. Sua senha antiga ainda está ativa. Verifique os registros para obter detalhes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Senha alterada com sucesso</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>A senha foi alterada com sucesso.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Recriptografando as abas...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Recriptografando aba %1 de %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Falha ao criptografar as seguintes abas:\n\n%1\n\nConsulte os registros para obter detalhes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Falha ao criptografar</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Ocultar a janela principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Mostrar ou ocultar a janela principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Abrir o menu de contexto.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Sair do servidor.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Desabilitar ou habilitar armazenamento de área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Imprimir conteúdo da área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Imprimir conteúdo da seleção X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Colar área de transferência na janela atual\n(pode não funcionar com certos aplicativos).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Definir texto da área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXTO</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nDefinir conteúdo da área de trasnferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DADOS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Copiar item da linha para a área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>LINHA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Copiar próximo item da aba atual para a área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Copiar item anterior da aba atual para a área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Adicionar texto para a área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Inserir texto na linha definida.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Remover itens da linha definida.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>LINHAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Editar itens ou editar um novo.\nO valor -1 é para o texto atual na área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Definir separador para itens na saída.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARADOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Imprimir dados brutos da área de transferência ou item da linha.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nSalvar dados brutos na linha fornecida.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Mostrar diálogo de ações.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nExecutar PROGRAMA no texto do item nas linhas.\nUse %1 em PROGRAMA para passar o texto como arguemnto.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAMA</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nMostrar mensagem popup na área de notificação pelo TEMPO definido em milissegundos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TÍTULO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MENSAGEM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TEMPO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Lista de nomes de abas disponíveis.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Executar comanda na aba com o nome fornecido.\nA aba é criada se ela não existir.\nO padrão é a primeira aba.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nAvaliar o programa ECMAScript.\nOs argumentos são acessíveis usando &quot;argumentos[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Executar testes de aplicativo (anexe o argumento --help para mais informações).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NOME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Mostrar janela principal e opcionalmente abrir uma aba com o nome informado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Copiar área de transferência da janela atual\n(pode não funcionar em alguns aplicativos).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Definir conteúdo da área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Imprimir quantidade de itens na aba atual.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Escrever dados brutos na linha especificada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Executar PROGRAM no texto do item nas linhas.\nUse %1 em PROGRAM para passar texto como argumento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Mostrar mensagem pop-up da bandeja por TIME milissegundos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMANDO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Remover aba.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Renomear aba.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NOVO_NOME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Exportar itens para arquivo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>NOME_ARQUIVO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importar itens do arquivo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Listar todas as opções.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Obter valor da opção.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPÇÃO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Defina um valor para a opção.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Avaliar script.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTOS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Inicia ou se conecta à instância do aplicativo com o nome da sessão especificado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Imprimir ajuda para COMMAND ou todos os comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Imprimir versão do programa e das bibliotecas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Inicie o servidor em segundo plano antes de executar um comando.</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nIniciar ou conectar à instância do aplicativo com o nome fornecido da sessão.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSÃO</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nImprimir ajuda para o COMANDO ou todos os comandos.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nImprimir versão do programa e bibliotecas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Modo de Uso: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Inicia o servidor se nenhum comando for especificado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  COMANDOS:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTAS:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Use o argumento traço duplo (--) para ler todos os seguintes argumentos\n    sem expandir as seqüências de escape (ex.: \\n, \\t e outros).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Use ? para MIME para imprimir os tipos MIME disponíveis (o padrão é &quot;texto/plano&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Número inválido de argumentos!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Falha ao exportar arquivo &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Falha ao importar arquivo &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Clipboard Manager</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Comando não encontrado!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Finalizando servidor.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Exceção</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Exceção em %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Falha ao copiar para a área de transferência!</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Não foi possível salvar o arquivo &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Use o argumento traço (-) para ler os dados da entrada padrão.</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Não foi possível importar o arquivo &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Opção inválida &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>A aba com o nome informado não existe!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>O nome da aba não pode estar vazio!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Uma aba com esse nome já existe!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Armazenamento na área de transferência desativado*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">CopyQ - %1 - %2</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Adicionar atalho</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Novo Atalho</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Pressione qualquer combinação de teclas. &lt;span style=&quot; font-weight:600;&quot;&gt;Esc&lt;/span&gt; para cancelar.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Clique aqui e pressione qualquer combinação de teclas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Remover atalho</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Localizar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Gl&amp;obal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Os atalhos globais podem ser acionados a partir de qualquer aplicativo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>A&amp;plicação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Os atalhos de aplicação só podem ser acionados a partir da janela principal.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Os atalhos de aplicativo só podem ser disparados a partir da janela principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Atalho já existe!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>O nome da aba não pode estar vazio e ser único.&lt;br /&gt;\nA aba &lt;b&gt;No&amp;amp;tas&lt;/b&gt; pode ser aberta usando &lt;b&gt;Alt+T&lt;/b&gt; &lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; como serapador de caminho na visualização em árvore no layout da aba.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nome:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Nova Aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Renomear a Aba</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Renomear o Grupo de Abas</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>Quantidade &amp;Máxima de itens:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>Padrão</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Salvar Itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Solicitar senha após intervalo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Tempo limite por aba, em segundos, para solicitar novamente a senha de criptografia.\n\nDefina como 0 para usar a configuração global.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>global</translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">Itens &amp;Armazenados</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Pressione &apos;/&apos; para pesquisar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Digite para pesquisar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Expressão Regular</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Não diferenciar maiúsculas de minúsculas</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_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>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Acerca</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Gestor da prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Correio electrónico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Página web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Doar</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Diálogo de acção</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Co&amp;mando:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>&amp;Entrada padrão:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Arma&amp;zenar saída padrão:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Enviar dados do suporte fornecido para a entrada padrão de comandos (deixar vazio para desactivar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Criar itens a partir da saída padrão do programa (deixar vazio para desactivar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Separador para novos itens:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Expressão regular para dividir a saída em múltiplos itens.&lt;\\p&gt;\n&lt;p&gt;Utilize &lt;b&gt;\\n&lt;/b&gt; para gravar cada linha num item separado.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Separador de saída:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Gravar itens no separador indicado (deixar vazio para gravar no separador actual)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Comando gravado</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">O comando foi gravado e pode ser acedido no menu de itens.\nPode configurar o comando nas preferências.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Erro: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Código de saída: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Comando %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Gestor de processos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtrar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Terminar seleccionados</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Adicionar comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Mostrar/Ocultar a janela principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Mostrar o menu da bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Mostrar a janela principal sob o rato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Editar a prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Editar o 1º item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Copiar o 2º item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Mostrar diálogo de acção</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Criar novo item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Copiar o item seguinte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Copiar o item anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Colar prancheta como texto simples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Desactivar o armazenamento na prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Activar o armazenamento na prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Colar e copiar seguinte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Colar e copiar anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Capturar o ecrã</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Colar data e hora actuais</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Novo comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorar itens vazios ou com carácter único</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>A&amp;brir no navegador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Colar como texto simples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Reproduzir vídeos automaticamente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Copiar URL (endereço web) para outro separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Criar miniatura (ImageMagick requerido)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Criar código QR do URL (qrencode requerido)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Tarefas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Adicionar ao separador %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Mover para o separador %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorar ficheiros copiados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorar janela *&quot;Senha&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Mover para o lixo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(lixo)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Limpar separador actual</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Impossível adicionar novos itens</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Separador cheio. Falha ao remover itens.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Impossível adicional itens a %1. Por favor, remova itens manualmente para arranjar espaço.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Descartar alterações?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Tem a certeza de que deseja &lt;strong&gt;descartar as alterações&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Impossível ligar ao servidor! Inicie primeiro o servidor do CopyQ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Ligação perdida!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Conteúdo da prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formatos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>C&amp;onteúdo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Remover formato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Conteúdo do item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Tamanho:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Tamanho:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>O servidor CopyQ já está em execução.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Cancelar comandos activos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Cancelar comandos activos e sair?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Cancelar saída</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Sair mesmo assim</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl + Espaço</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Defina os novos comandos que podem ser invocados quer automaticamente no novo conteúdo da prancheta, quer pelo utilizador a partir do menu, quer utilizando um atalho de sistema.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Localizar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Carregar comandos…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Gra&amp;var selecção…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Copiar selecção</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Colar comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Alterações não gravadas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>A janela de comando tem alterações não gravadas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Abrir ficheiros com comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Comandos (*.ini);; Configuração CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Gravar comandos seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Comandos (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Gravar comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Falha ao gravar comandos em &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>O comando contém a lista de programas com argumentos que serão executados. Por exemplo:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">O argumento %1 do programa será substituído por texto do item e %2 até %9 para textos capturados por expressão regular.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>O argumento %1 do programa será substituído pelo texto do item.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>O carácter %1 pode ser usado para passar a saída padrão para o programa seguinte.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Pode usar a sintaxe seguinte para passar o resto do comando como parâmetro único.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Isto dá a mesma saída que %1 mas é mais útil para comandos mais longos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Pode usar as funções listadas abaixo nos seguintes comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>pran&amp;cheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Mostrar ajuda do comando (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nome:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Nome do comando a mostrar no menu</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Tipo de Ação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Executar o comando automaticamente se a prancheta tiver novo conteúdo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;mático</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Mostrar comando no menu contextual de itens correspondentes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>No m&amp;enu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Atalho:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>Atalho &amp;global:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Atalho global</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Itens correspondentes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Salta o comando se o texto inserido não corresponder à expressão regular (deixe em branco para encontrar tudo).\n\n%2 a %9 (ou argument[1] e superior no script) em Comando e Filtro será substituído com os textos capturados.\n\nExemplos:\n\n- URL: ^(https?|ftp)://\n- Ficheiros PDF: \\.pdf$\n- Carácter único: ^.$\n- Multimédia remota: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Use o comando só para itens copiados para a prancheta a partir da janela com o título correspondente a esta expressão regular (deixar em branco para incluir todas). Em macOS, contém o nome da aplicação seguido de um hífen (&amp;quot;-&amp;quot;) e depois o título da janela. E.g., &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Dados deste tipo MIME serão enviados para a entrada padrão do comando.\nDeixar vazio para desactivar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Janela:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Use o comando só para itens cujo texto corresponda a esta expressão regular (vazio para corresponder a qualquer coisa).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Exemplos:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Comparar URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Comparar ficheiros PDF    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Comparar caractere único   &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Comparar multimédia remota    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Conteúdo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtro:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Use os comandos só se o filtro tiver sucesso.&lt;/p&gt;\n\n&lt;p&gt;O texto do item é passado para a &lt;b&gt;entrada padrão&lt;/b&gt; do comando de filtro. O item é &lt;b&gt;comparado só se o código de saída do comando de filtro for 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; para texto de item passado como argumento e &lt;b&gt;%2&lt;/b&gt; a &lt;b&gt;%9&lt;/b&gt; para argumentos capturados por expressão regular (partes entre parênteses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; para encadear comandos (passar a saída padrão para o comando seguinte).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Coman&amp;do</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Tipo:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the catured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Ignora o comando se o texto entrado não corresponder a esta expressão regular (deixar em branco para aceitar tudo).\n\n%2 a %9 em Comandos e filtros serão substituídos pelos textos capturados.\n\nExemplos:\n\n- Comparar URL: ^(https?|ftp)://\n- Comparar nomes de ficheiros PDF: \\.pdf$\n- Comparar carácter único: ^.$\n- Comparar multimédia remota: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Ignorar o comando se o filtro tiver código de saída não-zero.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Acção</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Nome do separador para onde copiar novos itens (deixar vazio para não copiar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Remover item correspondente\n\nNota: se for aplicado automaticamente, nenhum outro comando automático é executado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Remover item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Acção de menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Ocultar a janela depois de activar o comando no menu contextual de um item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Ocultar a janela principal depois de activar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Opções do comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Mostrar o diálogo de acção antes de executar o comando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Aguardar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Alterar item, não criar nenhuns itens novos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>&amp;Saída:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avançado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Programa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Mostrar</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Ignora o comando se o texto inserido não corresponder a esta expressão regular (deixar em branco para comparar tudo).\n\n%2 a %9 em Comando e Filtro serão substituídos pelos textos capturados.\n\nExemplos:\n\n- Comparar URL: ^(https?|ftp)://\n- Comparar nomes de ficheiros PDF: \\.pdf$\n- Comparar carácter único: ^.$\n- Comparar multimédia remota: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;mato:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Cop&amp;iar para separador:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Criar itens a partir da saída padrão do programa (deixar em branco para desactivar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Separador:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Separador para dividir a saída em múltiplos itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Separador de saída:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Gravar itens no separador com o nome indicado (deixar em branco para guardar no 1º. separador)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Mostrar opções avançadas</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Fundo</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Dicas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Encontrado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Número</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Letra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Primeiro plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Notificação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Mostrar &amp;número</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Mostrar barras de deslocação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Barras de deslo&amp;cação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Utilizar ícones do ambiente de trabalho sempre que possível</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>Í&amp;cones de sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>Su&amp;avização</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>D&amp;efinir cores para separadores, barra de ferramentas e menus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Repor tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Carregar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Gravar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Editar o tema actual em editor externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>E&amp;ditar tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Antever:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>A cadeia de pesquisa é %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Seleccione um item e\nprima F2 para editar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Item exemplo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Algumas notas aleatórias (Shift + F2 para editar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Abrir ficheiro de tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Gravar ficheiro de tema como</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Sem editor externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Defina primeiro o comando do editor externo!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Idioma:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Quebrar texto se for maior que a linha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Quebrar texto l&amp;ongo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Manter a janela principal por cima das outras</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Semp&amp;re no topo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Fechar a janela principal quando outra aplicação estiver focada</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Fechar quando não focada</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Activar para abrir as janelas no ecrã actual. Desactivar para abrir as janelas onde foram fechadas pela última vez</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>A&amp;brir as janelas no ecrã actual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Confirmar a saída da aplicação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Confirmar a s&amp;aída da aplicação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Executar a aplicação ao iniciar o sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>Início &amp;automático</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Suporte para teclas de navegação Vi (H, J, K, L e mais), barra (/) para procurar</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Navegação de estilo &amp;Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Impedir a captura de janelas da aplicação em gravações e capturas de ecrã</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>Oc&amp;ultar de gravações e capturas de ecrã</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Encriptar dados do separador no disco (requer definição de senha)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Encrip&amp;tar separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Use um armazenamento externo de chaves disponível para a senha de encriptação (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Usar armazenamento externo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Alterar senha para encriptar os dados do separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Alterar senha de encri&amp;ptação...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Estilo de navegação/Mapa de teclado:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Suporte para navegação Vi (teclas H, J, K, L, / e mais) e navegação Emacs (Ctrl+N, P, V e mais)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Pré-definição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Gravar e restaurar o histórico dos filtros de item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Gravar histórico de filtros</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Mostrar automaticamente dica para completar funções, tipo e nomes de variável nos comandos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Concluir comandos automaticamente</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulação da prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Permitir colar conteúdo copiado como as selecções com o rato (normalmente clicando no botão do meio do rato)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Colar prancheta com o rato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Permitir colar selecções do rato utilizando o atalho (normalmente Ctrl + V ou Shift + Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Colar selecção do rato com o teclado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Gravar prancheta no histórico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Gravar prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Gravar texto seleccionado com o rato (selecção primária) no histórico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Gravar texto seleccionado com o rato</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Executar comandos automáticos na selecção</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Número máximo de itens no histórico:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Número máximo de itens em cada separador</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Descarregar separador após um intervalo em minutos:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>Descarregar separador após &amp;um intervalo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Descarregar cada separador da memória depois de um dado número de minutos de inactividade.\n\nDefinir para 0 para não descarregar os separadores.</translation>\n    </message>\n    <message>\n        <source> minutes</source>\n        <translation type=\"vanished\"> minutos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Pedir senha após um intervalo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Tempo limite em segundos para os separadores encriptados pedirem novamente a senha.\n\nEscolha 0 para desactivar.</translation>\n    </message>\n    <message>\n        <source> seconds</source>\n        <translation type=\"vanished\"> segundos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Comando do editor externo (%&amp;1 é o ficheiro a editar):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Comando do editor externo (%1 é o ficheiro a editar).\n  Exemplos:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Se&amp;parador para gravar a prancheta:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Nome do separador que guardará automaticamente o novo conteúdo da prancheta.\n\nDeixar em branco para desactivar a gravação automática.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Deixar desmarcado para gravar o item editado com a tecla &quot;Enter&quot; e criar a nova linha com Ctrl + Enter.\n\nNota: os itens editados podem ser gravados com F2, ignorando esta opção.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Gra&amp;var item editado com Ctrl + Enter e criar nova linha com a tecla &quot;Enter&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Mostrar a descrição de uma linha de cada item.\n\nUtilize &quot;Antever&quot; para mostrar os itens completos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>&amp;Mostrar itens simples</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Permitir a procura por números, caso contrário, premir uma tecla numérica activa o item nessa posição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>Procurar por núm&amp;eros</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Activar o item com um só clique</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Depois de activar o item (duplo clique ou &quot;Enter&quot;), copiá-lo para a prancheta e...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Mover item para o topo da lista depois de ser activado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Mover item para o t&amp;opo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Fechar a janela principal após activar o item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>Fe&amp;char janela principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Focar a última janela depois de activar o item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Focar a última janela</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Colar na janela actual depois de activar o item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Colar na janela actual</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Mostrar/Ocultar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Ocultar separadores (prima Alt para mostrar)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Ocultar separa&amp;dores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Ocultar barra de ferramentas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Ocu&amp;ltar barra de ferramentas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Ocultar dicas da &amp;barra de ferramentas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Ocultar janela principal quando fechada</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Ocultar &amp;janela principal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Disposição e transparência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Mostrar árvore com separadores em vez da barra de separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Á&amp;rvore de separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Transparência &amp;focada:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparência da janela principal, se focada.\n\nNota: isto não é suportado em todos os sistemas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Transparência &amp;não focada:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparência da janela principal se não focada.\n\nNota: isto não é suportado em todos os sistemas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Mostrar número de itens nos separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Most&amp;rar total de itens</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Posição da &amp;notificação:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Posição no ecrã para as notificações</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Topo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Base</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Topo à direita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Base à direita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Base à esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Topo à esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Int&amp;ervalo em segundos para mostrar notificações:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Intervalo em segundos para mostrar a notificação de novo conteúdo na prancheta ou se um item para lá foi copiado (só se a janela principal estiver fechada).\n\nDefinir como 0 para desactivar.\n\nDefinir como -1 para manter visível até ser clicada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Número de lin&amp;has para a notificação da prancheta:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Número de linhas do conteúdo da prancheta.\n\nDefinir como 0 para desactivar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Utilizar notificações nativas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Geometria da notificação (em pontos de ecrã)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Desvio hori&amp;zontal:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Distância da notificação da margem direita/esquerda em pontos de ecrã</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>Desvio &amp;vertical:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Distância da notificação à margem superior/inferior em pontos do ecrã</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>&amp;Largura máxima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Largura máxima da notificação em pontos de ecrã</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Altura má&amp;xima:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Altura máxima da notificação em pontos de ecrã</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Não mostrar ícone na bandeja; minimizar janela quando fechada</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Desacti&amp;var bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Mostrar comando do conteúdo actual da prancheta no menu da bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>&amp;Mostrar comandos do conteúdo da prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Número de itens no men&amp;u da bandeja:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Número de itens no menu da bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Mostrar itens do separador actual no menu da bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Most&amp;rar separador actual no menu,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>ou es&amp;colher outro separador:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Nome do separador a mostrar no menu da bandeja (vazio para o 1º separador)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Colar item na janela actual após seleccioná-lo no menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>Colar item activado na &amp;janela actual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Mostrar antevisão da imagem ao lado dos itens de menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>M&amp;ostrar antevisão da imagem como ícone do item de menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Configuração</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Geral</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Disposição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Histórico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Bandeja</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Notificações</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Atalhos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Aparência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Valor inválido para a opção &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Repor as preferências?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Esta acção vai repor todas as preferências (em todos os separadores) nos valores predefinidos. &lt;br/&gt;&lt;br/&gt;Deseja realmente &lt;strong&gt;repor todas as preferências&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Reinício requerido</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>O idioma alterar-se-á após reiniciar a aplicação.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Preferências</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Falha ao criar pasta de sincronização &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt + ↓</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Seleccionar ícone…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Seleccionar ícone</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Explorar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Abrir ficheiro de ícones</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Ficheiros de imagem (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Todos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Separadores:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Co&amp;nfiguração</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Co&amp;mandos</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">código de saída do editor é %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Comando do editor: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Falha do comando do editor (ver diários)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Gravar</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Gravar item (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Cancelar</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Cancelar a edição e reverter as alterações</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Letra</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Negrito</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Itálico</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Sublinhado</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Rasurado</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Primeiro plano</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Fundo</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Eliminar estilo</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Procurar</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Desfazer</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Refazer</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Para partilhar itens encriptados noutro computador ou sessão, necessitará das chaves pública e privada: &lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br/&gt;(mantenha esta chave privada num local seguro&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Tem de ter o GnuPG instalado para ver separadores encriptados.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Encriptar (GnuPG requerido)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl + L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Desencriptar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Desencriptar e copiar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl + Shift + L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Desencriptar e colar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Erro: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Impossível gerar as chaves.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Para partilhar itens encriptados noutro computador ou sessão, necessitará destes ficheiros de chave secreta (mantenha-os seguros):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Concluído</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>A criar as novas chaves (pode demorar alguns minutos)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>A definir a nova senha...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>As chaves de encriptação &lt;strong&gt;devem ser geradas&lt;/strong&gt; antes de encriptar itens.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Gerar novas chaves...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Alterar senha...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>A encriptação falhou!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Falha ao desencriptar!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Encriptação</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Encriptar itens e separadores.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Para encriptar e desencriptar itens, adicione os comandos apropriados sob o separador Comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Partilhar itens e separadores encriptados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Separadores encriptados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Especifique nomes de separadores (um por linha) que serão automaticamente encriptados e desencriptados.&lt;/p&gt;\n&lt;p&gt;Defina o intervalo de descarga do separador no separador Histórico para descarregar com segurança itens desencriptados da memória.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Separador corrompido</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Nem todos os itens no separador &lt;strong&gt;%1&lt;/strong&gt; foram carregados. Deseja continuar a carregar o separador e eventualmente perder alguns itens?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>A extensão FakeVim é parte do Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emular o editor Vim ao editar itens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Activar FakeVim para editar itens</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Caminho do ficheiro de configuração:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Imagens</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Mostrar imagens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Largura má&amp;xima da imagem:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Largura máxima da imagem mostrada no histórico (0 para usar o tamanho original)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Altura máxima da ima&amp;gem:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Altura máxima da imagem mostrada no histórico (0 para usar o tamanho original)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Comando do editor de &amp;imagens:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Comando do editor de formatos de imagem suportados não SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Comando do editor &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Comando do editor para formato de imagens SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Mostrar notas dos itens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Posição das notas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>A&amp;cima do item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>A&amp;baixo do item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Ao &amp;lado do item</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Mostrar &amp;dica</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Adicionar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Remover</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Mover acima</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Mover abaixo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Mover para o topo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Mover para o fundo</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">A&amp;cima</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">A&amp;baixo</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Impossível remover itens fixados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Liberte primeiro os itens para os remover.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Fixar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Libertar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Itens fixados</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Fixe os itens para bloqueá-los na linha actual e evitar a eliminação (a não ser que os liberte).&lt;/p&gt;&lt;p&gt;Fornece atalhos e funcionalidade de programação.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Explorar...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Abrir pasta para sincronização</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Falha ao criar a pasta de sincronização</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Sincronizar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Sincronizar itens e notas com uma pasta no disco.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Impossível sincronizar o separador &quot;%1&quot; com a pasta &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Remover itens?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Deseja realmente &lt;strong&gt;remover os itens e os ficheiros associados&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Sincronizar separadores e pastas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sincronize conteúdos do &lt;strong&gt;separador&lt;/strong&gt; com a pasta com o &lt;strong&gt;caminho&lt;/strong&gt; indicado.&lt;/p&gt;\n&lt;p&gt;Defina um &lt;strong&gt;caminho vazio&lt;/strong&gt; para não gravar os itens no &lt;strong&gt;separador&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Nome do separador</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Caminho</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Ficheiros para formato de dados dos itens</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Definir tipo de meio em &lt;strong&gt;-&lt;/strong&gt; (sinal de menos) para ignorar ficheiros. Quaisquer outros ficheiros desconhecidos ou ocultos são ignorados.&lt;/p&gt;\n&lt;p&gt;Exemplo: carregar ficheiros com a extensão &lt;strong&gt;txt&lt;/strong&gt; como &lt;strong&gt;texto simples&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Tipo de meio do item</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Defina o tipo MIME como &lt;strong&gt;-&lt;/strong&gt; (hífen) para ignorar ficheiros. Quaisquer outros ficheiros ocultos ou desconhecidos são ignorados.&lt;/p&gt;\n&lt;p&gt;Exemplo: carregar ficheiros &lt;strong&gt;txt&lt;/strong&gt; como tipo MIME &lt;strong&gt;texto/simples&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Extensões</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">Tipo MIME do item</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Adicionar etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Remover etiqueta</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Etiquetar como %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Remover etiqueta %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Alternar etiqueta %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Impossível remover itens com uma etiqueta de bloqueio</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Remover as etiquetas dos itens antes de os remover.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Importante</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Limpar todas as etiquetas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Etiquetas</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Mostrar etiquetas dos itens.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Pode adicionar e personalizar itens de menu para adicionar e remover etiquetas no diálogo Comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Mais informação disponível na &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;página da wiki&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Nome da etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Comparar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Folha de estilo</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Cor</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ícone</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Bloquear</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Evitar remover o item</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Texto</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Mostrar texto e itens HTML simples.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Gravar e mostrar HTML e texto rico</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Número máximo de linhas a mostrar (0 para todas):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Altura máxima em pixels (0 para ilimitada):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Folha de estilo predefinida:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Exibir as páginas da Web.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Altura máxima em píxeis (0 para ilimitado):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Diário</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Sair?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Deseja &lt;strong&gt;sair&lt;/strong&gt; do CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Ficheiro</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>A&amp;juda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Novo separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Renomear &amp;grupo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Re&amp;nomear separador %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Re&amp;mover separador %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Remover grupo %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Alterar í&amp;cone do separador</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">Activar armaz&amp;enamento na prancheta</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Desactivar armazenamento na prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Opções para importação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Erro do CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>Mo&amp;strar/Ocultar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Opções para exportação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Erro de exportação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Falha ao exportar %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>Pran&amp;cheta: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Itens CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Encriptação indisponível</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>A encriptação não está disponível (consulte os diários para obter detalhes).\n\nSerá possível encriptar e desencriptar dados de separadores.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Senha de importação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Insira a senha para importar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Senha de exportação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Insira a senha para exportar (vazia não encripta):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Erro de importação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Falha ao importar %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Remover todos os separadores no grupo?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Deseja remover &lt;strong&gt;todos os separadores&lt;/strong&gt; no grupo &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Remover separador?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Deseja remover o separador &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Informação</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;OCULTO&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n linha)</numerusform>\n            <numerusform>%1 (%n linhas)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;IMAGEM&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ITEMS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;VAZIO&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DADOS&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Eliminar</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linha &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n linhas &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>O nome da sessão deve conter pelo menos 16 caracteres\nque podem ser letras, algarismos, &quot;-&quot; ou &quot;_&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>pran&amp;cheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Novo item</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl + I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Exportar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Preferências...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl + P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">C&amp;omandos/Atalhos globais...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>C&amp;omandos...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Mostrar &amp;conteúdo da prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl + Shift + C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>Al&amp;ternar armazenamento na prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl + Shift + X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Gestor de p&amp;rocessos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl + Shift + Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Sair</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl + Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>Ordenar itens &amp;seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl + Shift + S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Reverter itens seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl + Shift + R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>Co&amp;lar itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Copiar itens seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Localizar</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Mover para área de transferên&amp;cia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Mo&amp;strar conteúdo...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Mo&amp;strar antevisão</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Mover para Área de &amp;Transferência</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Remover</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Editar &amp;notas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift + F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">E&amp;ditar com o editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl + E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Acção...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Mover acima</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl + ↑</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Mover abaixo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl + ↓</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Mover para o topo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl + Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Mover para o fundo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl + End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Novo separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl + T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>R&amp;enomear separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl + F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Re&amp;mover separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl + W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Alterar í&amp;cone do separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl + Shift + T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Separador segui&amp;nte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Direita</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Esquerda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Abrir menu contextual do item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift + F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Se&amp;parador anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Gravar item</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Cancelar edição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Desfazer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Refazer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Letra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Negrito</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Itálico</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Sublinhado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Rasurado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Primeiro plano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Fundo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Eliminar estilo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Procurar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;ctivar itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>E&amp;ditar no editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Mo&amp;strar diário</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Acerca</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>A&amp;juda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>O separador %1 está corrompido ou faltam extensões do CopyQ!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Texto copiado (%n linha)</numerusform>\n            <numerusform>Texto copiado (%n linhas)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Texto copiado</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Dados copiados</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Senha de encriptação de novos separadores</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Insira a nova senha:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>As senhas não coincidem. Por favor, tente novamente. (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Alterar senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>A nova senha não pode estar vazia.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Falha ao definir a senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Excedido o máximo de tentativas de senha.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Confirme a senha de encriptação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Re-insira a senha para confirmar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Senha de encriptação do separador actual</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Insira a senha actual para encriptar os dados do separador:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Senha inválida. Por favor, tente novamente. (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Falha ao verificar a senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Ficheiros de encriptação corrompidos</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Os ficheiros de encriptação estão em falta ou corrompidos. O modo rigoroso não consegue recuperar automaticamente os separadores encriptados.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Falha ao alterar a senha</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Falha ao alterar a senha. A senha antiga ainda está activa. Veja os diários para mais detalhes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Senha alterada com sucesso</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>A senha foi alterada com sucesso.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>A re-encriptar os separadores...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>A re-encriptar o separador %1 de %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Falha ao encriptar os separadores seguintes:\n\n%1\n\nPor favor, veja os diários para mais detalhes.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Falha ao encriptar</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Mostrar a janela principal e opcionalmente abrir separador com o nome indicado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NOME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Ocultar a janela principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Mostrar ou ocultar a janela principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Abrir o menu contextual.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Sair do servidor.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Desactivar ou activar armazenamento do conteúdo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Imprimir conteúdo da prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Imprimir conteúdo da selecção X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Colar prancheta na janela actual\n(pode não funcionar com algumas aplicações).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Copiar prancheta da janela actual\n(pode não funcionar com algumas aplicações).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Definir texto da prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXTO</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nDefinir conteúdo da área de transferência.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DADOS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Imprimir número de itens no separador actual.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Copiar item na linha para a prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>LINHA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Copiar item seguinte do separador actual para a prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Copiar item anterior do separador actual para a prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Adicionar texto à prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Inserir texto na linha indicada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Remover itens nas linhas indicadas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>LINHAS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Editar itens ou editar novo.\nValor -1 é do texto na prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Definir separador para itens na saída.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARADOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Imprimir dados brutos da prancheta ou item na linha.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nEscrever dados brutos na linha indicada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Mostrar diálogo de acção.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nExecutar PROGRAMA no texto do item nas linhas.\nUsar %1 no PROGRAMA para passar texto como argumento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAMA</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nMostrar balão com TEMPO mili-segundos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Definir conteúdo da prancheta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Escrever dados em bruto na linha indicada.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Executar PROGRAMA ao ter item de texto nas linhas.\nUsar %1 em PROGRAMA para passar texto como argumento.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Mostrar dica na bandeja durante TEMPO mili-segundos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TÍTULO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MENSAGEM</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TEMPO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Listar nomes de separadores disponíveis.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Executar comando no separador indicado.\nCria o separador se não existir.\nA predefinição é o primeiro.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMANDO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Remover separador.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Renomear separador.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NOVO_NOME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Exportar itens para ficheiro.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>NOME_FICHEIRO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importar itens de ficheiro.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Listar todas as opções.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Obter valor da opção.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPÇÃO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Definir valor da opção.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Avaliar programa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Inicia ou liga à instância da aplicação com o nome de sessão indicado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Mostrar ajuda para COMANDO ou todos os comandos.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Mostrar versão do programa e das bibliotecas.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Iniciar o gestor em 2º plano antes de executar um comando.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nAvalie o programa ECMAScript.\nOs argumentos estão acessíveis ao utilizar com &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTOS</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nInicia ou liga à instância da aplicação com o nome de sessão indicado.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSÃO</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nImprimir ajuda para COMANDO ou todos os comandos.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nImprimir versão do programa e bibliotecas.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Executar testes da aplicação (usar --help para mais informação).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Utilização: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Inicia o servidor se não for especificado um comando.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  COMANDOs:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTAS:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Utilizar argumento travessão (-) para ler dados da entrada padrão.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Utilizar argumento travessão duplo (--) para ler todos os argumentos seguintes\n     sem expandir sequências de escape (i.e. \\n, \\t e outras).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Utilizar ? para MIME para imprimir todos os tipos MIME disponíveis (predefinição é &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Número de argumentos inválido!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Falha ao exportar o ficheiro &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Falha ao importar o ficheiro &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Gestor da prancheta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Comando não encontrado!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>A terminar o servidor.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Impossível gravar em &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Impossível importar &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Opção &quot;%1&quot; inválida!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Excepção</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Excepção em %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Impossível copiar para a prancheta!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Não existe um separador com esse nome!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>O nome de separador não pode estar vazio!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Já existe um separador com esse nome!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Armazenamento em memória desactivado*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">CopyQ - %1</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">CopyQ - %1 - %2</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Adicionar atalho</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Novo atalho</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Prima qualquer combinação de teclas. &lt;span style=&quot; font-weight:600;&quot;&gt;Esc&lt;/span&gt; para cancelar.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Clique aqui e prima qualquer combinação de teclas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Remover atalho</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Localizar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Gl&amp;obal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Os atalhos globais podem ser accionados a partir de qualquer aplicação.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>A&amp;plicação</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Atalhos da aplicação só podem ser accionados a partir da janela principal.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Os atalhos da aplicação só podem ser acionados a partir da janela principal.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>O atalho já existe!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>O nome do separador tem de ser único e não pode estar vazio.&lt;br /&gt;\nAs &lt;b&gt;Notas&lt;/b&gt; do separador podem ser abertas usando &lt;b&gt;Alt + T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; como separador de caminho na vista em árvore.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Nome:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Novo separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Renomear separador</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Renomear grupo de separadores</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>Número &amp;máximo de itens:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>predefinição</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Gravar itens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Pedir senha após um intervalo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Tempo limiute em segundos por separador para pedir novamente a senha de encriptação.\n\nEscolha 0 para usar a definição global.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>global</translation>\n    </message>\n    <message>\n        <source> seconds</source>\n        <translation type=\"vanished\"> segundos</translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;Guardar Itens</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Prima &quot;/&quot; para procurar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Escreva para procurar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Expressão regular</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Ignorar maiúsculas e minúsculas</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_ru.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"ru_RU\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>О программе</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Менеджер буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Автор</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Эл. почта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Сайт</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Пожертвовать</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Диалог действий</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>&amp;Стандартный ввод:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>&amp;Сохранить стандартный вывод:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Ко&amp;манда:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Отправить данные этого типа медиа в стандартный ввод команды (оставьте пустым для отключения)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Создавать объекты из стандартного вывода программы (оставьте пустым для отключения)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Разделитель новых объектов:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Регулярное выражение для разрыва вывода на несколько объектов.&lt;\\p&gt;\n&lt;p&gt;Используйте &lt;b&gt;\\n&lt;/b&gt; для разделения строк на несколько объектов.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Вкла&amp;дка вывода:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Сохранить объекты во вкладке с данным именем (оставьте пустым для сохранения в текущей вкладке)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Команда сохранена</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Команда была сохранена и теперь она доступна из меню объектов.\nВы можете настроить команду в настройках.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Ошибка: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Код выхода: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Команда %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Диспетчер процессов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Фильтр</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Удалить выбранное</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Добавить команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Показать/скрыть главное окно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Показать меню в трее</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Показать главное окно под курсором мыши</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Править буфер обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Править первый объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Копировать второй объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Показать диалог действий</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Создать новый объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Копировать следующий объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Копировать предыдущий объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Вставить буфер обмена в виде обычного текста</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Отключить сохранение буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Включить сохранение буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Вставить и скопировать следующий</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Вставить и скопировать предыдущий</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Сделать скриншот</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Вставить текущие дату и время</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Новая команда</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Игнорировать объекты без символов или только с одним символом</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Открыть в &amp;браузере</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Вставить как обычный текст</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Автовоспроизведение видео</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Копировать URL (веб-адрес) в другую вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Создать эскиз (требуется ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Создать QR-код из URL (требуется qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Задачи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Добавить на вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Переместить на вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Игнорировать скопированные файлы</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Игнорировать окно *&quot;Пароль&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Переместить в корзину</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(корзина)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Очистить текущую вкладку</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Не удалось добавить новые элементы</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Вкладка заполнена. Не удалось удалить какие-либо элементы.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Не удаётся добавить новые объекты во вкладку %1. Пожалуйста, удалите объекты вручную, чтобы освободить место.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Отменить правки?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Вы действительно хотите &lt;strong&gt;отменить правки&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Невозможно подключится к серверу! Сначала запустите сервер CopyQ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Соединение потеряно!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Содержимое буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Форматы:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>С&amp;одержимое:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Удалить формат</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Содержимое объекта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Размер:&lt;/strong&gt; %1 байт</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Размер:&lt;/strong&gt; %1 байт</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Сервер CopyQ уже запущен.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Отменить запущенные команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Отменить запущенные команды и выйти?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Отменить выход</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Всё равно выйти</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Пробел</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Определите новые команды, которые могут быть автоматически вызваны в новом содержимом буфера обмена или пользователем из меню или с помощью сочетания клавиш системы.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Поиск:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Загрузить команды…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>&amp;Сохранить выбранное…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Копировать выбранное</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Вставить команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Несохранённые правки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>В диалоге «Команды» есть несохранённые правки.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Открыть файл с командами</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Файлы команд (*.ini);; Файлы конфигурации CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Сохранить выбранные команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Файлы команд (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Сохранить команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Не удалось сохранить команды в файл «%1»: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Показать справку по командам (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Команды содержат список программ с аргументами, которые будут выполняться. Например:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Аргумент программы %1 будет заменён на текст элемента, а аргументы с %2 по %9 для текста, захваченного регулярным выражением.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Аргумент программы %1 будет заменён на текст объекта.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Символ %1 может использоваться для передачи стандартного вывода следующей программе.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Следующий синтаксис может использоваться для определение оставшейся части команды как один параметр.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Это даёт такой же вход как и %1, но полезнее для более длинных команд.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Функции, перечисленные ниже, могут быть использованы в следующих командах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;буфер обмена</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Имя:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Имя команды в меню</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Тип действия</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Запускать команду автоматически про появлении нового содержимого в буфере обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Авто&amp;матически</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Показать команду в контекстном меню подходящих объектов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>В м&amp;еню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Глобальное сочетание клавиш:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Совпадение объектов</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Пропускает команду, если введённый текст не соответствует этому регулярному выражению (оставьте пустым, чтобы сопоставить всё).\n\nОт %2 до %9 в командах и фильтрах будут заменены захваченными текстами.\n\nПримеры:\n\n- Сопоставить URL: ^(https?|ftp)://\n- Сопоставить имена файлов PDF: \\.pdf$\n- Сопоставить одиночный символ: ^.$\n- Сопоставить удалённое мультимедиа: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Данные этого MIME-типа будут отправлены в стандартный ввод команды.\nОставьте пустым для отключения этого.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Коман&amp;да</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Скрыть окно по активации команды из контекстного меню объекта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Править объект, не создавать новые</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Тр&amp;ансформация</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Создать объекты из стандартного вывода программы (оставьте пустым для отключения)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Глобальное сочетание клавиш</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Окно:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Используйте команду только для элементов, текст которых совпадает с регулярным выражением (оставьте пустым для соответствия чему-угодно)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Примеры:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  совпадающий URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt; совпадающие имена файлов PDF &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  совпадение одного символа &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  совпадение удалённого мультимедиа &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Дополнительно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>СЦЕНАРИЙ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Отображение</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Содержимое:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Фильтр:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Используйте команды, только если команда фильтрации успешно выполняется.&lt;/p&gt;\n\n&lt;p&gt;Элементы текста передаются &lt;b&gt;стандартному вводу&lt;/b&gt; от команды фильтрации. Элемент &lt;b&gt;совпадает только если команда фильтра выдаёт выходной код 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Используйте &lt;b&gt;% 1 &lt;/b&gt; для элемента текста, переданного в качестве аргумента и &lt;b&gt;% 2 &lt;/b&gt; на &lt;b&gt;% 9 &lt;/b&gt; для аргументов, захваченных регулярным выражением (детали, указанные в скобках).&lt;/p&gt;\n\n&lt;p&gt;Используйте &lt;b&gt;|&lt;/b&gt; для цепи команд (передать стандартному выводу следующей команды).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>Фор&amp;мат:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Тип:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Пропускает команду, если входной текст не соответствует этому регулярному выражению (оставьте пустым, чтобы соответствовать всему).\n\nОт %2 до %9 (или аргумент[1] и выше в сценарии) в Команде и Фильтре будут заменены на захваченные тексты.\n\nПримеры:\n\n- Соответствие адреса: ^(https?|ftp)://\n- Соответствие имён файлов PDF: \\.pdf$\n- Соответствие одиночного символа: ^.$\n- Соответствие внешнего мультимедиа: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Пропускает команду, если команда фильтра завершилась ошибкой с ненулевым кодом выхода.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Действие</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Коп&amp;ировать во вкладку:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Название вкладки для копирования новых объектов (оставьте пустым, чтобы не копировать)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Удалить соответствующий пункт\n\nПримечание: Если применяется автоматически, никакие другие автоматические команды не выполняются.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Удалить объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Меню действия</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Скрыть главное окно по активации</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Показать дополнительное</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Сочетание клавиш:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Используйте команду только для объектов, скопированных в буфер обмена из окна с заголовком текста, совпадающим с обычным выражением (оставьте пустым, чтобы подходило к каждому окну). В macOS это включает в себя название приложения с последующими тире &amp;quot;-&amp;quot; и заголовком окна. Например &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Настройки команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Показывать диалог действий перед выполнением команды</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Ждать</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>В&amp;ывод:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Разделитель:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Разделитель для соответствия разделения вывода на несколько объектов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Вкладка &amp;вывода:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Сохранить объекты на вкладке с указанным именем (оставьте пустым, чтобы сохранить в первой вкладке)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Фон</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Заметки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Найдено</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Выбрано</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Номер</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Обычный</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Редактор</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Шрифт</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Чередование</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Передний план</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Уведомление</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Показать &amp;номер</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Показать полосы прокрутки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Поло&amp;сы прокрутки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Использовать иконки из среды рабочего стола, когда это возможно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Ус&amp;тановить цвета для вкладок, панели инструментов и меню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>С&amp;истемные значки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Подсказки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Сглаживание</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>С&amp;бросить тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Тема:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Загрузить тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Сохранить тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Править текущую тему во внешнем редакторе</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>П&amp;равить тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Предварительный просмотр:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Строка поиска %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Выберите объект и\nнажмите F2 для правки.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Образец объекта %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Различные заметки (Shift+F2 для правки)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Открыть файл темы</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Сохранить файл темы как</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Нет внешнего редактора</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Сначала укажите команду внешнего редактора!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Абв</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Язык:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Переносить длинный текст, чтобы он помещался в строке</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Переносить &amp;длинный текст</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Держать основное окно поверх других окон</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Всегда &amp;поверх других окон</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Закрывать главное окно, когда фокус на другом приложении</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Закрывать, когда неактивно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Включить открытие окон на текущем экране. Отключить открытие окон в месте, где были закрыты ранее</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>&amp;Открывать окна на текущем экране</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Подтверждать выход из приложения</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Подтвер&amp;ждать выход из приложения</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Запуск приложения при старте системы</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>З&amp;апускать автоматически</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Поддержка навигационных клавиш Vi (H, J, K, L и другие), поиск клавишей косой черты (/)</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Стиль навигации Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Предотвращать захват окон приложений в скриншотах и записях</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Скрывать для скриншотов и записей</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Шифровать данные вкладок на диске (требуется установка пароля)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Шифровать &amp;вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Использовать доступное внешнее хранилище ключей для пароля шифрования (хранилище учётных данных Windows, связка ключей macOS, связка ключей GNOME, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Использовать внешнее хранилище ключей</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Изменить пароль, используемый для шифрования данных вкладок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Сменить &amp;пароль шифрования…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Стиль навигации / карта клавиш:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Поддержка навигации в Vi (клавиши H, J, K, L, / и другие) и навигации в Emacs (Ctrl+N, P, V и другие)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>По умолчанию</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Сохранение и восстановление истории фильтров объекта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Сохранять историю фильтра</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Автоматически отображать всплывающие окна для завершения ввода функций, типов и переменных в командах</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Автодополнение команд</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Управление буфером обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Разрешить вставку скопированного таким же образом, как и выделение мышью (обычно по нажатии средней кнопки мыши)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Вставить буфер обмена с помощью мыши</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Разрешить вставку выбора мыши с помощью сочетания клавиш (обычно Ctrl+V или Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Вставить выбранное мышью при помощи клавиатуры</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Сохранить буфер обмена в истории</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Хранилище буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Сохранить текст, выбранный с помощью мыши (основной выбор), в истории</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Сохранить текст, выбранный с помощью мыши</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Запускать автоматические команды при выборе</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Максимум объектов в истории:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Максимум объектов в каждой вкладке</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Выгрузить вкладку после перерыва в минутах:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>&amp;Выгружать вкладку через:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Выгружать каждую вкладку из памяти после указанного количества минут бездействия.\n\nУстановите 0, чтобы не выгружать вкладки.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Запрашивать пароль через:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Тайм-аут в секундах для повторного запроса пароля для зашифрованных вкладок.\n\nУстановите 0 для глобального отключения.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Команда внешнего редактора (%&amp;1 — файл для правки):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Команда внешнего редактора (%1 — файл для правки).\n  Примеры:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>В&amp;кладка для хранения буфера обмена:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Название вкладки, которая будет автоматически сохранять новое содержимое буфера обмена.\n\nОставьте пустым, чтобы отключить автоматическое запоминание.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Если флажок снят, клавиша Enter будет сохранять изменённый объект, а Ctrl+Enter будет создавать новую строку.\n\nПримечание: изменённые объекты можно сохранить клавишей F2 независимо от этого параметра.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Со&amp;хранять изменённый объект сочетанием Ctrl+Enter, создавать новую строку клавишей Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Показать однострочное описание каждого объекта.\n\nИспользуйте предпросмотр, чтобы отобразить объекты целиком.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Пока&amp;зать простые объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Включить поиск номеров, иначе нажатие цифровой клавиши активирует объект в этом положении</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Поиск цифр</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Активировать объект по одному нажатию</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>После активации объекта (двойным нажатием или клавишей Enter) скопировать его в буфер обмена и...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Переместить объект в верхнюю часть списка после его активации</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Переместить объект в &amp;начало</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Закрыть основное окно по активации объекта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Закрыть главное окно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Фокус на последнем окне по активации объекта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Фокус на последнем окне</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Вставить в текущее окно по активации объекта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Вставить в текущее окно</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Показать/скрыть</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Скрыть вкладки (нажмите клавишу Alt для показа)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>С&amp;крыть вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Скрыть панель инструментов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Скрыть пане&amp;ль инструментов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Скрыть &amp;значки панели инструментов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Скрыть главное окно при закрытии</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Скрыть &amp;главное окно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Оформление и прозрачность</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Показать дерево с вкладками вместо панели вкладок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>&amp;Дерево вкладок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Прозрачность в фокусе:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Прозрачность главного окна при фокусе.\n\nПримечание: Поддерживается не на всех устройствах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Прозрачность &amp;без фокуса:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Прозрачность главного окна без фокуса.\n\nПримечание: Поддерживается не на всех устройствах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Показать число объектов во вкладках</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Пока&amp;зать число объектов</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Позиция &amp;уведомления:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Положение на экране для уведомлений</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Сверху</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Снизу</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Сверху справа</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Снизу справа</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Снизу слева</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Сверху слева</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Инт&amp;ервал отображения уведомлений в секундах:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Интервал отображения уведомления (в секундах) о новом содержимом буфере обмена или когда элемент скопирован в буфер обмена (только если главное окно закрыто).\n\nУкажите 0, чтобы отключить.\n\nУкажите -1, чтобы отображать до момента нажатия мыши.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>&amp;Число строк в уведомлении буфера обмена:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Число строк для отображения нового содержимого буфера обмена.\n\nУстановите в 0, чтобы отключить.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Использовать системные уведомления</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Размеры окна уведомлений (в пикселях)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Гори&amp;зонтальное смещение:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Расстояние уведомлений от левого или правого края экрана в пикселях</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Вертикальное смещение:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Расстояние уведомлений от верхнего или нижнего края экрана в пикселях</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Максимальная &amp;ширина:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Максимальная ширина для уведомлений в пикселях</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Ма&amp;ксимальная высота:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Максимальная высота уведомлений в пикселях</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Не показывать иконку в трее; уменьшить окно при закрытии</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Отключить тр&amp;ей</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Показать команду для текущего содержимого буфера обмена в меню в трее</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Показ&amp;ать команды для содержимого буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>&amp;Число объектов в меню трея:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Число объектов в меню трея</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Показать объекты из текущей вкладки в меню трея</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Показать &amp;текущую вкладку в меню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>или вы&amp;брать другую вкладку:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Название вкладки для просмотра в меню в трее (пусто для первой вкладки)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Вставить объект в текущее окно после выбора в меню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Вставить активный объект в текущее окно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Предварительный просмотр изображения рядом с пунктами меню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Пока&amp;зать предварительный просмотр изображения в качестве значка пункта меню</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Настройки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Общее</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Оформление</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>История</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Трей</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Уведомления</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Быстрый доступ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Вид</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Неверное значение для параметра «%1»</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Сбросить настройки?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Это действие сбросит все ваши настройки (во всех вкладках) на значений по умолчанию.&lt;br /&gt;&lt;br /&gt;Вы действительно хотите &lt;strong&gt;сбросить все настройки&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Требуется перезапуск</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Язык будет изменён после перезапуска приложения.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Настройки</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Не удалось создать каталог синхронизации «%1»!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Вниз</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Выбрать значок…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Выберите значок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Обзор...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Открыть файл значка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Файлы изображений (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Все</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Вкладки:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Ко&amp;нфигурация</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Ко&amp;манды</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">Код завершения редактора: %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Команда редактора: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Ошибка команды редактора (см. журнал)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Сохранить</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Сохранить элемент (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Отмена</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Отменить правку и вернуть изменения</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Шрифт</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Жирный</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Курсив</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Подчёркивание</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Зачёркнутый</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Передний план</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Фон</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Стиль стирания</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Поиск</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Отменить действие</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Вернуть действие</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Для совместного использования зашифрованных объектов на другом компьютере или сеансе вам понадобятся общедоступные и секретные файлы ключей:&lt;ul&gt;&lt;li&gt; %1&lt;/li&gt;&lt;li&gt; %2&lt;br /&gt; (Сохраните этот секретный ключ в безопасном месте.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG должен быть установлен для просмотра зашифрованных вкладок.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Шифрование (требуется GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Расшифровать</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Расшифровать и скопировать</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Расшифровать и вставить</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Ошибка: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Ошибка генерации ключей.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Чтобы получить доступ к шифрованным объектам на другом компьютере или в ином сеансе, вам понадобятся эти файлы секретных ключей (храните их в надёжном месте):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Готово</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Создаются новые ключи (может занять несколько минут)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Отмена</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Введите новый пароль...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Ключи шифрования &lt;strong&gt;должны быть сгенерированы&lt;/strong&gt; перед использованием шифрования объекта.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Генерировать новые ключи...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Смена пароля...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Шифрование не удалось!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Расшифровка не удалась!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Шифрование</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Шифровать объекты и вкладки.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Чтобы зашифровать и дешифровать объекты, добавьте соответствующие команды на вкладке «Команды».</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Совместное использование зашифрованных объектов и вкладок</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Зашифрованные вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Укажите имена вкладок (по одной в строке), которые будут автоматически зашифрованы и дешифрованы.&lt;/p&gt;\n&lt;p&gt;Установите флажок «Разгружать вкладку» на вкладке «История», чтобы безопасно выгружать дешифрованные объекты из памяти.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Повреждённая вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Не все элементы вкладки &lt;strong&gt;%1&lt;/strong&gt; были успешно загружены. Всё ещё хотите загрузить вкладку и возможно потерять некоторые элементы?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Дополнение FakeVim — это часть Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Эмулировать редактор Vim во время правки объектов.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Включить FakeVim для изменения объектов</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Путь к файлу конфигурации:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Изображения</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Показать изображения.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Максимальная &amp;ширина изображения:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Максимальная ширина изображения, отображаемого в истории (укажите ноль для исходного размера)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Максимальная &amp;высота изображения:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Максимальная высота изображения, отображаемого в истории (устанавливается на ноль для исходного размера)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Команда &amp;редактора изображений:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Команда редактора для поддерживаемых форматов изображений, отличных от SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>К&amp;оманда редактора SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Команда редактора для формата изображений SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Заметки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Отображать заметки для объектов.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Позиция заметок</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>&amp;Над объектом</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>&amp;Под объектом</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>&amp;Возле объекта</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Показать всп&amp;лывающую подсказку</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Добавить</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Удалить</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Переместить вверх</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Переместить вниз</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>В начало</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Переместить в конец</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Вверх</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">Вни&amp;з</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Не удаётся удалить закреплённые объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Открепите объекты перед удалением.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Закрепить</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Открепить</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Закреплённые объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Закрепить объекты, чтобы заблокировать их в текущей строке и избежать удаления (пока они не откреплены).&lt;/p&gt;&lt;p&gt;Обеспечивает функциональность сочетаний клавиш и сценариев.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Обзор...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Открыть каталог для синхронизации</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Не удалось создать каталог синхронизации</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Синхронизация</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Синхронизировать объекты и заметки с каталогом на диске.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Не удалось синхронизировать вкладку «%1» с каталогом «%2»!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Удалить объекты?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Вы действительно хотите &lt;strong&gt;удалить объекты и связанные файлы&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Вкладки синхронизации и каталоги</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Синхронизировать содержимое &lt;strong&gt;вкладки&lt;/strong&gt; с каталогом по указанному &lt;strong&gt;пути&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Если указать &lt;strong&gt;пустой путь&lt;/strong&gt;, то объекты не сохранятся во &lt;strong&gt;вкладке&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Название вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Путь</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Файлы с форматами данных объектов</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Для пропуска файлов укажите тип медиа в &lt;strong&gt;-&lt;/strong&gt; (символ минуса). Любые другие неизвестные или скрытые файлы игнорируются.&lt;/p&gt;\n&lt;p&gt;Пример: загрузка файла с расширением &lt;strong&gt;txt&lt;/strong&gt; в виде типа медиа &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Тип медиа объекта</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Установите тип MIME на &lt;strong&gt;-&lt;/strong&gt; (символ минуса) для пропуска файлов. Любые другие неизвестные или скрытые файлы игнорируются.&lt;/p&gt;\n&lt;p&gt;Пример: Загрузить тип файла &lt;strong&gt;txt&lt;/strong&gt; в виде типа MIME &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Установите MIME тип на&lt;strong&gt;-&lt;/strong&gt; (тире), чтобы игнорировать файлы. Любые другие неизвестные или скрытые файлы игнорируются.&lt;/p&gt;\n&lt;p&gt;Пример. Загрузите расширение файла&lt;strong&gt;txt&lt;/strong&gt; в виде&lt;strong&gt; текстового / простого&lt;/strong&gt; MIME-типа.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Расширения</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">MIME-тип элемента</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Добавить метку</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Удалить метку</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Пометить как %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Удалить метку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Переключить метку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Невозможно удалить объекты с заблокированной меткой</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Снимите метки с объектов перед тем, как удалить их.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Важный</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Очистить все метки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Метки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Отображать метки для объектов.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Элементы меню для добавления и удаления настраиваемых меток можно добавлять и настраивать в диалоге «Команды».</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Подробности доступны на &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;вики-странице&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Имя метки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Совпадение</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Таблица стилей</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Цвет</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Значок</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Блокировка</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Предотвращать удаление объекта</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Текст</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Отображение простого текста и простых объектов HTML.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Сохранение и отображение HTML и расширенного текста</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Максимум отображаемых строк (0 — все):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Максимальная высота в пикселях (0 — неограниченно):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Стандартная таблица стилей:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Сайт</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Отобразить веб-страницы.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Максимальная высота в пикселях (0 без ограничений):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Журнал</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Выйти?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Вы хотите &lt;strong&gt;выйти&lt;/strong&gt; из CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Файл</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Правка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Справка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Параметры импорта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Показать/скрыть</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Параметры экспорта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Ошибка экспорта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Не удалось экспортировать файл %1!</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Включить сохранение буфера обмена</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Отключить сохранение буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Ошибка CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Новая вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Шифрование недоступно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>Шифрование недоступно (подробности см. в журналах).\n\nБудет возможно шифровать и расшифровывать данные вкладок.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Пароль импорта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Введите пароль для импорта:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Пароль экспорта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Введите пароль для экспорта (пусто — без шифрования):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Переименовать &amp;группу %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Переиме&amp;новать вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>У&amp;далить вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Удалить группу %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>С&amp;менить значок вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Буфер обмена: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Объекты CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Ошибка импорта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Не удалось импортировать файл %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Удалить все вкладки в группе?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Вы хотите удалить &lt;strong&gt;все вкладки&lt;/strong&gt; в группе &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Удалить вкладку ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Вы хотите удалить вкладку &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Информация</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;Скрыто&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n строка)</numerusform>\n            <numerusform>%1 (%n строки)</numerusform>\n            <numerusform>%1 (%n строк)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;ИЗОБРАЖЕНИЕ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ОБЪЕКТЫ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;ПУСТО&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;ДАННЫЕ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1 тег&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; не %n строк того &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1 тега&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; не %n строк того &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1 тегов&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; не %n строк того &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Название сеанса должно содержать не более 16 символов,\nкоторые могут быть буквами, цифрами, «-» или «_»!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;буфер обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Новый объект</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Импорт...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Экспорт...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Настройки...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">&amp;Команды/глобальные клавиши...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>К&amp;оманды...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Показать содержимое &amp;буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>П&amp;ереключить хранение буфера обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>Диспетчер п&amp;роцессов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>В&amp;ыход</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Сортировать выбранные объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Перевернуть выбранные объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Вставить объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Копировать выбранные объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Поиск</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Переместить в &amp;буфер обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;Показать содержимое...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Показать предпросмотр</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Переместить в &amp;буфер обмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Удалить</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Правка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Править &amp;заметки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">&amp;Изменить в редакторе</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Действие...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Переместить вверх</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Вверх</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Переместить вниз</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Вниз</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Переместить в начало</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Переместить в конец</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Новая вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>П&amp;ереименовать вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Уд&amp;алить вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>С&amp;менить значок вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Сле&amp;дующая вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Вправо</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Влево</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Открыть контекстное меню объектов</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Предыду&amp;щая вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Сохранить объект</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Отменить правку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Отменить</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Повторить</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Шрифт</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Жирный</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Курсив</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Подчёркнутый</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Зачёркнутый</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Передний план</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Фон</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Стиль стирания</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Поиск</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>&amp;Активировать объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Пра&amp;вить в редакторе</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Показать журнал</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;О программе</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Справка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Вкладка %1 повреждена или отсутствуют некоторые плагины CopyQ!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Текст скопирован (%n линия)</numerusform>\n            <numerusform>Текст скопирован (%n линии)</numerusform>\n            <numerusform>Текст скопирован (%n линий)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Текст скопирован</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Данные скопированы</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Новый пароль шифрования вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Введите новый пароль:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>Пароли не совпадают. Повторите попытку (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Смена пароля</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>Новый пароль не может быть пустым.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Не удалось настроить пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Превышен максимум попыток ввода пароля.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Подтверждение пароля шифрования</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Повторите пароль для подтверждения:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Текущий пароль шифрования вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Введите текущий пароль для шифрования данных вкладки:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Неверный пароль. Повторите попытку (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Не удалось проверить пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Файлы шифрования повреждены</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Файлы шифрования отсутствуют или повреждены. Строгий режим не может автоматически восстановить зашифрованные вкладки.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Не удалось сменить пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Не удалось сменить пароль. Ваш старый пароль всё ещё действует. Подробности см. в журналах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Пароль успешно изменён</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>Пароль был успешно изменён.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Перешифровка вкладок…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Отмена</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Перешифровка вкладки %1 из %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Не удалось зашифровать следующие вкладки:\n\n%1\n\nПодробности см. в журналах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Сбой шифрования</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Скрыть главное окно.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Показать или скрыть главное окно.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Открыть контекстное меню.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Отключиться от сервера.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Отключить или включить хранение содержимого буфера обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Вывести содержимое буфера обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Вывести содержимое выделения X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Вставить содержимое буфера обмена в текущее окно\n(может не работать с некоторыми приложениями).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Задать текст из буфера обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>ТЕКСТ</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nУстановить содержимое буфера обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>ДАННЫЕ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Скопировать объект из строки в буфер обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>СТРОКА</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Копировать следующий объект из текущей вкладки в буфер обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Копировать предыдущий объект из текущей вкладки в буфер обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Добавить текст в буфер обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Вставить текст в данной строке.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Удалить объекты в заданных строках.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>СТРОКИ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Изменить объекты или править новый.\nЗначение -1 для текущего текста в буфер обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Задать разделитель для объектов на выходе.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>РАЗДЕЛИТЕЛЬ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Вывести необработанные данные буфера обмена или объекта в строке.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nЗапись исходных данных в данной строке.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Показать диалог действий.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nЗапустите программу на текст элемента в строках.\nИспользуйте %1 в программе для передачи текста в качестве аргумента.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>ПРОГРАММА</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nПоказать всплывающее сообщение в трее на время миллисекундах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>ЗАГОЛОВОК</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>СООБЩЕНИЕ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>ВРЕМЯ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Список имён доступных вкладок.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Выполните команду на вкладке с заданным именем.\nЕсли она не существует, создаётся вкладка.\nЗначение по умолчанию — первая вкладка.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nОценка программы на ECMAScript.\nАргументы могут быть доступны при использовании с &quot;аргументами[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Выполнения тестов приложение (добавить аргумент --help для получения дополнительной информации).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>ИМЯ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Показать главное окно и при необходимости открыть вкладку с заданным именем.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Копировать буфер обмена из текущего окна\n(может работать не со всеми приложениями).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Установить содержимое буфера обмена.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Вывести число объектов в текущей вкладке.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Записать необработанные данные в эту строку.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Запустить ПРОГРАММУ на объектах текста в строках.\nИспользуйте %1 в ПРОГРАММЕ для обработки текста в виде аргумента.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Показывать всплывающее сообщение трея в течение ВРЕМЕНИ миллисекунд.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>КОМАНДА</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Удалить вкладку.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Переименовать вкладку.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>НОВОЕ_ИМЯ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Экспорт объектов в файл.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>ИМЯ_ФАЙЛА</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Импорт объектов из файла.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Список всех параметров.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Получить значение параметра.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>ПАРАМЕТР</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Задать значение параметра.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>ЗНАЧЕНИЕ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Оценить сценарий.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>Сценарий</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>АРГУМЕНТЫ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Запускает или подключается к экземпляру приложения с указанным именем сеанса.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Вывести справку для КОМАНДЫ или для всех команд.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Вывести версию программы и библиотек.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Запустите сервер в фоне перед тем, как выполнить команду.</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nНачинается или подключается к экземпляру приложения с указанным именем сессии.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>СЕАНС</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nРаспечатать справку для команды или всех команд.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nПечатать версию программы и библиотек.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Использование: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Запускает сервер, если команда не указана.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  КОМАНДЫ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>ЗАМЕТКИ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Используйте аргумент двойного тире (--) для чтения всех следующих аргументов\nбез расширения экранированной последовательности (например, \\n, \\t и другие).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Используйте для MIME символ ? для вывода доступных MIME-типов (по умолчанию — «text/plain»).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Неверное число аргументов!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Не удалось экспортировать файл «%1»</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Не удалось импортировать файл «%1»</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>Диспетчер буфера обмена CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Команда не найдена!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Прекращается работа сервера.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Исключение</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Исключение в %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Не удаётся скопировать в буфер обмена!</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Не удаётся сохранить в файл «%1»!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Используйте аргумент тире (-) для чтения данных из стандартного ввода.</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Не удаётся импортировать файл «%1»!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Недопустимый параметр «%1»!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Вкладки с таким именем не существует!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Имя вкладки не может быть пустым!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Вкладка с таким именем уже существует!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Хранение буфера обмена отключено*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Добавить сочетание клавиш</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Новое сочетание клавиш</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; для отмены.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Щёлкните сюда и нажмите любое сочетание клавиш</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Удалить сочетание клавиш</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Поиск:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;Общие</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Общие комбинации клавиш могут быть активированы из любого приложения.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;Приложение</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Сочетания клавиш приложения работают только в главном окне.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Активировать ярлыки приложений можно только из главного окна.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Сочетание клавиш уже существует!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Имя вкладки должно быть не пустым и уникальным.&lt;br /&gt;\nВкладку &lt;b&gt;Заметки&lt;/b&gt; можно открыть с помощью &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nИспользуйте &lt;b&gt;/&lt;/b&gt; в качестве разделителя пути в оформлении вкладок в виде дерева.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Имя:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Новая вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Переименовать вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Переименовать группу вкладок</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Максимум объектов:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>по умолчанию</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Сохранять объекты</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Запрашивать пароль через:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Тайм-аут для вкладки в секундах для повторного запроса пароля шифрования.\n\nУстановите 0 для использования глобальной настройки.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>глобально</translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;Сохранить элементы</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Нажмите «/» для поиска</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Введите для поиска</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Регулярное выражение</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Без учёта регистра</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_sk.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"sk_SK\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>O programe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Správca schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Autor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Prispejte</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Akcia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>&amp;Príkaz:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Štandardný &amp;vstup:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>&amp;Uložiť štandardný výstup:</translation>\n    </message>\n    <message>\n        <source></source>\n        <translation type=\"vanished\">Poslať dáta daného MIME typu na štandardný vstup príkazu (pre vypnutie ponechať prázdne)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Poslať dáta daného MIME typu na štandardný vstup príkazu (pre vypnutie ponechať prázdne)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Vytvoriť prvky zo štandardného výstupu príkazu (pre vypnutie ponechať prázdne)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Oddeľovač nových prvkov:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Regulárny výraz na rozdelenie výstupu do viacerých prvkov. &lt;/p&gt;\n&lt;p&gt; Na uloženie každého riadku to jedného prvku treba použiť &lt;b&gt;\\n&lt;/b&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp; Výstupná záložka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Uložiť prvky do záložky s daným názvom (do aktuálne otvorenej záložky, ak nie je názov uvedený)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Príkaz bol uložený</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Príkaz bol uložený a je prístupný z menu prvku.\nPríkaz je možné zmeniť v nastaveniach.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Chyba: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Návratový kód: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Príkaz %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Správca procesov</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Ukončiť vybrané</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Pridať príkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Zobraziť / skryť hlavné okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Zobraziť menu lišty</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Zobraziť hlavné okno pod kurzorom myši</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Editovať schránku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Editovať prvý prvok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Skopírovať druhý prvok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Zobraziť dialógové okno Akcie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Vytvoriť nový prvok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Skopírovať ďalší prvok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Skopírovať predchádzajúci prvok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Vložiť schránku ako obyčajný text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Zakázať ukladanie schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Povoliť ukladanie schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Vložiť a skopírovať ďalší</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Vložiť a skopírovať predchádzajúci</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Snímka obrazovky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Vložiť dátum a čas</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nový príkaz</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorovať prvky so žiadnym alebo jedným znakom</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>&amp;Otvoriť v prehliadači</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Vložiť ako obyčajný text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Video prehrať automaticky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Skopírovať URL (webovú adresu) do inej záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Vytvoriť náhľad (vyžaduje ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Vytvoriť QR kód z URL (vyžaduje qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Úlohy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Pridať do záložky %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Presunúť do záložky %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorovať kopírované súbory</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorovať okno *&quot;Heslo&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Presunúť do koša</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(kôš)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Odstrániť všetko z vybranej záložky</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Nemožno sa vytvoriť nový prvok</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Záložka je zaplnená. Nepodarilo sa odstrániť žiadne prvky.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Na kartu %1 nie je možné pridať nové položky. Vyberte miesto ručne, aby ste uvoľnili miesto.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Zahodiť zmeny?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Chcete naozaj &lt;strong&gt;zahodiť zmeny&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Pripojenie stratené!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Nedá sa pripojiť k serveru. Najskôr je nutné spustiť CopyQ server.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Obsah schránky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Formáty:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Obsah:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Odstrániť formátovanie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Obsah položky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Veľkosť:&lt;/strong&gt; %1 bajtov</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Veľkosť: &lt;/strong&gt; %1 bajtov</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Server CopyQ je už spustený.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Zrušiť aktívne príkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Zrušiť aktívne príkazy a ukončiť?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Zrušiť ukončenie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Ukončiť napriek tomu</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Medzerník</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Príkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definovať nové príkazy, ktoré možno použiť automaticky na nový obsah schránky, alebo používateľom z menu alebo pomocou skratky v systéme.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Hľadať:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Načítať príkazy…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>&amp;Uložiť vybrané…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopírovať vybraté</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Vložiť príkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Neuložené zmeny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>V dialógovom okne príkazu sú neuložené zmeny.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Otvoriť súbory s príkazmi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Príkazy (*.ini);; CopyQ nastavenia (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Uložiť vybraté príkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Príkazy (*. ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Príkaz obsahuje zoznam programov s argumentmi, ktoré sa vykonajú. Napríklad:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Argument programu %1 bude nahradený za text prvku, %2 až %9 za texty zachytené regulárnym výrazom.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Argument %1 bude nahradený textom prvku.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Znak %1 môže byť použitý na odoslanie štandardného výstupu do ďalšieho programu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Nasledujúcu syntax možno použiť na odovzdanie zvyšku príkazu ako jedného parametra.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Výsledok je rovnaký ako u %1, ale je užitočnejší pre dlhšie príkazy.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Funkcie uvedené nižšie sa dajú použiť ako v nasledujúcich príkazoch.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;schránka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Zobraziť Pomocníka príkazu (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Názov:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Názov príkazu zobrazený v menu</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Druh akcie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Spustiť príkaz automaticky, ak schránka má nový obsah</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>&amp;Automaticky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Zobraziť príkaz v kontextovom menu zodpovedajúcich položiek</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>V &amp;menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Klávesová skratka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Globálna klávesová skratka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Globálna klávesová skratka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Porovnať položky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Dáta tohoto MIME typu budú poslané na štandardný vstup príkazu.\nPre vypnutie ponechať prázdne.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Okno:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Pokiaľ nie je políčko prázdne, použi príkaz iba na prvky, pri ktorých sa text zhoduje s týmto regulárnym výrazom&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Príklady:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  URL  &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Názov PDF   súboru&lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Jediný znak &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Vzdialené multimediálne súbory   &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skript</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Zobrazenie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Obsah:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filter:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Použi príkaz len ak filter uspeje.&lt;/p&gt;\n\n&lt;p&gt;Text prvku je odoslaný na &lt;b&gt;štandardný vstup&lt;/b&gt; filtra. Príkaz sa &lt;b&gt;vykoná iba ak filter skončí z nulovým kódom&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Výraz &lt;b&gt;%1&lt;/b&gt; bude nahradený za text prvku a &lt;b&gt;%2&lt;/b&gt; až &lt;b&gt;%9&lt;/b&gt; za texty zachytené pomocou regulárneho výrazu (časti uzatvorené v zátvorkách).&lt;/p&gt;\n\n&lt;p&gt;Použite &lt;b&gt;|&lt;/b&gt; na zreťazenie viacerých príkazov (odovzdanie štandardného výstupu do ďalšieho príkazu).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Príka&amp;z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Typ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Pokročilé</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Preskočí príkaz, ak vstupný text nezodpovedá tomuto regulárnemu výrazu (ponechajte prázdne, aby vyhovovalo všetko).\n\n%2 až %9 (alebo argument[1] a viac v skripte) v príkaze a filtri budú nahradené zachytenými textami.\n\nPríklady:\n\n- Zhoda URL: ^(https?|ftp)://\n- Zhoda s názvami súborov PDF: \\.pdf$\n- Zhoda s jedným znakom: ^.$\n- Zhoda so vzdialenými multimédiami: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Preskočí príkaz, ak filter skončí s nenulovým kódom.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Akcia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Názov záložky, do ktorej sa majú skopírovať nové položky (ak ponecháte prázdne, nebude sa kopírovať)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Odstrániť položku vyhovujúcu filtru\n\nPoznámka: Ak sa aplikuje automaticky, nie sú vykonané žiadne ďalšie automatické príkazy.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Odstrániť prvok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menu Akcia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Skryť okno po aktivácii príkazu z kontextového menu položky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Po aktivácii skryť hlavné okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Možnosti príkazu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Zobraziť dialógové okno akcie pred vykonaním príkazu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>Č&amp;akať</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Zmeniť položku, nevytvárať žiadne nové položky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>&amp;Transformovať</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Vý&amp;stup:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt; Príkaz používajte iba pre položky skopírované do schránky z okna s názvom, ktorý sa zhoduje s týmto regulárnym výrazom (nechajte prázdne, aby zodpovedalo každému oknu). V systéme MacOS obsahuje názov aplikácie, za ktorým nasleduje pomlčka (&amp;quot;-&amp;quot;) a potom názov okna. Napr. &amp;quot;Safari - GitHub&amp;quot;. &lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>&amp;Formát:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Kopírovať do &amp;záložky:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Vytvoriť prvky zo štandardného výstupu príkazu (pre vypnutie ponechať prázdne)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Oddeľovač:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Oddeľovač prvkov na výstupe</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Výstupná záložka:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Uložiť prvky do záložky s daným názvom (do prvej záložky, ak nie je názov uvedený)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Zobraziť rozšírené</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Pozadie</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Tooltip</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Nájdené</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Vybrané</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normálne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Písmo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternatívne</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Popredí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Upozornenie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Zobra&amp;ziť číslo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Zobraziť posuvníky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Posuvníky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Použiť ikony z desktopového prostredie, kedykoľvek je to možné</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>&amp;Systémové ikony</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>V&amp;yhladzovanie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Nastaviť &amp;farby pre karty, panely nástrojov a ponuky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>O&amp;bnoviť tému</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Téma:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Načítať tému</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Uložiť tému</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Upraviť aktuálnu tému v externom editore</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Up&amp;raviť tému</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Náhľad:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>položka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Vyhľadávací reťazec je %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Vyberte položku a\nstlačte F2 pre editáciu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Príklad položky %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Náhodné poznámky (Shift+F2 pro úpravu)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Otvorte súbor tém</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Uložiť súbor s témou ako</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Žiadny externý editor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Najskôr nastavte príkaz externého editora!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Jazyk:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Zalomiť text, ak je príliš dlhý na to, aby sa zmestil na riadok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Zalomiť &amp;dlhý text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Ponechať hlavné okno nad ostatnými oknami</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>&amp;Ponechať nad ostatnými oknami</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Po aktivácii inej aplikácie zavrieť hlavné okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Zatvoriť pri deaktivácii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Povoliť otváranie okien na aktuálnej obrazovke. Zakázaným otvoríte okná tam, kde boli naposledy zatvorené</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>O&amp;tvárať okná na aktuálnej obrazovke</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Potvrdzovať ukončenie aplikácie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Potvrdzovať &amp;ukončenie aplikácie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Spustiť aplikáciu po prihlasení do systému</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Automaticky spustiť</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Podpora pre Vi navigáciu (klávesy H, J, K, L atď.), lomítko (/) pre vyhľadávanie</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Vi navigácia</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Štýl navigácie:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Podpora pre Vi navigáciu (klávesy H, J, K, L a viac) a Emacs navigáciu (Ctrl+N, P, V a viac)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Východzí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Ukladať a načítať históriu filtrov pre prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Ukladať históriu filtrovania prvkov</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Automaticky zobrazí menu pre dokončenie názvu funkcií, typov a premenných v príkazoch</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Automaticky dokončovať príkazy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Manipulácia so schránkou</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Povoliť vkladanie skopírovaného textu pomocou myši (obvykle stredné tlačidlo myši)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Vkladať schránku pomocou myši</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Povoliť vkladanie textu vybraného pomocou myši (zvyčajne Ctrl+V alebo Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Vkladať text vybraný myší pomocou klaves</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Uložiť schránku v histórii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Ukladať schránku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Ukladať text vybraný myšou do histórie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Ukladať text vybraný myšou</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Spúšťať automatické príkazy pre výber myši</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Maximálny počet prvkov v histórii:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Maximálny počet prvkov v každej záložke</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Interval v minútach pre odstránenie prvkov z pamäte:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Odstráň načítané záložky z pamäti po ubehnutí daného intervalu v minútach.\n\nNastav na 0 pre zachovanie záložiek v pamäti.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Príkaz pre editor (%&amp;1 je názov súboru):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Príkaz pre externý editor (%1 je názov súboru).\n   Príklady:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Záložk&amp;a pre ukladanie schránky:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Názov karty, ktorá bude automaticky ukladať nový obsah schránky.\n\nNechajte prázdne, ak chcete vypnúť automatické ukladanie.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Nezaškrtnuté pre klávesu Enter na uloženie editovaného prvku a Ctrl+Enter na vytvorenie nového riadku.\n\nPozn.: Editované prvky môžu byť uložené pomocou F2 bez ohľadu na túto voľbu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>&amp;Ulož prvok pomocou Ctrl + Enter a vytvor nový riadok pomocou klávesy Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Zobrazí jednoriadkový popis pre každý prvok.\n\nPouži Náhľad prvku pre zobrazenie celého obsahu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Zo&amp;braz jednoduché prvky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Povolí hľadanie čísel; inak stlačenie klávesy aktivuje prvok na danej pozícii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Hľadanie čísel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Aktivovať prvky jedným kliknutím</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Po aktivácii prvku (dvojklik alebo klávesa Enter), skopíruj schránky a ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Presunúť prvok na začiatok zoznamu po jeho aktivácii</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>&amp;Presunúť prvok na začiatok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Zavri hlavné okno po aktivácii prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Zavrieť hlavné okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Vyber posledné aktívne okno po aktivácii prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Vyber posledné aktívne okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Vlož do vybraného okna po aktivácii prvku</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>V&amp;lož do vybraného okna</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Zobraziť/Skryť</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Skryť záložky (stlačením klávesy Alt sa zobrazia)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Skrývať &amp;záložky</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Skry nástrojový panel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Skry ná&amp;strojový panel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Skr&amp;y popisy v paneli</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Skrývať hlavné okno po zatvorení</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Skryť &amp;hlavné okno</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Rozloženie a priehľadnosť</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Zobraz strom so záložkami namiesto panela</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Stro&amp;m so záložkami</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Aktívna priehľadnosť:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Priehľadnosť aktívneho hlavného okna.\n\nPoznámka: Táto funkcia nie je podporovaná na niektorých systémoch.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>&amp;Neaktívna priehľadnosť:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Priehľadnosť neaktívneho hlavného okna.\n\nPoznámka: Táto funkcia nie je podporovaná na niektorých systémoch.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Zobrazovať počet prvkov pri záložkách</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Zo&amp;brazovať počet prvkov</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Pozíc&amp;ia upozornenia:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Pozícia na obrazovke pre zobrazenie upozornení</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Font</source>\n        <translation type=\"obsolete\">Písmo</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"obsolete\">Popredí</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"obsolete\">Pozadie</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Chyba: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation type=\"unfinished\">Poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;schránka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation type=\"unfinished\">Písmo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation type=\"unfinished\">Popredí</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation type=\"unfinished\">Pozadie</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Hľadať:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Názov:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_sv.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"sv_SE\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Urklippshanterare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Utvecklare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-post</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Webb</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Donera</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Åtgärdsdialog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Ko&amp;mmando:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standard &amp;indata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Lagra standard &amp;utdata:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Skicka data av given mediatyp till standardinmatning av kommandot (lämna tomt för att stänga av)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Skapa objekt från programmets standardutgång (lämna tomt för att stänga av)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>Av&amp;skiljare för nya objekt:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Reguljärt uttryck för att dela upp utdata i flera objekt.&lt;\\p&gt;\n&lt;p&gt;Använd &lt;b&gt;\\n&lt;/b&gt; för att lagra varje rad till ett separat objekt.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>U&amp;tdataflik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Spara objekt i flik med angivet namn (lämna tomt för att spara i aktuell flik)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Kommandot sparat</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Kommandot sparades och kan kommas åt från objektmenyn.\nDu kan konfigurera kommandot i inställningar.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Fel: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Slutstatus: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Kommando %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Processhanterare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Avsluta valda</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Lägg till kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Visa/dölj huvudfönster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Visa aktivitetsfältsmenyn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Visa huvudfönster under muspekare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Redigera urklipp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Redigera första objektet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Kopiera andra objektet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Visa åtgärdsdialog</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Skapa nytt objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Kopiera nästa objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Kopiera föregående objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Klistra in urklipp som vanlig text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Inaktivera urklippslagring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Aktivera urklippslagring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Klistra in och kopiera nästa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Klistra in och kopiera föregående</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Ta skärmbild</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Klistra in aktuellt datum och tid</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Nytt kommando</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ignorera objekt med inget eller ett tecken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Öppna i we&amp;bbläsare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Klistra in som vanlig text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Spela upp videoklipp automatiskt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Kopiera URL (webbadress) till annan flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Skapa miniatyrbild (kräver ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Skapa QR-kod från URL (kräver qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Uppgifter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Lägg till i fliken %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Flytta till fliken %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ignorera kopierade filer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ignorera fönster för *&quot;Lösenord&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Lösenord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Flytta till papperskorgen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(papperskorg)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Rensa aktuell flik</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Det går inte att lägga till nya objekt</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Fliken är full. Kunde inte ta bort några objekt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Det går inte att lägga till nya objekt på fliken %1. Ta bort objekt manuellt för att skapa utrymme.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Förkasta ändringar?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Vill du verkligen &lt;strong&gt;förkasta ändringar&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Det går inte att ansluta till servern! Starta CopyQ-servern först.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Anslutningen förlorades!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Urklippsinnehåll</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Format:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>I&amp;nnehåll:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Ta bort format</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Objektinnehåll</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Storlek:&lt;/strong&gt; %1 byte</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Storlek:&lt;/strong&gt; %1 byte</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ-servern körs redan.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Avbryt aktiva kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Avbryt aktiva kommandon och avsluta?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Avbryt avslutande</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Avsluta i alla fall</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Blanksteg</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Definiera nya kommandon som antingen kan anropas automatiskt vid nytt urklippsinnehåll eller av användaren från meny eller med systemgenväg.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Sök:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Ladda kommandon…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Spara markerade…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Kopiera valda</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Klistra in kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Osparade ändringar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Kommandodialogen har osparade ändringar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Öppna filer med kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Kommandon (*.ini);; CopyQ-konfiguration (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Spara valda kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Kommandon (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Kommandon innehåller listor över program med argument som kommer att köras. Till exempel:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Programargument %1 kommer ersättas för objekttext, och %2 till %9 för texter fångade av reguljärt uttryck.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Programargument %1 kommer ersättas med objekttext.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Tecknet %1 kan användas för att skicka standard ut till nästa program.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Följande syntax kan användas för att skicka resten av kommandot som en enda parameter.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Detta ger samma utdata som %1 men är mer användbart för längre kommandon.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Funktioner som listas nedan kan användas som i följande kommandon.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;urklipp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Visa kommandohjälp (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Namn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Kommandonamn visat i meny</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Åtgärdstyp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Kör kommandot automatiskt om urklipp har nytt innehåll</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Auto&amp;matiskt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Visa kommando i snabbvalsmeny för matchande objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>I m&amp;eny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Genväg:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>G&amp;lobal genväg:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Global genväg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Matcha objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Data av denna MIME-typ kommer sändas till standard in för kommando.\nLämna tomt för att inaktivera detta.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>Fö&amp;nster:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Använd kommando endast för objekt vars text matchar detta reguljära uttryck (lämna tomt för att matcha vad som helst).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Exempel:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Matcha URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Matcha PDF-filnamn    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Matcha enstaka tecken    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Matcha fjärrmultimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Skript</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Visa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Innehåll:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filter:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Använd kommandon endast om filterkommando lyckas.&lt;/p&gt;\n\n&lt;p&gt;Objekttext skickas till &lt;b&gt;standard in&lt;/b&gt; för filterkommandot. Objektet &lt;b&gt;matchas endast om slutstatus för filterkommandot är 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Använd &lt;b&gt;%1&lt;/b&gt; för objekttext som skickas som argument och &lt;b&gt;%2&lt;/b&gt; till &lt;b&gt;%9&lt;/b&gt; för argument som fångas av reguljärt uttryck (delar innefattade i parenteser).&lt;/p&gt;\n\n&lt;p&gt;Använd &lt;b&gt;|&lt;/b&gt; för att kedja ihop kommandon (skicka standard ut till nästa kommando).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Komman&amp;do</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Typ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Avancerad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Hoppar över kommandot om filterkommandot misslyckas med nollskild avslutningskod.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Åtgärd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Namn på flik att kopiera nya objekt till (lämna tomt för att inte kopiera)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Ta bort matchande objekt\n\nObservera: Om detta verkställs automatiskt körs inga andra automatiska kommandon.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Ta bort objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menyåtgärd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Dölj fönster efter att kommando aktiveras från ett objekts snabbvalsmeny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Dölj huvudfönster efter aktivering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Kommandoalternativ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Visa åtgärdsdialog innan kommandot körs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Vänta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Ändra objekt, skapa inte några nya objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Tr&amp;ansformera</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>&amp;Utdata:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Hoppa över kommandot om inmatningstexten inte matchar detta reguljära uttryck (lämna tomt för att matcha allt).\n\n%2 till %9 i kommando och filter kommer att ersättas med de infångade texterna.\n\nExempel:\n\nMatcha webbadress: ^(https?|ftp):\nMatcha PDF-filnamn: \\.pdf$\nMatcha ett tecken: ^.$\nMatcha fjärrmultimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Använd kommando endast för objekt som kopieras till urklipp från fönster med titeltext som matchar detta vanliga uttryck (lämna tomt för att matcha vilket fönster som helst). På macOS innehåller detta applikationsnamnet följt av ett bindestreck (&amp;quot; -&amp;quot;) sedan fönstertiteln. T.ex. &amp;quot;Safari - GitHub &amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>For&amp;mat:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Kop&amp;iera till flik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Skapa objekt från standard ut för programmet (lämna tomt för att inaktivera)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>Av&amp;skiljare:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Avskiljare att använda för att dela utdata till flera objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>U&amp;tdataflik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Spara objekt i flik med angivet namn (lämna tomt för att spara i första fliken)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Visa avancerat</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Bakgrund</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Anteckningar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Inforutor</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Hittad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Vald</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Redigerare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Typsnitt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternera</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Förgrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Avisering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Visa &amp;nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Visa rullningslister</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>R&amp;ullningslister</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Använd ikoner från skrivbordsmiljön närhelst möjligt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>S&amp;ystemikoner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Kantutjämning</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Stä&amp;ll in färger för flikar, verktygsfält och menyer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>Åt&amp;erställ tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Läs in tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Spara tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Redigera aktuellt tema i extern redigerare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Re&amp;digera tema</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Förhandsvisning:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Söksträngen är %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Välj ett objekt och tryck\nF2 för att redigera.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Exempelobjekt %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Några slumpmässiga anteckningar (Skift+F2 för att redigera)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Öppna temafil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Spara temafil som</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Ingen extern redigerare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Ställ in kommando för extern redigerare först!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Språk:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Radbryt text om den är för lång för att rymmas på raden</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Radbr&amp;yt lång text</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Behåll huvudfönstret ovanför andra fönster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Allt&amp;id överst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Stäng huvudfönstret när andra program har fokus</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Stäng när ofokuserad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Aktivera för att öppna fönster på aktuell skärm. Inaktivera för att öppna fönster där de senast stängdes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>Ö&amp;ppna fönster på aktuell skärm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Bekräfta programavslutning</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Bekräfta programa&amp;vslutning</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Kör programmet vid systemstart</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Autostart</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Stöd för Vi-navigeringstangenter (H, J, K, L med mera), snedstreck (/) för att söka</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Navigering som i &amp;Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Spara och återställ historik för objektfilter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Spara filterhistorik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Visa automatiskt en ruta för att komplettera funktions-, typ- och variabelnamn i kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Autokomplettera kommandon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Urklippsmanipulering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Tillåt inklistring av kopierat innehåll på samma sätt som för musmarkeringar (vanligen genom nedtryckning av musens mittknapp)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Klistra in urklipp med musen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Tillåt inklistring av musmarkering med genväg (vanligen Ctrl+V eller Skift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Klistra in musmarkering med tangentbord</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Spara urklipp i historik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Lagra urklipp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Spara text markerad med musen (primär markering) i historik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Lagra text markerad med musen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Kör automatiska kommandon vid val</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Maximalt a&amp;ntal objekt i historik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Maximalt antal objekt i varje flik</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Glöm flik efter ett visst antal minuter:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Glöm varje flik i minnet efter ett angivet antal minuter av inaktivitet.\n\nStäll in till 0 för att inte glömma flikar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Externt redigerarkommando (%&amp;1 är fil att redigera):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Kommando för extern redigerare (%1 är filen som ska redigeras).\n  Exempel:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Fli&amp;k för att lagra urklipp:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Namn på flik som automatiskt kommer att lagra nytt urklippsinnehåll.\n\nLämna tomt för att inaktivera automatisk lagring.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Lämna okryssad för att Retur ska spara redigerat objekt och Ctrl+Retur skapa en ny rad.\n\nObservera: Redigerade objekt kan sparas med F2 oavsett detta alternativ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Spa&amp;ra redigerat objekt med Ctrl+Retur och skapa ny rad med Retur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Visa enradsbeskrivning för varje objekt.\n\nAnvänd objektförhandsvisning för att visa hela objekt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Vis&amp;a enkla objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Aktivera sökning efter nummer, annars trycker du på en sifferknapp för att aktivera objektet på den positionen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>S&amp;ök efter nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Aktivera objekt med enkelklick</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Efter att ett objekt har aktiverats (dubbelklick eller Retur), kopiera det till urklipp och…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Flytta objekt överst i listan efter att det har aktiverats</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Flytta objekt ö&amp;verst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Stäng huvudfönster efter objekt aktiverats</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>S&amp;täng huvudfönster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Fokusera senaste fönster efter objekt har aktiverats</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Fokusera senaste fönster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Klistra in till aktuellt fönster efter objekt har aktiverats</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Klistra in till aktuellt fönster</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Visa/dölj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Dölj flikar (tryck Alt för att visa)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>&amp;Dölj flikar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Dölj verktygsfält</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Dö&amp;lj verktygsfält</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Dölj verk&amp;tygsfältsetiketter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Dölj huvudfönster då det stängs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Döl&amp;j huvudfönster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Layout och transparens</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Visa träd med flikar istället för flikrad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Flikt&amp;räd</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Fokuserad transparens:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparens i huvudfönstret om det är fokuserat.\n\nObs: detta stöds inte på alla system.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Ofok&amp;userad transparens:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Transparens i huvudfönstret om ofokuserad.\n\nObs: detta stöds inte på alla system.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Visa antal objekt i flikar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>&amp;Visa objektantal</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Aviseringsposition:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Aviseringars position på skärmen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Överst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Nederst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Överst till höger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Nederst till höger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Nederst till vänster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Överst till vänster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Int&amp;ervall i sekunder som aviseringar ska visas:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Intervall i sekunder att visa avisering för nytt urklippsinnehåll eller om objekt kopieras till urklipp (endast om huvudfönstret är stängt).\n\nStäll in till 0 för att inaktivera detta.\n\nStäll in till -1 för att hålla synlig tills klickad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>An&amp;tal rader för urklippsavisering:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Antal rader att visa för nytt urklippsinnehåll.\n\nStäll in till 0 för att inaktivera.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Använd inhemska aviseringar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Aviseringsgeometri (i skärmpunkter)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Hori&amp;sontell offset:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Aviseringsavstånd från vänster eller höger skärmkant i skärmpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Vertikal position:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Aviseringsavstånd från övre eller nedre skärmkant i skärmpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Maximal &amp;bredd:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Maximal bredd för avisering i skärmpunkter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Ma&amp;ximal höjd:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Maximal höjd för avisering i skärmpunkter</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Visa inte aktivitetsfältsikon, minimera fönster då det stängs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Inaktiv&amp;era aktivitetsfält</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Visa kommando för aktuellt urklippsinnehåll i aktivitetsfältsmeny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Vis&amp;a kommandon för urklippsinnehåll</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>An&amp;tal objekt i aktivitetsfältsmeny:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Antal objekt i aktivitetsfältsmeny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Visa objekt från aktuell flik i aktivitetsfältsmeny</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Visa ak&amp;tuell flik i meny,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>eller &amp;välj en annan flik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Namn på flik att visa i aktivitetsfältsmeny (tomt för den första fliken)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Klistra in objekt i aktuellt fönster efter att ha valt det i menyn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Klistra in aktiverat objekt till aktuellt fönster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Visa bildförhandsvisning intill menyobjekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Vi&amp;sa bildförhandsvisning som menyobjektsikon</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Konfiguration</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Allmänt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Layout</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Historik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Aktivitetsfält</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Aviseringar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Flikar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Genvägar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Utseende</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Ogiltigt värde för alternativet ”%1”</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Återställ inställningar?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Denna åtgärd kommer återställa alla dina inställningar (i alla flikar) till standardvärdena.&lt;br /&gt;&lt;br /&gt;Vill du verkligen &lt;strong&gt;återställa alla inställningar&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Omstart krävs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Språk kommer att ändras efter att programmet har startats om.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Inställningar</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Misslyckades med att skapa synkroniseringskatalogen ”%1”!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Ned</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Välj ikon…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>…</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Välj ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Bläddra…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Öppna ikonfil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Bildfiler (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Alla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Flikar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Ko&amp;nfiguration</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Ko&amp;mmandon</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">slutstatus för redigerare är %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Redigerarkommando: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Editor-kommandot misslyckades (se loggar)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Spara</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Spara objekt (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Avbryt</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Avbryt redigering och återställ ändringar</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Typsnitt</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Fet</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Kursiv</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Understruken</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Genomstruken</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Förgrund</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Bakgrund</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Radera stil</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Sök</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Ångra</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Gör om</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">För att dela krypterade objekt på andra datorer eller sessioner behöver du öppna och hemliga nyckelfiler:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Förvara denna hemliga nyckel på ett säkert ställe.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>GnuPG måste vara installerat för att visa krypterade flikar.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Kryptera (kräver GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Dekryptera</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Dekryptera och kopiera</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Skift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Avkryptera och klistra in</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Fel: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Misslyckades med att generera nycklar.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>För att dela krypterade objekt på annan dator eller session behöver du dessa hemliga nyckelfiler (förvara dem på ett säkert ställe):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Klar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Skapar nya nycklar (detta kan ta några minuter)…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Avbryt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Ställer in nytt lösenord…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Krypteringsnycklar &lt;strong&gt;måste genereras&lt;/strong&gt; innan objektkryptering kan användas.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Generera nya nycklar…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Ändra lösenord…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Kryptering misslyckades!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Dekryptering misslyckades!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Kryptering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Kryptera objekt och flikar.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>För att kryptera och dekryptera objekt, lägg till lämpliga kommandon under kommandofliken.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Delning av krypterade objekt och flikar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Krypterade flikar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Ange namn på flikar (en per rad) som automatiskt ska krypteras och dekrypteras.&lt;/p&gt;\n&lt;p&gt;Ställ in intervall för att glömma flikar i fliken Historik för att på ett säkert sätt få bort dekrypterade objekt från minnet.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Skadad flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Inte alla objekt i fliken &lt;strong&gt;%1 &lt;/strong&gt; laddades korrekt. Vill du fortfarande ladda fliken och eventuellt förlora några objekt?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim-insticksmodulen är en del av Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Emulera redigeraren Vim under redigering av objekt.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Aktivera FakeVim för redigering av objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Sökväg till konfigurationsfil:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Bilder</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Visa bilder.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Maximal bild&amp;bredd:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Maximal bredd på bild som visas i historik (ställ in till noll för ursprunglig storlek)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Maximal bild&amp;höjd:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Maximal höjd på bild som visas i historik (ställ in till noll för ursprunglig storlek)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>B&amp;ildredigerarkommando:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Redigerarkommando för bildformat som stöds, förutom SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG-redigerarkommando:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Redigerarkommando för SVG-bildformatet.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Anteckningar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Visa anteckningar för objekt.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Anteckningsposition</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>O&amp;vanför objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Und&amp;er objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Bredvid ob&amp;jekt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Visa inf&amp;oruta</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Lägg till</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>Ta bo&amp;rt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Flytta upp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Flytta ned</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Flytta överst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Flytta nederst</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Uppåt</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Nedåt</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Det går inte att ta bort nålade objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Avnåla objekt först för att ta bort dem.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Nåla</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Avnåla</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Nålade objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Fäst objekt för att låsa dem i den aktuella raden och undvika borttagning (såvida det inte är ofäst).&lt;/p&gt;&lt;p&gt;Ger genvägar och skriptfunktioner.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Bläddra…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Öppna katalog för synkronisering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Misslyckades med att skapa synkroniseringskatalog</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Synkronisera</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Synkronisera objekt och anteckningar med en katalog på disk.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Misslyckades med att synkronisera fliken ”%1” med katalogen ”%2”!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Ta bort objekt?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Vill du verkligen &lt;strong&gt;ta bort objekt och associerade filer&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Flikar och kataloger för synkronisering</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Synkronisera innehåll i &lt;strong&gt;flik&lt;/strong&gt; med katalog med angiven &lt;strong&gt;sökväg&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Ställ in &lt;strong&gt;tom sökväg&lt;/strong&gt; för att inte spara objekt i &lt;strong&gt;flik&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Fliknamn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Sökväg</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Filer till objektdataformat</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Ställ in medietyp till &lt;strong&gt;-&lt;/strong&gt; (minus tecken) för att ignorera filer. Alla andra okända eller dolda filer ignoreras.&lt;/p&gt;\n&lt;p&gt;Exempel: Ladda &lt;strong&gt;txt&lt;/strong&gt; filtillägg som &lt;strong&gt;text/vanlig&lt;/strong&gt; mediatyp.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Mediatyp för objekt</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Ställ in MIME-typ till &lt;strong&gt;-&lt;/strong&gt; (bindestreck) för att ignorera filer. Alla andra okända eller dolda filer ignoreras.&lt;/p&gt;\n&lt;p&gt;Exempel: Läs in filändelsen &lt;strong&gt;txt&lt;/strong&gt; som MIME-typen &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Filändelser</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">MIME-typ för objekt</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Lägg till en tagg</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Ta bort en tagg</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Tagga som %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Ta bort taggen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Växla flik %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Kan inte ta bort objekt med en låst tagg</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Avtagga objekt först, för att ta bort dem.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Viktigt</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Rensa alla taggar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Taggar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Visa taggar för objekt.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Menyposter för att lägga till och ta bort anpassade taggar kan läggas till och anpassas i kommandodialogen.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Mer information finns tillgänglig på &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wikisidan&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Taggnamn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Matchning</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Stilmall</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Färg</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Ikon</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Lås</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Undvik att ta bort objekt</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Text</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Visa vanlig text och enkla HTML-objekt.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Spara och visa HTML och formaterad text</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Maximalt antal rader att visa (0 för att visa alla):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Maximal höjd i bildpunkter (0 för ingen gräns):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Standard stilmall:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Webb</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Visa webbsidor.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Maximal höjd i bildpunkter (0 för ingen gräns):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Logg</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Avsluta?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Vill du &lt;strong&gt;avsluta&lt;/strong&gt; CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Arkiv</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>R&amp;edigera</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Flikar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hjälp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Ny flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Byt namn på &amp;gruppen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>B&amp;yt namn på flik %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>Ta &amp;bort fliken %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Ta bort gruppen %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Än&amp;dra flikikon</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Aktivera urklippslagring</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Inaktivera urklippslagring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Alternativ för import</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ-fel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Visa/dölj</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Alternativ för Export</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Exportfel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Misslyckades med att exportera filen %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Urklipp: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ-objekt (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Importfel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Misslyckades med att importera filen %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Ta bort alla flikar i grupp?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vill du ta bort &lt;strong&gt;alla flikar&lt;/strong&gt; i gruppen &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Ta bort flik?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Vill du ta bort fliken &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Information</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;urklipp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;DOLD&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n rad)</numerusform>\n            <numerusform>%1 (%n rader)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;BILD&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;OBJEKT&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;TOM&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DATA&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backsteg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Nytt objekt</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Importera…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Exportera…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Inställningar…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">K&amp;ommandon/globala genvägar…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>K&amp;ommandon…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Visa &amp;urklippsinnehåll</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Skift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Växla urklippslagring</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Skift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>P&amp;rocesshanterare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Skift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>A&amp;vsluta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Sortera valda objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Skift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Vänd valda objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Skift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Klistra in objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Kopiera valda objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Sök</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">Flytta till &amp;urklipp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>Vi&amp;sa innehåll…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>Vi&amp;sa förhandsvisning</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Flytta till &amp;urklipp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>Ta bo&amp;rt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>R&amp;edigera</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Redigera a&amp;nteckningar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Skift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Re&amp;digera med redigerare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>Å&amp;tgärd…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Flytta upp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Upp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Flytta ned</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Ner</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Flytta överst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Flytta nederst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Ny flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>B&amp;yt namn på flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Ta &amp;bort flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>Ä&amp;ndra flikikon</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Skift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Nä&amp;sta flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Höger</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Vänster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Öppna menyn för kontext</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Skift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>&amp;Föregående flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Spara objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Avbryt redigering</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Ångra</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Göra om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Typsnitt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Fetstil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Kursiv</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Understruken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Genomstruken</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Förgrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Bakgrund</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Radera stil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Sök</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>A&amp;ktivera objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Re&amp;digera med redigerare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Vi&amp;sa logg</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Om</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hjälp</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n rad &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n rader &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Sessionsnamn får innehålla högst 16 tecken\nvilket kan vara bokstäver, siffror, ”-” eller ”_”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Fliken %1 är skadad eller några CopyQ-plugins saknas!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Text kopierad (%n rad)</numerusform>\n            <numerusform>Text kopierad (%n rader)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Text kopierad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Data kopierad</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Avbryt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Visa huvudfönster och öppna valfritt fliken med angivet namn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAMN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Dölj huvudfönster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Visa eller dölj huvudfönster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Öppna snabbvalsmeny.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Lämna server.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Inaktivera eller aktivera lagring av urklippsinnehåll.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Skriv ut urklippsinnehåll.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Skriv ut X11-markeringsinnehåll.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Kopiera urklipp till aktuellt fönster\n(fungerar kanske inte med vissa program).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Kopiera urklipp från nuvarande fönster\n(fungerar kanske inte med vissa program).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Ställ in urklippstext.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXT</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nStäll in urklippsinnehåll.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Skriv ut antal objekt i aktuell flik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Kopiera objekt i raden till urklipp.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>RAD</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Kopiera nästa objekt från aktuell flik till urklipp.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Kopiera föregående objekt från aktuell flik till urklipp.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Lägg till text till urklipp.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Infoga text i angiven rad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Ta bort objekt i angivna rader.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>RADER</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Redigera objekt eller redigera ett nytt.\nVärdet -1 är för aktuell text i urklipp.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Ställ in avskiljare för objekt vid utmatning.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>AVSKILJARE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Skriv ut rådata för urklipp eller objekt i rad.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nSkriv rådata till angiven rad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Visa åtgärdsdialog.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nKör PROGRAM på objekttext i raderna.\nAnvänd %1 i PROGRAM för att skicka text som argument.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nVisa aktivitetsfältsmeddelande under TID millisekunder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Ställ in urklippsinnehåll.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Skriv rådata till angiven rad.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Kör PROGRAM på objekttext i raderna.\nAnvänd %1 i PROGRAM för att skicka text som argument.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Visa popupmeddelande för TID i millisekunder.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITEL</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MEDDELANDE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TID</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Lista tillgängliga fliknamn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Kör kommando på fliken med angivet namn.\nFliken skapas om den inte finns.\nStandard är den första fliken.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>KOMMANDO</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Ta bort flik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Byt namn på flik.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NYTT_NAMN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Exportera objekt till fil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILNAMN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Importera objekt från fil.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Lista alla flaggor.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Erhåll värde på flagga.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>FLAGGA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Ställ in värde på flagga.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VÄRDE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Utvärdera skript.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Startar eller ansluter till programinstans med angivet sessionsnamn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Skriv ut hjälp för KOMMANDO eller alla kommandon.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Skriv version av program och bibliotek.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Starta servern i bakgrunden innan ett kommando körs.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nEvaluera ECMAScript-program.\nArgument är åtkomliga med &quot;arguments[0..N]&quot;.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SKRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENT</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nStartar eller ansluter till programinstans med angivet sessionsnamn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSION</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nSkriv ut hjälp för KOMMANDO eller alla kommandon.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nSkriv ut version på program och bibliotek.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Kör programtest (lägg till flaggan --help för mer info).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Användning: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Startar server om inget kommando anges.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  KOMMANDOn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>ANTECKNINGAR:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Använd flaggan bindestreck (-) för att läsa data från standard in.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Använd argument med dubbelt bindestreck (--) för att läsa alla följande\n    argument utan att expandera kontrollsekvenser (d.v.s. \\n, \\t med mera).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Använd ? som MIME för att skriva ut tillgängliga MIME-typer (standard är &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Ogiltigt antal argument!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ urklippshanterare</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Kommando hittades inte!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Avslutar server.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Det går inte att spara till filen ”%1”!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Det går inte att importera filen ”%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Ogiltigt alternativ ”%1”!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Undantag</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Undantag i %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Misslyckades med att kopiera till urklipp!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Det finns ingen flik med det angivna namnet!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Fliknamn kan inte vara tomt!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Det finns redan en flik med det angivna namnet!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Urklippslagring inaktiverad*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 — CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 — %2 — CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Lägg till genväg</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Ny genväg</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Tryck in valfri tangentkombination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; för att avbryta.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Klicka här och tryck ned valfri tangentkombination</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Ta bort genväg</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Sök:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>Gl&amp;obal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Globala genvägar kan utlösas från alla program.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>A&amp;pplikation</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Programgenvägar kan endast lösas ut från huvudfönstret.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Programgenvägar kan endast utlösas från huvudfönstret.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Genväg finns redan!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Fliknamn måste vara unikt och inte tomt.&lt;br /&gt;\nFliken &lt;b&gt;An&amp;amp;teckningar&lt;/b&gt; kan öppnas med &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nAnvänd &lt;b&gt;/&lt;/b&gt; som sökvägsavskiljare i trädvyns fliklayout.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Namn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Ny flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Byt namn på flik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Byt namn på flikgrupp</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Maximalt antal objekt:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>standard</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Spara objekt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;Lagra Objekt</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Tryck ”/” för att söka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Skriv för att söka</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Reguljärt uttryck</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Ej skiftlägeskänsligt</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_tr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"tr_TR\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Hakkında</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Pano Yöneticisi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Yazar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-posta</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Bağış Yap</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Eylem İletişim Kutusu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>&amp;Komut:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Standart &amp;girdi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Standart çıktıyı &amp;depola:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Verilen ortam türünün verilerini standart komut girişine gönderin (kapatmak için boş bırakın)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Programın standart çıktısından ögeler oluşturun (kapatmak için boş bırakın)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Yeni ögeler için ayırıcı:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Çıktıyı birden çok ögeye ayırmak için düzenli ifade.&lt;/p&gt;\n&lt;p&gt;Her satırı ayrı bir ögeye kaydetmek için &lt;b&gt;\\n&lt;/b&gt; kullanın.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Çıktı &amp;sekmesi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Ögeleri verilen adla sekmesine kaydedin (geçerli sekmede kaydetmek için boş bırakın)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Komut kaydedildi</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Komut kaydedildi ve öge menüsünden erişilebilir.\nKomutu tercihlerde ayarlayabilirsiniz.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Hata: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Hata kodu: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Komut %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>İşlem Yöneticisi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Filtre</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Seçilenleri Sonlandır</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Komut Ekle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Ana pencereyi göster/gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Tepsi menüsünü göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Fare imlecinin altındaki ana pencereyi göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Panoyu düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>İlk ögeyi düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>İkinci ögeyi kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Eylem iletişim kutusunu göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Yeni öge oluştur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Sıradaki ögeyi kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Önceki ögeyi kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Panoyu düz metin olarak yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Pano depolamayı devre dışı bırak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Pano depolamayı etkinleştir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Yapıştır ve sonrakini kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Yapıştır ve öncekini kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Ekran görüntüsü al</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Şu an ki tarihi yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Yeni komut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Tek karakter veya karakter içermeyen ögeleri yoksay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Tarayıcıda &amp;Aç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Düz Metin Olarak Yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Videoları otomatik oynat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Site adreslerini (URL) diğer sekmeye kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Küçük resim oluştur (ImageMagick gerekli)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>URL&apos;den QR kodu oluştur (qrencode gerekli)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Görevler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>%1 sekmesine ekle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>%1 sekmesine taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Kopyalanan dosyaları yoksay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>*&quot;Parola&quot;* penceresini yoksay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Parola</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Çöpe Taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(çöp)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Geçerli Sekmeyi Temizle</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Yeni öğeler eklenemiyor</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Sekme dolu. Herhangi bir öğe kaldırılamadı.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>%1 sekmesine yeni ögeler eklenemiyor. Yer açmak için lütfen ögeleri el ile kaldırın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Değişikliklerden Vazgeçilsin Mi?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Gerçekten &lt;strong&gt;değişiklerden vazgeçmek&lt;/strong&gt; istiyor musunuz?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Bağlantı koptu!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Sunucu bağlantısı yapılamıyor! Öncelikle CopyQ sunucusunu başlatın.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Pano İçeriği</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Biçimler:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>İ&amp;çerik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Biçimi Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Öge İçeriği</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Boyut:&lt;/strong&gt; %1 bayt</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Boyut:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ sunucusu zaten çalışıyor.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Aktif Komutları İptal Et</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Aktif komutları iptal edip çıkmak istiyor musunuz?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Çıkmaktan Vazgeç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Yine de Çık</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Boşluk</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Komutlar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Yeni pano içeriğinde veya menüden kullanıcı tarafından veya sistem kısayolunu kullanarak otomatik olarak çağrılabilen yeni komutları tanımlayın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Bul:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Komutları Yükle…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>&amp;Seçileni Kaydet…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Seçileni Kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Komutları Yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Kaydedilmemiş Değişiklikler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Komut kutusunda kaydedilmemiş değişiklikler var.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Dosyaları Komutlarla Aç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Komutlar (*.ini);; CopyQ Yapılandırma (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Seçili Komutları Kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Komutlar (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Komutları Kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Komutlar &quot;%1&quot; dosyasına kaydedilemedi: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Komut parametrelerle çalıştırılabilir program listesini içerir. Örnek olarak:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">%1 program argümanı, item metni için ve %2 ile %9 arasında düzenli ifade ile yakalanan metinler için değiştirilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>%1 program argümanı, öge metniyle değiştirilecektir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>%1 karakteri standart çıktıyı bir sonraki programa geçirmek için kullanılabilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Aşağıdaki sözdizimi komutun geri kalanını tek parametre olarak geçirmek için kullanılabilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Bu, %1 ile aynı çıktıyı verir, ancak daha uzun komutlar için daha kullanışlıdır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Aşağıda listelenen işlevler aşağıdaki komutlarda olduğu gibi kullanılabilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;pano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Komut yardımını göster (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Ad:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Menüde gösterilen komut adı</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">İşlem tipleri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Panoda yeni içerik olduğunda komutu otomatik çalıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Oto&amp;matik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Eşleşen ögeleri içerik menüsünde göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>M&amp;enüde</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Kısayol:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Genel Kısayol:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Genel Kısayol</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Ögeleri Eşleştir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Bu MIME türündeki veriler, komutun standart girişine gönderilecektir.\nBunu devre dışı bırakmak için boş bırakın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Pencere:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Komutu yalnızca metni &quot;düzenli ifade&quot; ile eşleşen ögeler için kullanın. (her şeyi eşleştirmek için boş bırakın). &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight:600;&quot;&gt;Örnekler: &lt;/span&gt;&lt;/p&gt;&lt;p&gt; URL’yi eşle &lt;span style=&quot;font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt; PDF dosya adlarını eşle &lt;span style=&quot;font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt; Tek karakterle eşleş &lt;span style=&quot;font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt; Uzak multimedyayla eşleş &lt;span style=&quot;font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Betik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Ekran</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;İçerik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Giriş metni bu düzenli ifadeyle eşleşmezse komutu atlar (her şeyle eşleşmesi için boş bırakın).\n\nKomut ve Filtre&apos;de %2 ile %9 arası (veya betikteki argüman[1] ve sonrası) yakalanan metinlerle değiştirilecektir.\n\nÖrnekler:\n\n- URL ile eşleşir: ^(https?|ftp)://\n- PDF dosya adlarıyla eşleşir: \\.pdf$\n- Tek karakterle eşleşir: ^.$\n- Uzak çoklu ortamla eşleşir: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Filtre:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Komutları yalnızca filtre komutu başarılı olursa kullanın.&lt;/p&gt;\n\n&lt;p&gt;Öge metni, filtre komutunun &lt;b&gt;standart girişine&lt;/b&gt; iletilir. Öge, &lt;b&gt;yalnızca filtre komutu çıkış kodu 0 ise&lt;/b&gt; eşleştirilir.&lt;/p&gt;\n\n&lt;p&gt;Argüman olarak iletilen öge metni için &lt;b&gt;%1&lt;/b&gt; ve düzenli ifadeyle yakalanan argümanlar için&lt;b&gt;%2&lt;/b&gt; ila &lt;b&gt;%9&lt;/b&gt; (parantez içine alınmış parçalar) kullanın ).&lt;/p&gt;\n\n&lt;p&gt;Komutları zincirlemek için &lt;b&gt;|&lt;/b&gt; kullanın (standart çıktıyı bir sonraki komuta iletin).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Komu&amp;t</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Tür:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Gelişmiş</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the catured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Girdi metni bu düzenli ifadeyle eşleşmiyorsa komutu atlar (her şeyi eşleştirmek için boş bırakın).\n\nKomut ve Filtre&apos;de %2 ile %9 arası, yakalanan metinlerle değiştirilecektir.\n\nÖrnekler:\n\n- URL eşleştir: ^(https?|ftp)://\n- PDF dosya adlarını eşleştir: \\.pdf$\n- Tek karakteri eşleştir: ^.$\n- Uzak çoklu ortamı eşleştir: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Filtre komutu sıfır olmayan çıkış koduyla başarısız olursa komutu atlar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Eylem</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Yeni ögelerin kopyalanacağı sekmenin adı (kopyalamak için boş bırakın)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Eşleşen ögeleri kaldır\n\nNot: Eğer bu otomatik olarak uygulanırsa, başka otomatik komutlar çalıştırılmaz.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Ögeyi Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menü Eylemi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Ögenin içerik menüsünden komut etkinleştirildikten sonra pencereyi gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Ana pencereyi etkinleştirmeden sonra gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Komut seçenekleri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Komut yürütülmeden önce eylem iletişim kutusu göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Bekle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Ögeyi değiştir, yeni öge yaratma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Dö&amp;nüştür</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Ç&amp;ıktı:</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Girdi metni bu düzenli ifadeyle eşleşmiyorsa komutu atlar (her şeyi eşleştirmek için boş bırakın).\n\nKomut ve Filtre&apos;de %2 ile %9 arası, yakalanan metinlerle değiştirilecektir.\n\nÖrnekler:\n\n- URL eşleştir: ^(https?|ftp)://\n- PDF dosya adlarını eşleştir: \\.pdf$\n- Tek karakteri eşleştir: ^.$\n- Uzak çoklu ortamı eşleştir: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Komutu, yalnızca normal ifadeyle eşleşen başlık metniyle pencereden panoya kopyalanan ögeler için kullanın (herhangi bir pencereye uyması için boş bırakın). MacOS&apos;ta bu, uygulama adını ve ardından bir kısa çizgi (&amp;quot;-&amp;quot;) ve ardından pencere başlığını içerir. Örneğin: &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>&amp;Biçim:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Sekmeye kop&amp;yala:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Programın standart çıkışından ögeleri oluşturun (devre dışı bırakmak için boş bırakın)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Ayırıcı:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Çıktıyı ayrı ögelere bölmek için kullanılacak ayırıcı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Çıktı &amp;sekmesi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Ögeleri verilen adla sekmeye kaydet (ilk sekmede kaydetmek için boş bırakın)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Gelişmiş Göster</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Arka plan</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Notlar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Araç ipuçları</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Bulundu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Seçildi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Numara</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Normal</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Düzenleyici</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Yazı Tipi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Alternatif</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Ön Plan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Bildirim</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Numara &amp;Göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Kaydırma çubuklarını göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>&amp;Kaydırma çubukları</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Mümkün olduğunca masaüstü ortamındaki simgeleri kullan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>&amp;Sistem Simgeleri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>&amp;Kenar yumuşatma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>&amp;Sekmeler, araç çubuğu ve menüler için renkleri ayarla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>&amp;Temayı Sıfırla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Tema:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Tema Yükle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Temayı Kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Geçerli temayı harici düzenleyicide düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>&amp;Temayı Düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Önizleme:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>öge</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Arama dizesi %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Bir öge seçin ve\ndüzenlemek için F2&apos;ye basın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Örnek öge %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Bazı rastgele notlar (düzenlemek için Shift+F2)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Tema Dosyası Aç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Tema Dosyasını Farklı Kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Harici Düzenleyici Yok</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Önce harici düzenleyici komutunu seçin!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Dil:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Satıra sığmayan metni kes</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>&amp;Uzun metni kaydır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Ana pencereyi diğer pencereler üzerinde tut</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Her Zaman &amp;Üstte</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Başka uygulamaya geçince ana pencereyi kapat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Odaklanmadığında Kapat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Geçerli ekranda pencereleri açmak için etkinleştirin. En son kapatıldıkları pencereleri açmak için devre dışı bırakın</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>&amp;Mevcut ekranda pencereleri aç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Uygulama çıkışını onayla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Uygulama &amp;çıkışını onayla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Uygulamayı sistem başlangıcında çalıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Otomatik Başlat</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Vi gezinme tuşlarını destekle (H, J, K, L ve dahası), arama için (/)</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Vi tipi gezinme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Ekran görüntülerinde ve kayıtlarda uygulama pencerelerinin yakalanmasını önle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>Ekran görüntülerinden ve kayıtlardan &amp;gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Gezinti biçimi / Tuş Eşlemi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Vi gezinti (tuşlar H, J, K, L, / ve dahası) ve Emacs gezinti (Ctrl+N, P, V ve dahası) desteği</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Öntanımlı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Öge filtrelerinin geçmişini kaydet ve geri yükle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Filtre Geçmişini Kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Komutlarda işlev, tür ve değişken adlarını tamamlamak için açılır pencereyi otomatik olarak göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Komutları Otomatik Tamamla</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Pano Manipülasyonu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Kopyalanan içeriği, fare seçimleriyle aynı şekilde yapıştırmaya izin verin (genellikle orta fare düğmesine basarak)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Panoyu fareyle yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Kısayol kullanarak fare seçimlerinin yapıştırılmasına izin ver (genellikle Ctrl+V veya Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Fare seçimini klavyeyle yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Geçmişte panoya kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Panoyu depola</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Fare ile seçilen metni (ana seçim) geçmişe kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Fareyi kullanarak seçilen metni saklayın</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Seçimde otomatik komut çalıştır</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>&amp;Geçmişte maksimum öge sayısı:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Her sekmedeki maksimum öge sayısı</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Dakikadaki aralıklarla sekmeyi kaldır:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Her bir sekmeyi, belirli dakika etkinlik dışı kaldıktan sonra bellekten çıkar.\n\nSekmeleri boşaltmamak için 0 olarak ayarlayın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Harici düzenleyici komutu (düzenlenecek dosya: %&amp;1):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Harici düzenleyici komutu (düzenlenecek dosya: %1).\n  Örnekler:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>&amp;Pano depolaması sekmesi:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Yeni pano içeriğini otomatik olarak depolayacak sekmenin adı.\n\nOtomatik depolamayı devre dışı bırakmak için boş bırakın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Düzenlenen ögeyi kaydetmek için Return tuşunun işaretini kaldırın ve Ctrl+Return ile yeni satır oluşturun.\n\nNot: Düzenlenmiş ögeler, bu seçenek dikkate alınmadan F2 ile kaydedilebilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>&amp;Düzenlenen ögeyi Ctrl+Return ile kaydet ve Return tuşuyla yeni satır oluştur</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Her bir ögenin tek satır açıklamasını göster.\n\nTüm ögeleri görüntülemek için Öge Önizleme&apos;yi kullanın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>&amp;Basit ögeleri göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Numara aramayı etkinleştir, aksi halde rakam tuşuna basılması, bu konumdaki ögeyi etkinleştirir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Sayıları ara</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Ögeyi tek tıklama ile etkinleştir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Öge etkinleştirildikten sonra (çift tıklayın veya Enter tuşuna basın), panoya kopyalayın ve ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Öge etkinleştirildikten sonra listenin en üstüne taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>&amp;Ögeyi en üste taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Öge etkinleştirildikten sonra ana pencereyi kapat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Ana pencereyi kapat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Öge etkinleştirildikten sonra son pencereye odaklan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Son pencereye odaklan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Öge etkinleştirildikten sonra geçerli pencereye yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Geçerli pencereye yapıştır</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Göster/Gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Sekmeleri gizle (göstermek için Alt tuşuna basın)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>&amp;Sekmeleri gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Araç çubuğunu gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>&amp;Araç çubuğunu gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>&amp;Araç çubuğu etiketlerini gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Kapatıldığında ana pencereyi gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>&amp;Ana pencereyi gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Düzen ve Şeffaflık</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Sekme çubuğu yerine sekmeli ağacı göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>&amp;Sekme Ağacı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Odaklanmış şeffaflık:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Odaklandığında ana pencerenin şeffaflığı.\n\nNot: Bu, tüm sistemlerde desteklenmemektedir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>&amp;Odaklanmamış şeffaflık:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Odaklanmadığında ana pencerenin şeffaflığı.\n\nNot: Bu, tüm sistemlerde desteklenmemektedir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Sekmelerdeki öge sayısını göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>&amp;Öge Sayısını Göster</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Bildirim konumu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Bildirimlerin ekrandaki konumu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Üst</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Üst Sağ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Alt Sağ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Alt Sol</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Üst Sol</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>&amp;Bildirimlerin saniye cinsinden görüntülenme aralığı:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Yeni pano içeriği bildirimi veya yeni öge panoya kopyalandı bildirimi için saniye cinsinden zaman aralığı (yalnızca ana pencere kapalıysa)\n\nDevre dışı bırakmak için 0 olarak ayarlayın.\n\nTıklayana kadar görünür kalması için -1 olarak ayarlayın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Pano &amp;bildirimi için satır sayısı:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Yeni pano içeriğinin gösterileceği satır sayısı.\n\nDevre dışı bırakmak için 0 olarak ayarlayın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>Yerel bildirimleri &amp;kullan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Bildirim Pozisyonu (ekran pikseli)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>&amp;Yatay konum:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Bildirimlerin sağ ve sol ekran konumlarına olan uzaklığı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Dikey konum:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Bildirimlerin üst ve alt ekran konumlarına olan uzaklığı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Maksimum &amp;genişlik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Ekran noktalarında bildirim için maksimum genişlik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Ma&amp;ksimum yükseklik:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Bildirimin ekran üzerindeki maksimum yüksekliği</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Tepsi simgesini gösterme; kapatıldığında pencereyi küçült</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>&amp;Tepsiyi devre dışı bırak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Geçerli pano içeriği komutunu tepsi menüsünde göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>&amp;Pano içeriği komutlarını göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Tepsi menüsündeki ögelerin &amp;sayısı:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Tepsi menüsündeki ögelerin sayısı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Geçerli sekmedeki ögeleri tepsi menüsünde göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>&amp;Geçerli sekmeyi menüde göster,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>veya &amp;diğer sekmeyi seç:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Tepsi menüsünde gösterilecek sekmenin adı (ilk sekme için boş)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Ögeyi menüden seçtikten sonra geçerli pencereye yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Etkinleştirilen ögeyi geçerli pencereye yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Menü ögelerinin yanında görüntü önizlemesi göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>&amp;Görüntü önizlemesini menü ögesi simgesi olarak göster</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Yapılandırma</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Genel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Düzen</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Geçmiş</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Tepsi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Bildirimler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Sekmeler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Ögeler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Kısayollar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Görünüm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Seçenek için geçersiz değer &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Tercihler sıfırlansın mı?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Bu işlem, tüm tercihlerinizi (tüm sekmelerde) öntanımlı değerlere sıfırlayacaktır.&lt;br /&gt;&lt;br /&gt;Gerçekten &lt;strong&gt;tüm tercihleri sıfırlamak&lt;/strong&gt; istiyor musunuz?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Yeniden Başlatma Gerekli</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Uygulama yeniden başlatıldıktan sonra dil değişecektir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Tercihler</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Eşitleme dizini oluşturulamadı &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Aşağı</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Simge Seç…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Simge Seç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Gözat...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Simge Dosyası Aç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Resim Dosyaları (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Hepsi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Sekmeler:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Ay&amp;arlar</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Ko&amp;mutlar</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">editör çıkış kodu %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Editör komutu: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Düzenleyici komutu başarısız oldu (günlüklere bakın)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Kaydet</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Ögeyi Kaydet (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Çıkış</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Düzenlemeden Çık ve Değişiklikleri Geri Al</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Escape</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Font</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Kalın</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">İtalik</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Altı çizili</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Çizili</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Önplan</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Arkaplan</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Stili Temizle</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Ara</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Geri Al</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Yeniden Yap</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Şifrelenmiş ögeleri diğer bilgisayarlarda veya oturumlarda paylaşmak için herkese açık ve gizli anahtar dosyalara ihtiyacınız vardır: &lt;ul&gt; &lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br/&gt; (Bu gizli anahtarı güvenli bir yerde saklayın.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Şifrelenmiş sekmeleri görüntülemek için GnuPG kurulu olmalıdır.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Şifrele (GnuPG gerekli)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Şifre Çöz</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Şifre Çöz ve Kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Şifre Çöz ve Yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Hata: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Anahtar oluşturulamadı.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Şifrelenen ögeleri başka bir bilgisayarda veya oturumda paylaşmak için bu gizli anahtar dosyalarına ihtiyacınız olacaktır (bunları güvenli bir yerde saklayın):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Başarılı</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Yeni anahtar oluşuruluyor (bir kaç dakika sürebilir)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>İptal</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Yeni parola ayarla...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Öge şifrelemenin kullanılmasından önce şifreleme anahtarları &lt;strong&gt;oluşturulmalı&lt;/strong&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Yeni Anahtarlar Oluştur...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Parola Değiştir...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Şifreleme hatası!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Şifre çözme hatası!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Şifreleme</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Ögeleri ve sekmeleri şifrele.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Ögeleri şifrelemek ve şifresini çözmek için Komutlar sekmesi altındaki uygun komutları ekleyin.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Şifrelenmiş Ögeleri ve Sekmeleri Paylaşma</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Şifrelenmiş Sekmeler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Otomatik olarak şifrelenecek ve şifresi çözülecek sekmelerin adlarını (her satıra bir tane) belirtin.&lt;/p&gt;\n&lt;p&gt;Şifresi çözülmüş ögeleri bellekten güvenle kaldırmak için Geçmiş sekmesinde kaldırma sekmesi aralığını ayarlayın.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Bozuk Sekme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>&lt;strong&gt;%1&lt;/strong&gt; sekmesindeki tüm ögeler başarıyla yüklenmedi. Yine de sekmeyi yüklemek ve muhtemel olarak bazı ögeleri kaybetmek istiyor musunuz?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim eklentisi Qt Oluşturan&apos;ın bir parçasıdır</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Ögeleri düzenlerken Vim düzenleyicisini taklit et.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Ögeleri Düzenlemek için FakeVim&apos;i etkinleştir</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Yapılandırma Dosyasının Yolu:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Resimler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Resimleri göster.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Maksimum Görüntü &amp;Genişliği:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Geçmişte görüntülenen maksimum resim genişliği (orijinal boyut için sıfıra ayarlayın)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Maksimum Görüntü &amp;Yüksekliği:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Geçmişte görüntülenen maksimum resim yüksekliği (orijinal boyut için sıfıra ayarlayın)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>&amp;Görüntü düzenleyici komutu:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>SVG dışındaki desteklenen görüntü biçimleri için düzenleyici komutu.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG düzenleyici komutu:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>SVG görüntü biçimi için düzenleyici komutu.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Notlar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Ögeler için notları görüntüle.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Notlar Konumu</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>&amp;Ögenin Üstünde</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>Ögenin &amp;Altında</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>Ögenin &amp;Yanında</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>&amp;Araç İpucunu Göster</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Ekle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Yukarı taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Aşağı taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>En üste taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>En alta taşı</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">&amp;Yukarı</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">&amp;Aşağı</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Sabitlenmiş Ögeler Kaldırılamıyor</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Ögeleri kaldırmak için önce sabitlemesini kaldırın.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Sabitle</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Sabitlemeyi Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Sabitlenmiş Ögeler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Geçerli satırda kilitlemek için ögeleri sabitleyin ve silmeyi önlemeyin (sabitleme kaldırılmamışsa).&lt;/p&gt;&lt;p&gt;Kısayollar ve komut dosyası işlevselliği sağlar.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Gözat...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Eşitleme için Dizini Aç</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Eşitleme dizini oluşturulamadı</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Eşitleme</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Öğeleri ve notları diskteki bir dizinle eşitle.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>&quot;%1&quot; sekmesini &quot;%2&quot; diziniyle eşitleyemedi!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Ögeler Kaldırılsın Mı?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>&lt;strong&gt;Ögeleri ve ilişkili dosyaları kaldırmayı&lt;/strong&gt; gerçekten istiyor musunuz?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Eşitleme Sekmeleri ve Dizinler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;&lt;strong&gt;Sekme&lt;/strong&gt; içeriklerini verilen &lt;strong&gt;yolla&lt;/strong&gt; verilen dizinle eşitle.&lt;/p&gt;\n&lt;p&gt;&lt;strong&gt;Sekme&lt;/strong&gt;deki ögeleri kaydetmeyecek &lt;strong&gt;boş bir yol&lt;/strong&gt; ayarla.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Sekme Adı</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Konum</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Öge Veri Biçimlerindeki Dosyalar</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Dosyaları yok saymak için ortam türünü &lt;strong&gt;-&lt;/strong&gt; (eksi işareti) olarak ayarlayın. Diğer bilinmeyen veya gizli dosyalar yok sayılır.&lt;/p&gt;\n&lt;p&gt;Örnek: &lt;strong&gt;txt&lt;/strong&gt; dosya uzantısını &lt;strong&gt;text/plain&lt;/strong&gt; olarak yükleyin.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Öge Ortam Türü</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"obsolete\">&lt;p&gt;Dosyaları yok saymak için MIME tipini &lt;strong&gt;-&lt;/strong&gt; (eksi karakteri) olarak ayarlayın. Diğer tüm bilinmeyen veya gizli dosyalar yok sayıldı.&lt;/p&gt;\n&lt;p&gt;Örnek: &lt;strong&gt;txt&lt;/strong&gt; dosya uzantısını &lt;strong&gt;text/plain&lt;/strong&gt; MIME tipi olarak yükleyin.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Dosyaları yoksaymak için MIME türünü &lt;strong&gt;-&lt;/strong&gt; (çizgi) olarak ayarlayın. Diğer bilinmeyen veya gizli dosyalar dikkate alınmaz.&lt;/p&gt;\n&lt;p&gt;Örnek: &lt;strong&gt;txt&lt;/strong&gt; dosya uzantısını &lt;strong&gt;metin/düz&lt;/strong&gt; MIME türü olarak yükleyin.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Uzantılar</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">Öğe MIME Tipi</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Etiket Ekle</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Etiketi Kaldır</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">%1 olarak etiketle</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">%1 etiketini kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>%1 Etiketini Aç/Kapat</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Kilitli Etikete Sahip Ögeler Kaldırılamaz</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Kaldırmak için önce ögelerin etiketini kaldırın.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Önemli</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Tüm etiketleri temizle</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Etiketler</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Ögeler için etiketleri göster.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Özel etiket ekleme ve çıkarma için menü ögeleri Komutlar iletişim kutusunda eklenebilir ve özelleştirilebilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Daha fazla bilgi &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki sayfasında&lt;/a&gt; mevcuttur.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Etiket Adı</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Eşle</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Biçem Sayfası</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Renk</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Simge</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Kilitle</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Ögeyi kaldırmaktan kaçın</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Metin</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Düz metni ve basit HTML ögelerini görüntüleyin.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>HTML ve zengin metni kaydetme ve görüntüleme</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Gösterilecek maksimum satır sayısı (hepsini göstermesi için 0):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Piksel cinsinden maksimum yükseklik (0 = limitsiz):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Öntanımlı biçem sayfası:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">Web sayfalarını göster.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">Piksel cinsinden maksimum yükseklik (0 = limitsiz):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Günlük</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Çıkış yapmak istiyor musun?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>CopyQ&apos;dan &lt;strong&gt;çıkmak&lt;/strong&gt; ister misiniz?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Dosya</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Öge</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Sekmeler</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Yardım</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Yeni Sekme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>%1 &amp;Grubunu Yeniden Adlandır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>%1 Sekmesini Yeniden &amp;Adlandır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>%1 Sekmesini &amp;Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>%1 Grubunu Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Sekme Simgesini Değiştir</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Pano Depolamayı Etkinleştir</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Pano Depolamayı Devre Dışı Bırak</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>İçe Aktarma Seçenekleri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ Hata</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Göster/Gizle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Dışa Aktarma Seçenekleri</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Dışa Aktarma Hatası</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>%1 dosyası dışa aktarılamadı!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Pano: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ Ögeleri (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>İçe Aktarma Hatası</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>%1 dosyası içe aktarılamadı!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Gruptaki Tüm Sekmeler Kaldırılsın Mı?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>&lt;strong&gt;%1&lt;/strong&gt; grubundaki &lt;strong&gt;tüm sekmeleri&lt;/strong&gt; kaldırmak istiyor musun?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Sekme Kaldırılsın Mı?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>&lt;strong&gt;%1&lt;/strong&gt; sekmesini kaldırmak istiyor musunuz?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Bilgi</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;pano</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;GİZLİ&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n satır)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;GÖRÜNTÜ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ÖGELER&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;BOŞ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;VERİ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Yeni Öge</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;İçe Aktar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Dışa Aktar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Tercihler...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">&amp;Komutlar/Genel Kısayollar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>&amp;Komutlar...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>&amp;Pano İçeriğini Göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Pano Depolamasını Aç/Kapat</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>&amp;İşlem Yöneticisi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Çık</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Seçili Ögeleri Sırala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Seçili Ögeleri Ters Çevir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Ögeleri Yapıştır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Seçili Ögeleri Kopyala</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Bul</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">&amp;Panoya taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;İçeriği Göster...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Önizlemeyi Göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">&amp;Panoya Taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>&amp;Notları Düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">Düzenleyici ile &amp;düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Eylem...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Yukarı Taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Yukarı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Aşağı Taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Aşağı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>En Üste Taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>En Alta Taşı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Yeni Sekme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Sekmeyi Yeniden &amp;Adlandır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Sekmeyi &amp;Kaldır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Sekme Simgesini Değiştir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>&amp;Sonraki Sekme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Sağ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Sol</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Öge İçeriği Menüsünü Aç</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>&amp;Önceki Sekme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Ögeyi Kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Düzenlemeyi İptal Et</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Geri Al</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Yeniden Yap</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Yazı Tipi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Kalın</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>İtalik</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Altı Çizili</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Üstü Çizili</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Ön Plan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Arka Plan</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Biçemi Sil</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Ara</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>Ögeleri &amp;Etkinleştir</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>Düzenleyici ile &amp;Düzenle</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Günlüğü Göster</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Hakkında</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Yardım</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n satır &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Oturum adı, harf, rakam, &apos;-&apos; veya &apos;_&apos; olabilen\nen fazla 16 karakter içermelidir!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>%1 sekmesi bozuk veya bazı CopyQ eklentileri eksik!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Metin Kopyalandı (%n satır)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Metin Kopyalandı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Veriler Kopyalandı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Ana pencereyi göster ve isteğe bağlı olarak verilen isim ile sekmeyi aç.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>AD</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Ana pencereyi gizle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Ana pencereyi göster veya gizle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Bağlam menüsünü aç.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Sunucudan çık.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Pano içerik depolamasını devre dışı bırak veya etkinleştir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Pano içeriğini yazdır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>X11 seçim içeriğini yazdır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Panoyu geçerli pencereye yapıştırın\n(bazı uygulamalarla çalışmayabilir).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Panoyu geçerli pencereden kopyala\n(bazı uygulamalarda çalışmayabilir).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Pano metnini ayarla.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>METİN</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\nPano içeriği ayarla.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>VERİ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Geçerli sekmedeki ögelerin miktarını yazdır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Satırdaki ögeyi panoya kopyalayın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>SATIR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Bir sonraki ögeyi geçerli sekmeden panoya kopyalayın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Önceki ögeyi geçerli sekmeden panoya kopyala.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Panoya metin ekle.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Verilen satıra metin ekleyin.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Verilen satırlardaki ögeleri kaldır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>SATIRLAR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Ögeleri düzenleyin veya yenisini düzenleyin.\n-1 değeri panodaki geçerli metin içindir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Çıkıştaki ögeler için ayırıcı ayarlayın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>AYIRICI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Satırdaki ögenin veya panonun ham verilerini yazdır.</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\nHam verileri verilen satıra yazın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Eylem iletişim kutusunu göster.</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\nPROGRAM, satırlardaki öğe metninde çalıştırın.\nMetni argüman olarak iletmek için PROGRAM içindeki %1&apos;i kullanın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\nTepsi açılır mesajını TIME milisaniye için göster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Pano içeriğini ayarla.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Ham verileri verilen satıra yazın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>PROGRAM&apos;ı satırlardaki öge metninde çalıştırın.\nMetni argüman olarak iletmek için PROGRAM içerisinde %1 kullanın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Tepsi açılır pencere mesajını ZAMAN milisaniye göster.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>BAŞLIK</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESAJ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>ZAMAN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Kullanılabilir sekme adlarını listele.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Komutu adı verilen sekmede çalıştır.\nSekme yoksa oluşturulur.\nÖntanımlı ilk sekmedir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>KOMUT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Sekmeyi kaldır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Sekmeyi yeniden adlandır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>YENİ_AD</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Ögeleri dosyaya aktarın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>DOSYA_ADI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Ögeleri dosyadan içe aktar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Tüm seçenekleri listele.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Seçenek değerini al.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>SEÇENEK</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Seçenek değeri ayarla.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>DEĞER</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Betiği değerlendir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Verilen oturum adına sahip uygulama örneğini başlatır veya ona bağlanır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>KOMUT veya tüm komutlar için yardımı yazdır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Programın ve kütüphanelerin sürümünü yazdır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Bir komutu çalıştırmadan önce sunucuyu arka planda başlat.</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\nECMAScript programını değerlendir.\nArgümanlara &quot;argümanlar[0..N]&quot; ile erişilebilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>BETİK</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGÜMANLAR</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\nVerilen oturum adıyla uygulama örneğini başlatır veya bağlar.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>OTURUM</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\nCOMMAND veya tüm komutlar için help yazın.</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\nProgramın ve kütüphanelerin sürümünü yazdır.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Uygulama testlerini çalıştırın (ekleme daha fazla bilgi için --help argümanı).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Kullanımı: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Hiçbir komut belirtilmezse sunucuyu başlatır.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  KOMUTlar:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>NOTLAR:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Standart girişteki verileri okumak için çizgi (-) argümanını kullanın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Kaçış dizilerini genişletmeden aşağıdaki tüm argümanları okumak için\n    çift çizgi argümanını (--) kullanın (yani, \\n, \\t ve diğerleri).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - MIME&apos;nin kullanılabilir MIME türlerini yazdırması için ? kullan (öntanımlı &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Geçersiz sayıda argüman!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ Pano Yöneticisi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Komut bulunamadı!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Sunucu sonlandırılıyor.\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">&quot;%1&quot; dosyasına kaydedilemiyor!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">&quot;%1&quot; dosyası içe aktarılamıyor!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Geçersiz seçenek &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>İstisna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>%1’de İstisna</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Panoya kopyalanamadı!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Verilen adla sekme mevcut değil!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Sekme adı boş olamaz!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Verilen adla sekme zaten var!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Panoya Kaydetme Devre Dışı*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Kısayol ekle</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Yeni Kısayol</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;Herhangi bir tuş bileşimine basın. İptal etmek için &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Buraya tıklayın ve herhangi bir tuş bileşimine basın</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Kısayolu Kaldır</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Bul:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;Genel</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Genel kısayollar herhangi bir uygulamadan tetiklenebilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;Uygulama</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Uygulama kısayolları yalnızca ana pencereden tetiklenebilir.</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">Uygulama kısayolları yalnızca ana pencereden tetiklenebilir.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Kısayol zaten var!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Sekme adı dolu ve benzersiz olmalıdır.&lt;br /&gt;\n&lt;b&gt;Notlar&lt;/b&gt; sekmesi &lt;b&gt;Alt+T&lt;/b&gt; kullanılarak açılabilir.&lt;br /&gt;\nAğaç görünümü sekme düzeninde yol ayırıcı olarak &lt;b&gt;/&lt;/b&gt; kullanın.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Ad:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Yeni Sekme</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Sekmeyi Yeniden Adlandır</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Sekme Grubunu Yeniden Adlandır</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Maksimum öge sayısı:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>öntanımlı</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>Ögeleri &amp;Kaydet</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;Mağaza Öğeleri</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Aramak için &apos;/&apos; tuşuna basın</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Aramak için yazın</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Düzenli İfade</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Büyük/Küçük Harf Duyarsız</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_uk.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"uk_UA\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Про програму</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Керування буфером обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Автор</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>Електронна пошта</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Інтернет</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Пожертвувати</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Діалог дій</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Ко&amp;манда:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>Стандартний &amp;ввід:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Зберегти стандартний в&amp;ивід:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Надіслати дані заданого типу медіа на стандартний ввід команди (залиште порожнім, щоб вимкнути)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Створити елементи зі стандартного виводу програми (залиште порожнім, щоб вимкнути)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>Розділюва&amp;ч для нових елементів:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Регулярний вираз для розділення вихідних даних на декілька елементів.&lt;\\p&gt;\n&lt;p&gt;Використовуйте &lt;b&gt;\\n&lt;/ b&gt; щоб зберегти кожен рядок, як окремий елемент.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Вкладка для &amp;виводу:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Зберегти елементи в вкладку із заданим ім&apos;ям (залишите порожнім, щоб зберегти лише поточну)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">Команда збережена</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">Команда збережена, і тепер її можна викликати з меню.\nЗмінити команду можна у налаштуваннях.</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Помилка: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Код виходу: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Команда %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Диспетчер процесів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Фільтр</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Скасувати виділене</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Додавання команд</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Показати/сховати головне вікно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Показати меню лотка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Показати головне меню під курсором миші</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Редагувати буфер обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Редагувати перший елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Скопіювати другий елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Показати діалогове вікно дій</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Створити новий елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Скопіювати наступний елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Скопіювати попередній елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Вставити вміст буферу обміну як простий текст</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Вимкнути збереження буфера обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Увімкнути збереження буфера обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Вставити і скопіювати наступний елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Вставити і скопіювати попередній елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Зробити знімок екрану</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Вставити поточну дату і час</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Нова команда</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Ігнорувати елементи без символів або тільки з одним символом</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Відкрити в &amp;браузері</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Вставити як звичайний текст</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Автоматично відтворювати відео</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Скопіювати URL (веб-адресу) до іншої вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Створити мініатюри (потрібен ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Створити QR-код з URL (потрібен qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Завдання</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Додати на вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Перемістити на вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Ігнорувати скопійовані файли</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Ігнорувати вікно &quot;Пароль&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Перемістити в смітник</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(кошик)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Очистити цю вкладку</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">Не вдається додати нові елементи</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">Вкладку заповнено. Не вдалося видалити будь-які предмети.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Не вдається додати нові елементи на вкладку %1. Видалить елементи вручну, щоб звільнити місце.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Скасувати зміни?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Дійсно &lt;strong&gt;скасувати зміни&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Не вдається підключитись до сервера! Спочатку запустіть сервер CopyQ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>З&apos;єднання втрачено!</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>Вміст буфера обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Формати:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Вміст:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Вилучити формат</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Вміст елементу</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Розмір:&lt;/strong&gt; %1 байт</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;Розмір:&lt;/strong&gt; %1 байт</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Сервер CopyQ вже запущено.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Скасувати активні команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Скасувати активні команди та вийти?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Скасувати вихід</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Вийти в будь-якому випадку</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Пробіл</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Визначте нові команди, які можуть бути автоматично виконані для нового вмісту буфера обміну або користувачем із меню або за допомогою глобальних сполучень клавіш.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Знайти:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Завантажити команди…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>&amp;Зберегти виділене…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Копіювати виділене</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Вставити команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Незбережені зміни</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>На вкладці «Команди» є незбережені зміни.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Відкрити файли з командами</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Файли команд (*.ini);; Файли конфігурації CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Зберегти вибрані команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Файли команд (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Зберегти команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Не вдалось зберегти команди в файл &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Показати довідку для команд (F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Вкладка «Команди» містить список програм з аргументами для виконання. Наприклад:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">Аргумент програми %1 буде замінений на текст елементу, а аргументи з %2 по %9 означають тексти, що були захоплені регулярним виразом.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Аргумент програми %1 буде замінено на текст елемента.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Символ %1 можна використовувати для передавання стандартного виводу наступній програмі.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Наступний синтаксис дозволяє передати решту команди як один параметр.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Це дає такий вихід як і у %1, але є кориснішим для довших команд.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Функції нижче можна використовувати в наступних командах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;буфер обміну</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Назва:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Назва команди в меню</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">Тип дії</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Запускати команду автоматично після появи нового вмісту в буфері обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>&amp;Автоматично</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Показати команду в контекстному меню відповідних елементів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>У &amp;меню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Глобальне сполучення клавіш:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Збіг елементів</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">Пропускає команду, якщо введений текст не відповідає цьому регулярному виразу (залиште пустим, щоб відповідати всьому).\n\nЗ %2 до %9 в команді та фільтрі буде замінено на захоплений текст.\n\nПриклади:\n\n- Збіг URL-адреси: ^(https?|ftp)://\n- Збіг назва PDF-файлів: \\.pdf$\n- Збіг з одним символом: ^.$\n- Збіг з віддаленим медіафайлом: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Дані цього типу MIME будуть відправлені на стандартний ввід команди.\nЗалиште поле порожнім, щоб вимкнути це.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>&amp;Команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Сховати вікно після активації команди із контекстного меню елементу</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Змінити елемент без створення нових елементів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>&amp;Перетворити</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Створювати елементи зі стандартного виводу програми (залиште порожнім, щоб вимкнути)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Глобальне сполучення клавіш</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Вікно:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Виконувати команду лише для тих елементів, текст яких збігається з регулярним виразом (залиште порожнім для відповідності будь-чому).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Приклади:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  збіг URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  збіг імен PDF-файлів    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  збіг одного символу    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  збіг віддалених мультимедіа    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Додатково</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Сценарій</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Показ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>В&amp;міст:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Фільтр:</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;Виконувати команди лише у разі успішного виконання команди фільтрації .&lt;/p&gt;\n&lt;p&gt;Текст елементу передається на &lt;b&gt;стандартний вход&lt;/b&gt; команди фільтрації. Елемент &lt;b&gt;збігається тільки якщо команда фільтрації має вихідний код 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Використовуйте &lt;b&gt;%1&lt;/b&gt; для тексту елемента, що\nпередається в якості аргументу, а &lt;b&gt;%2&lt;/b&gt; до &lt;b&gt;%9&lt;/b&gt; — в якості аргументів, захоплених регулярним виразом (частини у дужках).&lt;/p&gt;\n\n&lt;p&gt;Використовуйте символ &lt;b&gt;|&lt;/b&gt; для об&apos;єднання команд у ланцюжок (передача стандартного виводу наступній команди).&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>&amp;Формат:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Тип:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Пропускає команду, якщо введений текст не відповідає цьому регулярному виразу (якщо залишити порожнім, буде відповідати будь-якому).\n\nзаповнювачи від %2 до %9 (або аргумент[1] та далі в сценарії) в команді та фільтрі будуть замінені на відповідний текст.\n\nПриклади:\n\n- Пошук URL-адреси: ^(https?|ftp)://\n- Пошук імен PDF-файлів: \\.pdf$\n- Пошук будь-якого символу: ^.$\n- Пошук мультимедіа-файлів: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Пропускає команду, якщо команда фільтра не виконується з ненульовим кодом виходу.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Дія</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>&amp;Копіювати на вкладку:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Назва вкладки, куди будуть копіюватися нові елементі (залиште порожньою, щоб не копіювати)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Видаляє відповідний елемент\n\nПримітка: якщо команда виконується автоматично, то решта автоматичних команд не виконується.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>Ви&amp;далити елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Меню дії</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>&amp;Сховати головне вікно після активації</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Показати додаткове</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Глобальне сполучення клавіш:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Параметри команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Показує діалог дій перед виконанням команди</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Очікувати</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>В&amp;ивід:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Виконувати команду лише для елементів, що були скопійовані у буфер обміну з вікна із заголовком, який відповідає цьому регулярному виразу (залиште порожнім, щоб відповідати будь-якому вікну). У macOS це має бути назва програми з тире (&amp;quot;-&amp;quot;), а потім заголовок вікна. Наприклад &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Розділювач:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Розділювач, за яким вивід буде розбито на кілька елементів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>Вкладка для в&amp;иводу:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Зберігати елементи у обраній вкладці (залиште порожнім, щоб зберігати у першій вкладці)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Фон</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">Примітки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Знайдений елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Вибраний елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Номер</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Звичайний елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Редактор</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Шрифт</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Почережний елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Колір шрифту</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Сповіщення</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Показувати &amp;номери</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Показати смуги прокрутки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Смуги &amp;прокрутки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Використовувати піктограми із середовища стільниці, якщо це можливо</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>&amp;Встановити кольори для вкладок, панелі інструментів та меню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>&amp;Системні піктограми</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Підказки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>З&amp;гладжування</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>С&amp;кинути тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Тема:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Завантажити тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>З&amp;берегти тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Редагувати поточну тему в зовнішньому редакторі</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>&amp;Редагувати тему</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Попередній перегляд:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Рядок пошуку %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Виділіть елемент\nі натисніть F2 для редагування.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Приклад елемента %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Деякі випадкові нотатки (Shift+F2 для редагування)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Відкрити файл теми</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Зберегти тему як файл</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Немає зовнішнього редактора</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Спочатку вкажіть команду зовнішнього редактора!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Абв</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Мова:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Розділити текст на рядки, якщо він занадто довгий для показу в одному рядку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Переносити слова в &amp;довгому тексті</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Тримати головне вікно поверх інших вікон</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>&amp;Завжди зверху</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Закрити головне вікно, коли фокус отримує інша програма</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Закривати коли не активне</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Якщо увімкнено, вікна відкриватимуться на поточному екрані, в іншому випадку вікна відкриватимуться там, де вони були закриті</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>&amp;Відкривати вікна на поточному екрані</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Підтверджувати закриття програми</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>Підтверджувати ви&amp;хід з програми</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Запускати програму разом із системою</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Автоматичний запуск</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">Підтримка навігаційних клавіш Vi (Н, J, K, L тощо) та пошук клавішею скісної риски (/)</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Стиль &amp;навігації Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Запобігати захопленню вікон додатка на скріншотах та записах</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Приховати на скріншотах та записах</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>Шифрувати дані вкладок на диску (потрібно встановити пароль)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>Шифрувати &amp;вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>Використовувати зовнішнє сховище ключів для пароля шифрування (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>&amp;Використовувати зовнішнє сховище ключів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>Зміна паролю для шифрування даних вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>Змінити &amp;пароль шифрування...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Тип навігації / розкладка клавіш:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Підтримка навігації в стилі Vi (клавіші H, J, K, L, /, тощо) та Emacs (Ctrl+N, P, V, тощо)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Стандартний</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Зберігати та відновлювати історію фільтрування елементів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Зберігати історію фільтрування</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Автоматично показувати спливаюче вікно для завершення вводу функцій, типів та перемінних в командах</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Автодоповнення команд</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Маніпуляції з буфером обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Вставляти скопійований вміст таким же способом, як і під час виділення мишею (як правило, натиснувши середню кнопку миші)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Вставляти буфер обміну мишею</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Вставляти виділене мишею за допомогою сполучення клавіш (зазвичай Ctrl+V або Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Вставляти з клавіатури виділене мишею</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Зберігати історію зміни буферу обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Зберігати буфер обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Зберігати в історії текст, що був виділений мишею (основне виділення)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Зберігати текст, виділений мишою</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Автоматично виконувати команди після виділення</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Максимальна &amp;кількість елементів в історії:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Максимальна кількість елементів у кожній вкладці</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">Вивантажувати вкладки через певний &amp;час (хв):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>&amp;Вивантажити вкладку через:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Вивантажувати з пам&apos;яті кожну вкладку після вказаного терміну бездіяльності.\n\nВстановіть 0, щоб не вивантажувати вкладки.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>Вимагати пароль через:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>Час в секундах для зашифрованих вкладок, після якого буде повторно запитуватись пароль.\n\nВстановіть 0, щоб глобально вимкнути це.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Команда зовнішнього редактора (%&amp;1 — файл для редагування):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Команди зовнішнього редактора (%1 — це файл для редагування).\n  Приклади:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>&amp;Вкладка для зберігання буферу обміну:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Назва вкладки, у якій буде автоматично збережено новий вміст буферу обміну.\n\nЗалишіть порожнім, щоб вимкнути автоматичне збереження.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Якщо прапорець знято, клавіша Enter буде зберігати відредагований елемент, а Ctrl+Enter буде створювати новий рядок.\n\nПримітка: відредаговані елементи можна зберегти клавішею F2 незалежно від цього параметру.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>З&amp;берігати змінений елемент клавішами Ctrl+Enter і створювати новий рядок клавішею Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Показувати однорядковий опис кожного елемента.\n\nУвімкніть попередній перегляд елементу, щоб повністю показати елементи.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>&amp;Показувати прості елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Увімкнути пошук цифр, в іншому разі натискання цифрової клавіші активує елемент з цим номером</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Шукати числа</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Активувати елемент одним клацанням</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Після активації елементу (подвійне клацання або клавіша Enter), скопіювати його до буфера обміну та ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Перемістити елемент до верхньої частини списку після його активації</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Переміщати елемент на &amp;початок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Закривати головне вікно після активації елемента</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Закривати головне вікно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Передати фокус останньому вікну після активації елемента</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Активувати останнє вікно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Вставляти в поточне вікно після активації елемента</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>В&amp;ставляти в поточне вікно</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Показати/сховати</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Сховати вкладки (для показу натисніть клавішу Alt)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Сховати &amp;вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Сховати панель інструментів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Сховати &amp;панель інструментів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Сховати &amp;мітки панелі інструментів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Сховати головне вікно при закритті програми</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Сховати &amp;головне вікно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Макет та прозорість</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Показувати дерево вкладок замість панелі вкладок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>&amp;Дерево вкладок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>Прозорість з &amp;фокусом:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Прозорість головного вікна, коли у нього є фокус.\n\nПримітка: це підтримується не у всіх системах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Прозорість &amp;без фокусу:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Прозорість головного вікна, коли у нього немає фокусу.\n\nПримітка: це підтримується не у всіх системах.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Показувати кількість елементів у вкладках</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Показувати &amp;кількість елементів</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>Розташування &amp;сповіщення:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Розташування сповіщень на екрані</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Вгорі</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Внизу</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Вгорі праворуч</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Внизу праворуч</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Внизу ліворуч</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Вгорі ліворуч</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>&amp;Час показу сповіщень (с):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Час показу сповіщень (в секундах) про новий вміст буферу обміну або копіювання елементу до буферу обміну (тільки якщо головне вікно закрите).\n\nВстановіть 0, щоб нічого не показувати.\n\nВстановіть -1, щоб показувати, поки сповіщення не буде клацнуто мишею.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>&amp;Кількість рядків для сповіщення про буфер обміну:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Кількість рядків для показу нового вмісту буферу обміну.\n\nВстановіть 0, щоб вимкнути.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>Використовувати власні сповіщення</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Геометрія сповіщень (у пікселях)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>&amp;Горизонтальне зміщення:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Відстань сповіщення від лівого та правого країв екрану (у пікселях)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Вертикальне зміщення:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Відстань сповіщення від верхнього та нижнього країв екрану (у пікселях)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Максимальна &amp;ширина:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Максимальна ширина сповіщення (у пікселях)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>Максимальна &amp;висота:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Максимальна висота для сповіщень в точках екрану</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Не показувати піктограму у лотку. Згорнути вікно при закритті</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Відключити &amp;лоток</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Показувати в меню лотка команду для поточного вмісту буферу обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Показувати &amp;команди для вмісту буфера обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Кількість &amp;елементів у меню лотка:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Кількість елементів в меню лотка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Показувати в меню лотка елементи з поточної вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Показувати у меню &amp;поточну вкладку,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>або &amp;виберіть іншу вкладку:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Назва вкладки для показу в меню лотка (порожнє для першої вкладки)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Вставляти у поточне вікно вибраний в меню елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Вставляти вибраний елемент у поточне вікно</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Показувати попередній перегляд зображення поряд з пунктами меню</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>Попередньо показувати &amp;зображення як піктограму елементу меню</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">Налаштування</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Загальне</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Макет</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Історія</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Лоток</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Сповіщення</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Сполучення клавіш</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Вигляд</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Неприпустиме значення для параметра &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Скинути налаштування?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Це скине всі налаштування (у всіх вкладках) на стандартні значення.&lt;br /&gt;&lt;br /&gt;Дійсно &lt;strong&gt;скинути всі налаштування&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Потрібен перезапуск</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Зміна мови відбудеться після перезапуску програми.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Налаштування</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Не вдалось створити теку синхронізації &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Вниз</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Вибрати піктограму…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Оберіть піктограму</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Огляд...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Відкрити файл піктограми</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Файли зображень (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Все</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Вкладки:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>&amp;Налаштування</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>&amp;Команди</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">Команда редактора: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Помилка команди редактора (див. журнал)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">Зберегти</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">Зберегти елемент (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">Скасувати</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">Закінчити редагування та повернути зміни</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">Шрифт</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">Жирний</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">Курсив</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">Підкреслення</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">Закреслений</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">Колір шрифту</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">Колір тла</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">Стиль стирання</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">Пошук</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">Скасувати</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">Вернути</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">Для спільного використання зашифрованих елементів на іншому комп’ютері або сеансі вам знадобляться відкриті та закриті файли ключів:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Збережіть ці закриті ключі в безпечному місці.)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Для перегляду зашифрованих вкладок необхідно встановити GnuPG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Шифрування (потрібен GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Розшифрувати</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Розшифрувати та скопіювати</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Розшифрувати та вставити</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Помилка: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Не вдалося створити ключі.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Ці файли з закритими ключами знадобляться для надання доступу до зашифрованих об&apos;єктів іншому ком&apos;ютеру або сеансу (зберігайте їх в надійному місці):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Готово</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Створюються нові ключі (це може тривати кілька хвилин)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Скасувати</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Вкажіть новий пароль...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Перед шифруванням елементу &lt;strong&gt;потрібно згенерувати&lt;/strong&gt; ключі шифрування.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Створити нові ключі...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Зміна паролю...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Помилка шифрування!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Не вдалося розшифрувати!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Шифрування</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Шифрування елементів і вкладок.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Щоб зашифрувати та розшифрувати елементи, додайте відповідні команди на вкладці «Команди».</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Обмін зашифрованими елементами та вкладками</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Зашифровані вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Вкажіть назви вкладок (по одній на рядок), які будуть автоматично зашифровуватись та розшифровуватись.&lt;/p&gt;\n&lt;p&gt;Встановіть інтервал вивантаження вкладок на вкладці «Історія», щоб безпечно вивантажувати з пам&apos;яті розшифровані елементи.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Пошкоджена вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Не всі елементи на вкладці &lt;strong&gt;%1&lt;/strong&gt; були успішно завантажені. Дійсно завантажити вкладку та потенційно втратити деякі елементи?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Додаток FakeVim є частиною Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Емуляція редактора Vim під час редагування елементів.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Увімкнути FakeVim для редагування елементів</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Шлях до файлу налаштувань:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Зображення</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Показ зображень.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Максимальна &amp;ширина зображень:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Максимальна ширина зображення, яке показується в історії (0 означає оригінальний розмір)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Максимальна &amp;висота зображень:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Максимальна висота зображення для показу в історії (0 — оригінальний розмір)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>Команда редактору &amp;зображень:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Команда редактора для підтримуваних форматів зображень, відмінних від SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Команда &amp;редактору SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Команда редактора для зображень у форматі SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Примітки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Показ приміток для елементів.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Розміщення приміток</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>&amp;Над елементом</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>&amp;Під елементом</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>&amp;Біля елементу</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Показувати &amp;підказки</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Додати</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>В&amp;идалити</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Вгору</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Вниз</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>На початок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>В кінець</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">В&amp;гору</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">В&amp;низ</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Не вдається видалити закріплені елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Відкріпити елементи перед видаленням.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Закріпити</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Відкріпити</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Закріплені елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Закріплення елементів, щоб зафіксувати їх у поточному рядку та уникнути видалення (на відміну від відкріплених)&lt;/p&gt;&lt;p&gt;Надає сполучення клавіш та функції для сценаріїв.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Огляд...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Відкрити теку для синхронізації</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Не вдалося створити теку синхронізації</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Синхронізація</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Синхронізація елементів та приміток з текою на диску.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Не вдалось синхронізувати вкладку &quot;%1&quot; з текою &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Видалити елементи?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Дійсно &lt;strong&gt;видалити елементи та пов&apos;язані файли&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Синхронізація вкладок і тек</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Вміст &lt;strong&gt;вкладки&lt;/strong&gt; можна синхронізувати з текою з вказаним &lt;strong&gt;шляхом&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Якщо вказати &lt;strong&gt;порожній шлях&lt;/strong&gt;, елементи &lt;strong&gt;вкладки&lt;/strong&gt; не будуть зберігатись.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Назва вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Шлях</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Файли з форматами елементів</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Вкажіть для типу медіа &lt;strong&gt;-&lt;/strong&gt; (символ мінусу), щоб ігнорувати файли. Усі інші невідомі або приховані файли ігноруються.&lt;/p&gt;\n&lt;p&gt;Приклад: завантажувати розширення файлу&lt;strong&gt;txt&lt;/strong&gt; як тип медіа &lt;strong&gt;text/plain&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>Тип медіа елемента</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Розширення</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Додати мітку</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Видалити мітку</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">Помітити як %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">Видалити мітку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Переключити тег %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Не вдається видалити елементи із заблокованим тегом</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Щоб видалити елементи, зніміть спочатку з них мітки.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Важливо</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Очистити всі мітки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Мітки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Показ міток для елементів.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Елементи меню для додавання та видалення користувацьких тегів можна додавати та редагувати у діалоговому вікні «Команди».</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Додаткові відомості див. на &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki-сторінці&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Назва мітки</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Збіг</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Таблиця стилів</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Колір</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Піктограма</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Замок</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Запобігає видаленню елемента</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Текст</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Показ звичайного тексту та простих HTML-елементів.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Зберігати і показувати HTML та форматований текст</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Макс. кількість показуваних рядків (0 — показувати всі):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Макс. висота в пікселях (0 — без обмежень):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Стандартний стиль:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"obsolete\">Інтернет</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"obsolete\">Максимальна висота в пікселях (0 без обмежень):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Журнал</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Вийти?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Дійсно &lt;strong&gt;закрити&lt;/strong&gt; CopyQ?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Файл</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Редагування</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Довідка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Параметри експорту</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Помилка експорту</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Помилка імпорту</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Показати/сховати</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Не вдалося експортувати файл %1!</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Зберігати буфер обміну</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">&amp;Не зберігати буфер обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Параметри імпорту</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Помилка CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Створити вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>Шифрування недоступне</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>Шифрування недоступне (подробиці див. в журналі).\n\nМожна буде зашифрувати та розшифровувати дані вкладок.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>Імпортувати пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>Введіть пароль для імпорту:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>Експортувати пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>Введіть пароль для експорту (якщо не вказати, шифрування не буде):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Перейменувати &amp;групу %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>&amp;Перейменувати вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>&amp;Видалити вкладку %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Видалити групу %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Змінити піктограму вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Буфер обміну: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Елементи CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Не вдалося імпортувати файл %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Видалити всі вкладки у групі?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Дійсно видалити &lt;strong&gt;всі вкладки&lt;/strong&gt; у групі &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Видалити вкладку?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Дійсно видалити вкладку &lt;strong&gt;%1&lt;/strong&gt;?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Відомості</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;СХОВАНО&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n рядок)</numerusform>\n            <numerusform>%1 (%n рядки)</numerusform>\n            <numerusform>%1 (%n рядків)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;ЗОБРАЖЕННЯ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;ЕЛЕМЕНТИ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;ПУСТО&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;ДАНІ&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Del</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n рядок &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n рядки &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n рядків &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Назва сеансу повинна містити не більше 16 символів,\nякі можуть бути буквами, цифрами, &apos;-&apos; або &apos;_&apos;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;буфер обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Створити елемент</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Імпортувати...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Експортувати...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Налаштування...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">&amp;Команди/глобальні сполучення клавіш...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>&amp;Команди...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Показати вміст &amp;буфера обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Перемкнути зберігання буферу обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>&amp;Диспетчер процесів</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>&amp;Вихід</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>С&amp;ортувати виділені елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>&amp;Обернути виділені елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Вставити елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>С&amp;копіювати виділені елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Знайти</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Зберегти елемент</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Скасувати редагування</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Відновити</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Відмінити</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Повторити</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Шрифт</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>Жирний</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>Курсив</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Підкреслений</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Закреслений</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Колір шрифту</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Колір тла</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Видалити стиль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Пошук</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>&amp;Активувати елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;Показати вміст...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Попередній перегляд</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">Перемістити до &amp;буферу обміну</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Видалити</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Редагувати</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Редагувати &amp;примітки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">&amp;Змінити у редакторі</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Дія...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Змістити вгору</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Вгору</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Змістити вниз</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Вниз</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Перемістити на початок</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Перемістити в кінець</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>&amp;Створити вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>П&amp;ерейменувати вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>&amp;Видалити вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Змінити піктограму вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>&amp;Наступна вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Праворуч</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Ліворуч</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Відкрити контекстне меню елемента</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>&amp;Попередня вкладка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>&amp;Змінити в редакторі</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>Показати &amp;журнал</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Про програму</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Довідка</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Вкладка %1 пошкоджена або відсутні деякі плагіни CopyQ!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Текст скопійовано (%n рядок)</numerusform>\n            <numerusform>Текст скопійовано (%n рядки)</numerusform>\n            <numerusform>Текст скопійовано (%n рядків)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Текст скопійовано</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Дані скопійовано</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>Новий пароль для шифрування вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>Введіть новий пароль:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>Паролі не збігаються. Спробуйте ще раз (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>Змінити пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>Новий пароль не може бути порожнім.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>Не вдалось встановити пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>Забагато спроб ввести пароль.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>Підтвердьте пароль шифрування</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>Введіть пароль ще раз:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>Поточний пароль для шифрування вкладки</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>Введіть поточний пароль для шифрування даних вкладки:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>Недійсний пароль. Спробуйте ще раз (%1/%2):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>Не вдалося перевірити пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>Файли шифрування пошкоджені</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>Файли шифрування відсутні або пошкоджені. В суворому режимі не вдається автоматично відновити зашифровані вкладки.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>Не вдалося змінити пароль</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>Не вдалося змінити пароль. Ваш старий пароль все ще дійсний. Подробиці див. в журналі.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>Пароль успішно змінено</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>Пароль було успішно змінено.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>Повторне шифрування вкладок...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>Скасувати</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>Повторне шифрування вкладки %1 з %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>Не вдалося зашифрувати наступні вкладки:\n\n%1\n\nПодробиці див. в журналі.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>Помилка шифрування</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Сховати головне вікно.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Показати/сховати головне вікно.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Відкрити контекстне меню.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Закрити сервер.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Увімкнути або вимкнути збереження буфера обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>Вивести вміст буфера обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>Вивести вміст виділення X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Скопіювати буфер обміну у поточне вікно\n(може не працювати з деякими програмами).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Встановити текст буферу обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>ТЕКСТ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>ДАНІ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Скопіювати елемент у рядок у буфері обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>РЯДОК</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Скопіювати наступний елемент із поточної вкладки в буфер обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Скопіювати попередній елемент із поточної вкладки в буфер обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Додати текст до буферу обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Вставити текст у заданий рядок.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Видалити елементи у заданих рядках.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>РЯДКИ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Редагувати елементи або один новий.\nЗначення -1 означає поточний текст в буфері обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Встановити розділювач для виводу елементів.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>РОЗДІЛЮВАЧ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>Вивести необроблені дані буфера обміну або елемента в рядку.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Показати діалогове вікно дій.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>ПРОГРАМА</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>ЗАГОЛОВОК</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>ПОВІДОМЛЕННЯ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>ЧАС</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Вивести список доступних назв вкладок.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Виконати команду на вкладці із заданою назвою.\nЯкщо вкладка не існує, її буде створено.\nТипово використовується перша вкладка.</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">Виконати тести додатка (для додаткових відомостей додайте аргумент --help).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Запустити сервер у фоновому режимі перед виконанням команди.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>НАЗВА</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Показати головне вікно та (необов&apos;язково) відкрити вкладку із заданою назвою.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Скопіювати буфер обміну з поточного вікна\n(може не працювати з деякими програмами).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Встановити вміст буфера обміну.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>Вивести кількість елементів у поточній вкладці.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Записати необроблені дані в заданий рядок.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Виконати ПРОГРАМУ для тексту елементу у рядках.\nВикористовуйте %1 у ПРОГРАМІ, щоб передати текст як аргумент.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Показувати спливаюче повідомлення в лотку протягом вказаного часу (мс).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>КОМАНДА</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Видалити вкладку.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Перейменувати вкладку.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>НОВА_НАЗВА</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Експортувати елементи в файл.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>НАЗВА_ФАЙЛУ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Імпортувати елементи з файлу.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Вивести всі параметри.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Отримати значення параметру.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>ПАРАМЕТР</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Встановити значення параметру.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>ЗНАЧЕННЯ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Перевірити сценарій.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>СЦЕНАРІЙ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>АРГУМЕНТИ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Запустити або підключитися до екземпляра програми із заданою назвою сеансу.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>Показати довідку для КОМАНДИ або для всіх команд.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>Вивести версію програми та бібліотек.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>СЕАНС</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Використання: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Запускає сервер, якщо не вказано команду.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  КОМАНДИ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>ПРИМІТКИ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Використовуйте подвійне тире (--) в якості аргументу для зчитування наступних\nаргументів без розширення послідовностей екранування (наприклад \\n, \\t тощо).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Використовуйте ? для MIME, щоб вивести усі доступні типи MIME (за замовчуванням використовується &quot;text/plain&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Неприпустима кількість аргументів!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>Не вдалося експортувати файл &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>Не вдалося імпортувати файл &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>Менеджер буфера обміну CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Команду не знайдено!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Сервер закривається.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Виняток</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Виняток у %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Не вдалося скопіювати у буфер обміну!</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Не вдається зберегти файл у &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Використовуйте тире (-) в якості аргументу, щоб зчитати дані зі стандартного вводу.</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Не вдається імпортувати файл &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Неприпустимий параметр &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Вкладка з вказаною назвою не існує!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Назва вкладки не може бути порожньою!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Вкладка з такою назвою вже існує!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Зберігання буферу обміну вимкнено*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Додати сполучення клавіш</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Створити сполучення клавіш</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">Клацніть тут і натисніть будь-яку комбінацію клавіш</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Видалити сполучення клавіш</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Знайти:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>&amp;Глобальне</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Глобальні сполучення клавіш можна використовувати з будь-якої програми.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>&amp;Додаток</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Сполучення клавіш додатку можна використовувати тільки у головному вікні.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Сполучення клавіш вже зареєстровано!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Назва вкладки повинна бути не порожньою та унікальною.&lt;br /&gt;\nВкладку &lt;b&gt;П&amp;amp;римітки&lt;/b&gt; можна відкрити клавішами &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nВикористовуйте &lt;b&gt;/&lt;/b&gt; як роздільник шляху у режимі дерева вкладок.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Назва:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Створити вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Перейменувати вкладку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Перейменувати групу вкладок</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Максимальна кількість елементів:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>стандартна</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Зберігати елементи</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>Вимагати пароль через:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>Час в секундах для кожної вкладки, після якого буде повторно запитуватись пароль шифрування.\n\nЯкщо встановити 0, будуть використовуватись глобальні налаштування.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>глобальні</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Натисніть &apos;/&apos; для пошуку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Введіть текст для пошуку</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Регулярний вираз</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Чутливість до регістру</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_vi.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"vi_VN\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>Giới thiệu về</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>Trình quản lý bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>Tác giả</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>Quyên tặng</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>Hộp thoại hành động</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>Lệ&amp;nh:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>T&amp;iêu chuẩn đầu vào:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>Lưu trữ đầ&amp;u ra tiêu chuẩn:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>Gửi dữ liệu của loại phương tiện đã cho đến đầu vào lệnh tiêu chuẩn (để trống để tắt)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>Tạo các mục từ đầu ra tiêu chuẩn của chương trình (để trống để tắt)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>&amp;Dấu phân cách cho các mục mới:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Biểu thức chính quy để chia đầu ra thành nhiều mục.&lt;\\p&gt;\n&lt;p&gt;Sử dụng &lt;b&gt;\\n&lt;/b&gt; để lưu trữ từng dòng thành mục riêng biệt.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Tab đầu ra:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>Lưu các mục trong tab có tên cụ thể (để trống để lưu vào tab hiện tại)</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>Lỗi: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>Mã thoát: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>Lệnh %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>Trình quản lý quy trình</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>Lọc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>&amp;Chấm dứt đã chọn</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>Thêm lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>Hiển thị/ẩn cửa sổ chính</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>Hiển thị menu khay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>Hiển thị cửa sổ chính dưới con trỏ chuột</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>Chỉnh sửa bảng nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>Chỉnh sửa mục đầu tiên</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>Sao chép mục thứ hai</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>Hiển thị hộp thoại hành động</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>Tạo mục mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>Sao chép mục tiếp theo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>Sao chép mục trước đó</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>Dán bộ nhớ tạm dưới dạng văn bản thuần túy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>Vô hiệu hóa lưu trữ bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>Bật tính năng lưu trữ bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>Dán và sao chép tiếp theo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>Dán và sao chép trước đó</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>Chụp ảnh màn hình</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>Dán ngày và giờ hiện tại</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>Lệnh mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>Bỏ qua các mục không có hoặc có một ký tự</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>Mở trong &amp;Trình duyệt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>Dán dưới dạng Văn bản thuần túy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>Tự động phát video</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>Sao chép URL (địa chỉ web) sang tab khác</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>Tạo hình thu nhỏ (cần ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>Tạo mã QR từ URL (cần qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>Nhiệm vụ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Thêm vào tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>Di chuyển đến tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>Bỏ qua các tập tin đã sao chép</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>Bỏ qua cửa sổ *&quot;Mật khẩu&quot;*</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>Mật khẩu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>Chuyển vào Thùng rác</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(thùng rác)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>Xóa tab hiện tại</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>Không thể thêm mục mới vào tab %1. Vui lòng xóa các mục theo cách thủ công để tạo khoảng trống.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>Hủy thay đổi?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>Bạn có thực sự muốn &lt;strong&gt;hủy thay đổi&lt;/strong&gt; không?</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>Mất kết nối!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>Không thể kết nối với máy chủ! Khởi động máy chủ CopyQ trước.</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>NộI dung bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>&amp;Định dạng:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>&amp;Nội dung:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>Xóa định dạng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>Nội dung mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;Kích thước:&lt;/strong&gt; %1 byte</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>Máy chủ CopyQ đang chạy.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>Hủy lệnh đang có hiệu lực</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>Hủy các lệnh đang hoạt động và thoát?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>Hủy thoát</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>Vẫn thoát</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+Space</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>Lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>Xác định các lệnh mới có thể được gọi tự động trên nội dung bộ nhớ tạm hoặc bởi người dùng từ menu hoặc sử dụng phím tắt hệ thống.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Tìm kiếm:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>&amp;Tải lệnh…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>Lư&amp;u đã chọn…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>Sao chép đã chọn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>Dán lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>Thay đổi chưa được lưu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>Hộp thoại lệnh có những thay đổi chưa được lưu.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>Mở tệp với lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>Lệnh (*.ini);; Cấu hình CopyQ (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>Lưu các lệnh đã chọn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>Lệnh (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>Lưu lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>Không thể lưu lệnh vào tệp &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>Lệnh chứa danh sách các chương trình có đối số sẽ được thực thi. Ví dụ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>Đối số chương trình %1 sẽ được thay thế cho văn bản mục.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>Ký tự %1 có thể được sử dụng để chuyển đầu ra tiêu chuẩn sang chương trình tiếp theo.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>Cú pháp sau có thể được sử dụng để truyền phần còn lại của lệnh dưới dạng tham số đơn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>Điều này cho kết quả đầu ra tương tự như %1 nhưng hữu ích hơn cho các lệnh dài hơn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>Các chức năng được liệt kê dưới đây có thể được sử dụng như trong các lệnh sau.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>&amp;bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>Hiển thị lệnh trợ giúp (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Tên:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>Tên lệnh hiển thị trong menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>Kiểu:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>Chạy lệnh tự động nếu bộ nhớ tạm có nội dung mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>Tự độ&amp;ng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>Hiển thị lệnh trong menu ngữ cảnh của các mục phù hợp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>Trong M&amp;enu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>Phím tắt toàn cục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>Kịch bản</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>Hiển thị</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>&amp;Phím tắt:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>&amp;Phím tắt toàn cục:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>Lện&amp;h</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>&amp;Nâng cao</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>Các mục khớp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>&amp;Nội dung:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>Bỏ qua lệnh nếu văn bản đầu vào không khớp với biểu thức chính quy này (để trống để khớp với mọi thứ).\n\n%2 đến %9 (hoặc đối số [1] trở lên trong tập lệnh) trong Lệnh và Bộ lọc sẽ được thay thế bằng văn bản đã chụp.\n\nVí dụ:\n\n- URL trùng khớp: ^(https?|ftp)://\n- Tên file PDF trùng khớp: \\.pdf$\n- Một ký tự trùng khớp: ^.$\n- Đa phương tiện từ xa trùng khớp: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>&amp;Cửa sổ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Chỉ sử dụng lệnh cho các mục được sao chép vào bộ nhớ tạm từ cửa sổ có văn bản tiêu đề khớp với biểu thức chính quy này (để trống nếu muốn khớp với bất kỳ cửa sổ nào). Trên macOS, phần này chứa tên ứng dụng, theo sau là dấu gạch ngang (&quot;-&quot;), sau đó là tiêu đề cửa sổ. Ví dụ. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>Định dạ&amp;ng:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>Dữ liệu thuộc loại MIME này sẽ được gửi đến đầu vào lệnh tiêu chuẩn.\nĐể trống nếu muốn tắt tính năng này.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>&amp;Bộ lọc:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>Bỏ qua lệnh nếu lệnh lọc không thành công với mã thoát khác 0.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>Hành động</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>Sao ché&amp;p vào tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>Tên tab cần copy mục mới vào (để trống nếu không copy)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>Xóa mục phù hợp\n\nLưu ý: Nếu điều này được áp dụng tự động thì không có lệnh tự động nào khác được thực thi.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>&amp;Xóa mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>Menu Hành động</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>Ẩn cửa sổ sau khi lệnh được kích hoạt từ menu ngữ cảnh của một mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>Ẩn &amp;cửa sổ chính sau khi kích hoạt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>Tùy chọn lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>Đầ&amp;u ra:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>Tạo các mục từ đầu ra tiêu chuẩn của chương trình (để trống nếu muốn tắt)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>&amp;Dấu phân cách:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>Dấu phân cách phù hợp để chia đầu ra thành nhiều mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>&amp;Tab đầu ra:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>Lưu các mục trong tab có tên cụ thể (để trống để lưu trong tab đầu tiên)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>Hiển thị hộp thoại hành động trước khi thực hiện lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>&amp;Đợi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>Thay đổi mục, không tạo thêm mục mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>Chu&amp;yển đổi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>Hiển thị nâng cao</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>Nền</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>Chú giảI công cụ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>Tìm thấy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>Đã chọn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>Số</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>Bình thường</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>Trình biên tập</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>Phông chữ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>Luân phiên</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>Tiền cảnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>Thông báo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>Hiển thị &amp;số</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>Hiển thị thanh cuộn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>Thanh &amp;cuộn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>Sử dụng các biểu tượng từ môi trường máy tính để bàn bất cứ khi nào có thể</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>B&amp;iểu tượng hệ thống</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>Khử bí d&amp;anh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>Đặt màu cho tab, thanh công cụ và menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>Đặt &amp;lại chủ đề</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>Chủ đề:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>&amp;Tải chủ đề</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>&amp;Lưu chủ đề</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>Chỉnh sửa chủ đề hiện tại trong trình chỉnh sửa bên ngoài</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>Chỉ&amp;nh sửa chủ đề</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>Xem trước:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>Mở tệp chủ đề</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>Lưu tệp chủ đề dưới dạng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>Không có trình chỉnh sửa bên ngoài</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>Đặt lệnh soạn thảo bên ngoài trước!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>Chuỗi tìm kiếm là %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>Chọn một mục và\nnhấn F2 để chỉnh sửa.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>Mục ví dụ %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>Một số ghi chú ngẫu nhiên (Shift+F2 để chỉnh sửa)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>&amp;Ngôn ngữ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>Ngắt văn bản nếu nó quá dài để vừa dòng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>Ngắt d&amp;òng văn bản dài</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>Giữ cửa sổ chính phía trên các cửa sổ khác</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>Luô&amp;n ở trên cùng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>Đóng cửa sổ chính khi ứng dụng khác đang tập trung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>Đóng khi không tập trung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>Cho phép mở các cửa sổ trên màn hình hiện tại. Vô hiệu hóa để mở các cửa sổ nơi chúng được đóng lần cuối</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>&amp;Mở các cửa sổ trên màn hình hiện tại</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>Xác nhận thoát ứng dụng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>&amp;Xác nhận thoát ứng dụng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>Chạy ứng dụng khi khởi động hệ thống</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>&amp;Tự động khởi động</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>Ngăn chặn chụp cửa sổ ứng dụng trong ảnh chụp màn hình và bản ghi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>&amp;Ẩn khỏi ảnh chụp màn hình và bản ghi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>Kiểu điều hướng / Sơ đồ bàn phím:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>Hỗ trợ điều hướng Vi (các phím H, J, K, L, / và hơn thế nữa) và điều hướng Emacs (Ctrl+N, P, V và hơn thế nữa)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>Mặc định</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>Lưu và khôi phục lịch sử của bộ lọc mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>Lưu lịch sử bộ lọc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>Tự động hiển thị cửa sổ bật lên để hoàn thành hàm, loại và tên biến trong lệnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>Lệnh tự động hoàn thành</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>Thao tác bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>Cho phép dán nội dung đã sao chép giống như cách chọn chuột (thường là nhấn chuột giữa)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) Dán bộ nhớ tạm bằng chuột</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>Cho phép dán lựa chọn chuột bằng phím tắt (thường là Ctrl+V hoặc Shift+Insert)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) Dán lựa chọn chuột bằng bàn phím</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>Lưu bộ nhớ tạm vào lịch sử</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) Lưu trữ bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>Lưu văn bản đã chọn bằng chuột (lựa chọn chính) trong lịch sử</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) Lưu trữ văn bản đã chọn bằng chuột</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) Chạy lệnh tự động khi chọ</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>Tối đa &amp;số lượng mục trong lịch sử:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>Số mục tối đa trong mỗi tab</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">&amp;Dỡ bỏ tab sau một khoảng thời gian tính bằng phút:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>Tải từng tab khỏi bộ nhớ sau số phút không hoạt động được chỉ định.\n\nĐặt thành 0 để không dỡ tab.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>Lệnh soạn thảo bên ngoài (%&amp;1 là tệp cần chỉnh sửa):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>Lệnh soạn thảo bên ngoài (%1 là tệp cần chỉnh sửa).\n  Ví dụ:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>Ta&amp;b để lưu trữ bộ nhớ tạm:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>Tên tab sẽ tự động lưu trữ nội dung bộ nhớ tạm mới.\n\nĐể trống để tắt tính năng lưu trữ tự động.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>Bỏ chọn phím Return để lưu mục đã chỉnh sửa và Ctrl+Return tạo dòng mới.\n\nLưu ý: Các mục đã chỉnh sửa có thể được lưu bằng phím F2, bỏ qua tùy chọn này.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>Lư&amp;u đã chỉnh sửa mục bằng Ctrl+Return và tạo dòng mới bằng phím Return</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>Hiển thị mô tả dòng đơn của từng mục.\n\nSử dụng Xem trước mục để hiển thị toàn bộ mục.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>Hiển t&amp;hị các mục đơn giản</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>Cho phép tìm kiếm số, nếu không nhấn phím số sẽ kích hoạt mục ở vị trí đó</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>&amp;Tìm kiếm số</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>Kích hoạt mục chỉ bằng một cú nhấp chuột</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>Sau khi mục được kích hoạt (nhấp đúp hoặc phím Enter), sao chép mục đó vào bộ nhớ tạm và ...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>Di chuyển mục lên đầu danh sách sau khi được kích hoạt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>Di chuyển mục tới t&amp;op</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>Đóng cửa sổ chính sau khi mục được kích hoạt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>&amp;Đóng cửa sổ chính</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>Tập trung cửa sổ cuối cùng sau khi mục được kích hoạt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>&amp;Tập trung vào cửa sổ cuối cùng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>Dán vào cửa sổ hiện tại sau khi mục được kích hoạt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>&amp;Dán vào cửa sổ hiện tại</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>Hiển thị/Ẩn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>Ẩn tab (nhấn phím Alt để hiển thị)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>Ẩ&amp;n tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>Ẩn thanh công cụ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>Ẩn than&amp;h công cụ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>Ẩn nhãn thanh &amp;công cụ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>Ẩn cửa sổ chính khi đóng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>Ẩn cửa sổ &amp;chính</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>Bố cục và trong suốt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>Hiển thị cây bằng các tab thay vì thanh tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>Câ&amp;y tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>&amp;Độ trong suốt khi tập trung:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Độ trong suốt của cửa sổ chính nếu tập trung.\n\nLưu ý: Điều này không được hỗ trợ trên tất cả các hệ thống.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>Độ trong s&amp;uốt khi không tập trung:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>Độ trong suốt của cửa sổ chính nếu không tập trung.\n\nLưu ý: Điều này không được hỗ trợ trên tất cả các hệ thống.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>Hiển thị số mục trong tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>Hiển &amp;thị số lượng mục</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>&amp;Vị trí thông báo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>Vị trí trên màn hình để thông báo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>Trên</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>Dưới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>Trên phải</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>Dưới phải</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>Dưới trái</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>Trên trái</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>Khoản&amp;g thời gian tính bằng giây để hiển thị thông báo:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>Khoảng thời gian tính bằng giây để hiển thị thông báo về nội dung bộ nhớ tạm mới hoặc nếu mục được sao chép vào bộ nhớ tạm (chỉ khi cửa sổ chính đóng).\n\nĐặt thành 0 để tắt tính năng này.\n\nĐặt thành -1 để hiển thị cho đến khi được nhấp vào.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>Số dòng dành cho thông báo bộ nhớ tạm:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>Số dòng hiển thị cho nội dung bộ nhớ tạm mới.\n\nĐặt thành 0 để tắt.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>&amp;Sử dụng thông báo gốc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>Hình học thông báo (trong các điểm trên màn hình)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>Bù theo chiều n&amp;gang :</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>Khoảng cách thông báo từ cạnh trái hoặc cạnh phải của màn hình theo điểm màn hình</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>&amp;Bù chiều dọc:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>Khoảng cách thông báo từ cạnh trên hoặc dưới màn hình theo điểm màn hình</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>Chiều &amp;rộng tối đa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>Chiều rộng tối đa cho thông báo tại các điểm trên màn hình</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>&amp;Chiều cao tối đa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>Chiều cao tối đa cho thông báo tại các điểm trên màn hình</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>Không hiển thị biểu tượng khay; thu nhỏ cửa sổ khi đóng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>Vô &amp;hiệu hóa khay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>Hiển thị lệnh cho nội dung bộ nhớ tạm hiện tại trong menu khay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>Hiển t&amp;hị lệnh cho nội dung bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>Số lượng m&amp;ục trong menu khay:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>Số mục trong menu khay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>Hiển thị các mục từ tab hiện tại trong menu khay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>Hiển thị tab hiệ&amp;n tại trong menu,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>hoặc &amp;chọn tab khác:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>Tên tab sẽ hiển thị trong menu khay (trống cho tab đầu tiên)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>Dán mục vào cửa sổ hiện tại sau khi chọn nó trong menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>&amp;Dán mục đã kích hoạt vào cửa sổ hiện tại</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>Hiển thị bản xem trước hình ảnh bên cạnh các mục menu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>&amp;Hiển thị bản xem trước hình ảnh dưới dạng biểu tượng mục menu</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>Tùy chọn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>Chung</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>Bố Cục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>Lịch sử</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>Khay</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>Thông báo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>Mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>Phím tắt</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>Giao diện</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>Giá trị không hợp lệ cho tùy chọn &quot;%1&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>Đặt lại tùy chọn?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>Hành động này sẽ đặt lại tất cả tùy chọn của bạn (trong tất cả các tab) về giá trị mặc định.&lt;br /&gt;&lt;br /&gt;Bạn có thực sự muốn &lt;strong&gt;đặt lại tất cả tùy chọn&lt;/strong&gt; không?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>Yêu cầu khởi động lại</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>Ngôn ngữ sẽ được thay đổi sau khi ứng dụng được khởi động lại.</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>Không tạo được thư mục đồng bộ hóa &quot;%1&quot;!</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Xuống</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>Chọn Biểu Tượng…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>Chọn biểu tượng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>Duyệt...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>Mở tệp biểu tượng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>Tệp ảnh (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>&amp;Tất cả</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>&amp;Tab:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>Cấu hì&amp;nh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>Lệ&amp;nh</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>Lệnh soạn thảo không thành công (xem nhật ký)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>Mã hóa không thành công!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>Để chia sẻ các mục được mã hóa trên máy tính hoặc phiên khác, bạn sẽ cần những tệp khóa bí mật này (giữ chúng ở nơi an toàn):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>Phải cài đặt GnuPG để xem các tab được mã hóa.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>Mã hóa (cần GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>Giải mã</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>Giải mã và sao chép</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>Giải mã và dán</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>Không tạo được khóa.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>Lỗi: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>Hoàn Tất</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>Tạo khóa mới (quá trình này có thể mất vài phút)...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>Hủy</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>Đang đặt mật khẩu mới...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>Khóa mã hóa &lt;strong&gt;phải được tạo&lt;/strong&gt; trước khi có thể sử dụng mã hóa mục.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>Tạo khóa mới...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>Thay đổi mật khẩu...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>Giải mã không thành công!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>Mã hóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>Mã hóa các mục và tab.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>Để mã hóa và giải mã các mục, hãy thêm các lệnh thích hợp trong tab Lệnh.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>Chia sẻ mục và tab được mã hóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>Tab đuợc mã hóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Chỉ định tên của các tab (mỗi tab một dòng) sẽ được mã hóa và giải mã tự động.&lt;/p&gt;\n&lt;p&gt;Đặt khoảng thời gian hủy tải tab trong tab Lịch Sử để dỡ các mục được giải mã khỏi bộ nhớ một cách an toàn.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>Tab bị hỏng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>Không phải tất cả các mục trong tab &lt;strong&gt;%1&lt;/strong&gt; đều được tải thành công. Bạn vẫn muốn tải tab và có khả năng mất một số mục?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>Plugin FakeVim là một phần của Qt Creator</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>Giả lập trình soạn thảo Vim trong khi chỉnh sửa các mục.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>Kích hoạt FakeVim để chỉnh sửa các mục</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>Đường dẫn đến tệp cấu hình:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>Hình ảnh</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>Hiển thị hình ảnh.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>Chiều &amp;rộng tối đa của ảnh:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>Chiều rộng tối đa của hình ảnh được hiển thị trong lịch sử (đặt thành 0 cho kích thước gốc)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>Chiều &amp;cao tối đa của hình ảnh:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>Chiều cao tối đa của hình ảnh được hiển thị trong lịch sử (đặt về 0 cho kích thước gốc)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>&amp;Lệnh biên tập hình ảnh:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>Lệnh soạn thảo cho các định dạng hình ảnh được hỗ trợ ngoài SVG.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>Lệnh soạn thảo &amp;SVG:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>Lệnh soạn thảo cho định dạng ảnh SVG.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>Ghi chú</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>Hiển thị ghi chú cho các mục.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>Vị trí ghi chú</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>Mục trê&amp;n</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>&amp;Mục dưới</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>&amp;Mục bên cạnh</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>Hiển thị chú giả&amp;i công cụ</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>&amp;Thêm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Xóa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>Di chuyển lên</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>Di chuyển xuống</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>Di chuyển lên trên cùng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>Di chuyển xuống dưới cùng</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>Không Thể Xóa Các Mục Đã Ghim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>Bỏ ghim các mục trước để xóa chúng.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>Ghim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>Bỏ ghim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>Mục được ghim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Ghim các mục để khóa chúng trong hàng hiện tại và tránh bị xóa (trừ khi được bỏ ghim).&lt;/p&gt;&lt;p&gt;Cung cấp các phím tắt và chức năng viết tập lệnh.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>Duyệt...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>Mở thư mục để đồng bộ hóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>Không tạo được thư mục đồng bộ hóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>Đồng bộ hóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>Đồng bộ hóa các mục và ghi chú với một thư mục trên đĩa.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>Không đồng bộ được tab &quot;%1&quot; với thư mục &quot;%2&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>Xóa mục?</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>Bạn có thực sự muốn &lt;strong&gt;xóa các mục và tệp được liên kết&lt;/strong&gt; không?</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>Đồng bộ hóa tab và thư mục</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Đồng bộ hóa nội dung của &lt;strong&gt;tab&lt;/strong&gt; với thư mục có &lt;strong&gt;đường dẫn&lt;/strong&gt; nhất định.&lt;/p&gt;\n&lt;p&gt;Đặt &lt;strong&gt;đường dẫn trống&lt;/strong&gt; để không lưu các mục trong &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>Tên tab</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>Đường dẫn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>Tệp sang định dạng dữ liệu mục</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Đặt loại phương tiện thành &lt;strong&gt;-&lt;/strong&gt; (trừ ký tự) để bỏ qua tệp. Mọi tệp không xác định hoặc ẩn khác đều bị bỏ qua.&lt;/p&gt;\n&lt;p&gt;Ví dụ: Tải phần mở rộng tệp &lt;strong&gt;txt&lt;/strong&gt; dưới dạng loại phương tiện &lt;strong&gt;văn bản/thuần túy&lt;/strong&gt;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>Tiện ích mở rộng</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>LoạI phương tiện mục</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>Thêm nhãn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>Xóa nhãn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>Bật/Tắt nhãn %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>Không thể xóa các mục có nhãn bị khóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>Gỡ nhãn các mục trước để loại bỏ chúng.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>Quan trọng</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>Xóa tất cả các nhãn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>Nhãn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>Hiển thị nhãn cho các mục.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>Các mục menu để thêm và xóa thẻ tùy chỉnh có thể được thêm và tùy chỉnh trong hộp thoại Lệnh.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>Thông tin thêm có sẵn trên &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;trang wiki&lt;/a&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>Tên nhãn</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>Trùng khớp</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>Phong cách bảng</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>Màu sắc</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>Biểu tượng</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>Khóa</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>Tránh xóa mục</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>Văn bản</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>Hiển thị văn bản thuần túy và các mục HTML đơn giản.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>Lưu và hiển thị HTML và văn bản đa dạng thức</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>Số dòng tối đa cần hiển thị (0 để hiển thị tất cả):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>Chiều cao tối đa tính bằng pixel (0 để không giới hạn):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>Phong cách bảngmặc định:</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>Nhât ký</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>Mục CopyQ (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>&amp;Hiển thị/Ẩn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>Thoát?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>Bạn có muốn &lt;strong&gt;thoát&lt;/strong&gt; CopyQ không?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Tệp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Chỉnh sửa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>&amp;Mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>&amp;Tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Trợ giúp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>Tab &amp;mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>Đổi tên &amp;nhóm %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>Đổi tê&amp;n tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>&amp;Xóa Tab %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>Xóa nhóm %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Thay đổi biểu tượng tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>&amp;Bộ nhớ tạm: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>Tùy chọn cho nhập</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Lỗi CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>Tuỳ chọn cho xuất</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>Lỗi xuất</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>Không xuất được tập tin %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>Lỗi nhập</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>Không thể nhập tệp %1!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>Xóa tất cả tab trong nhóm?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Bạn có muốn xóa &lt;strong&gt;tất cả các tab&lt;/strong&gt; trong nhóm &lt;strong&gt;%1&lt;/strong&gt; không?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>Xóa Tab?</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>Bạn có muốn xóa tab &lt;strong&gt;%1&lt;/strong&gt; không?</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>Thông tin</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>&amp;bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;ẨN&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n dòng)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;HÌNH ẢNH&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;MỤC&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;TRỐNG&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;DỮ LIỆU&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>&amp;Mục mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>&amp;Nhập...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>&amp;Xuất...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>&amp;Tùy chọn...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>Lệ&amp;nh...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>Hiển thị nội dung &amp;bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>&amp;Hiển thị xem trước</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>&amp;Bật/Tắt lưu trữ bộ nhớ tạm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>T&amp;rình quản lý tiến trình</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>Th&amp;oát</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>&amp;Sắp xếp các mục đã chọn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>Đảo &amp;ngược các mục đã chọn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>&amp;Dán các mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>&amp;Sao chép các mục đã chọn</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>&amp;Tìm thấy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>Lưu mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>Hủy chỉnh sửa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Escape</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>Hoàn tác</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>Làm lại</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>Phông chữ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>In đậm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>In nghiêng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>Gạch chân</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>Gạch ngang</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>Tiền cảnh</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>Nền</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>Xóa kiểu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>Tìm kiếm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>Kí&amp;ch hoạt mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>&amp;Hiển thị nội dung...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>&amp;Xóa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Chỉnh sửa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>Chỉ&amp;nh sửa ghi chú</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>&amp;Chỉnh sửa bằng trình chỉnh sửa</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>&amp;Hành động...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>Di chuyển lên</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Up</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>Di chuyển xuống</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Down</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>Di chuyển lên trên</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>Di chuyển xuống dưới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>Tab &amp;mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>Đổi &amp;tên tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>Xó&amp;a tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>&amp;Thay đổi biểu tượng tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>Tab t&amp;iếp theo</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>Right</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>Tab &amp;trước</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>Left</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Trợ giúp</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>&amp;Hiển thị nhật ký</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Về</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>Mở menu ngữ cảnh mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>Tab %1 bị hỏng hoặc thiếu một số plugin CopyQ!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Tên phiên phải chứa tối đa 16 ký tự\ncó thể là chữ cái, chữ số, &apos;-&apos; hoặc &apos;_&apos;!</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>Đã sao chép văn bản (%n dòng)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>Đã sao chép văn bản</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>Đã sao chép dữ liệu</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">Hủy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>Hiển thị cửa sổ chính và tab mở tùy chọn với tên đã cho.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>TÊN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>Ẩn cửa sổ chính.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>Hiển thị hoặc ẩn cửa sổ chính.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>Mở menu ngữ cảnh.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>Thoát khỏi máy chủ.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>Vô hiệu hóa hoặc kích hoạt lưu trữ nội dung bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>In nội dung bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>In nội dung lựa chọn X11.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>Dán bảng nhớ tạm vào cửa sổ hiện tại\n(có thể không hoạt động với một số ứng dụng).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>Sao chép bộ nhớ tạm từ cửa sổ hiện tại\n(có thể không hoạt động với một số ứng dụng).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>Đặt văn bản bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>VĂN_BẢN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>Đặt nội dung bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DỮ_LIỆU</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>In số lượng mục trong tab hiện tại.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>Sao chép mục trong hàng vào bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>HÀNG</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>Sao chép mục tiếp theo từ tab hiện tại vào bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>Sao chép mục trước đó từ tab hiện tại vào bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>Thêm văn bản vào bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>Chèn văn bản vào hàng nhất định.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>Xóa các mục trong các hàng nhất định.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>HÀNG</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>Chỉnh sửa các mục hoặc chỉnh sửa mục mới.\nGiá trị -1 dành cho văn bản hiện tại trong bộ nhớ tạm.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>Đặt dấu phân cách cho các mục trên đầu ra.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>DẤU_PHÂN_CÁCH</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>In dữ liệu thô của bộ nhớ tạm hoặc mục liên tiếp.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>Viết dữ liệu thô vào hàng nhất định.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>Hiển thị hộp thoại hành động.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>Chạy CHƯƠNG_TRÌNH trên văn bản mục trong các hàng.\nSử dụng %1 trong CHƯƠNG_TRÌNH để chuyển văn bản làm đối số.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>CHƯƠNG_TRÌNH</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>Hiển thị thông báo bật lên trên khay trong THỜI_GIAN mili giây.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TIÊU_ĐỀ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>TIN_NHẮN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>THỜI_GIAN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>Liệt kê tên tab có sẵn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>Chạy lệnh trên tab có tên đã cho.\nTab được tạo nếu nó không tồn tại.\nMặc định là tab đầu tiên.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>LỆNH</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>Xóa tab.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>Đổi tên tab.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>TÊN_MỚI</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>Xuất các mục vào tệp.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>TÊN_TỆP</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>Nhập các mục từ tập tin.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>Liệt kê tất cả các tùy chọn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>Nhận giá trị tùy chọn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>TUỲ_CHỌN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>Đặt giá trị tuỳ chọn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>GIÁ_TRỊ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>Đánh giá kịch bản.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>KỊCH_BẢN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ĐỐI_SỐ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>Bắt đầu hoặc kết nối với phiên bản ứng dụng với tên phiên đã cho.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>PHIÊN</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>In ra help cho LỆNH hoặc tất cả các lệnh.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>In ra phiên bản của chương trình và thư viện.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>Khởi động máy chủ ở chế độ nền trước khi chạy lệnh.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>Cách sử dụng: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>Khởi động máy chủ nếu không có lệnh nào được chỉ định.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  LỆNH:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>GHI_CHÚ:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - Sử dụng đối số dấu gạch ngang (-) để đọc dữ liệu từ đầu vào tiêu chuẩn.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - Sử dụng đối số có dấu gạch ngang kép (--) để đọc tất cả các đối số sau mà không cần\n    mở rộng các chuỗi thoát (tức là \\n, \\t và các chuỗi khác).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - Sử dụng ? để MIME in các loại MIME có sẵn (mặc định là &quot;văn bản/thuần túy&quot;).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>Số đối số không hợp lệ!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Không thể lưu vào tập tin &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">Không thể nhập tập tin &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>Trình quản lý bộ nhớ tạm CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>Lệnh không tìm thấy!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>Chấm dứt máy chủ.\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>Tùy chọn không hợp lệ &quot;%1&quot;!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>Ngoại lệ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>Ngoại lệ trong %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>Không sao chép được vào bộ nhớ tạm!</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>Tab có tên đã cho không tồn tại!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>Tên tab không được để trống!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>Tab có tên đã tồn tại!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*Đã tắt tính năng lưu trữ bộ nhớ tạm*</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>Thêm phím tắt</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>Phím tắt mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>Xóa phím tắt</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>&amp;Tìm kiếm:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>T&amp;oàn cục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>Các phím tắt chung có thể được kích hoạt từ bất kỳ ứng dụng nào.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>Ứn&amp;g dụng</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>Các phím tắt ứng dụng chỉ có thể được kích hoạt từ cửa sổ chính.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>Lối tắt đã tồn tại!</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>Tên tab phải không trống và duy nhất.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; có thể được mở bằng &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nSử dụng &lt;b&gt;/&lt;/b&gt; làm dấu phân cách đường dẫn trong bố cục tab dạng xem dạng cây.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>&amp;Tên:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>Tab mới</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>Đổi tên tab</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>Đổi tên nhóm tab</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>&amp;Số lượng mục tối đa:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>mặc định</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>&amp;Lưu mục</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>Nhấn &apos;/&apos; để tìm kiếm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>Nhập để tìm kiếm</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>Biểu thức chính quy</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>Không phân biệt chữ HOA/thường</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_zh_CN.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"zh_CN\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>关于</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>剪贴板管理器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>作者</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>邮箱</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>主页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>捐赠</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>动作对话框</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>标准输入(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>存储标准输出(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>命令(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>发送给定媒体类型的数据至命令的标准输入（留空以关闭该功能）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>从应用的标准输出创建条目（留空以关闭）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>新建条目的分隔符(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;用于将输出拆分成多个条目的正则表达式。&lt;\\p&gt;\n&lt;p&gt;使用 &lt;b&gt;\\n&lt;/b&gt; 来存储每行分隔的条目。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>输出标签页(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>将条目存入指名的标签页（留空则存入当前标签页）</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">命令已保存</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">命令已保存，可以通过条目菜单访问。\n你可以在首选项中设置命令。</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>错误：%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>退出代码：%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>命令 %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>进程管理器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>过滤</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>中止所选(&amp;T)</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>添加命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>显示/隐藏主窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>显示托盘菜单</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>在鼠标指针下显示主窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>编辑剪贴板</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>编辑首项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>复制第二项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>显示操作对话框</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>创建新项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>复制下一项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>复制上一项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>剪贴板粘贴为纯文本</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>禁用剪贴板存储</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>启用剪贴板存储</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>粘贴并复制下一项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>粘贴并复制上一项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>进行截图</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>粘贴当前日期和时间</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>新建命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>忽略空字符或单个字符的条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>在浏览器中打开(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>粘贴为纯文本</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>自动播放视频</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>复制 URL（网址）到其他标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>创建缩略图（需要 ImageMagick）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>创建 URL 的二维码（需要 qrencode）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>任务</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>添加到%1标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>移动到%1标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>忽略已复制的文件</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>忽略 *&quot;密码&quot;* 窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>移动到垃圾桶</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>（垃圾桶）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>清除当前选项卡</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">不能添加新的条目</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">标签页已满。没有删除任何条目。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>不能添加新的条目到标签页%1. 请手动删除一些条目以腾出空间.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>放弃更改？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>你真的要&lt;strong&gt;放弃更改&lt;/strong&gt;吗？</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>无法连接到服务端！请先启动 CopyQ 服务端。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>连接丢失！</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>剪贴板内容</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>格式(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>内容(&amp;O):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>移除格式</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>条目内容</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;大小:&lt;/strong&gt; %1 字节</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;大小:&lt;/strong&gt; %1 字节</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ 服务端已在运行了。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>取消正在运行的命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>取消正在运行的命令并退出？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>取消退出</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>强制退出</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl + 空格</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>定义新的命令可以在复制新内容时被自动调用，也可以通过菜单或系统快捷键调用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>查找(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>加载命令(&amp;L)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>保存所选(&amp;V)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>复制选择项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>粘贴命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>更改未保存</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>命令对话框还未保存。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>用命令打开文件</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>命令 (*.ini);; CopyQ 配置 (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>保存选中的命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>命令 (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>保存命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>无法将命令保存到文件 &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>显示命令帮助(F1)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>命令包含了一组带有参数的执行程序。例如:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">参数 %1 是整体文本，而 %2 到 %9 则是正则表达式匹配的文本。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>程序参数 %1 将被项目文本替换。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>字符串 %1 将会通过标准输出送到下一个程序。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>可以用下面的语法把剩下的命令作为单一参数传递。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>这与 %1 的输出相同，但对较长命令更有用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>以下命令可以使用下列函数。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>剪贴板(&amp;C)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>名称(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>在菜单中显示的命令名称</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>高级(&amp;A)</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">动作类型</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>如果剪贴板中有新的内容就自动执行命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>自动执行(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>在匹配项的右键菜单中显示本命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>菜单中(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>全局快捷键(&amp;G):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>全局快捷键</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>脚本</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>显示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>匹配项</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the catured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">如果输入文本与此正则表达式不匹配，则跳过该命令（留空以匹配所有内容）。\n\n命令和筛选器中的 %2 到 %9 将被替换为捕获的文本。\n\n示例：\n\n- 匹配 URL: ^(https?|ftp)://\n- 匹配 PDF 文件名: \\.pdf$\n- 匹配单个字符: ^.$\n- 匹配远程多媒体: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>格式(&amp;M)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>此 MIME 类型的数据将发送到标准输入的命令中。\n留空则禁用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>命令(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>当命令从某个条目的右键菜单中激活时隐藏窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>仅改变条目而不创建新条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>转换(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>从程序的标准输出创建条目(留空则禁用)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>显示高级</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>窗口(&amp;W):</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;仅对正则表达式的匹配项执行命令（留空则匹配全部）。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight:600;&quot;&gt; 示例：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  匹配 URL    &lt;span style=&quot;font-weight:600;&quot;&gt; ^(https?|ftp): / /&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  匹配 PDF 文件名    &lt;span style=&quot;font-weight:600;&quot;&gt; \\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  匹配单个字符    &lt;span style=&quot;font-weight:600;&quot;&gt; ^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  匹配远程多媒体     &lt;span style=&quot;font-weight:600;&quot;&gt; ^ http://.*\\.(ogv|vlc|mp4|mp3) $&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>内容(&amp;C):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>类型：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>筛选器(&amp;F):</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;仅在筛选器命令成功执行时执行命令。&lt;/p&gt;\n\n&lt;p&gt;项目文本已被筛选器命令传递到 &lt;b&gt;标准输入&lt;/b&gt;。该项目 &lt;b&gt;筛选器命令的退出代码为 0 时才被匹配&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;使用 &lt;b&gt;%1&lt;/b&gt; 作为参数，&lt;b&gt;%2&lt;/b&gt; 传递给参数由 (括在括号中的部分) 的正则表达式捕获 &lt;b&gt;%9&lt;/b&gt; 项文本。&lt;/p&gt;\n\n&lt;p&gt;使用 &lt;b&gt;|&lt;/b&gt; 链接命令（将标准输出传递到下一个命令）。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>动作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>复制新项目的目标标签页名称（留空则禁用）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>删除匹配项\n\n注意：如果这是自动应用的，则其它自动命令不会被执行。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>删除条目(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>菜单动作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>在激活后隐藏主窗口(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>快捷键(&amp;S):</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">如果输入文本与此正则表达式不匹配，则跳过该命令（留空以匹配所有内容）。\n\n命令和过滤器中的 %2 到 %9 将替换为捕获的文本。\n\n示例：\n\n- 匹配 URL：^(https?|ftp)://\n- 匹配 PDF 文件名： \\.pdf$\n- 匹配单个字符：^.$\n- 匹配远程多媒体： ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;只对从具有匹配该正则表达式的标题文本的窗口复制到剪贴板的条目使用命令（留空则匹配任意窗口）。在macOS系统中，这包括后面跟一个破折号接着是窗口标题的的程序名（&amp;quot;-&amp;quot;）例如&amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>如果筛选器命令失败并出现非零退出代码，则跳过该命令。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>复制到标签页(&amp;Y)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>命令选项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>在执行命令前显示动作对话框</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>等待(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>输出(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>如果输入文本与此正则表达式不匹配，则跳过命令（留空以匹配所有内容）。\n\n命令和过滤器中的 %2 到 %9（或脚本中的参数 [1] 及以上）将被捕获的文本替换。\n\n示例：\n\n- 匹配 URL：^(https?|ftp)://\n- 匹配 PDF 文件名： \\.pdf$\n- 匹配单个字符：^.$\n- 匹配远程多媒体：^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>分隔符(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>分隔符拆分到多个项目的输出相匹配</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>输出标签页(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>将条目存入指定的标签页（留空则存入首个标签页）</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>背景</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">备注</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>发现</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>选中</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>序号</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>正常</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>编辑器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>字体</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>交替</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>前景</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>通知</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>显示序号(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>显示滚动条</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>滚动条(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>尽可能使用桌面环境中的图标</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>主题颜色应用于标签页，工具栏和菜单(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>系统图标(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>提示信息</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>消除锯齿(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>重置主题(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>主题:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>载入主题(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>保存主题(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>使用外部编辑器编辑当前主题</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>编辑主题(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>预览:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>搜索字串为 %1。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>选定一条然后\n按 F2 键来编辑。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>示例 条目 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>这是随机备注（Shift+F2 切换编辑模式）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>打开主题文件</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>主题文件另存为</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>无外部编辑器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>首先要设置外部编辑器命令！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>Abc</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>语言(&amp;L):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>如文本过长，则在窗口边缘折行</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>长文本自动换行(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>保持主窗口在其他窗口之上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>始终置顶</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>其他应用程序获得焦点时关闭主窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>不聚焦时关闭</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>启用以在当前屏幕上打开窗口. 禁用在上次关闭的地方打开窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>在当前屏幕打开窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>退出本程序需要确认</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>确认程序退出</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>系统启动时运行程序</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>自动启动(&amp;A)</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">支持 Vi 编辑器导航键 (H、J、K,、L 及其他)，使用斜杠 (/) 键进行搜索</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">&amp;Vi 风格导航键</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>防止在屏幕截图和录制中捕获应用程序窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>隐藏屏幕截图和录制</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation>对磁盘上的标签页数据进行加密（需要设置密码）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation>加密标签</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation>使用可用的外部密钥库作为加密密码（Windows 凭据存储、macOS 钥匙串、GNOME 密钥环、KWallet）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation>使用外部密钥库</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation>更改用于加密标签页数据的密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation>更改加密方式和密码……</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>导航风格 / 键盘映射：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>支持 Vi 导航（键 H、J、K、L、/ 等）和 Emacs 导航（Ctrl+N、P、V 等）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>默认</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>保存并还原条目筛选器的历史</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>保存筛选器历史</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>自动显示弹出窗口以补全命令中的函数、类型和变量名</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>自动补全的命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>剪贴板操作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>允许以与鼠标选择相同的方式粘贴复制的内容（一般通过按鼠标中键）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) 用鼠标粘贴剪贴板</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>允许使用快捷键（通常是Ctrl+V或Shift+Insert）粘贴鼠标所选项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) 用键盘粘贴鼠标所选</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>在历史中保存剪贴板</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) 存储剪贴板</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>在历史中用鼠标保存所选文本（首选）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) 用鼠标存储选中文本</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) 对所选内容运行自动命令</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>条目历史数量上限：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>每个标签页最大条目数</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">若干分钟后丢弃标签页：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation>间隔一段时间后卸载标签页：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>设定多少分钟后，从内存中丢弃每一个不活动的标签页\n\n设置为 0 则不进行该操作.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation>间隔一段时间后需要输入密码：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation>加密标签页再次需要输入密码的超时时间（秒）。\n\n设置为 0 可全局禁用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>外部编辑器命令（%&amp;1 表示要编辑的文件）：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>外部编辑器命令 (%1 代表需编辑的文件).\n..例如：\n....gedit %1\n....notepad %1\n....gvim -f %1\n....xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>存储剪贴板的标签页(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>自动存储新的剪贴板内容的标签页名称.\n\n留空则禁用自动存储.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>未选中的状态下，按 Return 保存，按 Ctrl+Return 换行.\n\n注：编辑的条目可无视本选项用 F2 保存。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>按 Ctrl+Return 保存编辑条目，按 Return 换行</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>显示每个条目的单行描述.\n\n使用条目预览显示整个条目内容.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>显示条目单行描述</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>允许搜索数字，另外按数字键激活那个位置上的条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>搜索数字</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>单击激活条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>条目激活后(鼠标双击或回车)，复制条目到剪贴板，并...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>在条目被激活后，将其移至列表顶部</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>移动条目到顶端</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>激活条目后，关闭主窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>关闭主窗口(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>激活条目后，聚焦上一个窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>聚焦上一窗口(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>激活条目后，粘贴到当前窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>粘贴到当前窗口(&amp;P)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>显示/隐藏</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>隐藏标签页（按 Alt 键显示）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>隐藏标签页(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>隐藏工具栏</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>隐藏工具栏(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>隐藏工具栏文本标签(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>关闭时隐藏主窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>隐藏主窗口(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>布局和透明度</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>显示为标签树而非标签栏</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>标签树(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>焦点标签透明度(&amp;F)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>主窗口聚焦时的透明度.\n\n注：不是所有系统都支持这个功能.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>&amp;失焦标签透明度：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>主窗口不聚焦时的透明度.\n\n注：不是所有系统都支持这个功能.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>显示标签页中的条目数</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>显示条目计数(&amp;W)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>通知位置(&amp;N)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>通知在屏幕上的位置</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>顶部</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>底部</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>右上角</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>右下角</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>左下角</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>左上角</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>显示通知的间隔（单位:秒）(&amp;E)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>每隔多少秒显示新增的剪贴板内容，或条目是否被复制到剪贴板的通知 (仅当主窗口关闭时)\n\n设置为 0 禁用本选项.\n\n设置为 -1 保持可见直到点击为止.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>剪贴板通知行数(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>新剪贴板内容的显示行数.\n\n设为 0 则禁用.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>使用原生通知(&amp;U)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>通知位置和大小(在屏幕中)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>水平偏移(&amp;Z)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>通知与屏幕左右边缘的距离</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>垂直偏移(&amp;V):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>通知与屏幕上下边缘的距离</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>最大宽度(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>通知的最大宽度</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>最大高度(&amp;X):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>通知的最大高度</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>不显示托盘图标；关闭窗口时最小化到托盘</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>禁用托盘图标(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>在托盘菜单中显示当前对剪贴板内容的命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>显示剪贴板内容命令(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>托盘菜单中剪贴板条目数(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>托盘菜单显示的条目数量</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>在托盘菜单中显示来自当前标签页的条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>在菜单中显示当前标签页,</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>或选择其他标签页:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>在系统托盘显示的标签页的名称(第一个标签页名称为空)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>在菜单中选中条目后粘贴到当前窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>粘贴激活条目到当前窗口(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>在菜单项旁边显示图像预览</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>将图像预览显示为菜单项图标(&amp;O)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">配置</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>通用</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>布局</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>历史</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>托盘</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>通知</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>快捷键</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>外观</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>选项“%1”的值无效</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>重置首选项？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>这项操作将重置您的配置到默认值(所有标签页)。&lt;br /&gt;&lt;br /&gt;您真的需要&lt;strong&gt;重置所有配置吗&lt;/strong&gt;？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>需要重启</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>更改语言需要重启本应用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>选项</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>创建同步文件夹 &quot;%1&quot; 失败！</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Down</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>选择图标…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>...</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>选择图标</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>浏览...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>打开图标文件</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>图片文件 (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>所有(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>标签页(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>配置(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>命令(&amp;M)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">编辑器退出代码为 %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">编辑器命令：%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>编辑器命令失败了 （见日志）</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">保存</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">保存项目 (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">取消</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">取消编辑，还原变更</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">字体</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">粗体</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">斜体</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">下划线</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">删除线</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">前景</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">背景</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">清除样式</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">查找</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">撤销</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">重做</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">共享加密的条目到其他电脑或会话，您需要公私秘钥文件: &lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(保证本私钥在一个安全的地方。)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>必须安装 GnuPG 才能查看加密的标签页。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>加密 (需要 GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>解密</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>解密并复制</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>解密并粘贴</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>回车</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>错误: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>生成密钥失败。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>要在其他计算机或会话上共享加密项目，您将需要这些密钥文件（将它们保存在安全的地方）：</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>完成</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>正在生成新密钥（可能需要几分钟）...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>取消</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>设置新密码...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>加密密钥&lt;strong&gt;必须先被生成&lt;/strong&gt;才能用于条目加密。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>生成新密钥...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>更改密码...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>加密失败！</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>解密失败！</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>加密</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>加密项目和标签页。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>要加密解密条目，需要在本标签页添加合适的命令。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>共享加密条目和标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>加密的标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;指定标签页名称来进行自动加密解密(每行一个)。&lt;/p&gt;\n&lt;p&gt;设置在历史标签页中卸载标签页的时间间隔以便从内存中卸载解密的标签页。&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>损坏的标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>不是所有 &lt;strong&gt;%1&lt;/strong&gt;标签页的项目均已成功加载。你是否仍然希望加载此选项卡并可能丢失一些项目？</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim 插件是 Qt Creator 的一部分</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>编辑项目时模拟 Vim 编辑器.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>编辑项目时启用 FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>配置文件路径:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>图片</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>显示图片。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>图片最大宽度(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>图片在历史记录中显示时的最大宽度(设为0时显示原始尺寸)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>图片最大高度(&amp;H):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>图片在历史记录中显示时的最大高度(设为0时显示原始尺寸)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>图片编辑器命令(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>适用于SVG以外的图片格式.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>&amp;SVG 编辑器命令:</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>适用于 SVG 格式.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>备注</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>显示条目备注。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>备注位置</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>上方条目(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>下方条目(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>旁边条目(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>显示工具提示(&amp;L)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>添加(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>删除(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>上移</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>下移</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>移到顶部</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>移到底部</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">上移(&amp;U)</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">下移(&amp;D)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>不能移除已经固定的条目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>移除条目前请先解除固定。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>固定</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>解除固定</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>已固定条目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;固定条目以锁定它们在当前行并避免删除（除非解除固定）&lt;/p&gt;&lt;p&gt;提供快捷方式和脚本功能&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>浏览...</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>打开需要同步的文件夹</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>创建同步文件夹失败</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>同步</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>使用磁盘上的目录来同步条目和备注。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>在文件夹“%2”中同步标签页“%1”失败！</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>确认移除条目？</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>您确定想&lt;strong&gt;移除条目和与其关联的文件&lt;/strong&gt;吗？</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>同步标签页和目录</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;使用给定的&lt;strong&gt;文件夹路径&lt;/strong&gt;来同步&lt;strong&gt;标签页&lt;/strong&gt;内容。&lt;/p&gt;\n&lt;p&gt;设置为&lt;strong&gt;空路径&lt;/strong&gt;*不*保存&lt;strong&gt;标签页&lt;/strong&gt;中的条目&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>文件夹路径</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>条目数据格式的文件</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;将媒体类型设置成&lt;strong&gt;-&lt;/strong&gt; (减号字符)来忽略文件. 任何其他未知或隐藏的文件都会被忽略.&lt;/p&gt;\n&lt;p&gt;例如: 扩展名为&lt;strong&gt;txt&lt;/strong&gt; 的文件属于 &lt;strong&gt;text/plain&lt;/strong&gt; 媒体类型.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>条目的媒体类型</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;设置MIME类型为&lt;strong&gt;&lt;/strong&gt;（破折号）来忽略文件。任何其他未知或隐藏的文件将被忽略&lt;/p&gt;\n&lt;p&gt;比如：将&lt;strong&gt;txt&lt;/strong&gt;文件扩展名加载为&lt;strong&gt;纯文本&lt;/strong&gt;MIME类型&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>扩展名</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">条目 MIME 类型</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>添加一个标记</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>移除一个标记</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">标记为 %1</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">移除标记 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>切换标记 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>无法移除带已锁定标记的项目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>删除条目前先取消标记。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>重要</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>清理所有标记</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>标记</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>为条目显示标记。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>可在命令对话框中添加和自定义用于添加和删除自定义标记的菜单项.</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>更多信息请查看 &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;Wiki 页面&lt;/a&gt;。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>标记名称</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>匹配</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>样式表</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>颜色</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>图标</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>锁定</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>避免删除项目</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>文本</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>显示纯文本和简单的 HTML 条目。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>保存和显示 HTML 和 富文本</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>要显示的最大行数（0显示所有行）：</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>要显示的最大高度(单位像素，设置为 0 不限制):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>默认样式表：</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">Web</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">显示web页面.</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">最大高度（以像素为单位，设为 0则无限制):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>日志</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>退出？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>你想&lt;strong&gt;退出&lt;/strong&gt; CopyQ 吗？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>文件(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>编辑(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>条目(&amp;I)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>标签页(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>帮助(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>导入选项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation>加密不可用</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation>加密功能不可用（详情请查看日志）。\n\n未来将可以对标签页数据进行加密和解密。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation>导入密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation>请输入导入密码：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation>导出密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation>请输入导出密码（留空则不加密）：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>显示/隐藏(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>导出选项</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>导出错误</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>导出到文件 %1 失败！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>导入错误</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>导入文件 %1 失败！</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">启用剪贴板存储(&amp;E)</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">禁用剪贴板存储(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>CopyQ 错误</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>新建标签页(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>重命名标签页组(&amp;G): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>重命名标签页(&amp;N): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>删除标签页(&amp;M): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>删除标签页组: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>更改标签页图标(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>剪贴板(&amp;C): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ 项目 (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>删除组中的全部标签页？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>你想要删除 &lt;strong&gt;%1&lt;/strong&gt; 标签页组中的&lt;strong&gt;全部标签页&lt;/strong&gt;吗？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>删除标签页？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>你想要删除 &lt;strong&gt;%1&lt;/strong&gt; 标签页吗？</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>信息</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;隐藏&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n 行)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;图像&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;条目&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;空&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;数据&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n 行 &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>会话名称至少包含 16 个字符:\n必须为字母、数字、&quot;-&quot; 或 &quot;_&quot;！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>剪贴板(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>新建条目(&amp;N)</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>导入(&amp;I)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>导出(&amp;E)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>首选项(&amp;P)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">命令/全局快捷键(&amp;O)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>命令(&amp;O)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>显示剪贴板内容(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>开/关剪贴板存储(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>进程管理器(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>退出(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>排序所选条目(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>反转所选条目(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>粘贴条目(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>复制所选条目(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>查找(&amp;F)</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">移动到剪贴板(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>显示内容(&amp;S)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>显示预览(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">移动到剪贴板(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>删除(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>编辑(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>编辑备注(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">使用编辑器编辑(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>动作（命令）(&amp;A)...</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>上移</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl + ↑</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>下移</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl + ↓</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>移到顶部</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>移到底部</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>新建标签页(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>重命名标签页(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>删除标签页(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>更改标签页图标(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>下一个标签页(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>→</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>←</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>打开条目右键菜单</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>上一个标签页(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>保存条目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>取消编辑</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Escape 键</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>撤销</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>重做</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>字体</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>粗体</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>斜体</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>下划线</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>删除线</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>前景</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>背景</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>清除样式</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>查找</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>激活项目(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>用编辑器编辑(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>显示日志(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>关于(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>帮助(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>标签 %1损坏或一些CopyQ插件丢失！</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>文本已复制 (%n 行)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>文本已复制</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>数据已复制</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation>新标签页加密密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation>请输入新密码：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation>密码不匹配。请重试 (%1/%2)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation>更改密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation>新密码不能为空。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation>密码设置失败</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation>密码尝试次数已达上限。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation>确认加密密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation>请重新输入密码以确认：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation>当前标签页加密密码</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation>请输入当前用于加密标签页数据的密码：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation>密码无效。请重试 (%1/%2)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation>密码验证失败</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation>加密文件已损坏</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation>加密文件丢失或损坏。严格模式无法自动恢复加密标签页。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation>更改密码失败</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation>密码更改失败。您的旧密码仍然有效。请查看日志了解详情。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation>密码更改成功</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation>密码已成功更改。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation>正在重新加密标签页……</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation>取消</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation>正在重新加密标签页 %1 of %2: %3</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation>以下标签页加密失败：\n\n%1\n\n请查看日志了解详情。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation>加密失败</translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>隐藏主窗口。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>显示/隐藏主窗口。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>打开上下文菜单。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>退出服务器。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>禁用或启用剪贴板内容存储。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>打印剪贴板内容。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>打印 X11 所选择的内容。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>粘贴剪贴板内容到当前窗口\n（部分程序可能无效）。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>设置剪贴板文本。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXT</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\n设置剪贴板内容。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>复制行中的条目到剪贴板。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ROW</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>复制当前标签页的下一个项目到剪贴板。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>复制当前标签页的上一个项目到剪贴板。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>添加文本到剪贴板。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>插入文本到指定的行。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>删除条目中给出的行。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ROWS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>编辑条目或新建一个。\n值为 -1 时为当前剪贴板中的文本。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>设置输出的条目分隔符。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>打印剪贴板或行中条目的原始数据。</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\n写入原始数据到指定行。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>显示操作对话框。</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\n在指定行内的条目文本中运行 PROGRAM。\nPROGRAM 后的 %1 为参数，用来传递文本参数。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\n显示托盘弹出信息 TIME 毫秒。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITLE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESSAGE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>列出可用的标签页名称。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>于标签页上使用指定名称运行命令。\n如果标签页不存在将创建。\n默认为第一个标签页。</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\n执行 ECMAScript 程序。\n参数可以使用 &quot;arguments[0..N]&quot; 来进行访问。</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">运行程序测试 (后面加 &quot; --help&quot; 参数查看更多信息)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>显示主窗口，可选提供名称打开指定标签页。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>从当前窗口的剪贴板进行复制\n(在某些应用程序里也许无法使用).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>设置剪贴板内容.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>印出当前标签页中项目的数量。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>把原始数据写到给定的行.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>针对各行里的条目文字执行 程序 .\n使用 %1 将条目文字当做参数传给 程序.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>将托盘处弹出消息的显示时间设为 TIME 毫秒.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMMAND</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>删除标签页。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>重命名标签页。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NEW_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>导出条目到文件。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILE_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>从文件中倒入条目。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>列出所有选项。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>获取选项值。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>设置选项值。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALUE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>试运行脚本.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>运行或连接到符合给定会话名称的应用实体.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>显示 COMMAND 或者所有指令的帮助信息.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>显示程序和库文件的版本信息.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>执行命令前，先在后台启动服务器。</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\n使用指定会话名称开始或连接到应用实例。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSION</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\n打印 COMMAND 或所有命令的帮助信息。</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\n打印程序和库的版本。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>用法: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>如果没有指定命令则开始服务。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  COMMAND:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>注意事项：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - 使用双破折号参数(——)读取下面的所有参数而不\n    展开转义序列 (如 \\n, \\t 及其它).</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - 为 MIME 使用 ? 以打印可用的 MIME 类型 (默认为 &quot;text/plain&quot;)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>参数个数不对!</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation>导出文件 &quot;%1&quot; 失败</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation>导入文件 &quot;%1&quot; 失败</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ 剪贴板管理器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>异常</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>无法复制到剪贴板！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>命令未找到！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>正在终止服务器。\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>异常发生在 %1</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">无法保存文件“%1”！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - 使用短横线（-）作为参数以从标准输入读取数据。</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">无法导入文件“%1”！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>无效选项“%1”！</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>不存在该名称的标签页！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>标签页名称不能为空 ！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>已存在同名标签页！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*剪贴板存储已禁用*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>新增快捷键</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>新建快捷键</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;span style=&quot;font-weight:600;&quot;&gt;按下 Esc 来&lt;/span&gt;取消。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">单击此处并按任意键进行组合设置</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>删除快捷方式</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>查找(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>全局(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>可从任意程序触发全局快捷键.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>程序(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>应用程序快捷方式只能从主窗口中触发。</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">只能从主窗口触发程序快捷键.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>快捷方式已存在！</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>标签页名称必须非空且不重复。&lt;br /&gt;\n&lt;b&gt;No&amp;amp;tes&lt;/b&gt; 标签页可以使用快捷键 &lt;b&gt;Alt+T&lt;/b&gt; 打开。&lt;br /&gt;\n标签树布局中可使用 &lt;b&gt;/&lt;/b&gt; 路径分隔符。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>名称(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>新建标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>重命名标签页</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>重命名标签页组</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>最大条目数(&amp;M)：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>默认</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>保存条目(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation>间隔一段时间后需要输入密码：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation>每个标签页再次需要输入加密密码的超时时间（以秒为单位）。\n\n设置为 0 可使用全局设置。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation>全局</translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">&amp;储存条目</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>按 &apos;/&apos; 以进行搜索</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>输入文字进行搜索</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>正则表达式</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>忽略大小写</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "translations/copyq_zh_TW.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"zh_TW\">\n<context>\n    <name>AboutDialog</name>\n    <message>\n        <location filename=\"../src/ui/aboutdialog.ui\" line=\"14\"/>\n        <source>About</source>\n        <translation>關於</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"87\"/>\n        <source>Clipboard Manager</source>\n        <translation>剪貼簿管理器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"94\"/>\n        <source>Author</source>\n        <translation>作者</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"95\"/>\n        <source>E-mail</source>\n        <translation>電子郵件</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"96\"/>\n        <source>Web</source>\n        <translation>網站</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/aboutdialog.cpp\" line=\"97\"/>\n        <source>Donate</source>\n        <translation>贊助</translation>\n    </message>\n</context>\n<context>\n    <name>ActionDialog</name>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"14\"/>\n        <source>Action Dialog</source>\n        <translation>動作對話框</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"33\"/>\n        <source>Co&amp;mmand:</source>\n        <translation>命令(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"58\"/>\n        <source>Standard &amp;input:</source>\n        <translation>標準輸入(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"68\"/>\n        <source>Store standard o&amp;utput:</source>\n        <translation>儲存標準輸出(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"78\"/>\n        <source>Send data of given media type to standard input of command (leave empty to turn off)</source>\n        <translation>將指定的媒體類型資料送至命令的標準輸入 (留白則關閉此輸入)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"85\"/>\n        <source>Create items from standard output of the program (leave empty to turn off)</source>\n        <translation>將程式的標準輸出儲存成項目 (留白則不儲存)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"102\"/>\n        <source>&amp;Separator for new items:</source>\n        <translation>新項目的分隔號(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"112\"/>\n        <source>&lt;p&gt;Regular expression for splitting output into multiple items.&lt;\\p&gt;\n&lt;p&gt;Use &lt;b&gt;\\n&lt;/b&gt; to store each line to separate item.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;將輸出分解成多個項目的類型式。&lt;\\p&gt;\n&lt;p&gt;使用 &lt;b&gt;\\n&lt;/b&gt;儲存每行成分解項目。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"116\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"123\"/>\n        <source>Output &amp;tab:</source>\n        <translation>輸出分頁(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actiondialog.ui\" line=\"133\"/>\n        <source>Save items in tab with given name (leave empty to save in the current tab)</source>\n        <translation>以後面名稱儲存分頁中的項目(要儲存於目前分頁則留白)</translation>\n    </message>\n    <message>\n        <source>Command saved</source>\n        <translation type=\"vanished\">命令已儲存</translation>\n    </message>\n    <message>\n        <source>Command was saved and can be accessed from item menu.\nYou can set up the command in preferences.</source>\n        <translation type=\"vanished\">命令已儲存，能從項目功能表取用\n於偏好中可設定命令。</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandler</name>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"117\"/>\n        <source>Error: %1</source>\n        <translation>錯誤: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"135\"/>\n        <source>Exit code: %1</source>\n        <translation>結束碼: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/actionhandler.cpp\" line=\"169\"/>\n        <source>Command %1</source>\n        <translation>命令 %1</translation>\n    </message>\n</context>\n<context>\n    <name>ActionHandlerDialog</name>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"14\"/>\n        <source>Process Manager</source>\n        <translation>程序管理器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"22\"/>\n        <source>Filter</source>\n        <translation>篩選</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/actionhandlerdialog.ui\" line=\"32\"/>\n        <source>&amp;Terminate Selected</source>\n        <translation>中止所選的(&amp;T)</translation>\n    </message>\n</context>\n<context>\n    <name>AddCommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/addcommanddialog.ui\" line=\"14\"/>\n        <source>Add Commands</source>\n        <translation>加入命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"64\"/>\n        <source>Show/hide main window</source>\n        <translation>顯示/隱藏主窗</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"65\"/>\n        <source>Show the tray menu</source>\n        <translation>顯示通知區圖示功能表</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"66\"/>\n        <source>Show main window under mouse cursor</source>\n        <translation>在滑鼠游標下顯示主窗</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"67\"/>\n        <source>Edit clipboard</source>\n        <translation>編輯剪貼簿</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"68\"/>\n        <source>Edit first item</source>\n        <translation>編輯第一項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"69\"/>\n        <source>Copy second item</source>\n        <translation>複製第二項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"70\"/>\n        <source>Show action dialog</source>\n        <translation>顯示動作對話框</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"71\"/>\n        <source>Create new item</source>\n        <translation>新建項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"72\"/>\n        <source>Copy next item</source>\n        <translation>複製下一項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"73\"/>\n        <source>Copy previous item</source>\n        <translation>複製上一項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"74\"/>\n        <source>Paste clipboard as plain text</source>\n        <translation>將剪貼簿內容轉為純文字貼上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"75\"/>\n        <source>Disable clipboard storing</source>\n        <translation>關閉剪貼簿儲存</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"76\"/>\n        <source>Enable clipboard storing</source>\n        <translation>啟用剪貼簿儲存</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"77\"/>\n        <source>Paste and copy next</source>\n        <translation>貼上與複製下一個</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"78\"/>\n        <source>Paste and copy previous</source>\n        <translation>貼上與複製上一個</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"79\"/>\n        <source>Take screenshot</source>\n        <translation>拍攝畫面快照</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/globalshortcutcommands.cpp\" line=\"80\"/>\n        <source>Paste current date and time</source>\n        <translation>貼上目前日期和時間</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"41\"/>\n        <source>New command</source>\n        <translation>新命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"48\"/>\n        <source>Ignore items with no or single character</source>\n        <translation>忽略無字元或單字元項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"77\"/>\n        <source>Open in &amp;Browser</source>\n        <translation>以瀏覽器開啟(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"85\"/>\n        <source>Paste as Plain Text</source>\n        <translation>作為純文字貼上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"93\"/>\n        <source>Autoplay videos</source>\n        <translation>自動播放視訊</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"102\"/>\n        <source>Copy URL (web address) to other tab</source>\n        <translation>複製 URL (網站位址) 到另一分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"109\"/>\n        <source>Create thumbnail (needs ImageMagick)</source>\n        <translation>建立縮圖 (需要 ImageMagick)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"117\"/>\n        <source>Create QR Code from URL (needs qrencode)</source>\n        <translation>從 URL 建立 QR 碼 (需要 qrencode)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"125\"/>\n        <source>Tasks</source>\n        <comment>Tab name for some predefined commands</comment>\n        <translation>工作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"128\"/>\n        <source>Add to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>加到 %1 分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"136\"/>\n        <source>Move to %1 tab</source>\n        <comment>%1 is quoted Tasks tab name</comment>\n        <translation>移到 %1 分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"144\"/>\n        <source>Ignore copied files</source>\n        <translation>忽略複製的檔案</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"153\"/>\n        <source>Ignore *&quot;Password&quot;* window</source>\n        <translation>忽略 *&quot;密碼&quot;* 窗格</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"154\"/>\n        <source>Password</source>\n        <translation>密碼</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"162\"/>\n        <source>Move to Trash</source>\n        <translation>移到垃圾桶</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"165\"/>\n        <source>(trash)</source>\n        <translation>(垃圾桶)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/predefinedcommands.cpp\" line=\"169\"/>\n        <source>Clear Current Tab</source>\n        <translation>清除目前分頁</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardBrowser</name>\n    <message>\n        <source>Cannot Add New Items</source>\n        <translation type=\"vanished\">無法加入新的項目</translation>\n    </message>\n    <message>\n        <source>Tab is full. Failed to remove any items.</source>\n        <translation type=\"vanished\">分頁已滿，無法移除任何項目。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1573\"/>\n        <source>Cannot add new items to tab %1. Please remove items manually to make space.</source>\n        <translation>無法再加入新項目至 %1 分頁。請手工移除一些項目以騰出空位。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1897\"/>\n        <source>Discard Changes?</source>\n        <translation>放棄變更？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboardbrowser.cpp\" line=\"1898\"/>\n        <source>Do you really want to &lt;strong&gt;discard changes&lt;/strong&gt;?</source>\n        <translation>真想 &lt;strong&gt;放棄變更&lt;/strong&gt; 嗎？</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardClient</name>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"106\"/>\n        <source>Cannot connect to server! Start CopyQ server first.</source>\n        <translation>無法連上伺服器！先啟動 CopyQ 伺服器。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardclient.cpp\" line=\"99\"/>\n        <source>Connection lost!</source>\n        <translation>失去連線！</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardDialog</name>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"20\"/>\n        <source>Clipboard Content</source>\n        <translation>剪貼簿內容</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"73\"/>\n        <source>&amp;Formats:</source>\n        <translation>格式(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"112\"/>\n        <source>C&amp;ontent:</source>\n        <translation>內容(&amp;O):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/clipboarddialog.ui\" line=\"205\"/>\n        <source>Remove Format</source>\n        <translation>移除格式</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"84\"/>\n        <source>Item Content</source>\n        <translation>項目內容</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/clipboarddialog.cpp\" line=\"155\"/>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of clipboard/item data in bytes</comment>\n        <translation>&lt;strong&gt;大小:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n    <message>\n        <source>&lt;strong&gt;Size:&lt;/strong&gt; %1 bytes</source>\n        <comment>Size of data in bytes</comment>\n        <translation type=\"vanished\">&lt;strong&gt;大小:&lt;/strong&gt; %1 bytes</translation>\n    </message>\n</context>\n<context>\n    <name>ClipboardServer</name>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"130\"/>\n        <source>CopyQ server is already running.</source>\n        <translation>CopyQ 伺服器已運行。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"403\"/>\n        <source>Cancel Active Commands</source>\n        <translation>取消目前命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"404\"/>\n        <source>Cancel active commands and exit?</source>\n        <translation>取消目前命令並退出？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"407\"/>\n        <source>Cancel Exiting</source>\n        <translation>取消退出</translation>\n    </message>\n    <message>\n        <location filename=\"../src/app/clipboardserver.cpp\" line=\"408\"/>\n        <source>Exit Anyway</source>\n        <translation>退出</translation>\n    </message>\n</context>\n<context>\n    <name>CommandCompleter</name>\n    <message>\n        <location filename=\"../src/gui/commandcompleter.cpp\" line=\"221\"/>\n        <source>Ctrl+Space</source>\n        <comment>Shortcut to show completion menu</comment>\n        <translation>Ctrl+空格鍵</translation>\n    </message>\n</context>\n<context>\n    <name>CommandDialog</name>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"14\"/>\n        <source>Commands</source>\n        <translation>命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"26\"/>\n        <source>Define new commands that can be either invoked automatically on new clipboard content or by user from menu or using system shortcut.</source>\n        <translation>定義可針對新剪貼簿內容自動呼叫的新命令，或由使用者從功能表，或用系統的快鍵呼叫的新命令。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"51\"/>\n        <source>&amp;Find:</source>\n        <translation>尋找(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"64\"/>\n        <source>&amp;Load Commands…</source>\n        <translation>載入命令(&amp;L)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"74\"/>\n        <source>Sa&amp;ve Selected…</source>\n        <translation>儲存所選(&amp;V)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"84\"/>\n        <source>Copy Selected</source>\n        <translation>複製所選</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commanddialog.ui\" line=\"91\"/>\n        <source>Paste Commands</source>\n        <translation>貼上命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Unsaved Changes</source>\n        <translation>未儲存的變更</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"178\"/>\n        <source>Command dialog has unsaved changes.</source>\n        <translation>命令對話方塊有未儲存的變更。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"256\"/>\n        <source>Open Files with Commands</source>\n        <translation>以命令開啟檔案</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"257\"/>\n        <source>Commands (*.ini);; CopyQ Configuration (copyq.conf copyq-*.conf)</source>\n        <translation>命令 (*.ini);; CopyQ 設定 (copyq.conf copyq-*.conf)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"268\"/>\n        <source>Save Selected Commands</source>\n        <translation>儲存所選命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"269\"/>\n        <source>Commands (*.ini)</source>\n        <translation>命令 (*.ini)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"277\"/>\n        <source>Save Commands</source>\n        <translation>儲存命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commanddialog.cpp\" line=\"278\"/>\n        <source>Failed to save commands to file &quot;%1&quot;: %2</source>\n        <translation>無法將命令儲存到檔案 &quot;%1&quot;: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CommandHelpButton</name>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"56\"/>\n        <source>Command contains list of programs with arguments which will be executed. For example:</source>\n        <translation>命令含有將被執行的、帶有參元的程式清單。例如:</translation>\n    </message>\n    <message>\n        <source>Program argument %1 will be substituted for item text, and %2 through %9 for texts captured by regular expression.</source>\n        <translation type=\"vanished\">項目文會替換程式參元 %1，符合類型式的文字則替換參元 %2 至 %9。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"60\"/>\n        <source>Program argument %1 will be substituted for item text.</source>\n        <translation>程式參元 %1 會被項目文字取代。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"64\"/>\n        <source>Character %1 can be used to pass standard output to the next program.</source>\n        <translation>字元 %1 可將標準輸出傳給下一個程式。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"70\"/>\n        <source>Following syntax can be used to pass rest of the command as single parameter.</source>\n        <translation>以下語法可用來將命令的其餘部分作為單一參元傳遞。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"73\"/>\n        <source>This gives same output as %1 but is more useful for longer commands.</source>\n        <translation>這產生同於 %1 的輸出；於較長命令更有用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"80\"/>\n        <source>Functions listed below can be used as in following commands.</source>\n        <translation>下面列出的函數可以後面範例命令的方式使用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"81\"/>\n        <source>&amp;clipboard</source>\n        <comment>Example tab name</comment>\n        <translation>剪貼簿(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/commandhelpbutton.cpp\" line=\"115\"/>\n        <source>Show command help (F1)</source>\n        <translation>顯示命令説明 (F1)</translation>\n    </message>\n</context>\n<context>\n    <name>CommandWidget</name>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"31\"/>\n        <source>&amp;Name:</source>\n        <translation>名稱(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"41\"/>\n        <source>Command name shown in menu</source>\n        <translation>在功能表中顯示的命令名稱</translation>\n    </message>\n    <message>\n        <source>Type of Action</source>\n        <translation type=\"vanished\">動作類型</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"63\"/>\n        <source>Run the command automatically if clipboard has new content</source>\n        <translation>如果剪貼簿有新內容，自動執行命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"66\"/>\n        <source>Auto&amp;matic</source>\n        <extracomment>Type of command; triggered by whenever clipboard changes</extracomment>\n        <translation>自動的(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"79\"/>\n        <source>Show command in context menu of matching items</source>\n        <translation>在相合項的右鍵功能表中顯示命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"82\"/>\n        <source>In M&amp;enu</source>\n        <extracomment>Type of command; triggered by a custom application shortcut</extracomment>\n        <translation>於功能表(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"197\"/>\n        <source>&amp;Global Shortcut:</source>\n        <translation>全局快鍵(&amp;G):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"95\"/>\n        <source>Global Shortcut</source>\n        <extracomment>Type of command; triggered by a custom global/system shortcut</extracomment>\n        <translation>全域快捷鍵</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"316\"/>\n        <source>Match Items</source>\n        <translation>相合項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"405\"/>\n        <source>Data of this MIME type will be sent to standard input of command.\nLeave empty to disable this.</source>\n        <translation>將給定 MIME 類型的資料，轉送到命令的標準輸入。\n要關閉則留白。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"372\"/>\n        <source>&amp;Window:</source>\n        <translation>窗格(&amp;W):</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use command only for items whose text match this regular expression (leave empty to match anything).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match URL    &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match PDF filenames    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match single character    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  Match remote multimedia    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;項目的文字符合此字串類型式，命令才作用 (留白，則不限項目文字)。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;譬如:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  URL 符合後面類型   &lt;span style=&quot; font-weight:600;&quot;&gt;^(https?|ftp)://&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  PDF 檔名符合後面類型    &lt;span style=&quot; font-weight:600;&quot;&gt;\\.pdf$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  單一字元符合後面類型    &lt;span style=&quot; font-weight:600;&quot;&gt;^.$&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  遠端多媒體符合後面類型    &lt;span style=&quot; font-weight:600;&quot;&gt;^http://.*\\.(ogv|vlc|mp4|mp3)$&lt;/span&gt;&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"346\"/>\n        <source>&amp;Content:</source>\n        <translation>內容(&amp;C):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"416\"/>\n        <source>&amp;Filter:</source>\n        <translation>篩選(&amp;F):</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Use commands only if filter command succeeds.&lt;/p&gt;\n\n&lt;p&gt;Item text is passed to &lt;b&gt;standard input&lt;/b&gt; of the filter command. The item is &lt;b&gt;matched only if the filter command exit code is 0&lt;/b&gt;.&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;%1&lt;/b&gt; for item text passed as argument and &lt;b&gt;%2&lt;/b&gt; to &lt;b&gt;%9&lt;/b&gt; for arguments captured by regular expression (parts enclosed in parentheses).&lt;/p&gt;\n\n&lt;p&gt;Use &lt;b&gt;|&lt;/b&gt; to chain commands (pass standard output to next command).&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;只當篩選命令成功才使用命令。&lt;/p&gt;\n\n&lt;p&gt;項目文被傳送到篩選命令的&lt;b&gt;標準輸入&lt;/b&gt;。該項目 &lt;b&gt;只在篩選命令的結束碼為 0 時，才被挑出&lt;/b&gt;。&lt;/p&gt;\n\n&lt;p&gt;用 &lt;b&gt;%1&lt;/b&gt; 作為參元接收傳送的項目文，並用 &lt;b&gt;%2&lt;/b&gt; 至 &lt;b&gt;%9&lt;/b&gt; 作為參元接收類型式(regular expression)抓出的文 (括在括號中的部分)。&lt;/p&gt;\n\n&lt;p&gt;用 &lt;b&gt;|&lt;/b&gt; 去串接命令 (將標準輸出傳給下一命令)。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"243\"/>\n        <source>Comman&amp;d</source>\n        <translation>命令(&amp;D)</translation>\n    </message>\n    <message>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation type=\"vanished\">如果輸入的文字不合此類型式，則忽略命令 (若是留白，則一定執行命令).\n\n命令與篩選器中的 %2 到 %9 會被截取的文字取代。\n\n例如:\n\n- 找出 URL: ^(https?|ftp)://\n- 找出 PDF 檔名: \\.pdf$\n- 找出單一字元: ^.$\n- 找出遠端多媒體: ^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"447\"/>\n        <source>Action</source>\n        <translation>動作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"480\"/>\n        <source>Name of tab to copy new items into (leave empty not to copy)</source>\n        <translation>新項目會複製過去的分頁的名稱 (不複製則留白)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"492\"/>\n        <source>Remove matching item\n\nNote: If this is applied automatically, no other automatic commands are executed.</source>\n        <translation>刪除相合項目\n\n說明: 如果這自動套用，其他自動命令都不會執行。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"497\"/>\n        <source>&amp;Remove Item</source>\n        <translation>移除項目(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"507\"/>\n        <source>Menu Action</source>\n        <translation>功能表動作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"528\"/>\n        <source>Hide window after command is activated from context menu of an item</source>\n        <translation>命令經項目之右鍵功能表啟動後隱藏窗格</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"531\"/>\n        <source>&amp;Hide main window after activation</source>\n        <translation>啟動後隱藏主窗格(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"722\"/>\n        <source>Show Advanced</source>\n        <translation>進階顯示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"159\"/>\n        <source>&amp;Shortcut:</source>\n        <translation>快鍵(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"382\"/>\n        <source>&lt;p&gt;Use command only for items copied to clipboard from window with title text that matches this regular expression (leave empty to match any window). On macOS, this contains the application name followed by a dash (&amp;quot;-&amp;quot;) then the window title. E.g. &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;對窗格標題文字符合此類型式的窗格中複製到剪貼簿的項目執行命令 (留白，則不加此限制)。於 macOS，則是中橫線後跟隨應用程式名稱(&amp;quot;-&amp;quot;)，再跟隨窗格標題文字。例如 &amp;quot;Safari - GitHub&amp;quot;.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"541\"/>\n        <source>Command options</source>\n        <translation>命令選項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"637\"/>\n        <source>Show action dialog before executing the command</source>\n        <translation>執行命令前，顯示動作對話框</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"640\"/>\n        <source>&amp;Wait</source>\n        <translation>等待(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"647\"/>\n        <source>Change item, don&apos;t create any new items</source>\n        <translation>變更項目內容，而不[由輸出另]建立新項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"650\"/>\n        <source>Tr&amp;ansform</source>\n        <translation>轉換(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"570\"/>\n        <source>O&amp;utput:</source>\n        <translation>輸出(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"275\"/>\n        <source>&amp;Advanced</source>\n        <translation>進階(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"108\"/>\n        <source>Script</source>\n        <extracomment>Type of command; allows to extend scripting capabilities</extracomment>\n        <translation>隨譯即行碼(Script)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"56\"/>\n        <source>Type:</source>\n        <translation>類型:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"121\"/>\n        <source>Display</source>\n        <extracomment>Type of command; allows change how items are displayed</extracomment>\n        <translation>顯示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"356\"/>\n        <source>Skips the command if the input text does not match this regular expression (leave empty to match everything).\n\n%2 through %9 (or argument[1] and up in script) in Command and Filter will be replaced with the captured texts.\n\nExamples:\n\n- Match URL: ^(https?|ftp)://\n- Match PDF filenames: \\.pdf$\n- Match single character: ^.$\n- Match remote multimedia: ^http://.*\\.(ogv|vlc|mp4|mp3)$</source>\n        <translation>若輸入文字不符合此正規表示式，則略過指令（留空則會匹配所有內容）。\n\n在「指令」與「過濾器」中的 %2 至 %9（或指令碼中的 argument[1] 及以上）將被替換為捕獲的文字。\n\n範例：\n\n- 匹配網址：^(https?|ftp)://\n- 匹配 PDF 檔案名稱：\\.pdf$\n- 匹配單一字元：^.$\n- 匹配遠端多媒體：^http://.*\\.(ogv|vlc|mp4|mp3)$</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"389\"/>\n        <source>For&amp;mat:</source>\n        <translation>格式(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"435\"/>\n        <source>Skips the command if the filter command fails with non-zero exit code.</source>\n        <translation>如果篩選命令失敗，並傳回非零值，則忽略命令。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"470\"/>\n        <source>Cop&amp;y to tab:</source>\n        <translation>複製到分頁(&amp;Y):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"580\"/>\n        <source>Create items from standard output of the program (leave empty to disable)</source>\n        <translation>用程式的標準輸出建立項目 (要關閉則留白)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"590\"/>\n        <source>&amp;Separator:</source>\n        <translation>分隔號(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"600\"/>\n        <source>Separator to match for splitting the output to multiple items</source>\n        <translation>將輸出分成多個項目的分隔號</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"603\"/>\n        <source>\\n</source>\n        <translation>\\n</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"610\"/>\n        <source>Output &amp;tab:</source>\n        <translation>輸出分頁(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/commandwidget.ui\" line=\"620\"/>\n        <source>Save items in tab with given name (leave empty to save in first tab)</source>\n        <translation>以指定名稱儲存分頁中的項目(要儲存於目前分頁則留白)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabAppearance</name>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"62\"/>\n        <source>Background</source>\n        <translation>背景</translation>\n    </message>\n    <message>\n        <source>Notes</source>\n        <translation type=\"vanished\">注意事項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"69\"/>\n        <source>Tooltips</source>\n        <translation>提示信息</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"104\"/>\n        <source>Found</source>\n        <translation>找到的</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"111\"/>\n        <source>Selected</source>\n        <translation>所選的</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"174\"/>\n        <source>Number</source>\n        <translation>數</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"181\"/>\n        <source>Normal</source>\n        <translation>一般</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"188\"/>\n        <source>Editor</source>\n        <translation>編輯器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"195\"/>\n        <source>Font</source>\n        <translation>字型</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"223\"/>\n        <source>Alternate</source>\n        <translation>另類</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"230\"/>\n        <source>Foreground</source>\n        <translation>前景</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"251\"/>\n        <source>Notification</source>\n        <translation>通知</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"283\"/>\n        <source>Show &amp;Number</source>\n        <translation>顯示數(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"290\"/>\n        <source>Show scrollbars</source>\n        <translation>顯示捲動列</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"293\"/>\n        <source>S&amp;crollbars</source>\n        <translation>捲動列(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"300\"/>\n        <source>Use icons from desktop environment whenever possible</source>\n        <translation>盡可能使用桌面環境的圖示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"303\"/>\n        <source>S&amp;ystem Icons</source>\n        <translation>系統圖示(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"310\"/>\n        <source>&amp;Antialias</source>\n        <translation>去鋸齒(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"319\"/>\n        <source>S&amp;et colors for tabs, tool bar and menus</source>\n        <translation>設定項目、工具列和功能表的顏色(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"341\"/>\n        <source>&amp;Reset Theme</source>\n        <translation>設回預設主題(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"348\"/>\n        <source>Theme:</source>\n        <translation>主題:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"355\"/>\n        <source>&amp;Load Theme</source>\n        <translation>載入主題(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"362\"/>\n        <source>&amp;Save Theme</source>\n        <translation>儲存主題(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"369\"/>\n        <source>Edit current theme in external editor</source>\n        <translation>於外部編輯器編輯目前主題</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"372\"/>\n        <source>E&amp;dit Theme</source>\n        <translation>編輯主題(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabappearance.ui\" line=\"393\"/>\n        <source>Preview:</source>\n        <translation>預覽:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"472\"/>\n        <source>item</source>\n        <comment>Search expression in preview in Appearance tab.</comment>\n        <translation>項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"474\"/>\n        <source>Search string is %1.</source>\n        <translation>搜尋的字串為 %1。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"475\"/>\n        <source>Select an item and\npress F2 to edit.</source>\n        <translation>選一項目，然後\n按 F2 來編輯。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"477\"/>\n        <source>Example item %1</source>\n        <translation>示例項目 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"482\"/>\n        <source>Some random notes (Shift+F2 to edit)</source>\n        <translation>一些雜記 (Shift+F2 編輯)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"160\"/>\n        <source>Open Theme File</source>\n        <translation>開啟主題檔</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"170\"/>\n        <source>Save Theme File As</source>\n        <translation>主題檔儲存為</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"189\"/>\n        <source>No External Editor</source>\n        <translation>不使用外部編輯器</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"190\"/>\n        <source>Set external editor command first!</source>\n        <translation>首先設定外部編輯器命令！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configtabappearance.cpp\" line=\"390\"/>\n        <source>Abc</source>\n        <comment>Preview text for font settings in appearance dialog</comment>\n        <translation>測試</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabGeneral</name>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"65\"/>\n        <source>&amp;Language:</source>\n        <translation>語言(&amp;L):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"93\"/>\n        <source>Break text if it&apos;s too long to fit on line</source>\n        <translation>如果文字太長，換行</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"96\"/>\n        <source>Wrap l&amp;ong text</source>\n        <translation>長文自動換行(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"103\"/>\n        <source>Keep main window above other windows</source>\n        <translation>保持主窗在其他窗之上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"106\"/>\n        <source>Alwa&amp;ys on Top</source>\n        <translation>總是在上層(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"113\"/>\n        <source>Close main window when other application has focus</source>\n        <translation>其他應用程式處於焦點時，關閉主視窗</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"116\"/>\n        <source>Close When Unfocused</source>\n        <translation>離開焦點時關閉</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"123\"/>\n        <source>Enable to open windows on current screen. Disable to open windows where they were last closed</source>\n        <translation>啟用於目前螢幕開啟窗格。停用於最後關閉窗格處開啟窗格</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"126\"/>\n        <source>O&amp;pen windows on current screen</source>\n        <translation>於目前螢幕開啟窗格(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"133\"/>\n        <source>Confirm application exit</source>\n        <translation>確認要結束應用程式</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"136\"/>\n        <source>Confirm application e&amp;xit</source>\n        <translation>確認應用程式之退出(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"146\"/>\n        <source>Run the application on system startup</source>\n        <translation>於系統啟動時執行應用程式</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"149\"/>\n        <source>&amp;Autostart</source>\n        <translation>自動啟動(&amp;A)</translation>\n    </message>\n    <message>\n        <source>Support for Vi navigation keys (H, J, K, L and more), slash (/) key to search</source>\n        <translation type=\"vanished\">支援 Vi 移動瀏覽鍵 (H, J, K, L 等)，斜線 (/) 鍵以搜尋</translation>\n    </message>\n    <message>\n        <source>&amp;Vi style navigation</source>\n        <translation type=\"vanished\">Vi 式移動瀏覽(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"156\"/>\n        <source>Prevent capturing app windows in screenshots and recordings</source>\n        <translation>防止截圖或錄製本應用程式窗格</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"159\"/>\n        <source>&amp;Hide from screenshots and recordings</source>\n        <translation>潛避螢幕截圖與錄影(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"166\"/>\n        <source>Encrypt tab data on disk (requires password to be set)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"169\"/>\n        <source>Encrypt &amp;Tabs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"176\"/>\n        <source>Use an available external key store for the encryption password (Windows Credential Store, macOS Keychain, GNOME Keyring, KWallet)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"179\"/>\n        <source>&amp;Use external key store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"204\"/>\n        <source>Change the password used to encrypt tab data</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"207\"/>\n        <source>Change Encryption &amp;Password...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"234\"/>\n        <source>Navigation style / Keymap:</source>\n        <translation>導覽風格 / 鍵位對應：</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"244\"/>\n        <source>Support for Vi navigation (keys H, J, K, L, / and more) and Emacs navigation (Ctrl+N, P, V and more)</source>\n        <translation>支援 Vi 導航模式（按鍵 H、J、K、L、/ 及其他按鍵）及 Emacs 導航模式（Ctrl+N、P、V 及其他按鍵）</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"248\"/>\n        <source>Default</source>\n        <translation>預設</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"253\"/>\n        <source>Vi</source>\n        <translation>Vi</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"258\"/>\n        <source>Emacs</source>\n        <translation>Emacs</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"281\"/>\n        <source>Save and restore history of item filters</source>\n        <translation>儲存和還原項目篩選的歷史紀錄</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"284\"/>\n        <source>Save Filter History</source>\n        <translation>儲存篩選歷史</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"291\"/>\n        <source>Automatically show popup to complete function, type and variable names in commands</source>\n        <translation>自動跳出快顯以輔助完成命令中的函式、類型和變數名稱</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"294\"/>\n        <source>Auto-complete Commands</source>\n        <translation>自動輔助完成命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"301\"/>\n        <source>Clipboard Manipulation</source>\n        <translation>剪貼簿內容編輯</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"313\"/>\n        <source>Allow to paste copied content the same way as mouse selections (usually by pressing middle mouse button)</source>\n        <translation>允許貼上複製的內容，就是滑鼠選後自動貼上(通常是藉由按中鍵)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"316\"/>\n        <source>(&amp;3) Paste clipboard with mouse</source>\n        <translation>(&amp;3) 用滑鼠貼上剪貼</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"323\"/>\n        <source>Allow to paste mouse selections using shortcut (usually Ctrl+V or Shift+Insert)</source>\n        <translation>允許用快鍵 (常為 Ctrl+V 或 Shift+Insert) 貼上滑鼠選的</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"326\"/>\n        <source>(&amp;4) Paste mouse selection with keyboard</source>\n        <translation>(&amp;4) 用鍵盤貼上滑鼠選的</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"333\"/>\n        <source>Save clipboard in history</source>\n        <translation>儲存剪貼歷史</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"336\"/>\n        <source>(&amp;1) Store clipboard</source>\n        <translation>(&amp;1) 存放剪貼歷史</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"346\"/>\n        <source>Save text selected with mouse (primary selection) in history</source>\n        <translation>儲存滑鼠所選文字到歷史紀錄</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"349\"/>\n        <source>(&amp;2) Store text selected using mouse</source>\n        <translation>(&amp;2) 儲存滑鼠所選文字</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabgeneral.ui\" line=\"356\"/>\n        <source>(&amp;5) Run automatic commands on selection</source>\n        <translation>(&amp;5) 對所選執行自動命令</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabHistory</name>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"65\"/>\n        <source>Maximum &amp;number of items in history:</source>\n        <translation>歷史紀錄中的項目數量上限(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"77\"/>\n        <source>Maximum number of items in each tab</source>\n        <translation>每一分頁中的項目數量上限</translation>\n    </message>\n    <message>\n        <source>&amp;Unload tab after an interval in minutes:</source>\n        <translation type=\"vanished\">於若干分鐘後卸載分頁(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"105\"/>\n        <source>&amp;Unload tab after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"117\"/>\n        <source>Unload each tab from memory after specified number of minutes of inactivity.\n\nSet to 0 not to unload tabs.</source>\n        <translation>不活動超過指定分鐘數後，從記憶體卸載分頁。\n\n設為 0，則不卸載分頁。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"147\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"159\"/>\n        <source>Timeout in seconds for encrypted tabs to require password again.\n\nSet to 0 to disable globally.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"189\"/>\n        <source>External editor command (%&amp;1 is file to edit):</source>\n        <translation>外部編輯器命令 (%&amp;1 是要編輯的檔案):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"199\"/>\n        <source>External editor command (%1 is file to edit).\n  Examples:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</source>\n        <translation>外部編輯器命令 (%1 表要編輯的檔):\n  例子:\n    gedit %1\n    notepad %1\n    gvim -f %1\n    xterm -e vim %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"214\"/>\n        <source>Ta&amp;b for storing clipboard:</source>\n        <translation>存放剪貼歷史之分頁(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"224\"/>\n        <source>Name of tab that will automatically store new clipboard content.\n\nLeave empty to disable automatic storing.</source>\n        <translation>自動儲存新剪貼的分頁名稱。\n\n留白，則停用自動儲存功能。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"238\"/>\n        <source>Leave unchecked for Return key to save edited item and Ctrl+Return create new line.\n\nNote: Edited items can be saved with F2 disregarding this option.</source>\n        <translation>不勾選，則按 Return 儲存編輯項，Ctrl+Return 換新行。\n\n注意: 編輯項可不顧此選項，以 F2 儲存。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"243\"/>\n        <source>Sa&amp;ve edited item with Ctrl+Return and create new line with Return key</source>\n        <translation>按 Ctrl+Return 儲存編輯項，Return 換新行(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"250\"/>\n        <source>Show single line description of each item.\n\nUse Item Preview to display whole items.</source>\n        <translation>顯示每一項目的首行。\n\n可透過項目預覽顯示整個項目。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"255\"/>\n        <source>Sho&amp;w simple items</source>\n        <translation>簡單顯示項目(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"262\"/>\n        <source>Enable searching for numbers, otherwise pressing a digit key activates item on that position</source>\n        <translation>啟用搜尋號碼，要不然按下數字鍵啟動在該位置的項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"265\"/>\n        <source>S&amp;earch for numbers</source>\n        <translation>搜尋項目號碼(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"275\"/>\n        <source>Activate item with single click</source>\n        <translation>按一下即啟用項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"282\"/>\n        <source>After item is activated (double-click or Enter key), copy it to clipboard and ...</source>\n        <translation>(按兩下或按 Enter) 項目被啟用後，即複製到系統剪貼簿，然後 …</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"288\"/>\n        <source>Move item to the top of the list after it is activated</source>\n        <translation>項目啟用後，移動項目至清單首</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"291\"/>\n        <source>Move item to the t&amp;op</source>\n        <translation>移動項目至首(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"298\"/>\n        <source>Close main window after item is activated</source>\n        <translation>項目啟用後，關閉主窗</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"301\"/>\n        <source>&amp;Close main window</source>\n        <translation>關閉主窗(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"308\"/>\n        <source>Focus last window after item is activated</source>\n        <translation>項目啟用後，移焦至啟用前的視窗</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"311\"/>\n        <source>&amp;Focus last window</source>\n        <translation>移焦至之前最後用的視窗(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"318\"/>\n        <source>Paste to current window after item is activated</source>\n        <translation>項目啟用後，貼到目前窗格</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabhistory.ui\" line=\"321\"/>\n        <source>&amp;Paste to current window</source>\n        <translation>貼到目前窗格(&amp;P)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabLayout</name>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"62\"/>\n        <source>Show/Hide</source>\n        <translation>顯示/隱藏</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"68\"/>\n        <source>Hide tabs (press Alt key to show)</source>\n        <translation>隱藏分頁 (按 alt 鍵顯示)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"71\"/>\n        <source>Hi&amp;de tabs</source>\n        <translation>隱藏分頁(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"78\"/>\n        <source>Hide toolbar</source>\n        <translation>隱藏工具列</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"81\"/>\n        <source>Hide too&amp;lbar</source>\n        <translation>隱藏工具列(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"88\"/>\n        <source>Hide tool&amp;bar labels</source>\n        <translation>隱藏工具列標籤(&amp;B)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"95\"/>\n        <source>Hide main window when closed</source>\n        <translation>關閉時隱藏主窗</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"98\"/>\n        <source>Hide &amp;main window</source>\n        <translation>隱藏主窗(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"108\"/>\n        <source>Layout and Transparency</source>\n        <translation>版面和透明度</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"117\"/>\n        <source>Show tree with tabs instead of tab bar</source>\n        <translation>不以分頁列，而以分頁顯示樹</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"120\"/>\n        <source>Tab T&amp;ree</source>\n        <translation>分頁樹(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"127\"/>\n        <source>&amp;Focused transparency:</source>\n        <translation>焦點時的透明度(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"139\"/>\n        <source>Transparency of main window if focused.\n\nNote: This is not supported on all systems.</source>\n        <translation>處於焦點時，主窗格的透明度。\n\n注意: 並非所有系統支持這個。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"169\"/>\n        <source>&amp;Unfocused transparency:</source>\n        <translation>非焦點時的透明度(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"181\"/>\n        <source>Transparency of main window if unfocused.\n\nNote: This is not supported on all systems.</source>\n        <translation>非處於焦點時，主窗格的透明度\n\n注意: 並非所有系統支持這個。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"211\"/>\n        <source>Show number of items in tabs</source>\n        <translation>顯示分頁中項目的數量</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtablayout.ui\" line=\"214\"/>\n        <source>Sho&amp;w Item Count</source>\n        <translation>顯示項目數量(&amp;W)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabNotifications</name>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"65\"/>\n        <source>&amp;Notification position:</source>\n        <translation>通知的位置(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"77\"/>\n        <source>Position on screen for notifications</source>\n        <translation>通知於螢幕上的位置</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"81\"/>\n        <source>Top</source>\n        <translation>頂</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"86\"/>\n        <source>Bottom</source>\n        <translation>底</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"91\"/>\n        <source>Top Right</source>\n        <translation>頂右</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"96\"/>\n        <source>Bottom Right</source>\n        <translation>底右</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"101\"/>\n        <source>Bottom Left</source>\n        <translation>底左</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"106\"/>\n        <source>Top Left</source>\n        <translation>頂左</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"129\"/>\n        <source>Int&amp;erval in seconds to display notifications:</source>\n        <translation>通知顯示多久(以秒計時)(&amp;E):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"141\"/>\n        <source>Interval in seconds to display notification for new clipboard content or if item is copied to clipboard (only if main window is closed).\n\nSet to 0 to disable this.\n\nSet to -1 to keep visible until clicked.</source>\n        <translation>如有新的剪貼項目複製到系統剪貼簿 (僅當copyq主窗關閉)，顯示通知多久 (以秒為單位)。\n\n設為 0 來停用此功能。\n\n設置為 -1，以維持可見，直到按一下。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"173\"/>\n        <source>Num&amp;ber of lines for clipboard notification:</source>\n        <translation>剪貼簿通知之行數(&amp;B):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"185\"/>\n        <source>Number of lines to show for new clipboard content.\n\nSet to 0 to disable.</source>\n        <translation>顯示剪貼歷史的新[項目]數。\n\n設為 0，則停用此功能。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"212\"/>\n        <source>&amp;Use native notifications</source>\n        <translation>使用作業系統的通知(&amp;U)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"221\"/>\n        <source>Notification Geometry (in screen points)</source>\n        <translation>通知之幾何 (以螢幕點為單位)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"227\"/>\n        <source>Hori&amp;zontal offset:</source>\n        <translation>水平位移量(&amp;Z):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"239\"/>\n        <source>Notification distance from left or right screen edge in screen points</source>\n        <translation>通知與螢幕左邊或右邊的距離 (以螢幕點為單位)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"267\"/>\n        <source>&amp;Vertical offset:</source>\n        <translation>垂直位移量(&amp;V):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"279\"/>\n        <source>Notification distance from top or bottom screen edge in screen points</source>\n        <translation>通知與螢幕上緣或下緣的距離 (以螢幕點為單位)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"307\"/>\n        <source>Maximum &amp;width:</source>\n        <translation>寬度上限(&amp;W):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"319\"/>\n        <source>Maximum width for notification in screen points</source>\n        <translation>螢幕點中的通知的寬度上限</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"344\"/>\n        <source>Ma&amp;ximum height:</source>\n        <translation>最大高度(&amp;X):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabnotifications.ui\" line=\"356\"/>\n        <source>Maximum height for notification in screen points</source>\n        <translation>螢幕點中的通知的高度上限</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigTabTray</name>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"60\"/>\n        <source>Don&apos;t show tray icon; minimize window when closed</source>\n        <translation>不顯示通知區圖示；關閉時最小化視窗</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"63\"/>\n        <source>Disabl&amp;e tray</source>\n        <translation>停用通知區圖示(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"70\"/>\n        <source>Show command for current clipboard content in tray menu</source>\n        <translation>顯示通知區圖示功能表中的目前剪貼歷史的命令</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"73\"/>\n        <source>Sho&amp;w commands for clipboard content</source>\n        <translation>顯示處理剪貼的命令(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"82\"/>\n        <source>N&amp;umber of items in tray menu:</source>\n        <translation>通知區圖示功能表中項目的數量(&amp;U):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"92\"/>\n        <source>Number of items in tray menu</source>\n        <translation>通知區圖示功能表中的項目數量</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"119\"/>\n        <source>Show items from current tab in tray menu</source>\n        <translation>於通知區圖示功能表顯示目前分頁中的項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"122\"/>\n        <source>Show cu&amp;rrent tab in menu,</source>\n        <translation>顯示功能表中的目前分頁(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"129\"/>\n        <source>or &amp;choose other tab:</source>\n        <translation>或選其他分頁(&amp;C):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"145\"/>\n        <source>Name of tab to show in tray menu (empty for the first tab)</source>\n        <translation>顯示於通知區圖示功能表中的分頁名稱 (留白則為首頁)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"170\"/>\n        <source>Paste item to current window after selecting it in menu</source>\n        <translation>選擇功能表中的項目後，貼到目前窗格</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"173\"/>\n        <source>&amp;Paste activated item to current window</source>\n        <translation>雙點項目以貼到目前窗格(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"180\"/>\n        <source>Show image preview next to menu items</source>\n        <translation>於功能表項目旁顯示圖像預覽</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configtabtray.ui\" line=\"183\"/>\n        <source>Sh&amp;ow image preview as menu item icon</source>\n        <translation>以功能表項目圖示顯示圖像預覽(&amp;O)</translation>\n    </message>\n</context>\n<context>\n    <name>ConfigurationManager</name>\n    <message>\n        <source>Configuration</source>\n        <translation type=\"vanished\">設定</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"162\"/>\n        <source>General</source>\n        <translation>一般</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"163\"/>\n        <source>Layout</source>\n        <translation>版面</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"164\"/>\n        <source>History</source>\n        <translation>歷史</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"165\"/>\n        <source>Tray</source>\n        <translation>系統匣</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"166\"/>\n        <source>Notifications</source>\n        <translation>通知</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"167\"/>\n        <source>Tabs</source>\n        <translation>分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"168\"/>\n        <source>Items</source>\n        <translation>項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"169\"/>\n        <source>Shortcuts</source>\n        <translation>快鍵</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"170\"/>\n        <source>Appearance</source>\n        <translation>外觀</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"472\"/>\n        <source>Invalid value for option &quot;%1&quot;</source>\n        <translation>選項 &quot;%1&quot; 的值無效</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"517\"/>\n        <source>Reset preferences?</source>\n        <translation>設回偏好？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"518\"/>\n        <source>This action will reset all your preferences (in all tabs) to default values.&lt;br /&gt;&lt;br /&gt;Do you really want to &lt;strong&gt;reset all preferences&lt;/strong&gt;?</source>\n        <translation>此動作將所有(所有分頁的)偏好回復到預設值。&lt;br /&gt;&lt;br /&gt; 真的要&lt;strong&gt;回復所有偏好&lt;/strong&gt;？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"622\"/>\n        <source>Restart Required</source>\n        <translation>必須重新啟動</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/configurationmanager.cpp\" line=\"623\"/>\n        <source>Language will be changed after application is restarted.</source>\n        <translation>重新啟動應用程式，才會更改語言。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/configurationmanager.ui\" line=\"20\"/>\n        <source>Preferences</source>\n        <translation>選項</translation>\n    </message>\n</context>\n<context>\n    <name>FileWatcher</name>\n    <message>\n        <location filename=\"../plugins/itemsync/filewatcher.cpp\" line=\"654\"/>\n        <source>Failed to create synchronization directory &quot;%1&quot;!</source>\n        <translation>無法建立同步(雙向更新)用的目錄 &quot;%1&quot;！</translation>\n    </message>\n</context>\n<context>\n    <name>FilterCompleter</name>\n    <message>\n        <location filename=\"../src/gui/filtercompleter.cpp\" line=\"172\"/>\n        <source>Alt+Down</source>\n        <comment>Filter completion shortcut</comment>\n        <translation>Alt+Down</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectButton</name>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"21\"/>\n        <source>Select Icon…</source>\n        <translation>選擇圖示…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectbutton.cpp\" line=\"56\"/>\n        <source>...</source>\n        <comment>Select/browse icon.</comment>\n        <translation>…</translation>\n    </message>\n</context>\n<context>\n    <name>IconSelectDialog</name>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"150\"/>\n        <source>Select Icon</source>\n        <translation>選擇圖示</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"157\"/>\n        <source>Browse...</source>\n        <translation>瀏覽…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"203\"/>\n        <source>Open Icon file</source>\n        <translation>開啟圖示檔</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/iconselectdialog.cpp\" line=\"204\"/>\n        <source>Image Files (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</source>\n        <translation>圖片檔 (*.png *.jpg *.jpeg *.bmp *.ico *.svg)</translation>\n    </message>\n</context>\n<context>\n    <name>ImportExportDialog</name>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"17\"/>\n        <source>&amp;All</source>\n        <translation>全部(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"27\"/>\n        <source>&amp;Tabs:</source>\n        <translation>分頁(&amp;T):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"44\"/>\n        <source>Co&amp;nfiguration</source>\n        <translation>組態(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/importexportdialog.ui\" line=\"51\"/>\n        <source>Co&amp;mmands</source>\n        <translation>命令(&amp;M)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditor</name>\n    <message>\n        <source>editor exit code is %1</source>\n        <translation type=\"vanished\">編輯器結束碼是 %1</translation>\n    </message>\n    <message>\n        <source>Editor command: %1</source>\n        <translation type=\"vanished\">編輯器命令: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemeditor.cpp\" line=\"140\"/>\n        <source>Editor command failed (see logs)</source>\n        <translation>執行編輯器命令失敗 (見紀錄)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEditorWidget</name>\n    <message>\n        <source>Save</source>\n        <translation type=\"vanished\">儲存</translation>\n    </message>\n    <message>\n        <source>Save Item (&lt;strong&gt;F2&lt;/strong&gt;)</source>\n        <translation type=\"vanished\">儲存項目 (&lt;strong&gt;F2&lt;/strong&gt;)</translation>\n    </message>\n    <message>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation type=\"vanished\">F2</translation>\n    </message>\n    <message>\n        <source>Cancel</source>\n        <translation type=\"vanished\">取消</translation>\n    </message>\n    <message>\n        <source>Cancel Editing and Revert Changes</source>\n        <translation type=\"vanished\">取消編輯，復原變更</translation>\n    </message>\n    <message>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation type=\"vanished\">Esc</translation>\n    </message>\n    <message>\n        <source>Font</source>\n        <translation type=\"vanished\">字型</translation>\n    </message>\n    <message>\n        <source>Bold</source>\n        <translation type=\"vanished\">粗體</translation>\n    </message>\n    <message>\n        <source>Italic</source>\n        <translation type=\"vanished\">斜體</translation>\n    </message>\n    <message>\n        <source>Underline</source>\n        <translation type=\"vanished\">下劃線</translation>\n    </message>\n    <message>\n        <source>Strikethrough</source>\n        <translation type=\"vanished\">刪除線</translation>\n    </message>\n    <message>\n        <source>Foreground</source>\n        <translation type=\"vanished\">前景</translation>\n    </message>\n    <message>\n        <source>Background</source>\n        <translation type=\"vanished\">背景</translation>\n    </message>\n    <message>\n        <source>Erase Style</source>\n        <translation type=\"vanished\">擦除樣式</translation>\n    </message>\n    <message>\n        <source>Search</source>\n        <translation type=\"vanished\">搜尋</translation>\n    </message>\n    <message>\n        <source>Undo</source>\n        <translation type=\"vanished\">復原</translation>\n    </message>\n    <message>\n        <source>Redo</source>\n        <translation type=\"vanished\">重複</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedLoader</name>\n    <message>\n        <source>To share encrypted items on other computer or session, you&apos;ll need public and secret key files:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(Keep this secret key in a safe place.)&lt;/li&gt;&lt;/ul&gt;</source>\n        <translation type=\"vanished\">要分享加密項目到其他電腦或 Copyq 工作狀態(session)，會需要公開的金鑰與私密的金鑰:&lt;ul&gt;&lt;li&gt;%1&lt;/li&gt;&lt;li&gt;%2&lt;br /&gt;(於安全所在保存此私密金鑰。)&lt;/li&gt;&lt;/ul&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"746\"/>\n        <source>GnuPG must be installed to view encrypted tabs.</source>\n        <translation>一定得安裝 GnuPG 才能檢視加密的分頁。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"840\"/>\n        <source>Encrypt (needs GnuPG)</source>\n        <translation>加密 (需要 GnuPG)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"846\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"857\"/>\n        <source>Ctrl+L</source>\n        <translation>Ctrl+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"851\"/>\n        <source>Decrypt</source>\n        <translation>解密</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"862\"/>\n        <source>Decrypt and Copy</source>\n        <translation>解密並複製</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"867\"/>\n        <source>Ctrl+Shift+L</source>\n        <translation>Ctrl+Shift+L</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"872\"/>\n        <source>Decrypt and Paste</source>\n        <translation>解密並貼上</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"877\"/>\n        <source>Enter</source>\n        <translation>Enter</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"946\"/>\n        <source>Error: %1</source>\n        <translation>錯誤: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"934\"/>\n        <source>Failed to generate keys.</source>\n        <translation>無法產生金鑰。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"671\"/>\n        <source>To share encrypted items on other computer or session, you&apos;ll need these secret key files (keep them in a safe place):</source>\n        <translation>要在其他電腦或工作態共用加密項，需要這些密鑰檔(請存於安全位置):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"951\"/>\n        <source>Done</source>\n        <translation>完成</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"967\"/>\n        <source>Creating new keys (this may take a few minutes)...</source>\n        <translation>產生新金鑰 (需幾分種)…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"968\"/>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"971\"/>\n        <source>Cancel</source>\n        <translation>取消</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"970\"/>\n        <source>Setting new password...</source>\n        <translation>設定新密碼…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"973\"/>\n        <source>Encryption keys &lt;strong&gt;must be generated&lt;/strong&gt; before item encryption can be used.</source>\n        <translation>項目加密前 &lt;strong&gt;一定得產生&lt;/strong&gt;金鑰。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"976\"/>\n        <source>Generate New Keys...</source>\n        <translation>產生新金鑰…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"978\"/>\n        <source>Change Password...</source>\n        <translation>變更密碼…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"395\"/>\n        <source>Encryption failed!</source>\n        <translation>無法加密！</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.cpp\" line=\"984\"/>\n        <source>Decryption failed!</source>\n        <translation>無法解密！</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"82\"/>\n        <source>Encryption</source>\n        <translation>加密</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencrypted.h\" line=\"84\"/>\n        <source>Encrypt items and tabs.</source>\n        <translation>將項目與分頁加密。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemEncryptedSettings</name>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"23\"/>\n        <source>To encrypt and decrypt items add appropriate commands under Commands tab.</source>\n        <translation>要加密、解密項目，得在命令分頁下加入適當的命令。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"70\"/>\n        <source>Sharing Encrypted Items and Tabs</source>\n        <translation>分享加密的項目與分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"92\"/>\n        <source>Encrypted Tabs</source>\n        <translation>加密的分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemencrypted/itemencryptedsettings.ui\" line=\"98\"/>\n        <source>&lt;p&gt;Specify names of tabs (one per line) which will be automatically encrypted and decrypted.&lt;/p&gt;\n&lt;p&gt;Set unload tab interval in History tab to safely unload decrypted items from memory.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;指定會自動加密與解密的分頁名稱(每行一個)。&lt;/p&gt;\n&lt;p&gt;於歷史紀錄分頁設定多久即卸載分頁，以安全地從記憶體卸載解密的項目。&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFactory</name>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"80\"/>\n        <source>Corrupted Tab</source>\n        <translation>損壞的分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"81\"/>\n        <source>Not all items in the tab &lt;strong&gt;%1&lt;/strong&gt; were loaded successfully. Do you still want to load the tab and potentially lose some items?</source>\n        <translation>分頁 &lt;strong&gt;%1&lt;/strong&gt; 中不是所有項目都成功載入。仍想載入分頁，而可能流失一些項目嗎？</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimLoader</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"25\"/>\n        <source>FakeVim</source>\n        <translation>FakeVim</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"27\"/>\n        <source>FakeVim plugin is part of Qt Creator</source>\n        <translation>FakeVim 外掛是 Qt Creator 的一部分</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.h\" line=\"29\"/>\n        <source>Emulate Vim editor while editing items.</source>\n        <translation>編輯項目時，模擬 Vim 編輯器。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemFakeVimSettings</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"17\"/>\n        <source>Enable FakeVim for Editing Items</source>\n        <translation>啟用 FakeVim 來編輯項目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevimsettings.ui\" line=\"24\"/>\n        <source>Path to Configuration File:</source>\n        <translation>設定檔之路徑:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageLoader</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"65\"/>\n        <source>Images</source>\n        <translation>圖片</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimage.h\" line=\"67\"/>\n        <source>Display images.</source>\n        <translation>顯示圖片。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemImageSettings</name>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"19\"/>\n        <source>Maximum Image &amp;Width:</source>\n        <translation>圖片寬度上限(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"34\"/>\n        <source>Maximum width of image displayed in history (set to zero for original size)</source>\n        <translation>於歷史紀錄中顯示的圖片寬度上限 (顯示原始大小，則設為 0)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"59\"/>\n        <source>Maximum Image &amp;Height:</source>\n        <translation>圖片高度上限(&amp;H):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"77\"/>\n        <source>Maximum height of image displayed in history (set to zero for original size)</source>\n        <translation>於歷史紀錄中顯示的圖片高度上限 (顯示原始大小，則設為 0)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"109\"/>\n        <source>&amp;Image editor command:</source>\n        <translation>圖片編輯器命令(&amp;I):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"119\"/>\n        <source>Editor command for supported image formats other than SVG.</source>\n        <translation>SVG 除外的所支援的圖片格式的編輯器命令。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"126\"/>\n        <source>&amp;SVG editor command:</source>\n        <translation>SVG 編輯器命令(&amp;S):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemimage/itemimagesettings.ui\" line=\"136\"/>\n        <source>Editor command for SVG image format.</source>\n        <translation>SVG 圖片格式編輯器命令。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesLoader</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"63\"/>\n        <source>Notes</source>\n        <translation>注意事項</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotes.h\" line=\"65\"/>\n        <source>Display notes for items.</source>\n        <translation>顯示項目之備註。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemNotesSettings</name>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"17\"/>\n        <source>Notes Position</source>\n        <translation>備註位置</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"23\"/>\n        <source>Abo&amp;ve Item</source>\n        <translation>項目之上(&amp;V)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"30\"/>\n        <source>Below Ite&amp;m</source>\n        <translation>項目之下(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"37\"/>\n        <source>Beside Ite&amp;m</source>\n        <translation>項目旁邊(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemnotes/itemnotessettings.ui\" line=\"47\"/>\n        <source>Show Too&amp;l Tip</source>\n        <translation>顯示提示(&amp;T)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemOrderList</name>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"59\"/>\n        <source>&amp;Add</source>\n        <translation>新增(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"72\"/>\n        <source>&amp;Remove</source>\n        <translation>移除(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"82\"/>\n        <source>Move up</source>\n        <extracomment>Button moves current item one row up</extracomment>\n        <translation>移上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"92\"/>\n        <source>Move down</source>\n        <extracomment>Button moves current item one row down</extracomment>\n        <translation>移下</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"102\"/>\n        <source>Move to the top</source>\n        <extracomment>Button moves current item to the top</extracomment>\n        <translation>移至首</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/itemorderlist.ui\" line=\"112\"/>\n        <source>Move to the bottom</source>\n        <extracomment>Button moves current item to the bottom</extracomment>\n        <translation>移至尾</translation>\n    </message>\n    <message>\n        <source>&amp;Up</source>\n        <translation type=\"vanished\">移上(&amp;U)</translation>\n    </message>\n    <message>\n        <source>&amp;Down</source>\n        <translation type=\"vanished\">移下(&amp;D)</translation>\n    </message>\n</context>\n<context>\n    <name>ItemPinnedLoader</name>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"179\"/>\n        <source>Cannot Remove Pinned Items</source>\n        <translation>無法移除已被釘選的項目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"180\"/>\n        <source>Unpin items first to remove them.</source>\n        <translation>先解除釘選才能移除它們。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"333\"/>\n        <source>Pin</source>\n        <translation>釘選</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.cpp\" line=\"341\"/>\n        <source>Unpin</source>\n        <translation>取消釘選</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"83\"/>\n        <source>Pinned Items</source>\n        <translation>已釘選項目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itempinned/itempinned.h\" line=\"86\"/>\n        <source>&lt;p&gt;Pin items to lock them in current row and avoid deletion (unless unpinned).&lt;/p&gt;&lt;p&gt;Provides shortcuts and scripting functionality.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;釘選項目以將它們鎖於目前行，避免被刪除 (除非取消釘選)。&lt;/p&gt;&lt;p&gt;供快鍵和隨譯即行程式碼使用。&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncLoader</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"111\"/>\n        <source>Browse...</source>\n        <comment>Button text for opening file dialog to select synchronization directory</comment>\n        <translation>瀏覽…</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"726\"/>\n        <source>Open Directory for Synchronization</source>\n        <translation>開啟與分頁同步(雙向更新)的目錄</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"739\"/>\n        <source>Failed to create synchronization directory</source>\n        <translation>無法建立用來同步(雙向更新)的目錄</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"120\"/>\n        <source>Synchronize</source>\n        <translation>同步(雙向更新)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.h\" line=\"122\"/>\n        <source>Synchronize items and notes with a directory on disk.</source>\n        <translation>項目、備註與磁碟上的目錄同步(雙向更新)。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSaver</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"427\"/>\n        <source>Failed to synchronize tab &quot;%1&quot; with directory &quot;%2&quot;!</source>\n        <translation>無法同步(雙向更新)&quot;%1&quot;分頁與&quot;%2&quot;目錄！</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"461\"/>\n        <source>Remove Items?</source>\n        <translation>移除項目？</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsync.cpp\" line=\"462\"/>\n        <source>Do you really want to &lt;strong&gt;remove items and associated files&lt;/strong&gt;?</source>\n        <translation>真要 &lt;strong&gt;移除項目與它同步的檔案&lt;/strong&gt;？</translation>\n    </message>\n</context>\n<context>\n    <name>ItemSyncSettings</name>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"24\"/>\n        <source>Synchronization Tabs and Directories</source>\n        <translation>分頁與目錄同步(雙向更新)</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"42\"/>\n        <source>&lt;p&gt;Synchronize contents of &lt;strong&gt;tab&lt;/strong&gt; with directory with given &lt;strong&gt;path&lt;/strong&gt;.&lt;/p&gt;\n&lt;p&gt;Set &lt;strong&gt;empty path&lt;/strong&gt; not to save items in &lt;strong&gt;tab&lt;/strong&gt;.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;&lt;strong&gt;分頁&lt;/strong&gt;內容與指定&lt;strong&gt;路徑&lt;/strong&gt;的目錄同步(雙向更新)。&lt;/p&gt;\n&lt;p&gt;設成&lt;strong&gt;空路徑&lt;/strong&gt;就不會儲存&lt;strong&gt;分頁&lt;/strong&gt;中的項目。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"63\"/>\n        <source>Tab Name</source>\n        <translation>分頁名稱</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"68\"/>\n        <source>Path</source>\n        <translation>路徑</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"88\"/>\n        <source>Files to Item Data Formats</source>\n        <translation>項目檔對應到項目資料格式</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"106\"/>\n        <source>&lt;p&gt;Set media type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; media type.&lt;/p&gt;</source>\n        <translation>&lt;p&gt;媒體類型設成 &lt;strong&gt;-&lt;/strong&gt; (減號字元) 以忽略檔案。任何其他未知或隱藏檔會被忽略。&lt;/p&gt;\n&lt;p&gt;例如: 若採用 &lt;strong&gt;text/plain&lt;/strong&gt; 媒體類型，則會載入以 &lt;strong&gt;txt&lt;/strong&gt; 為附檔名的檔案。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"126\"/>\n        <source>Item Media Type</source>\n        <translation>項目媒體類型</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (minus character) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;將 MIME 類型設成 &lt;strong&gt;-&lt;/strong&gt; (短橫線字元)以忽略有此類型的檔案的雙向更新。會忽略其他未知副檔名與類型的檔案或隱藏檔。&lt;/p&gt;\n&lt;p&gt;例如，設定  &lt;strong&gt;txt&lt;/strong&gt; (副檔名的)檔對應 &lt;strong&gt;text/plain&lt;/strong&gt; (MIME 項目類型) 的項目。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <source>&lt;p&gt;Set MIME type to &lt;strong&gt;-&lt;/strong&gt; (dash) to ignore files. Any other unknown or hidden files are ignored.&lt;/p&gt;\n&lt;p&gt;Example: Load &lt;strong&gt;txt&lt;/strong&gt; file extension as &lt;strong&gt;text/plain&lt;/strong&gt; MIME type.&lt;/p&gt;</source>\n        <translation type=\"vanished\">&lt;p&gt;將 MIME 類型設成 &lt;strong&gt;-&lt;/strong&gt; (短橫線) 以忽略[有此類型的資料的雙向更新]。會忽略其他未知[副檔名與類型的檔案]或隱藏檔。&lt;/p&gt;\n&lt;p&gt;例如，設定 &lt;strong&gt;txt&lt;/strong&gt; (副檔名) 的檔對應 &lt;strong&gt;text/plain&lt;/strong&gt; (MIME 項目類型) 的項目。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemsync/itemsyncsettings.ui\" line=\"121\"/>\n        <source>Extensions</source>\n        <translation>副檔名</translation>\n    </message>\n    <message>\n        <source>Item MIME Type</source>\n        <translation type=\"vanished\">項目的 MIME 類型</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"140\"/>\n        <source>Add a Tag</source>\n        <translation>新增標籤</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"145\"/>\n        <source>Remove a Tag</source>\n        <translation>移除標籤</translation>\n    </message>\n    <message>\n        <source>Tag as %1</source>\n        <translation type=\"vanished\">加上 %1 標籤</translation>\n    </message>\n    <message>\n        <source>Remove tag %1</source>\n        <translation type=\"vanished\">移除 %1 標籤</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"166\"/>\n        <source>Toggle Tag %1</source>\n        <translation>切換標籤 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"597\"/>\n        <source>Cannot Remove Items With a Locked Tag</source>\n        <translation>無法移除帶有鎖固標籤的項目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"598\"/>\n        <source>Untag items first to remove them.</source>\n        <translation>移除項目的標籤，以移除項目。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"711\"/>\n        <source>Important</source>\n        <comment>Tag name for example command</comment>\n        <translation>重要</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.cpp\" line=\"741\"/>\n        <source>Clear all tags</source>\n        <translation>移除所有標籤</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"111\"/>\n        <source>Tags</source>\n        <translation>標籤</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtags.h\" line=\"113\"/>\n        <source>Display tags for items.</source>\n        <translation>顯示項目的標籤。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTagsSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"17\"/>\n        <source>Menu items for adding and removing custom tags can be added and customized in Commands dialog.</source>\n        <translation>可在命令對話框中加入與自訂，用來加入、移除標籤的功能表項目。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"27\"/>\n        <source>More info is available on &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki page&lt;/a&gt;.</source>\n        <translation>更多的資訊在 &lt;a href=&quot;https://copyq.readthedocs.io/en/latest/tags.html&quot;&gt;wiki 網頁&lt;/a&gt;。</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"38\"/>\n        <source>Tag Name</source>\n        <translation>標籤名稱</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"43\"/>\n        <source>Match</source>\n        <translation>比對</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"48\"/>\n        <source>Style Sheet</source>\n        <translation>樣式表</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"53\"/>\n        <source>Color</source>\n        <translation>顏色</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"58\"/>\n        <source>Icon</source>\n        <translation>圖示</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"63\"/>\n        <source>Lock</source>\n        <translation>鎖固</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtags/itemtagssettings.ui\" line=\"66\"/>\n        <source>Avoid removing item</source>\n        <translation>避免移除項目</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextLoader</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"63\"/>\n        <source>Text</source>\n        <translation>純文字</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtext.h\" line=\"65\"/>\n        <source>Display plain text and simple HTML items.</source>\n        <translation>顯示純文字項目和 HTML 項目。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemTextSettings</name>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"17\"/>\n        <source>Save and display HTML and rich text</source>\n        <translation>儲存與顯示 HTML 和 RTF 項目</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"26\"/>\n        <source>Maximum number of lines to display (0 to show all):</source>\n        <translation>顯示行數的上限 (0 則全顯示):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"60\"/>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation>高度上限 (以 Pixen 為單位) (0 則無上限):</translation>\n    </message>\n    <message>\n        <location filename=\"../plugins/itemtext/itemtextsettings.ui\" line=\"92\"/>\n        <source>Default style sheet:</source>\n        <translation>預設樣式表:</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebLoader</name>\n    <message>\n        <source>Web</source>\n        <translation type=\"vanished\">網站</translation>\n    </message>\n    <message>\n        <source>Display web pages.</source>\n        <translation type=\"vanished\">顯示網站頁面。</translation>\n    </message>\n</context>\n<context>\n    <name>ItemWebSettings</name>\n    <message>\n        <source>Maximum height in pixels (0 for no limit):</source>\n        <translation type=\"vanished\">高度上限 (以 Pixen 為單位) (0 則無上限):</translation>\n    </message>\n</context>\n<context>\n    <name>LogDialog</name>\n    <message>\n        <location filename=\"../src/ui/logdialog.ui\" line=\"14\"/>\n        <source>Log</source>\n        <translation>紀錄</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>CopyQ</source>\n        <translation type=\"vanished\">CopyQ</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"895\"/>\n        <source>Exit?</source>\n        <translation>結束？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"896\"/>\n        <source>Do you want to &lt;strong&gt;exit&lt;/strong&gt; CopyQ?</source>\n        <translation>想要 &lt;strong&gt;結束&lt;/strong&gt; CopyQ？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"954\"/>\n        <source>&amp;File</source>\n        <translation>檔案(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1000\"/>\n        <source>&amp;Edit</source>\n        <translation>編輯(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1024\"/>\n        <source>&amp;Item</source>\n        <translation>項目(&amp;I)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1028\"/>\n        <source>&amp;Tabs</source>\n        <translation>分頁(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1053\"/>\n        <source>&amp;Help</source>\n        <translation>說明(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1078\"/>\n        <source>&amp;New Tab</source>\n        <translation>新增分頁(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1080\"/>\n        <source>Rename &amp;Group %1</source>\n        <translation>重新命名群組 %1(&amp;G)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1082\"/>\n        <source>Re&amp;name Tab %1</source>\n        <translation>重新命名 %1 分頁(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1084\"/>\n        <source>Re&amp;move Tab %1</source>\n        <translation>移除 %1 分頁(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1086\"/>\n        <source>Remove Group %1</source>\n        <translation>移除群組 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1088\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>變更分頁圖示(&amp;C)</translation>\n    </message>\n    <message>\n        <source>&amp;Enable Clipboard Storing</source>\n        <translation type=\"vanished\">啟用剪貼歷史之儲存(&amp;E)</translation>\n    </message>\n    <message>\n        <source>&amp;Disable Clipboard Storing</source>\n        <translation type=\"vanished\">停用剪貼歷史之儲存(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"510\"/>\n        <source>Options for Import</source>\n        <translation>用於匯入 CopyQ 的選項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"2725\"/>\n        <source>CopyQ Error</source>\n        <comment>Notification error message title</comment>\n        <translation>Copyq 錯誤</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"857\"/>\n        <source>&amp;Show/Hide</source>\n        <translation>顯示/隱藏(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"530\"/>\n        <source>Encryption Unavailable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"531\"/>\n        <source>Encryption is not available (see logs for details).\n\nIt will be possible to encrypt and decrypt tab data.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"593\"/>\n        <source>Import Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"594\"/>\n        <source>Enter password for import:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"617\"/>\n        <source>Export Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"618\"/>\n        <source>Enter password for export (empty for no encryption):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4297\"/>\n        <source>Options for Export</source>\n        <translation>用於匯出 CopyQ 的選項</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4328\"/>\n        <source>Export Error</source>\n        <translation>匯出 CopyQ 錯誤</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4329\"/>\n        <source>Failed to export file %1!</source>\n        <translation>匯出檔案 %1失敗！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4437\"/>\n        <source>Import Error</source>\n        <translation>匯入 CopyQ 錯誤</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4438\"/>\n        <source>Failed to import file %1!</source>\n        <translation>匯入檔案 %1失敗！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"1131\"/>\n        <source>&amp;Clipboard: %1</source>\n        <comment>Tray menu clipboard item format</comment>\n        <translation>剪貼簿內容(&amp;C): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"303\"/>\n        <source>CopyQ Items (*.cpq)</source>\n        <translation>CopyQ 項目 (*.cpq)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4616\"/>\n        <source>Remove All Tabs in Group?</source>\n        <translation>移除群組中的所有分頁？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4617\"/>\n        <source>Do you want to remove &lt;strong&gt;all tabs&lt;/strong&gt; in group &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>想移除&lt;strong&gt;%1&lt;/strong&gt;群組中的&lt;strong&gt;所有分頁&lt;/strong&gt;？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4664\"/>\n        <source>Remove Tab?</source>\n        <translation>移除分頁？</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/mainwindow.cpp\" line=\"4665\"/>\n        <source>Do you want to remove tab &lt;strong&gt;%1&lt;/strong&gt;?</source>\n        <translation>想要移除&lt;strong&gt;%1&lt;/strong&gt;分頁？</translation>\n    </message>\n</context>\n<context>\n    <name>Proxy</name>\n    <message>\n        <location filename=\"../plugins/itemfakevim/itemfakevim.cpp\" line=\"516\"/>\n        <source>Information</source>\n        <translation>資訊</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"414\"/>\n        <source>&lt;HIDDEN&gt;</source>\n        <comment>Label for hidden/secret clipboard content</comment>\n        <translation>&lt;隱藏&gt;</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/common/common.cpp\" line=\"420\"/>\n        <source>%1 (%n lines)</source>\n        <comment>Label for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>%1 (%n 行)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"430\"/>\n        <source>&lt;IMAGE&gt;</source>\n        <comment>Label for image in clipboard</comment>\n        <translation>&lt;圖片&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"432\"/>\n        <source>&lt;ITEMS&gt;</source>\n        <comment>Label for copied items in clipboard</comment>\n        <translation>&lt;項目&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"434\"/>\n        <source>&lt;EMPTY&gt;</source>\n        <comment>Label for empty clipboard</comment>\n        <translation>&lt;空&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/common.cpp\" line=\"436\"/>\n        <source>&lt;DATA&gt;</source>\n        <comment>Label for data in clipboard</comment>\n        <translation>&lt;資料&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"32\"/>\n        <source>Backspace</source>\n        <comment>Key to remove item or MIME on OS X</comment>\n        <translation>Backspace</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/shortcuts.cpp\" line=\"34\"/>\n        <source>Delete</source>\n        <comment>Key to remove item or MIME</comment>\n        <translation>Delete</translation>\n    </message>\n    <message numerus=\"yes\">\n        <source>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n lines &amp;mdash;&lt;/small&gt;&lt;/div&gt;</source>\n        <comment>Notification label for multi-line text in clipboard</comment>\n        <translation type=\"vanished\">\n            <numerusform>%1&lt;div align=&quot;right&quot;&gt;&lt;small&gt;&amp;mdash; %n 行 &amp;mdash;&lt;/small&gt;&lt;/div&gt;</numerusform>\n        </translation>\n    </message>\n    <message>\n        <source>%1</source>\n        <comment>Notification label for single-line text in clipboard</comment>\n        <translation type=\"vanished\">%1</translation>\n    </message>\n    <message>\n        <location filename=\"../src/main.cpp\" line=\"292\"/>\n        <source>Session name must contain at most 16 characters\nwhich can be letters, digits, &apos;-&apos; or &apos;_&apos;!</source>\n        <translation>Copyq 工作態名稱至多指允許 16 個字元\n可以是字母、數字、&apos;-&apos; 或 &apos;_&apos;！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/common/appconfig.cpp\" line=\"22\"/>\n        <source>&amp;clipboard</source>\n        <comment>Default name of the tab that automatically stores new clipboard content</comment>\n        <translation>剪貼簿(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"42\"/>\n        <source>&amp;New Item</source>\n        <translation>新項目(&amp;N)</translation>\n    </message>\n    <message>\n        <source>Ctrl+I</source>\n        <translation type=\"vanished\">Ctrl+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>&amp;Import...</source>\n        <translation>匯入(&amp;I)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"46\"/>\n        <source>&amp;Export...</source>\n        <translation>匯出(&amp;E)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>&amp;Preferences...</source>\n        <translation>偏好(&amp;P)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"48\"/>\n        <source>Ctrl+P</source>\n        <translation>Ctrl+P</translation>\n    </message>\n    <message>\n        <source>C&amp;ommands/Global Shortcuts...</source>\n        <translation type=\"vanished\">命令/全局快鍵(&amp;O)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"51\"/>\n        <source>C&amp;ommands...</source>\n        <translation>命令(&amp;O)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"52\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"54\"/>\n        <source>Show &amp;Clipboard Content</source>\n        <translation>顯示剪貼簿內容(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"55\"/>\n        <source>Ctrl+Shift+C</source>\n        <translation>Ctrl+Shift+C</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"58\"/>\n        <source>&amp;Toggle Clipboard Storing</source>\n        <translation>開/關剪貼簿之儲存(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"59\"/>\n        <source>Ctrl+Shift+X</source>\n        <translation>Ctrl+Shift+X</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"60\"/>\n        <source>P&amp;rocess Manager</source>\n        <translation>程序管理器(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"61\"/>\n        <source>Ctrl+Shift+Z</source>\n        <translation>Ctrl+Shift+Z</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>E&amp;xit</source>\n        <translation>離開(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"62\"/>\n        <source>Ctrl+Q</source>\n        <translation>Ctrl+Q</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"65\"/>\n        <source>&amp;Sort Selected Items</source>\n        <translation>排序所選項(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"66\"/>\n        <source>Ctrl+Shift+S</source>\n        <translation>Ctrl+Shift+S</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"68\"/>\n        <source>&amp;Reverse Selected Items</source>\n        <translation>反排所選項(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"69\"/>\n        <source>Ctrl+Shift+R</source>\n        <translation>Ctrl+Shift+R</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"71\"/>\n        <source>&amp;Paste Items</source>\n        <translation>貼上項目(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"73\"/>\n        <source>&amp;Copy Selected Items</source>\n        <translation>複製所選項目(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"75\"/>\n        <source>&amp;Find</source>\n        <translation>尋找(&amp;F)</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <translation type=\"vanished\">複製到剪貼簿(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"109\"/>\n        <source>&amp;Show Content...</source>\n        <translation>顯示[項目]內容(&amp;S)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"110\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"56\"/>\n        <source>&amp;Show Preview</source>\n        <translation>顯示預覽(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"57\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <source>Move to &amp;Clipboard</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation type=\"vanished\">複製到剪貼簿，並移成剪貼史首項(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"111\"/>\n        <source>&amp;Remove</source>\n        <translation>移除(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>&amp;Edit</source>\n        <translation>編輯(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"113\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"115\"/>\n        <source>Edit &amp;Notes</source>\n        <translation>編輯備註(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"116\"/>\n        <source>Shift+F2</source>\n        <translation>Shift+F2</translation>\n    </message>\n    <message>\n        <source>E&amp;dit with editor</source>\n        <translation type=\"vanished\">以編輯器編輯(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"118\"/>\n        <source>Ctrl+E</source>\n        <translation>Ctrl+E</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>&amp;Action...</source>\n        <translation>動作(&amp;A)…</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"119\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"122\"/>\n        <source>Move Up</source>\n        <translation>移上</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"123\"/>\n        <source>Ctrl+Up</source>\n        <translation>Ctrl+Up</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"124\"/>\n        <source>Move Down</source>\n        <translation>移下</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"125\"/>\n        <source>Ctrl+Down</source>\n        <translation>Ctrl+Down</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"126\"/>\n        <source>Move to Top</source>\n        <translation>移至首</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"127\"/>\n        <source>Ctrl+Home</source>\n        <translation>Ctrl+Home</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"128\"/>\n        <source>Move to Bottom</source>\n        <translation>移至尾</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"129\"/>\n        <source>Ctrl+End</source>\n        <translation>Ctrl+End</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"131\"/>\n        <source>&amp;New Tab</source>\n        <translation>新增分頁(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"132\"/>\n        <source>Ctrl+T</source>\n        <translation>Ctrl+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"133\"/>\n        <source>R&amp;ename Tab</source>\n        <translation>重新命名分頁(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"134\"/>\n        <source>Ctrl+F2</source>\n        <translation>Ctrl+F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"135\"/>\n        <source>Re&amp;move Tab</source>\n        <translation>移除分頁(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"136\"/>\n        <source>Ctrl+W</source>\n        <translation>Ctrl+W</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"137\"/>\n        <source>&amp;Change Tab Icon</source>\n        <translation>變更分頁圖示(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"138\"/>\n        <source>Ctrl+Shift+T</source>\n        <translation>Ctrl+Shift+T</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"139\"/>\n        <source>Ne&amp;xt Tab</source>\n        <translation>下一分頁(&amp;X)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"140\"/>\n        <source>Right</source>\n        <comment>Default shortcut to focus next tab</comment>\n        <translation>右邊</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"143\"/>\n        <source>Left</source>\n        <comment>Default shortcut to focus previous tab</comment>\n        <translation>左邊</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"153\"/>\n        <source>Open Item Context Menu</source>\n        <translation>開啟項目快顯功能表</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"154\"/>\n        <source>Shift+F10</source>\n        <comment>Default shortcut to open item context menu</comment>\n        <translation>Shift+F10</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"142\"/>\n        <source>&amp;Previous Tab</source>\n        <translation>上一分頁(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"44\"/>\n        <source>Ctrl+Shift+I</source>\n        <translation>Ctrl+Shift+I</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"78\"/>\n        <source>Save Item</source>\n        <translation>儲存項目</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"79\"/>\n        <source>F2</source>\n        <comment>Shortcut to save item editor changes</comment>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"80\"/>\n        <source>Cancel Editing</source>\n        <translation>取消編輯</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"81\"/>\n        <source>Escape</source>\n        <comment>Shortcut to revert item editor changes</comment>\n        <translation>Esc</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"82\"/>\n        <source>Undo</source>\n        <translation>撤回上個動作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"84\"/>\n        <source>Redo</source>\n        <translation>再次上個動作</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"86\"/>\n        <source>Font</source>\n        <translation>字型</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"88\"/>\n        <source>Bold</source>\n        <translation>粗體</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"90\"/>\n        <source>Italic</source>\n        <translation>斜體</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"92\"/>\n        <source>Underline</source>\n        <translation>底線</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"94\"/>\n        <source>Strikethrough</source>\n        <translation>刪除線</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"96\"/>\n        <source>Foreground</source>\n        <translation>前景</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"98\"/>\n        <source>Background</source>\n        <translation>背景</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"100\"/>\n        <source>Erase Style</source>\n        <translation>移除樣式</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"102\"/>\n        <source>Search</source>\n        <translation>搜尋</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"106\"/>\n        <source>A&amp;ctivate Items</source>\n        <comment>copies selected items to clipboard and moves them to top (depending on settings)</comment>\n        <translation>使用項目(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"117\"/>\n        <source>E&amp;dit with Editor</source>\n        <translation>用編輯器編輯(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>&amp;Show Log</source>\n        <translation>顯示紀錄(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"148\"/>\n        <source>F12</source>\n        <translation>F12</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"150\"/>\n        <source>&amp;About</source>\n        <translation>關於(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/menuitems.cpp\" line=\"146\"/>\n        <source>&amp;Help</source>\n        <translation>說明(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/item/itemfactory.cpp\" line=\"463\"/>\n        <source>Tab %1 is corrupted or some CopyQ plugins are missing!</source>\n        <translation>%1 分頁已損壞或某些 CopyQ 外掛遺失！</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2283\"/>\n        <source>Text Copied (%n lines)</source>\n        <comment>Notification title for multi-line text in clipboard</comment>\n        <translation>\n            <numerusform>已複製的文字 (%n 行)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2286\"/>\n        <source>Text Copied</source>\n        <comment>Notification title for single-line text in clipboard</comment>\n        <translation>已複製的文字</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2302\"/>\n        <source>Data Copied</source>\n        <comment>Notification title for a copied data in clipboard</comment>\n        <translation>已複製的資料</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"155\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"265\"/>\n        <source>New Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"157\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"266\"/>\n        <source>Enter new password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"158\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"320\"/>\n        <source>Passwords did not match. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"171\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"337\"/>\n        <source>Change Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"172\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"338\"/>\n        <source>New password cannot be empty.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"177\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"206\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"369\"/>\n        <source>Password Setup Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"178\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"207\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"246\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"370\"/>\n        <source>Maximum password attempts exceeded.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"188\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"347\"/>\n        <source>Confirm Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"189\"/>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"348\"/>\n        <source>Re-enter password to confirm:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"226\"/>\n        <source>Current Tab Encryption Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"228\"/>\n        <source>Enter current password for encrypting tab data:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"229\"/>\n        <source>Invalid password. Please try again (%1/%2):</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"245\"/>\n        <source>Password Verification Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"399\"/>\n        <source>Encryption Files Corrupted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"400\"/>\n        <source>Encryption files are missing or corrupted. Strict mode cannot recover encrypted tabs automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"436\"/>\n        <source>Change Password Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"437\"/>\n        <source>Failed to change password. Your old password is still active. Please check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"445\"/>\n        <source>Change Password Successful</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"446\"/>\n        <source>Password has been changed successfully.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"461\"/>\n        <source>Re-encrypting tabs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"462\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">取消</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"491\"/>\n        <source>Re-encrypting tab %1 of %2: %3</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"539\"/>\n        <source>Failed to encrypt the following tabs:\n\n%1\n\nPlease check the logs for details.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/encryptionpassword.cpp\" line=\"543\"/>\n        <source>Encryption Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Scriptable</name>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"54\"/>\n        <source>Show main window and optionally open tab with given name.</source>\n        <translation>顯示主窗；可加上名稱(NAME)，以開啟指定分頁。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"55\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"144\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"148\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"151\"/>\n        <source>NAME</source>\n        <translation>NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"57\"/>\n        <source>Hide main window.</source>\n        <translation>隱藏主窗。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"59\"/>\n        <source>Show or hide main window.</source>\n        <translation>顯示或隱藏主窗。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"61\"/>\n        <source>Open context menu.</source>\n        <translation>開啟(通知區圖示的)右鍵功能表。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"63\"/>\n        <source>Exit server.</source>\n        <translation>結束伺服器。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"65\"/>\n        <source>Disable or enable clipboard content storing.</source>\n        <translation>停用或啟用剪貼簿之儲存。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"68\"/>\n        <source>Print clipboard content.</source>\n        <translation>印出系統剪貼簿內容。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"69\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"73\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"84\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"120\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>MIME</source>\n        <translation>MIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"72\"/>\n        <source>Print X11 selection content.</source>\n        <translation>印出 X11 選取的內容。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"76\"/>\n        <source>Paste clipboard to current window\n(may not work with some applications).</source>\n        <translation>將系統剪貼簿內容貼到目前窗格\n(在某些應用程式可能無作用)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"79\"/>\n        <source>Copy clipboard from current window\n(may not work with some applications).</source>\n        <translation>將目前窗格內容複製到系統剪貼簿\n(在某些應用程式可能無作用)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"81\"/>\n        <source>Set clipboard text.</source>\n        <translation>設定剪貼簿內的文字。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"82\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"99\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"103\"/>\n        <source>TEXT</source>\n        <translation>TEXT</translation>\n    </message>\n    <message>\n        <source>\nSet clipboard content.</source>\n        <translation type=\"vanished\">\n設定剪貼簿的內容。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"85\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"86\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"121\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"122\"/>\n        <source>DATA</source>\n        <translation>DATA</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"89\"/>\n        <source>Print amount of items in current tab.</source>\n        <translation>印出目前分頁中項目的數量。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"91\"/>\n        <source>Copy item in the row to clipboard.</source>\n        <translation>複製目前項目到剪貼簿。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"92\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"102\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"110\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"117\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"119\"/>\n        <source>ROW</source>\n        <translation>ROW</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"94\"/>\n        <source>Copy next item from current tab to clipboard.</source>\n        <translation>將目前分頁的下一項複製到剪貼簿。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"96\"/>\n        <source>Copy previous item from current tab to clipboard.</source>\n        <translation>將目前分頁的上一項複製到剪貼簿。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"98\"/>\n        <source>Add text into clipboard.</source>\n        <translation>將文字(TEXT)加入剪貼簿。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"101\"/>\n        <source>Insert text into given row.</source>\n        <translation>將文字(TEXT)插入指定行(ROW)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"105\"/>\n        <source>Remove items in given rows.</source>\n        <translation>移除各指定行(ROWS)的項目。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"106\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"126\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"130\"/>\n        <source>ROWS</source>\n        <translation>ROWS</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"108\"/>\n        <source>Edit items or edit new one.\nValue -1 is for current text in clipboard.</source>\n        <translation>編輯項目或編輯新項目。\n～Value -1 is for current text in clipboard.</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"113\"/>\n        <source>Set separator for items on output.</source>\n        <translation>輸出時放入項目分隔號。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"114\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>SEPARATOR</source>\n        <translation>SEPARATOR</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"116\"/>\n        <source>Print raw data of clipboard or item in row.</source>\n        <translation>印出歷史項目的原始資料(raw data)。</translation>\n    </message>\n    <message>\n        <source>\nWrite raw data to given row.</source>\n        <translation type=\"vanished\">\n將原始資料(raw data)寫入指定項目所在行(row)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"125\"/>\n        <source>Show action dialog.</source>\n        <translation>顯示動作對話框。</translation>\n    </message>\n    <message>\n        <source>\nRun PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation type=\"vanished\">\n對行(rows)中項目文字執行程式(PROGRAM)。\n於程式(PROGRAM)中用 %1 將文字作為參數傳遞。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"131\"/>\n        <source>PROGRAM</source>\n        <translation>PROGRAM</translation>\n    </message>\n    <message>\n        <source>\nShow tray popup message for TIME milliseconds.</source>\n        <translation type=\"vanished\">\n顯示 TIME 的通知區圖示的彈出訊息時間(以毫秒為單位)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"83\"/>\n        <source>Set clipboard content.</source>\n        <translation>設定剪貼簿內容。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"118\"/>\n        <source>Write raw data to given row.</source>\n        <translation>將原始資料寫入指定行。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"128\"/>\n        <source>Run PROGRAM on item text in the rows.\nUse %1 in PROGRAM to pass text as argument.</source>\n        <translation>對行中項目文字執行 PROGRAM。\n於 PROGRAM 中用 %1，可將文字作為參元傳入 PROGRAM。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"133\"/>\n        <source>Show tray popup message for TIME milliseconds.</source>\n        <translation>於 TIME 微秒顯示系統匣彈出訊息。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"134\"/>\n        <source>TITLE</source>\n        <translation>TITLE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"135\"/>\n        <source>MESSAGE</source>\n        <translation>MESSAGE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"136\"/>\n        <source>TIME</source>\n        <translation>TIME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"139\"/>\n        <source>List available tab names.</source>\n        <translation>列出可用的分頁名稱。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"141\"/>\n        <source>Run command on tab with given name.\nTab is created if it doesn&apos;t exist.\nDefault is the first tab.</source>\n        <translation>對指定名稱的分頁執行命令。\n若分頁不存在，就會新增分頁。\n預設是第一分頁。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"145\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"179\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"184\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>COMMAND</source>\n        <translation>COMMAND</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"147\"/>\n        <source>Remove tab.</source>\n        <translation>移除分頁。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"150\"/>\n        <source>Rename tab.</source>\n        <translation>重新命名分頁。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"152\"/>\n        <source>NEW_NAME</source>\n        <translation>NEW_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"155\"/>\n        <source>Export items to file.</source>\n        <translation>匯出項目至檔案。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"156\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"159\"/>\n        <source>FILE_NAME</source>\n        <translation>FILE_NAME</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"158\"/>\n        <source>Import items from file.</source>\n        <translation>從檔案匯入項目。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"162\"/>\n        <source>List all options.</source>\n        <translation>列出所有選項。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"164\"/>\n        <source>Get option value.</source>\n        <translation>取得選項值。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"165\"/>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"168\"/>\n        <source>OPTION</source>\n        <translation>OPTION</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"167\"/>\n        <source>Set option value.</source>\n        <translation>設定選項值。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"169\"/>\n        <source>VALUE</source>\n        <translation>VALUE</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"171\"/>\n        <source>Evaluate script.</source>\n        <translation>執行隨意即行碼。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"175\"/>\n        <source>Starts or connects to application instance with given session name.</source>\n        <translation>以指定的工作態(session)名稱，啟動或連接到應用程式實例。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"178\"/>\n        <source>Print help for COMMAND or all commands.</source>\n        <translation>於螢幕印出 COMMAND 的說明或全部命令的說明。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"181\"/>\n        <source>Print version of program and libraries.</source>\n        <translation>於螢幕印出程式與程式庫的版本。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"183\"/>\n        <source>Start server in background before running a command.</source>\n        <translation>執行命令前先於背景啟動伺服器。</translation>\n    </message>\n    <message>\n        <source>\nEvaluate ECMAScript program.\nArguments are accessible using with &quot;arguments[0..N]&quot;.</source>\n        <translation type=\"vanished\">\n執行(Evaluate) ECMAScript 程式。\n用 &quot;arguments[0..N]&quot; 去讀寫參數。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"172\"/>\n        <source>SCRIPT</source>\n        <translation>SCRIPT</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"173\"/>\n        <source>ARGUMENTS</source>\n        <translation>ARGUMENTS</translation>\n    </message>\n    <message>\n        <source>\nStarts or connects to application instance with given session name.</source>\n        <translation type=\"vanished\">\n以指定的 copyq 工作(SESSION)，啟動或連到應用程式個例。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/commandhelp.cpp\" line=\"176\"/>\n        <source>SESSION</source>\n        <translation>SESSION</translation>\n    </message>\n    <message>\n        <source>\nPrint help for COMMAND or all commands.</source>\n        <translation type=\"vanished\">\n印出某命令(COMMAND)或所有命令的說明。</translation>\n    </message>\n    <message>\n        <source>\nPrint version of program and libraries.</source>\n        <translation type=\"vanished\">\n印出程式與程式庫的版本(version)。</translation>\n    </message>\n    <message>\n        <source>Run application tests (append --help argument for more info).</source>\n        <translation type=\"vanished\">執行應用程式測試 (附加 &quot;--help&quot; 參元可得更多資訊)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"115\"/>\n        <source>Usage: copyq [%1]</source>\n        <translation>用法: copyq [%1]</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"116\"/>\n        <source>Starts server if no command is specified.</source>\n        <translation>若沒指定命令，啟動伺服器。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"117\"/>\n        <source>  COMMANDs:</source>\n        <translation>  命令:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"122\"/>\n        <source>NOTES:</source>\n        <translation>注意事項:</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"124\"/>\n        <source>  - Use double-dash argument (--) to read all following arguments without\n    expanding escape sequences (i.e. \\n, \\t and others).</source>\n        <translation>  - 用雙短橫線參元 (--)，使以不展開脫逸字串(如 \\n, \\t 等)的方式，讀取後面所有參元。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"126\"/>\n        <source>  - Use ? for MIME to print available MIME types (default is &quot;text/plain&quot;).</source>\n        <translation>  - 用 &quot;?&quot; 印出所有可用的 MIME 類型 (預設值是 &quot;text/plain&quot;)。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"131\"/>\n        <source>Invalid number of arguments!</source>\n        <translation>無效的參元數量！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"578\"/>\n        <source>Failed to export file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"583\"/>\n        <source>Failed to import file &quot;%1&quot;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"720\"/>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"755\"/>\n        <source>CopyQ Clipboard Manager</source>\n        <translation>CopyQ 剪貼簿管理員</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2915\"/>\n        <source>Exception</source>\n        <translation>異常</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"3031\"/>\n        <source>Failed to copy to clipboard!</source>\n        <translation>複製到剪貼簿失敗！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"123\"/>\n        <source>  - Use dash argument (-) to read data from standard input.</source>\n        <translation>  - 用短橫線參元 (-) 使從標準輸入讀入資料。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"767\"/>\n        <source>Command not found!</source>\n        <translation>未找到命令！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"866\"/>\n        <source>Terminating server.\n</source>\n        <translation>正結束伺服器。\n</translation>\n    </message>\n    <message>\n        <source>Cannot save to file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">無法存到檔案 &quot;%1&quot;！</translation>\n    </message>\n    <message>\n        <source>Cannot import file &quot;%1&quot;!</source>\n        <translation type=\"vanished\">無法匯入檔案 &quot;%1&quot;！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"1438\"/>\n        <source>Invalid option &quot;%1&quot;!</source>\n        <translation>無效選項 &quot;%1&quot;！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptable.cpp\" line=\"2916\"/>\n        <source>Exception in %1</source>\n        <translation>在 %1 有異常</translation>\n    </message>\n</context>\n<context>\n    <name>ScriptableProxy</name>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"647\"/>\n        <source>Tab with given name doesn&apos;t exist!</source>\n        <translation>有給定名稱的項目不存在！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"652\"/>\n        <source>Tab name cannot be empty!</source>\n        <translation>分頁名稱不可空白！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"993\"/>\n        <source>Tab with given name already exists!</source>\n        <translation>有給定名稱的分頁已存在！</translation>\n    </message>\n    <message>\n        <location filename=\"../src/scriptable/scriptableproxy.cpp\" line=\"2221\"/>\n        <source>*Clipboard Storing Disabled*</source>\n        <comment>Main window title if clipboard storing is disabled</comment>\n        <translation>*已停用剪貼簿儲存*</translation>\n    </message>\n    <message>\n        <source>%1 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label)</comment>\n        <translation type=\"vanished\">%1 - CopyQ</translation>\n    </message>\n    <message>\n        <source>%1 - %2 - CopyQ</source>\n        <comment>Main window title format (%1 is clipboard content label, %2 is session name)</comment>\n        <translation type=\"vanished\">%1 - %2 - CopyQ</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutButton</name>\n    <message>\n        <location filename=\"../src/gui/shortcutbutton.cpp\" line=\"27\"/>\n        <source>Add shortcut</source>\n        <translation>新增快鍵</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutDialog</name>\n    <message>\n        <location filename=\"../src/ui/shortcutdialog.ui\" line=\"14\"/>\n        <source>New Shortcut</source>\n        <translation>新增快鍵</translation>\n    </message>\n    <message>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Press any key combination. &lt;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt; to cancel.&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;span style=&quot; font-weight:600;&quot;&gt;Escape&lt;/span&gt;取消。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <source>Click here and press any key combination</source>\n        <translation type=\"vanished\">點按此，然後按下鍵的組合</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutdialog.cpp\" line=\"22\"/>\n        <source>Remove Shortcut</source>\n        <translation>刪除快鍵</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutsWidget</name>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"31\"/>\n        <source>&amp;Find:</source>\n        <translation>尋找(&amp;F):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"50\"/>\n        <source>Gl&amp;obal</source>\n        <translation>全局(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"56\"/>\n        <source>Global shortcuts can be triggered from any application.</source>\n        <translation>全局快鍵在任何應用程式都可作用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"77\"/>\n        <source>A&amp;pplication</source>\n        <translation>應用程式(&amp;P)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/shortcutswidget.ui\" line=\"83\"/>\n        <source>Application shortcuts can only be triggered from the main window.</source>\n        <translation>應用程式快鍵只在CopyQ主窗取得焦點時有作用。</translation>\n    </message>\n    <message>\n        <source>Application shortcuts can be triggered only from the main window.</source>\n        <translation type=\"vanished\">應用程式快鍵只在主窗格有作用。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/shortcutswidget.cpp\" line=\"229\"/>\n        <source>Shortcut already exists!</source>\n        <translation>快鍵已存在！</translation>\n    </message>\n</context>\n<context>\n    <name>TabDialog</name>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"29\"/>\n        <source>Tab name must be non-empty and unique.&lt;br /&gt;\nTab &lt;b&gt;No&amp;amp;tes&lt;/b&gt; can be opened using &lt;b&gt;Alt+T&lt;/b&gt;.&lt;br /&gt;\nUse &lt;b&gt;/&lt;/b&gt; as path separator in tree view tab layout.</source>\n        <translation>分頁名稱不可留白，且必須是唯一。&lt;br /&gt;\n例如分頁 &lt;b&gt;筆記(&amp;amp;T)&lt;/b&gt;可用&lt;b&gt;Alt+T&lt;/b&gt;開啟。&lt;br /&gt;\n於樹狀檢視分頁版面，用 &lt;b&gt;/&lt;/b&gt; 作為路徑分隔號。</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabdialog.ui\" line=\"43\"/>\n        <source>&amp;Name:</source>\n        <translation>名稱(&amp;N):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"17\"/>\n        <source>New Tab</source>\n        <translation>新增分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"20\"/>\n        <source>Rename Tab</source>\n        <translation>重新命名分頁</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/tabdialog.cpp\" line=\"23\"/>\n        <source>Rename Tab Group</source>\n        <translation>重新命名分頁群組</translation>\n    </message>\n</context>\n<context>\n    <name>TabPropertiesWidget</name>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"46\"/>\n        <source>&amp;Maximum number of items:</source>\n        <translation>項目數量上限(&amp;M):</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"56\"/>\n        <source>default</source>\n        <translation>預設</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"84\"/>\n        <source>&amp;Save Items</source>\n        <translation>儲存項目(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"93\"/>\n        <source>Require password after an interval:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"103\"/>\n        <source>Per-tab timeout in seconds for requiring encryption password again.\n\nSet to 0 to use global setting.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../src/ui/tabpropertieswidget.ui\" line=\"108\"/>\n        <source>global</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <source>&amp;Store Items</source>\n        <translation type=\"vanished\">儲存項目(&amp;S)</translation>\n    </message>\n</context>\n<context>\n    <name>TrayMenu</name>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"109\"/>\n        <source>Press &apos;/&apos; to search</source>\n        <translation>按 &apos;/&apos; 進行搜尋</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"111\"/>\n        <source>Type to search</source>\n        <translation>打字搜尋</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/traymenu.cpp\" line=\"127\"/>\n        <source>&amp;%1. %2</source>\n        <comment>Key hint (number shortcut) for items in tray menu (%1 is number, %2 is item label)</comment>\n        <translation>&amp;%1. %2</translation>\n    </message>\n</context>\n<context>\n    <name>Utils::FilterLineEdit</name>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"380\"/>\n        <source>Regular Expression</source>\n        <translation>類型式(regular expression)</translation>\n    </message>\n    <message>\n        <location filename=\"../src/gui/filterlineedit.cpp\" line=\"383\"/>\n        <source>Case Insensitive</source>\n        <translation>不區分大小寫</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "utils/bump_version.sh",
    "content": "#!/bin/bash\n#\n# Updates CopyQ version in source code.\n#\n# Argument is the new version.\n#\n# 1. Checks new version format.\n# 2. Checks if CHANGES file contains the new version.\n# 3. Updates version in version header.\n# 4. Updates version for plugins.\n# 5. Updates version in AppData file.\n#\n\nset -euo pipefail\n\nversion=$1\n\nversion_file=src/version.cmake\nappdata_file=shared/com.github.hluk.copyq.metainfo.xml\nitemwidget_file=src/item/itemwidget.h\nchanges_file=CHANGES.md\n\ncheck_version_format() {\n    if ! grep -q '^[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+$' <<< \"$version\"; then\n        echo \"Expected version format is MAJOR.MINOR.PATCH\"\n        exit 1\n    fi\n}\n\ncheck_changes() {\n    last_changes_version=$(head -1 \"$changes_file\")\n    if [[ \"$last_changes_version\" != \"# $version\" ]]; then\n        echo \"Update $changes_file first\"\n        exit 1\n    fi\n}\n\nfix_file() {\n    file=$1\n    format=$2\n\n    pattern=$(printf \"$format\" '[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+')\n    text=$(printf \"$format\" \"$version\")\n    sed -i \"s|$pattern|$text|\" \"$file\"\n\n    new_version=$(grep -o \"$pattern\" \"$file\")\n    if [[ \"$new_version\" != \"$text\" ]]; then\n        echo \"Failed to replace version in $file\"\n        exit 1\n    fi\n}\n\nfix_version_file() {\n    fix_file \"$version_file\" 'set(copyq_version \"%s\")'\n}\n\nfix_itemwidget() {\n    fix_file \"$itemwidget_file\" \\\n        '#define COPYQ_PLUGIN_ITEM_LOADER_ID \"com.github.hluk.copyq.itemloader/%s\"'\n}\n\nfix_appdata() {\n    sed -i '/<release version=\"'\"$version\"'\"/d' \"$appdata_file\"\n\n    if grep -qo '\"'\"$version\"'\"' \"$appdata_file\"; then\n        echo \"New version already mentioned in $appdata_file\"\n        exit 1\n    fi\n\n    release_date=$(date +%Y-%m-%d)\n    release_node=\"<release version=\\\"$version\\\" date=\\\"$release_date\\\" />\"\n    sed -i 's#^\\(\\s*\\)<releases>$#&\\n\\1    '\"$release_node\"'#' \"$appdata_file\"\n\n    if ! grep -qo '<release version=\"'\"$version\"'\"' \"$appdata_file\"; then\n        echo \"Failed to add new version to $appdata_file\"\n        exit 1\n    fi\n\n    appstream-util validate-relax --nonet \"$appdata_file\"\n}\n\ncheck_version_format\ncheck_changes\nfix_version_file\nfix_itemwidget\nfix_appdata\ngit commit -a -m \"v$version\"\ngit tag -s -a -m \"v$version\" \"v$version\"\ngit show\n"
  },
  {
    "path": "utils/copy_files.sh",
    "content": "#!/bin/bash\n# Save whole files in CopyQ.\n# USAGE:\n#   utils/copy_files.sh [FILES...]\n# EXAMPLE:\n#   TAB=images utils/copy_files.sh ~/Pictures/*.jpg\nCOPYQ=${COPYQ:-copyq}\nTAB=${TAB:-files}\n\nset -e\n\ni=0\nfor x in \"$@\"; do\n    # get MIME\n    mime=$(file -b -L --mime-type \"$x\")\n    # print info\n    printf \"%s: %s\\n\" \"$mime\" \"$x\"\n    # write image with label\n    \"$COPYQ\" -s \"$SESSION\" tab \"$TAB\" write $((++i)) \\\n        \"application/x-copyq-item-notes\" \"$x\" \\\n        \"$mime\" - < \"$x\"\ndone\n"
  },
  {
    "path": "utils/create_source_package.sh",
    "content": "#!/bin/bash\nversion=$1\nprefix=Copyq-$version\nout=${2:-\"$prefix.tar.gz\"}\nout=$(readlink -f \"$out\")\n\nscript=$(readlink -f \"$0\")\nsource=\"$(dirname \"$(dirname \"$script\")\")\"\n\nset -e\n\ndie () {\n    echo \"ERROR: $*\"\n    exit 1\n}\n\ngit -C \"$source\" archive --format=tar.gz --prefix=\"$prefix/\" --output=\"$out\" \"v$version\" ||\n    die \"First arguments must be existing version (tag v<VERSION> must exist in repository)\"\n\necho \"Created source package for version $version: $out\"\n\nsize=$(stat --format=\"%s\" \"$out\")\nhash=$(md5sum \"$out\" | cut -d' ' -f 1)\necho \" $hash $size $out\"\n"
  },
  {
    "path": "utils/fix-translations.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nOne time script to fix window title translation strings in CopyQ.\n\nRemoves unneeded application from window titles from translation files.\n\nThe application name is added to the title by using\nQGuiApplication::setApplicationDisplayName().\n\"\"\"\nfrom glob import glob\nimport re\n\nimport xml.etree.ElementTree as ET\n\n\ndef main():\n    prefix = re.compile('^CopyQ\\\\s*')\n    suffix = re.compile('\\\\s*CopyQ$')\n    sources = {\n        \"CopyQ About\",\n        \"CopyQ Action Dialog\",\n        \"CopyQ Add Commands\",\n        \"CopyQ Clipboard Content\",\n        \"CopyQ Commands\",\n        \"CopyQ Configuration\",\n        \"CopyQ Export Error\",\n        \"CopyQ Import Error\",\n        \"CopyQ Item Content\",\n        \"CopyQ Log\",\n        \"CopyQ New Tab\",\n        \"CopyQ New Shortcut\",\n        \"CopyQ Options for Export\",\n        \"CopyQ Options for Import\",\n        \"CopyQ Process Manager\",\n        \"CopyQ Rename Tab\",\n        \"CopyQ Rename Tab Group\",\n        \"CopyQ Select Icon\",\n    }\n\n    for fn in glob('translations/*.ts'):\n        tree = ET.parse(fn)\n        root = tree.getroot()\n        for context in root.iter('context'):\n            for message in context.iter('message'):\n                source = message.find('source')\n                if source.text in sources:\n                    tr = message.find('translation')\n                    if not tr.text:\n                        continue\n\n                    source.text = re.sub(prefix, '', source.text)\n                    tr.text = re.sub(prefix, '', tr.text)\n                    tr.text = re.sub(suffix, '', tr.text)\n                    if tr.text[0].islower():\n                        tr.text = tr.text[0].upper() + tr.text[1:]\n                    tr.set('type', 'unfinished')\n\n        tree.write(fn)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "utils/fosshub.py",
    "content": "#!/usr/bin/env python\n\"\"\"\nCreate new release and upload files to FossHUB.\n\nGet the API key from: https://devzone.fosshub.com/dashboard/profile\n\nUSAGE: ./fosshub.py <VERSION> <API_KEY>\n\"\"\"\nimport requests\nimport sys\n\nproject_id = '5c1195728c9fe8186f80a14b'\nfosshub_new_release_url = 'https://api.fosshub.com/rest/projects/{project_id}/releases/'.format(project_id=project_id)\ngithub_release_url = 'https://github.com/hluk/CopyQ/releases/download/v{version}/{basename}'\nfiles = {\n    'copyq-{version}-setup.exe': 'Windows Installer',\n    'copyq-{version}.zip': 'Windows Portable',\n    'CopyQ-macos-10.dmg.zip': 'macOS',\n    'CopyQ-macos-12-m1.dmg.zip': 'macOS M1',\n}\n\nversion = sys.argv[1]\napi_key = sys.argv[2]\n\n# https://devzone.fosshub.com/dashboard/restApi\ndata = {\n    'version': version,\n    'files': [{\n        'fileUrl': github_release_url.format(version=version, basename=basename.format(version=version)),\n        'type': filetype,\n        'version': version\n    } for basename, filetype in files.items()],\n    'publish': True,\n}\nheaders = {\n    'X-Auth-Key': api_key\n}\n\nresponse = requests.post(fosshub_new_release_url, json=data, headers=headers)\nif response.status_code != 200:\n    raise RuntimeError('Unexpected response: ' + response.text)\n\nprint('All OK: ' + response.text)\n"
  },
  {
    "path": "utils/generata-big-data-tab.sh",
    "content": "#!/bin/bash\nset -euo pipefail\n\nCOPYQ=${COPYQ:-copyq}\nsession=test\ntab=BIG\n\nitems=10000\nsize=50000\n\nfor x in $(seq $items); do\n    echo $x\n    head -c $size /dev/random | base64 | \"$COPYQ\" -s $session tab $tab insert -1 -\ndone\n"
  },
  {
    "path": "utils/github/build-macos-deps.sh",
    "content": "#!/usr/bin/env bash\n# Builds KDE framework dependencies for CopyQ on macOS (GitHub Actions).\n# Uses Ninja. Expects Qt from install-qt-action.\n#\n# Expected environment variables:\n#   GITHUB_WORKSPACE, CMAKE_PREFIX_PATH,\n#   KF_VERSION, KF_PATCH, KF_BRANCH,\n#   QCA_VERSION, QTKEYCHAIN_VERSION\nset -exo pipefail\n\n: \"${GITHUB_WORKSPACE:?}\"\n: \"${CMAKE_PREFIX_PATH:?}\"\n: \"${KF_VERSION:?}\"\n: \"${KF_PATCH:?}\"\n: \"${KF_BRANCH:?}\"\n: \"${QCA_VERSION:?}\"\n: \"${QTKEYCHAIN_VERSION:?}\"\n\nKF_FULLVER=${KF_VERSION}.${KF_PATCH}\nKF_BASE_URL=\"https://download.kde.org/${KF_BRANCH}/frameworks/${KF_VERSION}\"\n\nINSTALL_PREFIX=${DEPS_PREFIX:-$GITHUB_WORKSPACE/deps/install}\nDOWNLOADS_DIR=$GITHUB_WORKSPACE/deps/downloads\nBUILD_DIR=$GITHUB_WORKSPACE/deps/build\nPATCH_DIR=$GITHUB_WORKSPACE/utils/patches\n\nmkdir -p \"$INSTALL_PREFIX\" \"$DOWNLOADS_DIR\" \"$BUILD_DIR\"\nexport PATH=$INSTALL_PREFIX/bin:$PATH\n\n# Generic dependency builder.\n#   build_dep NAME VERSION BASE_URL [CMAKE_ARGS...]\n# Override URL path:  BUILD_DEP_URL_PATH=... build_dep ...\n# Override archive:   BUILD_DEP_SUFFIX=... build_dep ...\nbuild_dep() {\n    local name=$1\n    local version=$2\n    local base_url=$3\n    shift 3\n    local extra_cmake_args=(\"$@\")\n\n    local suffix=${BUILD_DEP_SUFFIX:-tar.xz}\n    local url_path=${BUILD_DEP_URL_PATH:-\"$name-$version\"}\n    local url=\"$base_url/$url_path.$suffix\"\n    local pkg=\"$DOWNLOADS_DIR/$name-$version.$suffix\"\n\n    # Download with retry.\n    curl -sSLo \"$pkg\" --fail-with-body --retry 5 --retry-all-errors \"$url\"\n\n    # Extract.\n    (cd \"$DOWNLOADS_DIR\" && cmake -E tar xf \"$pkg\")\n\n    # Apply patches if any exist.\n    local src_dir=\"$DOWNLOADS_DIR/$name-$version\"\n    if [[ -d \"$PATCH_DIR/$name\" ]]; then\n        local patch\n        for patch in \"$PATCH_DIR/$name\"/*.patch; do\n            [[ -f \"$patch\" ]] && (cd \"$src_dir\" && patch -p1 < \"$patch\")\n        done\n    fi\n\n    # Configure + build.\n    cmake -B \"$BUILD_DIR/$name\" -S \"$src_dir\" -G Ninja \\\n        -DCMAKE_BUILD_TYPE=Release \\\n        -DCMAKE_PREFIX_PATH=\"$CMAKE_PREFIX_PATH\" \\\n        -DCMAKE_INSTALL_PREFIX=\"$INSTALL_PREFIX\" \\\n        -DBUILD_TESTING=OFF \\\n        \"${extra_cmake_args[@]}\"\n\n    cmake --build \"$BUILD_DIR/$name\" --parallel\n}\n\n# Install a previously built dependency.\n#   install_dep NAME\ninstall_dep() {\n    cmake --install \"$BUILD_DIR/$1\"\n}\n\n# Group A: No inter-dependencies, build in parallel.\nBUILD_DEP_URL_PATH=\"${QCA_VERSION}/qca-${QCA_VERSION}\" \\\n    build_dep qca \"$QCA_VERSION\" \"https://download.kde.org/stable/qca\" \\\n        -DBUILD_WITH_QT6=ON \\\n        -DBUILD_TESTS=OFF \\\n        -DBUILD_TOOLS=OFF \\\n        -DBUILD_PLUGINS=ossl &\nqca_pid=$!\n\nBUILD_DEP_URL_PATH=\"$QTKEYCHAIN_VERSION\" BUILD_DEP_SUFFIX=tar.gz \\\n    build_dep qtkeychain \"$QTKEYCHAIN_VERSION\" \\\n        \"https://github.com/frankosterfeld/qtkeychain/archive/refs/tags\" \\\n        -DBUILD_WITH_QT6=ON \\\n        -DBUILD_TRANSLATIONS=OFF \\\n        -DBUILD_TEST_APPLICATION=OFF &\nqtkeychain_pid=$!\n\nbuild_dep extra-cmake-modules \"$KF_FULLVER\" \"$KF_BASE_URL\" &\necm_pid=$!\n\nwait \"$qca_pid\" \"$qtkeychain_pid\" \"$ecm_pid\"\ninstall_dep qca\ninstall_dep qtkeychain\ninstall_dep extra-cmake-modules\n\n# Group B: Depend on ECM.\nbuild_dep kconfig \"$KF_FULLVER\" \"$KF_BASE_URL\" \\\n    -DKCONFIG_USE_DBUS=OFF \\\n    -DKCONFIG_USE_GUI=OFF &\nkconfig_pid=$!\n\nbuild_dep kwindowsystem \"$KF_FULLVER\" \"$KF_BASE_URL\" &\nkwindowsystem_pid=$!\n\nwait \"$kconfig_pid\" \"$kwindowsystem_pid\"\ninstall_dep kconfig\ninstall_dep kwindowsystem\n\n# Group C: Depend on kconfig + kwindowsystem.\nbuild_dep knotifications \"$KF_FULLVER\" \"$KF_BASE_URL\" \\\n    -DUSE_DBUS=OFF &\nknotifications_pid=$!\n\nbuild_dep kstatusnotifieritem \"$KF_FULLVER\" \"$KF_BASE_URL\" \\\n    -DUSE_DBUS=OFF &\nkstatusnotifieritem_pid=$!\n\nwait \"$knotifications_pid\" \"$kstatusnotifieritem_pid\"\ninstall_dep knotifications\ninstall_dep kstatusnotifieritem\n\necho \"All dependencies built successfully.\"\n"
  },
  {
    "path": "utils/github/build-windows-deps.sh",
    "content": "#!/usr/bin/bash\n# Builds KDE framework dependencies for CopyQ on Windows (GitHub Actions).\n# Uses Ninja + MSVC. Requires ilammy/msvc-dev-cmd to be run first.\n#\n# Expected environment variables:\n#   GITHUB_WORKSPACE, CMAKE_PREFIX_PATH,\n#   KF_VERSION, KF_PATCH, KF_BRANCH,\n#   QCA_VERSION, QTKEYCHAIN_VERSION, SNORETOAST_VERSION\nset -exo pipefail\n\n: \"${GITHUB_WORKSPACE:?}\"\n: \"${CMAKE_PREFIX_PATH:?}\"\n: \"${KF_VERSION:?}\"\n: \"${KF_PATCH:?}\"\n: \"${KF_BRANCH:?}\"\n: \"${QCA_VERSION:?}\"\n: \"${QTKEYCHAIN_VERSION:?}\"\n: \"${SNORETOAST_VERSION:?}\"\n\nKF_FULLVER=${KF_VERSION}.${KF_PATCH}\nKF_BASE_URL=\"https://download.kde.org/${KF_BRANCH}/frameworks/${KF_VERSION}\"\nSNORETOAST_BASE_URL=\"https://invent.kde.org/libraries/snoretoast/-/archive/v${SNORETOAST_VERSION}\"\n\nINSTALL_PREFIX=${DEPS_PREFIX:-$GITHUB_WORKSPACE/deps/install}\nDOWNLOADS_DIR=$GITHUB_WORKSPACE/deps/downloads\nBUILD_DIR=$GITHUB_WORKSPACE/deps/build\nPATCH_DIR=$GITHUB_WORKSPACE/utils/patches\n\nmkdir -p \"$INSTALL_PREFIX\" \"$DOWNLOADS_DIR\" \"$BUILD_DIR\"\nexport PATH=$INSTALL_PREFIX/bin:$PATH\n\n# Generic dependency builder.\n#   build_dep NAME VERSION BASE_URL [CMAKE_ARGS...]\n# Override URL path:  BUILD_DEP_URL_PATH=... build_dep ...\n# Override archive:   BUILD_DEP_SUFFIX=... build_dep ...\nbuild_dep() {\n    local name=$1\n    local version=$2\n    local base_url=$3\n    shift 3\n    local extra_cmake_args=(\"$@\")\n\n    local suffix=${BUILD_DEP_SUFFIX:-tar.xz}\n    local url_path=${BUILD_DEP_URL_PATH:-\"$name-$version\"}\n    local url=\"$base_url/$url_path.$suffix\"\n    local pkg=\"$DOWNLOADS_DIR/$name-$version.$suffix\"\n\n    # Download with retry.\n    curl -sSLo \"$pkg\" --fail-with-body --retry 5 --retry-all-errors \"$url\"\n\n    # Extract.\n    (cd \"$DOWNLOADS_DIR\" && cmake -E tar xf \"$pkg\")\n\n    # Apply patches if any exist.\n    local src_dir=\"$DOWNLOADS_DIR/$name-$version\"\n    if [[ -d \"$PATCH_DIR/$name\" ]]; then\n        local patch\n        for patch in \"$PATCH_DIR/$name\"/*.patch; do\n            [[ -f \"$patch\" ]] && (cd \"$src_dir\" && patch -p1 < \"$patch\")\n        done\n    fi\n\n    # Configure + build.\n    cmake -B \"$BUILD_DIR/$name\" -S \"$src_dir\" -G Ninja \\\n        -DCMAKE_BUILD_TYPE=Release \\\n        -DCMAKE_PREFIX_PATH=\"$CMAKE_PREFIX_PATH\" \\\n        -DCMAKE_INSTALL_PREFIX=\"$INSTALL_PREFIX\" \\\n        -DBUILD_TESTING=OFF \\\n        \"${extra_cmake_args[@]}\"\n\n    cmake --build \"$BUILD_DIR/$name\" --parallel\n}\n\n# Install a previously built dependency.\n#   install_dep NAME\ninstall_dep() {\n    cmake --install \"$BUILD_DIR/$1\"\n}\n\n# Group A: No inter-dependencies, build in parallel.\nBUILD_DEP_URL_PATH=\"${QCA_VERSION}/qca-${QCA_VERSION}\" \\\n    build_dep qca \"$QCA_VERSION\" \"https://download.kde.org/stable/qca\" \\\n        -DBUILD_WITH_QT6=ON \\\n        -DBUILD_TESTS=OFF \\\n        -DBUILD_TOOLS=OFF \\\n        -DBUILD_PLUGINS=ossl &\nqca_pid=$!\n\nBUILD_DEP_URL_PATH=\"$QTKEYCHAIN_VERSION\" BUILD_DEP_SUFFIX=tar.gz \\\n    build_dep qtkeychain \"$QTKEYCHAIN_VERSION\" \\\n        \"https://github.com/frankosterfeld/qtkeychain/archive/refs/tags\" \\\n        -DBUILD_WITH_QT6=ON \\\n        -DBUILD_TRANSLATIONS=OFF \\\n        -DBUILD_TEST_APPLICATION=OFF &\nqtkeychain_pid=$!\n\nBUILD_DEP_SUFFIX=zip \\\n    build_dep snoretoast \"v$SNORETOAST_VERSION\" \"$SNORETOAST_BASE_URL\" &\nsnoretoast_pid=$!\n\nbuild_dep extra-cmake-modules \"$KF_FULLVER\" \"$KF_BASE_URL\" &\necm_pid=$!\n\nwait \"$qca_pid\" \"$qtkeychain_pid\" \"$snoretoast_pid\" \"$ecm_pid\"\ninstall_dep qca\ninstall_dep qtkeychain\ninstall_dep snoretoast\ninstall_dep extra-cmake-modules\n\n# Group B: Depend on ECM.\nbuild_dep kconfig \"$KF_FULLVER\" \"$KF_BASE_URL\" \\\n    -DKCONFIG_USE_DBUS=OFF \\\n    -DKCONFIG_USE_GUI=OFF &\nkconfig_pid=$!\n\nbuild_dep kwindowsystem \"$KF_FULLVER\" \"$KF_BASE_URL\" &\nkwindowsystem_pid=$!\n\nwait \"$kconfig_pid\" \"$kwindowsystem_pid\"\ninstall_dep kconfig\ninstall_dep kwindowsystem\n\n# Group C: Depend on kconfig + kwindowsystem.\nbuild_dep knotifications \"$KF_FULLVER\" \"$KF_BASE_URL\" &\nknotifications_pid=$!\n\nbuild_dep kstatusnotifieritem \"$KF_FULLVER\" \"$KF_BASE_URL\" &\nkstatusnotifieritem_pid=$!\n\nwait \"$knotifications_pid\" \"$kstatusnotifieritem_pid\"\ninstall_dep knotifications\ninstall_dep kstatusnotifieritem\n\necho \"All dependencies built successfully.\"\n"
  },
  {
    "path": "utils/github/deploy-windows.sh",
    "content": "#!/usr/bin/bash\n# Assembles a deployable CopyQ directory on Windows (GitHub Actions).\n# Copies dependencies, runs windeployqt, prepares for testing and packaging.\n#\n# Based on the proven Appveyor after_build.sh workflow.\n#\n# Expected environment variables:\n#   GITHUB_WORKSPACE, BUILD_DIR, APP_VERSION,\n#   QT_ROOT_DIR, DEPS_PREFIX, OPENSSL_ROOT_DIR\nset -exuo pipefail\n\n: \"${GITHUB_WORKSPACE:?}\"\n: \"${BUILD_DIR:?}\"\n: \"${APP_VERSION:?}\"\n: \"${QT_ROOT_DIR:?}\"\n: \"${DEPS_PREFIX:?}\"\n: \"${OPENSSL_ROOT_DIR:?}\"\n\nAPP=\"copyq-${APP_VERSION}\"\nDEST=\"${GITHUB_WORKSPACE}/${APP}\"\n\nmkdir -p \"$DEST\"\n\ncmake --install \"$BUILD_DIR\" --config Release --prefix \"$DEST\" --verbose\n\n# Copy QCA and QtKeychain libraries.\nmkdir -p \"$DEST/crypto\"\ncp -v \"$DEPS_PREFIX/bin/qca-qt6.dll\" \"$DEST\"\ncp -v \"$DEPS_PREFIX/lib/qca-qt6/crypto/qca-ossl.dll\" \"$DEST/crypto/\"\ncp -v \"$DEPS_PREFIX/bin/qt6keychain.dll\" \"$DEST\"\n\n# Workaround for windeployqt: https://github.com/frankosterfeld/qtkeychain/issues/246\ncp -v \"$DEPS_PREFIX/bin/qt6keychain.dll\" \"$QT_ROOT_DIR/bin/\"\n\ncrypto_libraries=(\n    \"$DEST/qca-qt6.dll\"\n    \"$DEST/qt6keychain.dll\"\n)\n\n# Copy KDE framework and SnoreToast libraries.\ncp -v \"$DEPS_PREFIX/bin/KF6\"*.dll \"$DEST\"\ncp -v \"$DEPS_PREFIX/bin/snoretoast.exe\" \"$DEST\"\nkf_libraries=(\n    \"$DEST/KF6ConfigCore.dll\"\n    \"$DEST/KF6Notifications.dll\"\n)\n\n# Copy project assets.\ncp -v \"$GITHUB_WORKSPACE/AUTHORS\" \"$DEST\"\ncp -v \"$GITHUB_WORKSPACE/LICENSE\" \"$DEST\"\ncp -v \"$GITHUB_WORKSPACE/README.md\" \"$DEST\"\n\nmkdir -p \"$DEST/themes\"\ncp -v \"$GITHUB_WORKSPACE/shared/themes/\"* \"$DEST/themes\"\n\nmkdir -p \"$DEST/translations\"\ncp -v \"$BUILD_DIR/src/\"*.qm \"$DEST/translations\"\n\nmkdir -p \"$DEST/plugins\"\ncp -v \"$BUILD_DIR/plugins/\"*.dll \"$DEST/plugins\"\n\n# Copy OpenSSL libraries.\ncp -v \"$OPENSSL_ROOT_DIR\"/bin/libcrypto-*.dll \"$DEST\"\ncp -v \"$OPENSSL_ROOT_DIR\"/bin/libssl-*.dll \"$DEST\"\n\n# Run windeployqt to gather Qt runtime dependencies.\n\"$QT_ROOT_DIR/bin/windeployqt\" --help\n\"$QT_ROOT_DIR/bin/windeployqt\" \\\n    --no-system-d3d-compiler \\\n    --no-system-dxc-compiler \\\n    --no-compiler-runtime \\\n    --no-opengl-sw \\\n    --no-quick \\\n    --skip-plugin-types qmltooling,generic,networkinformation \\\n    \"${kf_libraries[@]}\" \\\n    \"${crypto_libraries[@]}\" \\\n    \"$DEST/copyq.exe\"\n\n# Clean up workaround file to avoid polluting the cached Qt installation.\nrm -f \"$QT_ROOT_DIR/bin/qt6keychain.dll\"\n\n# Copy test binary and its Qt dependency into the deployed directory\n# so tests run against the fully deployed application layout.\ncp -v \"$BUILD_DIR/copyq-tests.exe\" \"$DEST/\"\ncp -v \"$QT_ROOT_DIR/bin/Qt6Test.dll\" \"$DEST/\"\ncp -v \"$BUILD_DIR/src/itemtests.dll\" \"$DEST/\"\n\n# Remove system-installed OpenSSL to verify bundled libs are used.\nrm -vf /c/Windows/System32/libcrypto-*\nrm -vf /c/Windows/System32/libssl-*\nrm -vf /c/Windows/SysWOW64/libcrypto-*\nrm -vf /c/Windows/SysWOW64/libssl-*\n\n# Verify the deployed binary works with only bundled libraries.\nOldPath=$PATH\nexport PATH=\"$DEST\"\n\"$DEST/copyq.exe\" --help\n\"$DEST/copyq.exe\" --version\n\"$DEST/copyq.exe\" --info\nexport PATH=$OldPath\n\necho \"Deploy complete: $DEST\"\n"
  },
  {
    "path": "utils/github/test-linux-global-shortcuts.sh",
    "content": "#!/bin/bash\n# Tests global shortcuts on X11.\nset -xeuo pipefail\n\nexport COPYQ_SESSION_NAME=__COPYQ_SHORTCUT\n\nsource \"$(dirname \"$0\")/test-start-server.sh\"\ntrap \"kill $copyq_pid || true\" QUIT TERM INT HUP EXIT\n\n./copyq removeTab TEST || true\n\n# register Ctrl+Alt+T to exit CopyQ\n./copyq - <<EOF\nsetCommands(\n    [\n        {\n            name: \"Test Command\",\n            cmd: \"copyq tab TEST add TEST\",\n            globalShortcuts: [\"ctrl+alt+t\"],\n            isGlobalShortcut: true,\n        }\n    ]\n)\nEOF\nsleep 2\n\ntrigger_shortcut() {\n    xdotool \\\n        keydown Control_L \\\n        keydown Alt_L \\\n        key t \\\n        keyup Alt_L \\\n        keyup Control_L\n}\n\ntrigger_shortcut\n\nif [[ $(./copyq tab TEST count) == 1 ]]; then\n    echo \"✅ PASSED: Global shortcut registered: Command executed\"\nelse\n    echo \"❌ FAILED: Global shortcut registered: Command not executed\"\n    exit 1\nfi\n\n# Unregister the shortcut\n./copyq 'setCommands([])'\ntrigger_shortcut\n\nif [[ $(./copyq tab TEST count) == 1 ]]; then\n    echo \"✅ PASSED: Global shortcut unregistered: Command not executed\"\nelse\n    echo \"❌ FAILED: Global shortcut unregistered: Command executed\"\n    exit 1\nfi\n"
  },
  {
    "path": "utils/github/test-linux-gnome-extension.sh",
    "content": "#!/bin/bash\n# Runs GNOME extension clipboard integration test.\nset -xeuo pipefail\n\nexport QT_QPA_PLATFORM=wayland\n\n# Launch in clean environment\nif [[ -z \"${COPYQ_TESTS_GNOME_EXTENSION_INIT:-}\" ]]; then\n    tmp_dir=\"$(mktemp -d)\"\n    cleanup() {\n        while ! rm -rf \"$tmp_dir\"; do\n            sleep 0.2\n        done\n    }\n    trap cleanup EXIT TERM INT HUP\n    mkdir -p \"$tmp_dir/.config\" \\\n        \"$tmp_dir/.local/share\" \\\n        \"$tmp_dir/.cache\" \\\n        \"$tmp_dir/.runtime\"\n    chmod 0700 \"$tmp_dir/.runtime\"\n    env --ignore-environment \\\n        COPYQ_TESTS_GNOME_EXTENSION_INIT=1 \\\n        HOME=\"$tmp_dir\" \\\n        COPYQ_LOG_LEVEL=\"${COPYQ_LOG_LEVEL:-DEBUG}\" \\\n        QT_LOGGING_RULES=\"${QT_LOGGING_RULES:-*.debug=true;qt.*.debug=false;qt.*.warning=true}\" \\\n        COPYQ_GNOME_EXTENSION_DEBUG=\"${COPYQ_GNOME_EXTENSION_DEBUG:-1}\" \\\n        COPYQ_SESSION_NAME=\"${COPYQ_SESSION_NAME:-__COPYQ_GNOMEEXT}\" \\\n        COPYQ_TESTS_EXECUTABLE=\"$COPYQ_TESTS_EXECUTABLE\" \\\n        COPYQ_TESTS_TESTS_EXECUTABLE=\"${COPYQ_TESTS_TESTS_EXECUTABLE:-./copyq-tests}\" \\\n        COPYQ_TESTS_SKIP_MULTIPLE_CLIPBOARD_FORMATS=1 \\\n        XDG_CONFIG_HOME=\"$tmp_dir/.config\" \\\n        XDG_DATA_HOME=\"$tmp_dir/.local/share\" \\\n        XDG_DATA_DIRS=\"$tmp_dir/.local/share\" \\\n        XDG_CACHE_HOME=\"$tmp_dir/.cache\" \\\n        XDG_RUNTIME_DIR=\"$tmp_dir/.runtime\" \\\n        LANG=\"$LANG\" \\\n        dbus-run-session -- \"$0\" \"$@\"\n    exit\nfi\n\nif [[ ! -x \"$COPYQ_TESTS_EXECUTABLE\" ]]; then\n    echo \"❌ FAILED: CopyQ executable not found: $COPYQ_TESTS_EXECUTABLE\"\n    exit 1\nfi\nif [[ ! -x \"$COPYQ_TESTS_TESTS_EXECUTABLE\" ]]; then\n    echo \"❌ FAILED: copyq-tests executable not found: $COPYQ_TESTS_TESTS_EXECUTABLE\"\n    exit 1\nfi\n\n# Install GNOME extension before starting gnome-shell\nextension_uuid=\"copyq-clipboard@hluk.github.com\"\nprefix_dir=\"$(cd \"$(dirname \"$COPYQ_TESTS_EXECUTABLE\")/..\" && pwd)\"\ninstalled_extension_dir=\"${COPYQ_GNOME_EXTENSION_DIR:-$prefix_dir/share/gnome-shell/extensions/$extension_uuid}\"\nif [[ ! -d \"$installed_extension_dir\" ]]; then\n    echo \"❌ FAILED: Extension not found: $installed_extension_dir\"\n    exit 1\nfi\nuser_extension_dir=\"${HOME}/.local/share/gnome-shell/extensions/${extension_uuid}\"\nmkdir -p \"$(dirname \"$user_extension_dir\")\"\nrm -rf \"$user_extension_dir\"\ncp -a \"$installed_extension_dir\" \"$user_extension_dir\"\n\n# Some CI images miss compiled GNOME schemas even when gnome-shell is installed.\nschema_dir=$XDG_DATA_HOME/glib-2.0/schemas\nmkdir -p \"$schema_dir\"\nglib-compile-schemas --targetdir=\"$schema_dir\" /usr/share/glib-2.0/schemas\nif ! gsettings list-schemas 2>/dev/null | grep -qx 'org.gnome.shell'; then\n    echo \"❌ FAILED: GNOME schema org.gnome.shell is unavailable\"\n    exit 1\nfi\n\n# Avoid dependency on org.gnome.Shell.Extensions helper in minimal environments.\ngsettings set org.gnome.shell disable-user-extensions false || true\ngsettings set org.gnome.shell enabled-extensions \"['${extension_uuid}']\" || true\n\ncleanup() {\n    kill ${gnome_pid:-} ${tail_pid:-} ${copyq_pid:-} 2>/dev/null || true\n}\ntrap cleanup EXIT TERM INT HUP\n\ngnome-shell --headless --wayland --wayland-display=copyq-wayland --no-x11 --virtual-monitor 1280x960 &\ngnome_pid=$!\n\ncheck_gnome_running() {\n    if ! kill -0 \"$gnome_pid\"; then\n        echo \"❌ FAILED: gnome-shell is not running\"\n        exit 1\n    fi\n}\n\nexport WAYLAND_DISPLAY=copyq-wayland\nsocket=$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY\nfor _ in {1..20}; do\n    check_gnome_running\n    if [[ -S \"$socket\" ]]; then\n        break\n    fi\n    sleep 1\ndone\n\nif [[ -S \"$socket\" ]]; then\n    echo \"✅ PASSED: Wayland display is available\"\nelse\n    echo \"❌ FAILED: Wayland display not available\"\n    exit 1\nfi\n\nextention_service_health_check() {\n    gdbus call --session \\\n        --dest org.freedesktop.DBus \\\n        --object-path /org/freedesktop/DBus \\\n        --method org.freedesktop.DBus.NameHasOwner \\\n        com.github.hluk.copyq.GnomeClipboard | grep -q \"true\"\n}\n\ntry=0\nwhile ! extention_service_health_check; do\n    check_gnome_running\n    try=$((try + 1))\n    if (( try > 20 )); then\n        echo \"❌ FAILED: GNOME extension service health check failed\"\n        exit 1\n    fi\n    sleep 0.5\ndone\necho \"✅ PASSED: GNOME extension service is running\"\n\nexport COPYQ_LOG_FILE=\"$XDG_RUNTIME_DIR/copyq.log\"\ntouch \"$COPYQ_LOG_FILE\"\ntail -f \"$COPYQ_LOG_FILE\" &\ntail_pid=$!\n\n\"$COPYQ_TESTS_EXECUTABLE\" 2>/dev/null &\ncopyq_pid=$!\nCOPYQ_WAIT_FOR_SERVER_MS=5000 \"$COPYQ_TESTS_EXECUTABLE\" '\n    config(\"check_selection\", true);\n    while(!isClipboardMonitorRunning()) {};\n    hide();\n'\n\nset_clipboard() {\n    clipboard_type=$1\n    text=$2\n    if [[ \"$clipboard_type\" == CLIPBOARD ]]; then\n        clipboard_type_id=0\n    else\n        clipboard_type_id=1\n    fi\n    gdbus call --session \\\n        --dest com.github.hluk.copyq.GnomeClipboard \\\n        --object-path /com/github/hluk/copyq/GnomeClipboard \\\n        --method com.github.hluk.CopyQ.GnomeClipboard1.SetClipboardData \\\n        \"$clipboard_type_id\" \\\n        \"text/plain;charset=utf-8\" \\\n        \"<'$text'>\"\n}\n\ntest_clipboard() {\n    clipboard_type=$1\n    text=$2\n    set_clipboard \"$clipboard_type\" \"$text\"\n    script=\"\n        for (i=0; i<20; ++i) {\n            if (read(0) == '$text') {\n                abort();\n            }\n            sleep(100);\n        }\n        fail();\n    \"\n    if \"$COPYQ_TESTS_EXECUTABLE\" \"$script\"; then\n        echo \"✅ PASSED: $clipboard_type item propagated from GNOME extension\"\n    else\n        echo \"❌ FAILED: $clipboard_type item did not propagate from GNOME extension\"\n        exit 1\n    fi\n}\n\ntest_clipboard CLIPBOARD 'CLIPBOARD TEXT'\ntest_clipboard PRIMARY 'PRIMARY TEXT'\n\n\"$COPYQ_TESTS_EXECUTABLE\" exit\n\n\"$COPYQ_TESTS_TESTS_EXECUTABLE\" commandHasClipboardFormat commandCopy commandClipboard\n"
  },
  {
    "path": "utils/github/test-linux-wayland.sh",
    "content": "#!/bin/bash\n# Runs tests for Wayland.\nset -xeuo pipefail\n\n# Run only specific tests that are expected to work on Wayland.\ndefault_wayland_tests=(\n    configPath\n    readLog\n    commandShowHide\n    commandCopy\n    commandClipboard\n    commandHasClipboardFormat\n    clipboardToItem\n    itemToClipboard\n    avoidStoringPasswords\n)\n\nkwin_wayland --virtual --socket=copyq-wayland &\ntrap \"kill $!\" QUIT TERM INT HUP EXIT\nexport WAYLAND_DISPLAY=copyq-wayland\n\n# Enable verbose logging.\nexport COPYQ_LOG_LEVEL=DEBUG\nexport QT_LOGGING_RULES=${QT_LOGGING_RULES:-\"*.debug=true;qt.*.debug=false;qt.*.warning=true\"}\n\nexport QT_QPA_PLATFORM=wayland\n\n# Smoke test the default session\nfor i in {1..5}; do\n    echo \"Trying to start CopyQ server ($i)\"\n    if ./copyq --start-server exit; then\n        break\n    elif [[ $i == 5 ]]; then\n        echo \"❌ FAILED: Could not start CopyQ server\"\n        exit 1\n    fi\n    sleep $((i * 2))\ndone\n\nif [[ $# == 0 ]]; then\n    # Test handling Unix signals.\n    script_root=\"$(dirname \"$(readlink -f \"$0\")\")\"\n    \"$script_root/test-signals.sh\"\n\n    ./copyq-tests \"${default_wayland_tests[@]}\"\nelse\n    ./copyq-tests \"$@\"\nfi\n"
  },
  {
    "path": "utils/github/test-linux.sh",
    "content": "#!/bin/bash\n# Runs tests for console and X11.\nset -xeuo pipefail\n\n# Enable verbose logging.\nexport COPYQ_LOG_LEVEL=DEBUG\nexport QT_LOGGING_RULES=\"*.debug=true;qt.*.debug=false;qt.*.warning=true\"\n\nexport COPYQ_TESTS_EXECUTABLE=${COPYQ_TESTS_EXECUTABLE:-\"./copyq\"}\n\n# Test command line arguments that don't need GUI.\nDISPLAY=\"\" \"$COPYQ_TESTS_EXECUTABLE\" --help\nDISPLAY=\"\" \"$COPYQ_TESTS_EXECUTABLE\" --version\nDISPLAY=\"\" \"$COPYQ_TESTS_EXECUTABLE\" --info\n\n# Start X11 and window manager.\nexport DISPLAY=':99.0'\nXvfb :99 -screen 0 1280x960x24 &\nsleep 5\nopenbox &\nsleep 8\n\n# Smoke test the default session\n\"$COPYQ_TESTS_EXECUTABLE\" --start-server exit\n\n# Test handling Unix signals.\n\"$(dirname \"$0\")/test-signals.sh\"\n\n# Test global shortcuts on X11.\n\"$(dirname \"$0\")/test-linux-global-shortcuts.sh\"\n\n# Run tests.\nexport COPYQ_TESTS_RERUN_FAILED=1\n./copyq-tests \"$@\"\n"
  },
  {
    "path": "utils/github/test-macos.sh",
    "content": "#!/bin/bash\nset -xeuo pipefail\n\nhdiutil attach CopyQ*.dmg\nls -Rl /Volumes\napp_bundle_path=$(echo /Volumes/copyq-*/CopyQ.app)\nexecutable=\"$app_bundle_path/Contents/MacOS/CopyQ\"\n\n# Test the app before deployment.\n\"$executable\" --help\n\"$executable\" --version\n\"$executable\" --info\n\n# Test paths and features.\nls \"$(\"$executable\" info plugins)/\"\nls \"$(\"$executable\" info themes)/\"\nls \"$(\"$executable\" info translations)/\"\ntest \"$(\"$executable\" info has-global-shortcuts)\" -eq \"1\"\n\n# Disable animations for tests\ndefaults write -g NSAutomaticWindowAnimationsEnabled -bool false\ndefaults write -g NSWindowResizeTime -float 0.001\n\n# Run tests (retry once on error).\nexport COPYQ_TESTS_RERUN_FAILED=1\nexport COPYQ_TESTS_SKIP_COMMAND_EDIT=1\nexport COPYQ_TESTS_SKIP_CONFIG_MOVE=1\nexport COPYQ_TESTS_SKIP_DRAG_AND_DROP=1\nexport COPYQ_TESTS_SKIP_SLOW_CLIPBOARD=1\nexport COPYQ_TESTS_EXECUTABLE=\"$executable\"\n./copyq-tests\n\n# Verify the bundle is self-contained: every @rpath reference resolves to a\n# library that is actually present in the Frameworks directory.\necho '--- Checking bundle for unresolved @rpath references ---'\nframeworks_dir=\"$app_bundle_path/Contents/Frameworks\"\nunresolved=$(\n    find \"$app_bundle_path\" -type f \\( -name '*.dylib' -o -perm /111 \\) -print0 |\n    xargs -0 otool -L 2>/dev/null |\n    grep -o '@rpath/[^ ]*' |\n    sort -u |\n    while read -r ref; do\n        rel=${ref#@rpath/}\n        if [ ! -e \"$frameworks_dir/$rel\" ]; then\n            echo \"$ref\"\n        fi\n    done || true\n)\nif [ -n \"$unresolved\" ]; then\n    echo 'ERROR: Unresolved @rpath references in bundle:'\n    echo \"$unresolved\"\n    exit 1\nfi\necho 'OK: All @rpath references resolve within the bundle.'\n\n# Verify minimum macOS deployment target is at most 13.0.\necho '--- Checking minimum macOS version ---'\nmin_version=$(otool -l \"$executable\" | awk '/LC_BUILD_VERSION/{found=1} found && /minos/{print $2; exit}')\nif [ -z \"$min_version\" ]; then\n    # Fallback: try LC_VERSION_MIN_MACOSX\n    min_version=$(otool -l \"$executable\" | awk '/LC_VERSION_MIN_MACOSX/{found=1} found && /version/{print $2; exit}')\nfi\nif [ -z \"$min_version\" ]; then\n    echo 'ERROR: Could not determine minimum macOS version from binary.'\n    exit 1\nfi\necho \"Minimum macOS version: $min_version\"\nmajor=${min_version%%.*}\nif [ \"$major\" -gt 13 ]; then\n    echo \"ERROR: Minimum macOS version $min_version exceeds 13.x\"\n    exit 1\nfi\necho 'OK: Minimum macOS version is acceptable.'\n"
  },
  {
    "path": "utils/github/test-signals.sh",
    "content": "#!/bin/bash\n# Tests for handling Unix signals.\nset -xeuo pipefail\n\nexport COPYQ_SESSION_NAME=__COPYQ_SIGTEST\n\nsource \"$(dirname \"$0\")/test-start-server.sh\"\n\nexit_code=0\n\n# Test interrupting a long sleep command\nif [[ ${COPYQ_TESTS_SKIP_SIGNAL:-0} == \"1\" ]]; then\n    echo \"⚠️ Skipping signal test\"\nelse\n    ./copyq 'sleep(100000)' &\n    copyq_sleep_pid=$!\n\n    sigterm=15\n    expected_exit_code=$((128 + sigterm))\n\n    sleep 2\n    if ! pkill -$sigterm -f '^\\./copyq sleep\\(100000\\)$'; then\n        echo \"❌ FAILED: Could not send SIGTERM to the command\"\n        kill $copyq_sleep_pid\n        exit_code=1\n    fi\n\n    if wait $copyq_sleep_pid; then\n        echo \"❌ FAILED: Interrupt sleep: should exit with an error\"\n        exit_code=1\n    else\n        actual_exit_code=$?\n        if [[ $actual_exit_code == $expected_exit_code ]]; then\n            echo \"✅ PASSED: Interrupt sleep: exited with an error as expected\"\n        else\n            echo \"❌ FAILED: Interrupt sleep: expected exit code $expected_exit_code, got $actual_exit_code\"\n            exit_code=1\n        fi\n    fi\nfi\n\n./copyq 'sleep(100000)' &\ncopyq_sleep_pid=$!\n\n./copyq 'while(true){read(9999999);}' &\ncopyq_loop_pid=$!\n\ntrap \"kill -9 $copyq_sleep_pid $copyq_loop_pid || true\" TERM INT\n\nsleep 2\necho \"⏱️ Sending SIGTERM to server\"\nkill $copyq_pid\n\nif wait $copyq_sleep_pid; then\n    echo \"❌ FAILED: Abort sleep: should exit with an error\"\n    exit_code=1\nelse\n    echo \"✅ PASSED: Abort sleep: exited with an error as expected\"\nfi\n\nif wait $copyq_loop_pid; then\n    echo \"❌ FAILED: Abort loop: should exit with an error\"\n    exit_code=1\nelse\n    echo \"✅ PASSED: Abort loop: exited with an error as expected\"\nfi\n\nif wait $copyq_pid; then\n    echo \"❌ FAILED: Server should exit with a non-zero code\"\n    exit_code=1\nelse\n    echo \"✅ PASSED: Server exited with a non-zero code as expected\"\nfi\n\nexit $exit_code\n"
  },
  {
    "path": "utils/github/test-start-server.sh",
    "content": "#!/bin/bash\n# Starts CopyQ server for tests.\n# Usage: source test-start-server.sh\n\n# Enable verbose logging.\nexport COPYQ_LOG_LEVEL=DEBUG\nexport QT_LOGGING_RULES=\"*.debug=true;qt.*.debug=false;qt.*.warning=true\"\n\n./copyq &\ncopyq_pid=$!\n\n# Wait for server to start\nfor i in {1..3}; do\n    echo \"Trying to start CopyQ server ($i)\"\n    if ./copyq 'serverLog(\"Server started\")'; then\n        break\n    elif [[ $i == 5 ]]; then\n        echo \"❌ FAILED: Could not start CopyQ server\"\n        exit 1\n    fi\n    sleep $((i * 2))\ndone\n"
  },
  {
    "path": "utils/gitlab/build-before_script.sh",
    "content": "#!/bin/bash\nset -ex\n\napt update\n\napt -y install \\\n    build-essential \\\n    cmake \\\n    extra-cmake-modules \\\n    git \\\n    libkf5notifications-dev \\\n    libqt5svg5 \\\n    libqt5svg5-dev \\\n    libqt5waylandclient5-dev \\\n    libqt5x11extras5-dev \\\n    libwayland-dev \\\n    libxfixes-dev \\\n    libxtst-dev \\\n    qtbase5-private-dev \\\n    qtdeclarative5-dev \\\n    qttools5-dev \\\n    qttools5-dev-tools \\\n    qtwayland5 \\\n    qtwayland5-dev-tools\n"
  },
  {
    "path": "utils/gitlab/build-script.sh",
    "content": "#!/bin/bash\nset -ex\n\nBUILD_DIR=${BUILD_DIR:-\"build\"}\nINSTALL_PREFIX=${INSTALL_PREFIX:-\"copyq\"}\nINSTALL_PREFIX=$(readlink -f \"$INSTALL_PREFIX\")\n\ncmake_args=(\n    -DWITH_TESTS=TRUE\n    -DWITH_QT6=FALSE\n    -DCMAKE_INSTALL_PREFIX=\"$INSTALL_PREFIX\"\n    ..\n)\n\nmkdir -p \"$BUILD_DIR\"\n\n(\n    cd \"$BUILD_DIR\"\n    cmake \"${cmake_args[@]}\" ..\n    cmake --build . --target install\n)\n"
  },
  {
    "path": "utils/gitlab/test-before_script.sh",
    "content": "#!/bin/bash\nset -ex\n\npackages=(\n    libkf5notifications5\n\n    libqt5core5a\n    libqt5gui5\n    libqt5network5\n    libqt5qml5\n    libqt5waylandclient5\n    libqt5widgets5\n    libqt5svg5\n    libqt5xml5\n    libqt5test5\n    libqt5x11extras5\n\n    libx11-6\n    libxtst6\n)\n\napt update\n\n# Runtime libraries\napt -y install \"${packages[@]}\"\n"
  },
  {
    "path": "utils/gitlab/test-script.sh",
    "content": "#!/bin/bash\nset -ex\n\nINSTALL_PREFIX=${INSTALL_PREFIX:-\"copyq\"}\nINSTALL_PREFIX=$(readlink -f \"$INSTALL_PREFIX\")\n\n\"$INSTALL_PREFIX/bin/copyq\" help\n\"$INSTALL_PREFIX/bin/copyq\" version\n\"$INSTALL_PREFIX/bin/copyq\" info\n"
  },
  {
    "path": "utils/gitlab/test_gui-before_script.sh",
    "content": "#!/bin/bash\nset -ex\n\npackages=(\n    # X11 and window manager\n    xvfb\n    openbox\n\n    # Screenshot utility\n    scrot\n)\n\nutils/gitlab/test-before_script.sh\n\napt -y install \"${packages[@]}\"\n"
  },
  {
    "path": "utils/gitlab/test_gui-script.sh",
    "content": "#!/bin/bash\nset -ex\n\nSCREENSHOT_DIR=${SCREENSHOT_DIR:-\"screenshots\"}\nINSTALL_PREFIX=${INSTALL_PREFIX:-\"copyq\"}\nINSTALL_PREFIX=$(readlink -f \"$INSTALL_PREFIX\")\n\nexport DISPLAY=':99.0'\nXvfb :99 -screen 0 1280x960x24 &\nsleep 5\n\nopenbox &\nsleep 5\n\nmkdir -p \"$TESTS_LOG_DIR\"\nexport COPYQ_LOG_FILE=\"$TESTS_LOG_DIR/copyq.log\"\n\n# Start taking screenshots in background.\n(\n    set +x\n    mkdir -p \"$SCREENSHOT_DIR\"\n    while true; do\n        i=$((i+1))\n        f=\"$SCREENSHOT_DIR/$i.png\"\n        sleep 1 &&\n            echo \"   --- $f ---\" &&\n            echo \"   --- $f ---\" >> \"$COPYQ_LOG_FILE\" &&\n            scrot \"$f\" ||\n            break\n    done\n) &\n\n# Avoid following warning:\n#     QtWarning: QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'\nexport XDG_RUNTIME_DIR='/tmp/runtime-root'\nmkdir -p \"$XDG_RUNTIME_DIR\"\nchmod 0700 \"$XDG_RUNTIME_DIR\"\n\n# Disable encryption tests because exporting GPG key asks for password.\nexport COPYQ_TESTS_SKIP_ITEMENCRYPT=1\n\nexport COPYQ_TESTS_SKIP_DRAG_AND_DROP=1\n\nexport COPYQ_TESTS_RERUN_FAILED=1\nexport COPYQ_TESTS_NO_NETWORK=1\n\"$INSTALL_PREFIX/bin/copyq\" tests\n"
  },
  {
    "path": "utils/linux_make_icons.sh",
    "content": "#!/bin/bash\nset -e\n\nmake_icons()\n{\n    input_icon=$1\n    output_basename=$2\n\n    for extent in 16 22 24 32 48 64 128 256 512 1024; do\n        size=\"${extent}x${extent}\"\n        output=\"${output_basename}_$size.png\"\n        echo \"Converting $input_icon -> $output\"\n        convert -background transparent -density 600 \"$input_icon\" \\\n            -resize \"$size\" \"$output\"\n    done\n}\n\ncd src/images\nmake_icons icon.svg icon\n"
  },
  {
    "path": "utils/lupdate.sh",
    "content": "#!/bin/bash\nlupdate_args=(\n    src/\n    plugins/*/*.{cpp,h,ui}\n    -ts\n    ${1:-translations/*.ts}\n)\nexec \"${LUPDATE:-lupdate-qt6}\" \"${lupdate_args[@]}\"\n"
  },
  {
    "path": "utils/make_icns.sh",
    "content": "#!/bin/bash\nset -ex\n\nimage_dir=src/images\ntmp_dir=icon.iconset\n\nout=${image_dir}/icon.icns\n\nrm -rf \"${tmp_dir}\"\nmkdir -p \"${tmp_dir}\"\n\nconvert_img () {\n    size=$1\n    highdpi=$2\n\n    target_img=${tmp_dir}/icon_${size}x${size}\n    if [[ -n \"$highdpi\" ]]; then\n        target_img=\"${target_img}@${highdpi}x\"\n        size=$(expr $size \\* $highdpi)\n    fi\n    target_img=\"${target_img}.png\"\n\n    source_img=${image_dir}/icon_${size}x${size}.png\n\n    cp \"$source_img\" \"$target_img\"\n}\n\nconvert_img 16\nconvert_img 16 2\nconvert_img 32\nconvert_img 32 2\nconvert_img 128\nconvert_img 128 2\nconvert_img 256\nconvert_img 256 2\nconvert_img 512\nconvert_img 512 2\n\niconutil --convert icns --output $out \"${tmp_dir}\"\nrm -rf \"${tmp_dir}\"\n"
  },
  {
    "path": "utils/make_ico.sh",
    "content": "#!/bin/bash\nimage_dir=src/images\nout=${1:-src/images/icon.ico}\n\nargs=(\n    -background transparent\n    ${image_dir}/icon_16x16.png\n    \\( ${image_dir}/icon_22x22.png -resize 20x20 \\)\n    ${image_dir}/icon_24x24.png\n    ${image_dir}/icon_32x32.png\n    \\( ${image_dir}/icon_48x48.png -resize 40x40 \\)\n    ${image_dir}/icon_48x48.png\n    ${image_dir}/icon_64x64.png\n    \\( ${image_dir}/icon_128x128.png -resize 96x96 \\)\n    ${image_dir}/icon_128x128.png\n    ${image_dir}/icon_256x256.png\n    \"$out\"\n    )\n\nexec convert \"${args[@]}\"\n"
  },
  {
    "path": "utils/patches/knotifications/0001-Support-updating-Snore-notifications.patch",
    "content": "From dfb10fdbdc3ae82037366ed4cf039796beca7d6d Mon Sep 17 00:00:00 2001\nFrom: Lukas Holecek <hluk@email.cz>\nDate: Sun, 15 Nov 2020 19:06:53 +0100\nSubject: [PATCH] Support updating Snore notifications\n\n---\n src/notifybysnore.cpp | 29 +++++++++++++++++++++--------\n 1 file changed, 21 insertions(+), 8 deletions(-)\n\ndiff --git a/src/notifybysnore.cpp b/src/notifybysnore.cpp\nindex a82d0a4..4bf1c53 100644\n--- a/src/notifybysnore.cpp\n+++ b/src/notifybysnore.cpp\n@@ -61,7 +61,7 @@ NotifyBySnore::NotifyBySnore(QObject *parent)\n     m_server.listen(QString::number(qHash(qApp->applicationDirPath())));\n     connect(&m_server, &QLocalServer::newConnection, this, [this]() {\n         QLocalSocket *responseSocket = m_server.nextPendingConnection();\n-        connect(responseSocket, &QLocalSocket::readyRead, [this, responseSocket]() {\n+        connect(responseSocket, &QLocalSocket::readyRead, this, [this, responseSocket](){\n             const QByteArray rawNotificationResponse = responseSocket->readAll();\n             responseSocket->deleteLater();\n\n@@ -175,9 +175,20 @@ void NotifyBySnore::notifyDeferred(KNotification *notification)\n\n     // handle the icon for toast notification\n     const QString iconPath = m_iconDir.path() + QLatin1Char('/') + QString::number(notification->id());\n+    const bool deleteNewIcon = !QFile::exists(iconPath);\n     const bool hasIcon = (notification->pixmap().isNull()) ? qApp->windowIcon().pixmap(1024, 1024).save(iconPath, \"PNG\") //\n                                                            : notification->pixmap().save(iconPath, \"PNG\");\n     if (hasIcon) {\n+        qCDebug(LOG_KNOTIFICATIONS) << \"Created temporary icon\" << iconPath;\n+        if (deleteNewIcon) {\n+            connect(notification, &KNotification::destroyed, [iconPath](){\n+                if (QFile::remove(iconPath)) {\n+                    qCDebug(LOG_KNOTIFICATIONS) << \"Deleted temporary icon\" << iconPath;\n+                } else {\n+                    qCDebug(LOG_KNOTIFICATIONS) << \"Failed to delete temporary icon\" << iconPath;\n+                }\n+            });\n+        }\n         snoretoastArgsList << QStringLiteral(\"-p\") << iconPath;\n     }\n\n@@ -207,19 +218,20 @@ void NotifyBySnore::notifyDeferred(KNotification *notification)\n         const auto data = snoretoastProcess->readAllStandardOutput();\n         qCDebug(LOG_KNOTIFICATIONS) << \"SnoreToast process stdout:\" << snoretoastArgsList << data;\n     });\n-    connect(snoretoastProcess, &QProcess::errorOccurred, this, [this, snoretoastProcess, snoretoastArgsList, iconPath](QProcess::ProcessError error) {\n+    QPointer<KNotification> maybeNotification = notification;\n+    connect(snoretoastProcess, &QProcess::errorOccurred, this, [this, snoretoastProcess, maybeNotification, snoretoastArgsList, iconPath](QProcess::ProcessError error) {\n         qCWarning(LOG_KNOTIFICATIONS) << \"SnoreToast process errored:\" << snoretoastArgsList << error;\n         snoretoastProcess->deleteLater();\n-        QFile::remove(iconPath);\n+        close(maybeNotification);\n     });\n     connect(snoretoastProcess,\n             qOverload<int, QProcess::ExitStatus>(&QProcess::finished),\n             this,\n-            [this, snoretoastProcess, snoretoastArgsList, iconPath](int exitCode, QProcess::ExitStatus exitStatus) {\n+            [this, snoretoastProcess, maybeNotification, snoretoastArgsList, iconPath](int exitCode, QProcess::ExitStatus exitStatus) {\n                 qCDebug(LOG_KNOTIFICATIONS) << \"SnoreToast process finished:\" << snoretoastArgsList;\n                 qCDebug(LOG_KNOTIFICATIONS) << \"code:\" << exitCode << \"status:\" << exitStatus;\n                 snoretoastProcess->deleteLater();\n-                QFile::remove(iconPath);\n+                close(maybeNotification);\n             });\n\n     qCDebug(LOG_KNOTIFICATIONS) << \"SnoreToast process starting:\" << snoretoastArgsList;\n@@ -228,6 +240,9 @@ void NotifyBySnore::notifyDeferred(KNotification *notification)\n\n void NotifyBySnore::close(KNotification *notification)\n {\n+    if (notification == nullptr)\n+        return;\n+\n     qCDebug(LOG_KNOTIFICATIONS) << \"Requested to close notification with ID:\" << notification->id();\n     if (m_notifications.constFind(notification->id()) == m_notifications.constEnd()) {\n         qCWarning(LOG_KNOTIFICATIONS) << \"Couldn't find the notification in m_notifications. Nothing to close.\";\n@@ -246,9 +261,7 @@ void NotifyBySnore::close(KNotification *notification)\n\n void NotifyBySnore::update(KNotification *notification, const KNotifyConfig &notifyConfig)\n {\n-    Q_UNUSED(notification);\n-    Q_UNUSED(notifyConfig);\n-    qCWarning(LOG_KNOTIFICATIONS) << \"updating a notification is not supported yet.\";\n+    notify(notification, notifyConfig);\n }\n\n #include \"moc_notifybysnore.cpp\"\n--\n2.43.0\n"
  },
  {
    "path": "utils/sanitize.sh",
    "content": "#!/bin/bash\nset -e\n\nsanitizers=\"address,leak,bounds,bool,enum,null,undefined\"\nexport CXX_FLAGS=\"$CXX_FLAGS -fno-omit-frame-pointer -mllvm -asan-use-private-alias=1\"\n\nbuild_dir=build-sanitize\nutils_dir=$(dirname \"$(readlink -f \"$0\")\")\nsrc_dir=$utils_dir/..\nsteps=(\n    clean\n    cmake\n    ninja\n    run\n    )\n\nif [ -n \"$CLANG_ROOT\" ]; then\n    export PATH=$CLANG_ROOT:$PATH\nfi\nCXX=${CXX:-clang++}\n\nexport ASAN_SYMBOLIZER_PATH=${ASAN_SYMBOLIZER_PATH:-$(which llvm-symbolizer)}\nexport ASAN_OPTIONS=${ASAN_OPTIONS:-\"detect_leaks=1 detect_stack_use_after_return=1 print_stats=1 use_odr_indicator=1\"}\n\necho \"=== Using sanitizers (directory \\\"$build_dir\\\") ===\"\n\nstep=2\nif [ -d \"$build_dir\" ]; then\n    echo \"Select starting point:\"\n    select step in \"${steps[@]}\"; do step=$REPLY; break; done\nfi\n\nhas_step () {\n    [[ $step -le $1 ]]\n}\n\nhas_step \"${#steps[*]}\"\n\nif has_step 1; then\n    rm -r \"$build_dir\" || exit 1\nfi\n\nmkdir -p \"$build_dir\"\ncd \"$build_dir\"\n\nif has_step 2; then\n    cmake \\\n        -DCMAKE_INSTALL_PREFIX=\"$PWD/install\" \\\n        -DCMAKE_CXX_COMPILER=\"$CXX\" \\\n        -DCMAKE_CXX_FLAGS=\"$CXX_FLAGS -fsanitize=$sanitizers\" \\\n        -DCMAKE_BUILD_TYPE=Debug \\\n        -DCMAKE_GENERATOR=Ninja \\\n        \"$src_dir\"\nfi\n\nif has_step 3; then\n    ninja install\nfi\n\nif has_step 4; then\n    ./copyq -s test1 \"$@\"\nfi\n"
  },
  {
    "path": "utils/script_docs_to_cpp.py",
    "content": "#!/usr/bin/python\n'''\nParses API for C++ from Scriptable API documentation.\n'''\n\nimport re\n\nreadme_path = 'docs/scripting-api.rst'\noutput_path = 'src/gui/commandcompleterdocumentation.h'\n\nheader = '''// Generated by \"utils/script_docs_to_cpp.py\" from \"%s\".\n#pragma once\n\ntemplate <typename AddDocumentationCallback>\nvoid addDocumentation(AddDocumentationCallback addDocumentation)\n{\n'''\n\nfooter = '}'\n\n# Regex for function/variable/type name in documentation\nre_title = re.compile(r'''\n  (?:\n    ^\\.\\.\\s*js:function::\\s*\n    (?P<function_api>\n      # function return value\n      .*?\n      # function name\n      (?P<function_name>[\\w.]+)\n      # arguments\n      \\(.*\n    )\n\n    |\n\n    ^\\.\\.\\s*js:data::\\s*\n    # variable name\n    (?P<variable_name>[\\w.]+)\n\n    |\n\n    ^\\.\\.\\s*js:class::\\s*\n    # type name\n    (?P<type_name>[\\w.]+)$\n  )\n  ''', re.VERBOSE)\n\n\ndef write_api(output_file, name, api, description, rtype):\n    if rtype:\n        api = f'{api} -> {rtype}'\n    output = '    addDocumentation(\"{}\", \"{}\", \"{}\");\\n'\\\n        .format(name, api, description)\n    output_file.write(output)\n\n\ndef main():\n    with open(output_path, mode='w', encoding='utf-8') as output_file:\n        output_file.write((header % readme_path) + '\\n')\n\n        with open(readme_path, mode='r', encoding='utf-8') as readme_file:\n            name = None\n            api = None\n            description = None\n            rtype = None\n            for line in readme_file:\n                # Skip lines with large indentation, like function aliases.\n                if line.startswith(' ' * 5):\n                    continue\n\n                line = line.strip().replace('``', '`')\n                line = re.sub(r':js:func:`([^`]+)`', r'`\\1()`', line)\n                line = re.sub(r':js:[^:]*:`([^`]+)`', r'`\\1`', line)\n                line = re.sub(r'/\\*[^*]+\\*/', r'', line)\n\n                match = re.match(re_title, line)\n                if match:\n                    if name:\n                        write_api(output_file, name, api, description, rtype)\n                    name = match.group('function_name') or match.group('variable_name') or match.group('type_name')\n                    api = match.group('function_api') or name\n                    description = None\n                    rtype = None\n                elif not description or not description.endswith(\".\"):\n                    if description:\n                        description += \" \" + line.strip()\n                    else:\n                        description = line.strip()\n                else:\n                    rtype_match = re.match(r'^\\s*:rtype: (?P<rtype>.+)', line)\n                    if rtype_match:\n                        rtype = rtype_match.group('rtype')\n\n            if name:\n                write_api(output_file, name, api, description, rtype)\n\n        output_file.write(footer + '\\n')\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "utils/sign_released_files.sh",
    "content": "#!/bin/bash\nset -euo pipefail\n\nsha512sum *.gz *.zip *.exe > checksums-sha512.txt\n\n# https://docs.sigstore.dev/quickstart/quickstart-cosign/\ncosign sign-blob checksums-sha512.txt --bundle cosign.bundle\n\ncosign verify-blob checksums-sha512.txt --bundle cosign.bundle \\\n    --certificate-identity=hluk@email.cz \\\n    --certificate-oidc-issuer=https://github.com/login/oauth\n"
  },
  {
    "path": "utils/update_icon_font.py",
    "content": "#!/usr/bin/env python\n'''\nUpdates icon font and header files for CopyQ repository.\n\nFirst argument is path to unpacked Font Awesome archive (https://fontawesome.com/).\n'''\nimport json\nimport os\nimport sys\n\nfrom textwrap import dedent\n\nfrom fontTools.merge import Merger\nfrom fontTools.ttLib import TTFont\n\nFONTS = [\n    'fa-solid-900.ttf',\n    'fa-brands-400.ttf',\n]\nFONT_FILENAME = 'fontawesome.ttf'\n\nSOLID_STYLE = 'solid'\nBRANDS_STYLE = 'brands'\n\n\ndef read_icons(icons_json):\n    with open(icons_json, 'r') as icons_file:\n        icons_content = icons_file.read()\n        return json.loads(icons_content)\n\n\ndef write_header_file_preamble(header_file):\n    script = os.path.realpath(__file__)\n    script_name = os.path.basename(script)\n    comment = (\n            f'// This file is generated with \"{script_name}\"'\n            + ' from FontAwesome\\'s metadata.\\n#pragma once\\n\\n')\n    header_file.write(comment)\n\n\ndef write_icon_list_header_file(header_icon_list, icons):\n    with open(header_icon_list, 'w') as header_file:\n        items = []\n        for style in [SOLID_STYLE, BRANDS_STYLE]:\n            is_brand = 'true' if style == BRANDS_STYLE else 'false'\n            for name, icon in icons.items():\n                if style in icon['styles']:\n                    code = icon['unicode']\n                    search_terms = [icon['label'].lower()] + (icon['search']['terms'] or [])\n                    search_terms_list = '|'.join(search_terms)\n                    items.append('{0x%s, %s, \"%s\"}' % (code, is_brand, search_terms_list))\n\n        item_list_content = ',\\n'.join(items)\n        content = dedent('''\\\n            struct Icon {\n                unsigned short unicode;\n                bool isBrand;\n                const char *searchTerms;\n            };\n\n            constexpr Icon iconList[] = {\n            %s\n            };\n        ''') % item_list_content\n\n        write_header_file_preamble(header_file)\n        header_file.write(content)\n\n\ndef write_icons_header_file(header_icons, icons):\n    with open(header_icons, 'w') as header_file:\n        write_header_file_preamble(header_file)\n        header_file.write('#ifndef ICONS_H\\n')\n        header_file.write('#define ICONS_H\\n')\n        header_file.write('\\n')\n        header_file.write('enum IconId {\\n')\n\n        for name, icon in icons.items():\n            label = name.title().replace('-', '')\n            code = icon['unicode']\n            header_file.write(f'    Icon{label} = 0x{code},' + '\\n')\n\n        header_file.write('};\\n')\n        header_file.write('\\n')\n        header_file.write('#endif // ICONS_H\\n')\n\n\ndef rename_font_family(path):\n    \"\"\"\n    Adds suffix to font family it doesn't conflict with font installed on\n    system, which could be in incorrect version.\n\n    See: https://github.com/fonttools/fonttools/blob/master/Snippets/rename-fonts.py\n    \"\"\"\n\n    font = TTFont(path)\n    name_table = font['name']\n\n    FAMILY_RELATED_IDS = dict(\n        LEGACY_FAMILY=1,\n        TRUETYPE_UNIQUE_ID=3,\n        FULL_NAME=4,\n        POSTSCRIPT_NAME=6,\n        PREFERRED_FAMILY=16,\n        WWS_FAMILY=21,\n    )\n\n    for rec in name_table.names:\n        if rec.nameID not in FAMILY_RELATED_IDS.values():\n            continue\n\n        name = rec.toUnicode()\n        if name.startswith('Font Awesome'):\n            rec.string = name + ' (CopyQ)'\n        elif name.startswith('FontAwesome'):\n            rec.string = name + '(CopyQ)'\n\n        assert rec.toUnicode().endswith('(CopyQ)')\n\n    font.save(path)\n\n\ndef copy_fonts(font_awesome_src, target_font_dir):\n    font_dir = os.path.join(font_awesome_src, 'webfonts')\n    fonts = [\n        os.path.join(font_dir, src_name)\n        for src_name in FONTS\n    ]\n    dest_path = os.path.join(target_font_dir, FONT_FILENAME)\n\n    print(f'Merging fonts: {fonts} -> {dest_path}')\n    merger = Merger()\n    with merger.merge(fonts) as font:\n        font.save(dest_path)\n\n    rename_font_family(dest_path)\n\n\ndef main():\n    font_awesome_src = sys.argv[1]\n\n    script = os.path.realpath(__file__)\n    utils_dir = os.path.dirname(script)\n    project_dir = os.path.dirname(utils_dir)\n    src_dir = os.path.join(project_dir, 'src')\n\n    header_icon_list = os.path.join(src_dir, 'gui', 'icon_list.h')\n    header_icons = os.path.join(src_dir, 'gui', 'icons.h')\n\n    target_font_dir = os.path.join(src_dir, 'images')\n    copy_fonts(font_awesome_src, target_font_dir)\n\n    icons_json = os.path.join(\n            font_awesome_src, 'metadata', 'icons.json')\n    icons = read_icons(icons_json)\n\n    write_icon_list_header_file(header_icon_list, icons)\n    print(f'Header file \"{header_icon_list}\" updated.')\n\n    write_icons_header_file(header_icons, icons)\n    print(f'Header file \"{header_icons}\" updated.')\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "utils/windows_copyq_update.sh",
    "content": "#!/bin/bash\n# Script to update CopyQ installation on Windows.\nbuild=${1:-\"../build-copyq-Qt_4_8_5-Release\"}\ndst=${2:-\"/c/dev/copyq\"}\nsrc=${3:-$PWD}\n\nset -e\n\nupdate() {\n    set -e\n    mkdir -p \"${@: -1}\"\n    cp -uv -- \"$@\"\n}\n\nupdate \"$src\"/{README.md,AUTHORS,HACKING,LICENSE} \"$dst\"\nupdate \"$src\"/shared/themes/*.{css,ini} \"$dst/themes\"\nupdate \"$build\"/copyq.exe \"$dst\"\nupdate \"$build\"/plugins/*.dll \"$dst/plugins\"\nupdate \"$build\"/src/*.qm \"$dst/translations\"\n"
  }
]